2013 Nov 20 5:03 PM
Hi experts,
I have the following three tables:
Source Table
Account | Functional Area | Profit Center | Amount |
60000 | 00 | 10001 | 50,00 |
60000 | 05 | 20002 | 130,00 |
70000 | 13 | 30001 | -450,00 |
Master Data Table:
Account | Functional Area Range from | Functional Area Range To | Profit Center Range from | Profit Center Range To | Virtual Account |
60000 |
| 03 | 10001 | 10010 | AX |
60000 | 04 | 10 | 20001 | 20010 | AY |
70000 | 11 | 20 | 30000 | 30010 | BX |
Target Table
Account | Functional Area | Profit Center | Amount | Virtual Account |
60000 | 00 | 10001 | 50,00 | AX |
60000 | 05 | 20002 | 130,00 | AY |
70000 | 13 | 30001 | -450,00 | BX |
Source table is feeding Target Table. I have to fill virtual account in target table by reading the master data table.
The idea is like this:
-When the accounts are equal between source table and Master data table
-Check in a first time the functional area in source table between from and to in master data table
-Then check the profit center in source table between from and to in master data table
-Then fill virtual account
Amine
Message Part (1/2)
2013 Nov 21 12:05 PM
Hi-
Try below approach:
DATA: lv_data_missing.
LOOP AT it_source INTO wa_source.
CLEAR: wa_master.
READ TABLE it_master INTO wa_master WITH KEY account = wa_source-account.
IF sy-subrc = 0.
CLEAR wa_master.
LOOP AT it_master INTO wa_master WHERE account = wa_source-account.
CLEAR: lv_data_missing.
IF ( wa_source-fa >= wa_master-ff OR
wa_source-fa <= wa_master-ft ).
ELSE.
lv_data_missing = 'X'.
WRITE: 'Error: Functional Area missing for Account', wa_source-account.
ENDIF.
IF ( wa_source-pf >= wa_master-pf OR
wa_source-pf <= wa_master-pt ).
ELSE.
lv_data_missing = 'X'.
ENDIF.
IF lv_data_missing = 'X'.
CONTINUE.
ELSE.
"Append record to your final internal table
ENDIF.
ENDLOOP.
ELSE.
WRITE: / 'Error: Account', wa_source-account 'Not found'.
ENDIF.
ENDLOOP.
-Venkat
Hi Ariva,
The issue of the read is that the code is going to read only the first record and not all the others.
But the idea is to loop until find a corresponding value in the master data table. If no value is found then add it to my error table.
Thanks.
Amine
2013 Nov 20 5:04 PM
Here how I do it and it’s woking fine (but my solution is limited I will explain later why):
Data : ff ,ft, pf, pt type i.
loop at Master_Data_table into structure where account = source-account.
ff = structure-fa from.
ft = structure-ft to.
pf= structure-pc from.
pt = structure- pc to.
if source-fa >=ff and source-fa <= ft.
if source-pc >=pf and source-pc <= pt.
target-va = structure-va.
endif.
endif.
endloop.
The issue is that some times the loop will not find any corresponding values in master data table and I would like to store them in an error table. Here an example of not matching records assmung that my master data table contains only the records above.
Source Table
Account | Functional Area | Profit Center | Amount |
90000 | 05 | 10001 | |
60000 | 09 | 10001 | 50,00 |
60000 | 05 | 30002 | 130,00 |
I tried to find a solution with the sy-subrc but in debug mode it’s always eq 0.
Thanks.
Amine
Message Part (2/2)
2013 Nov 20 5:31 PM
Hi Amine,
Only the Account no in Source table and the Master table has to be same or the entire structure?
You have given like.
loop at Master_Data_table into structure where account = source-account.
So what is Source-account? Can you give the piece of coding you have written above the loop statement?
2013 Nov 20 5:38 PM
Hi
You need to move all conditions in WHERE clauses
loop at Master_Data_table into structure
where account = source-account
and ( fa_from <= source-fa
and fa_to => soure-fa )
and (pc_from <= source-pc
and (pc_to => source-pc ).
target-va = structure-va.
endloop.
if sy-subrc <> 0.
----------> ERROR
endif.
Max
2013 Nov 20 6:52 PM
Hi,
Source-account is the field account from source table.
The idea of my code was to loop until find in the master data table using the key account a matching coorespondance record.
Let me know if you need more details.
Amine
2013 Nov 20 6:56 PM
Hi Max,
interesting. But i have to convert the fields into i type. This is why i made this in the loop:
Data : ff ,ft, pf, pt type i.
ff = structure-fa from.
ft = structure-ft to.
pf= structure-pc from.
pt = structure- pc to
How can i manage it in your proposal?
Thanks.
Amine
2013 Nov 21 11:36 AM
Loop at source table.
loop at Master_Data_table into structure where account = source-account.
ff = structure-fa from.
ft = structure-ft to.
pf= structure-pc from.
pt = structure- pc to.
if source-fa >=ff and source-fa <= ft.
if source-pc >=pf and source-pc <= pt.
target-va = structure-va.
endif.
endif.
endloop.
if sy-subrc ne 0 or taget-va is initial." meaning no data matches
append error record for no data for account.
endif.
endloop.
2013 Nov 21 12:06 PM
Hi Nahbeet,
Thanks for your answer.
Do you think that i may add an exit to go out the loop when a record is found?
Thanks.
Amine
2013 Nov 21 12:07 PM
2013 Nov 21 1:33 PM
Something like this, right?
loop at Master_Data_table into structure where account = source-account.
ff = structure-fa from.
ft = structure-ft to.
pf= structure-pc from.
pt = structure- pc to.
if source-fa >=ff and source-fa <= ft.
if source-pc >=pf and source-pc <= pt.
target-va = structure-va.
exit.
endif.
endif.
endloop.
2013 Nov 20 5:27 PM
Hi,
Please try below code.
Loop at Sourcetable into wa_source
read table mastertable into wa_master with account = wa_source-account.
if sy-subrc = 0.
if wa_source-functionarea between wa_master-fromfunctionarea and wa_master-tofunctionarea.
wa_final-virtualaccount = wa_master-virtualaccount.
append wa_final to it_final.
endif.
endloop.
if you want to perform first time of functional area.
Please use at new of functionalarea or on change of wa_source-funationalarea.
Hope above code resolve your issue.
2013 Nov 20 6:59 PM
Hi Ariva,
The issue of the read is that the code is going to read only the first record and not all the others.
But the idea is to loop until find a corresponding value in the master data table. If no value is found then add it to my error table.
Thanks.
Amine
2013 Nov 21 11:29 AM
Hi Amine,
Can you give us more details?
1) CASE 1
Suppose Source Table contains,
60000
70000
80000
and Master Table contains
70000
80000
90000
Then Your Result table should be :
70000
80000
and your Error Table should be:
60000
OR
2) CASE 2
RESULT TABLE
70000
80000
ERROR TABLE
60000
90000
In first case,LOOP SOURCE TABLE
READ TABLE MASTER TABLE INTO WA_MASTERTABLE WITH KEY ACCNT = ACCNT- SOURCE TABLE.
IF SY-SUBRC = 0.
RESULT TABLE OPERATIONS
ELSE.
ERROR TABLE OPERATIONS.
ENDIF.
ENDLOOP.
In second case, write one more loop.
loop at master table
READ TABLE SOURCE_TABLE INTO WA_SOURCE TABLE WITH KEY ACCNT = MASTERTABLE-ACCNT
IF SY-SUBRC = 0.
RESULT TABLE OPERATIONS
ELSE
ERROR TABLE OPERATIONS.
ENDIF.
ENDLOOP.
Regards,
Philip.
2013 Nov 21 12:05 PM
Hi Philip,
The three conditions have to be respected, not only the account
Thx.
Amine
2013 Nov 21 12:05 PM
Hi-
Try below approach:
DATA: lv_data_missing.
LOOP AT it_source INTO wa_source.
CLEAR: wa_master.
READ TABLE it_master INTO wa_master WITH KEY account = wa_source-account.
IF sy-subrc = 0.
CLEAR wa_master.
LOOP AT it_master INTO wa_master WHERE account = wa_source-account.
CLEAR: lv_data_missing.
IF ( wa_source-fa >= wa_master-ff OR
wa_source-fa <= wa_master-ft ).
ELSE.
lv_data_missing = 'X'.
WRITE: 'Error: Functional Area missing for Account', wa_source-account.
ENDIF.
IF ( wa_source-pf >= wa_master-pf OR
wa_source-pf <= wa_master-pt ).
ELSE.
lv_data_missing = 'X'.
ENDIF.
IF lv_data_missing = 'X'.
CONTINUE.
ELSE.
"Append record to your final internal table
ENDIF.
ENDLOOP.
ELSE.
WRITE: / 'Error: Account', wa_source-account 'Not found'.
ENDIF.
ENDLOOP.
-Venkat
2013 Nov 21 1:22 PM
Hi Venhat,
In this piece of code:
IF ( wa_source-fa >= wa_master-ff OR
wa_source-fa <= wa_master-ft ).
Do you meant?
IF ( wa_source-fa >= wa_master-ff AND
wa_source-fa <= wa_master-ft ).
Thanks.
Amine
2013 Nov 21 1:40 PM
Hello Amine-
Correction! it's 'AND' and not 'OR'.
IF ( wa_source-fa >= wa_master-ff AND
wa_source-fa <= wa_master-ft ).
IF ( wa_source-pf >= wa_master-pf AND
wa_source-pf <= wa_master-pt ).
Also you can use BETWEEN too.
IF ( wa_source-fa BETWEEN wa_master-ff AND wa_master-ft ).
ENDIF.
-Venkat
2013 Nov 21 1:48 PM
2013 Nov 21 1:59 PM
Venkat,
What do you think about the follwing logic. Actually it will be more easy for me to implement and maintain:
Thx
.
loop at source into wa_source
loop at Master_Data_table into structure
where account = source-account
and ( fa_from <= source-fa
and fa_to => soure-fa )
and (pc_from <= source-pc
and (pc_to => source-pc ).
if sy-subrc eq 0.
target-va = structure-va.
else.
append to err
endloop.
endloop.
2013 Nov 21 2:21 PM
Hello Amine-
Agreed! You can for sure use that logic its straight forward and with a single condition. I have written my logic with an intention of more error specific. Say suppose if there is a miss match in functional area or profit center or miss match in both you can populate/capture error.
If your requirement is to just append error table only when there is a miss match in account please go ahead with that logic.
-----------------------------------------------------------------------
SORT: sorce BY account ASCENDING,
master BY account ASCENDING.
loop at Master_Data_table into structure
where account = source-account
and ( fa_from <= source-fa
and fa_to => soure-fa )
and (pc_from <= source-pc
and (pc_to => source-pc ).
endloop.
if sy-subrc eq 0.
target-va = structure-va.
else.
append to err
endif.
endloop.
-Venkat
2013 Nov 21 3:06 PM
Just to add to Venkat code add an exit inside loop the moment you find one you skip the rest of processing.
2013 Nov 21 4:43 PM
I have another question please:
How can i convert fa_from, fa_to,pc_from, pc_to to i type before the loop?
I would like that the loop considers them as type i.
In my initial proposal i made this but i don't know how to adapt it to your last version of code:
data: ff, ft, pf, pt type i.
loop at Master_Data_table into structure where account = source-account.
ff = structure-fa from.
ft = structure-ft to.
pf= structure-pc from.
pt = structure- pc to.
if source-fa >=ff and source-fa <= ft.
if source-pc >=pf and source-pc <= pt.
target-va = structure-va.
endif.
endif.
endloop.
Thanks.
Amine
2013 Nov 21 5:28 PM
Hi Amine-
There is no need to convert these variables to integer type, please see below sample code for your reference:
In below code field prctr is of type character with length 10, Data Element 'PRCTR'.
TYPES: BEGIN OF t_itab,
prctr TYPE prctr,
END OF t_itab.
DATA: itab TYPE STANDARD TABLE OF t_itab,
wa_itab TYPE t_itab,
itab_temp TYPE STANDARD TABLE OF t_itab,
wa_itab_temp TYPE t_itab.
wa_itab-prctr = '5000'.
APPEND wa_itab TO itab.
wa_itab-prctr = '6000'.
APPEND wa_itab TO itab.
wa_itab-prctr = '7000'.
APPEND wa_itab TO itab.
wa_itab-prctr = '8000'.
APPEND wa_itab TO itab.
wa_itab_temp-prctr = '1000'.
APPEND wa_itab_temp TO itab_temp.
wa_itab_temp-prctr = '2000'.
APPEND wa_itab_temp TO itab_temp.
wa_itab_temp-prctr = '3000'.
APPEND wa_itab_temp TO itab_temp.
LOOP AT itab INTO wa_itab.
LOOP AT itab_temp INTO wa_itab_temp WHERE prctr <= wa_itab-prctr.
WRITE: / wa_itab_temp-prctr.
ENDLOOP.
ENDLOOP.
Output:
Please go ahead with your coding.
-Venkat
| User | Count |
|---|---|
| 4 | |
| 2 | |
| 2 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |