‎2007 Jun 12 12:56 PM
Hi frnds,
I am using three function module inside the loop ,
am assigning the vendor to class , characteristics ,values.
For the same vendor, there are different values need to be assigned, but when i pass the record one by one in the loop 1, the assignment overwrites with the new value. the vendor gets updated with the latest value. but i require these values need to be appended in the transaction ( cl20n). hence i used loop 2 to capture the similiar class, characteristics , different values to the vendor, and appending it. Due to performance issue , i should take the loop2 out , need to use a alternative code for it. pls help me out how to avoid loop2 withe alternative code.
loop 1
Function module 1. " bapi_concatenate_key
loop2 " this loop append the values into the transaction
endloop
function module 2. " bapi_objcl_change
function module 3. " bapi_commit_transaction
endloop
‎2007 Jun 12 1:37 PM
Hi,
I think if you are creating the assignments newly then you can use
BAPI_OBJCL_CREATE instead of BAPI_OBJCL_CHANGE.
Check out the following code which is for assigning Materials to classes and characteristics.
WRITE:/ 'CLASS TYPE : 001' COLOR 2.
LOOP AT it_001 INTO x_001.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = x_001-matnr
IMPORTING
output = x_001-matnr.
v_objkey = x_001-matnr.
v_cnt = 0.
REFRESH: it_bapi_char,it_bapi_char_values ,it_bapiret_create,
it_alwval_num,it_alwval_char,it_alwval_curr .
CLEAR: x_bapiret1,x_bapi_char,x_bapi_char_values ,
x_alwval_num,x_alwval_char,x_alwval_curr.
LOOP AT it_class INTO x_class WHERE recid = x_001-recid AND class = x_001-class.
v_cnt = v_cnt + 1.
IF v_cnt = 1.
CALL FUNCTION 'BAPI_CLASS_GET_CHARACTERISTICS'
EXPORTING
classnum = x_class-class
classtype = '001'
IMPORTING
return = x_bapiret1
TABLES
characteristics = it_bapi_char
char_values = it_bapi_char_values.
ENDIF.
SORT :it_bapi_char,it_bapi_char_values.
READ TABLE it_bapi_char INTO x_bapi_char WITH KEY name_char = x_class-atnam BINARY SEARCH.
IF sy-subrc = 0.
READ TABLE it_bapi_char_values INTO x_bapi_char_values
WITH KEY name_char = x_class-atnam char_value = x_class-atwrt.
IF sy-subrc = 0.
IF x_bapi_char-data_type = 'CHAR'.
TRANSLATE x_class-atwrt TO UPPER CASE.
x_alwval_char-charact = x_class-atnam.
x_alwval_char-value_char = x_class-atwrt.
APPEND x_alwval_char TO it_alwval_char.
ELSEIF x_bapi_char-data_type = 'CURR'.
x_alwval_curr-charact = x_class-atnam.
x_alwval_curr-value_from = x_class-atwrt.
x_alwval_curr-currency_from = 'USD'.
APPEND x_alwval_curr TO it_alwval_curr.
ELSEIF x_bapi_char-data_type = 'NUM' OR x_bapi_char-data_type = 'DATE'
OR x_bapi_char-data_type = 'TIME'.
x_alwval_num-charact = x_class-atnam.
x_alwval_num-value_from = x_class-atwrt.
APPEND x_alwval_num TO it_alwval_num.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
CALL FUNCTION 'BAPI_OBJCL_CREATE'
EXPORTING
objectkeynew = v_objkey
objecttablenew = 'MARA'
classnumnew = x_class-class
classtypenew = '001'
TABLES
allocvaluesnum = it_alwval_num
allocvalueschar = it_alwval_char
allocvaluescurr = it_alwval_curr
return = it_bapiret_create.
READ TABLE it_bapiret_create INTO x_bapiret WITH KEY type = 'E' .
IF sy-subrc NE 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
WRITE:/ 'Material : ', v_objkey COLOR 4.
LOOP AT it_bapiret_create INTO x_bapiret WHERE type = 'E' OR type = 'S' .
WRITE: /1 x_bapiret-type, 6 x_bapiret-message.
ENDLOOP.
SKIP 2.
ENDLOOP.
‎2007 Jun 12 1:10 PM
One way is that you get the tables in one shoot with for all entries instead of loop and FM call....then in a loop merge the values to your internal tables.
Peter
‎2007 Jun 12 1:16 PM
hi
u can use 'FOR ALL ENTERIES'
regards
ravish
<b>dont forget to rewared points if helpful</b>
‎2007 Jun 12 1:25 PM
Hi,
declare internal tables....
write select statements using FOR ALL ENTRIES
after that loop at first internal table.
use read statements...
append data to final internal table.
endloop
Regards
‎2007 Jun 12 1:37 PM
Hi,
I think if you are creating the assignments newly then you can use
BAPI_OBJCL_CREATE instead of BAPI_OBJCL_CHANGE.
Check out the following code which is for assigning Materials to classes and characteristics.
WRITE:/ 'CLASS TYPE : 001' COLOR 2.
LOOP AT it_001 INTO x_001.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = x_001-matnr
IMPORTING
output = x_001-matnr.
v_objkey = x_001-matnr.
v_cnt = 0.
REFRESH: it_bapi_char,it_bapi_char_values ,it_bapiret_create,
it_alwval_num,it_alwval_char,it_alwval_curr .
CLEAR: x_bapiret1,x_bapi_char,x_bapi_char_values ,
x_alwval_num,x_alwval_char,x_alwval_curr.
LOOP AT it_class INTO x_class WHERE recid = x_001-recid AND class = x_001-class.
v_cnt = v_cnt + 1.
IF v_cnt = 1.
CALL FUNCTION 'BAPI_CLASS_GET_CHARACTERISTICS'
EXPORTING
classnum = x_class-class
classtype = '001'
IMPORTING
return = x_bapiret1
TABLES
characteristics = it_bapi_char
char_values = it_bapi_char_values.
ENDIF.
SORT :it_bapi_char,it_bapi_char_values.
READ TABLE it_bapi_char INTO x_bapi_char WITH KEY name_char = x_class-atnam BINARY SEARCH.
IF sy-subrc = 0.
READ TABLE it_bapi_char_values INTO x_bapi_char_values
WITH KEY name_char = x_class-atnam char_value = x_class-atwrt.
IF sy-subrc = 0.
IF x_bapi_char-data_type = 'CHAR'.
TRANSLATE x_class-atwrt TO UPPER CASE.
x_alwval_char-charact = x_class-atnam.
x_alwval_char-value_char = x_class-atwrt.
APPEND x_alwval_char TO it_alwval_char.
ELSEIF x_bapi_char-data_type = 'CURR'.
x_alwval_curr-charact = x_class-atnam.
x_alwval_curr-value_from = x_class-atwrt.
x_alwval_curr-currency_from = 'USD'.
APPEND x_alwval_curr TO it_alwval_curr.
ELSEIF x_bapi_char-data_type = 'NUM' OR x_bapi_char-data_type = 'DATE'
OR x_bapi_char-data_type = 'TIME'.
x_alwval_num-charact = x_class-atnam.
x_alwval_num-value_from = x_class-atwrt.
APPEND x_alwval_num TO it_alwval_num.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
CALL FUNCTION 'BAPI_OBJCL_CREATE'
EXPORTING
objectkeynew = v_objkey
objecttablenew = 'MARA'
classnumnew = x_class-class
classtypenew = '001'
TABLES
allocvaluesnum = it_alwval_num
allocvalueschar = it_alwval_char
allocvaluescurr = it_alwval_curr
return = it_bapiret_create.
READ TABLE it_bapiret_create INTO x_bapiret WITH KEY type = 'E' .
IF sy-subrc NE 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
WRITE:/ 'Material : ', v_objkey COLOR 4.
LOOP AT it_bapiret_create INTO x_bapiret WHERE type = 'E' OR type = 'S' .
WRITE: /1 x_bapiret-type, 6 x_bapiret-message.
ENDLOOP.
SKIP 2.
ENDLOOP.
‎2007 Jun 13 11:36 AM
Hi,
The Bapi_class_get_characteristics takes all the values for the respective characteristics, but i am passing a file which consists of vendor, class ,characteristics, values
eg
123| Returnable_package| Packages| 02|
321| Returnable_package| Packages| 02|
123| Returnable_package| Packages| 01|
421| Vendor_shipping| Vendor_shipping| 02|
The vendor 123 has two values 02,01 . so this two values need to be appended.
Eventhough of using the READ statment to remove the loop , the purpose of the loop 2 is collect the similiar characteristics, value from the file that is been uploaded and get assigned and appended to the transaction cl20n. i have used the above code but the values is not assigned to the vendor. pls solve the issue.
‎2007 Jun 13 11:42 AM
Hi,
here is the logic for using loop inside loop if it is a must! This considerably improves performance compared to normal nested loops.
SORT wt_table1 BY key.
SORT wt_table2 BY key.
wv_index = 1.
LOOP AT wt_table1.
Treatment.
LOOP AT wt_table2 FROM wv_index.
IF wt_table1-key = wt_table2-key.
Treatment.
ELSEIF wt_table2-key > wt_table1-key.
wv_index = sy-tabix.
EXIT.
ENDIF.
ENDLOOP.
Treatment.
ENDLOOP.
Hope that this helps you,
Regards,
Sooness.
‎2007 Jun 13 11:58 AM