Коллеги, доброго времени суток всем.
Хотел спросить, приходилось ли кому делать пакетный ввод (BDC) для транзакции CS02 и ей подобных? Сейчас делал ф-ю, которая создаёт изменение в системе(СС01) и к этому изменению подвязывает модификацию спецификации изделия(CS02). Делаю всё пакетным вводом; сначала хотел руками таблицы править, но потом понял, что гиблое дело - слишком много всяких левых счётчиков и ссылок везде, так что, думаю, пакетным вводом правильней будет. Проблема в том, что СС01 всё отрабатывает, создаёт нормально, а вот CS02 максимум удаляет старые позиции, а дальше ничего не происходит. Не могу понять в чем причина, хотя догадываюсь, что какая то проблема в совместимости CS02 и пакетного ввода (через SHDB транзакция даже выглядит иначе). На всякий случай кину код для СС01 тоже, хотя там всё работает, но может уже оттуда какой то косяк идёт, а если нет, то хоть может пригодится кому.
Вот бдц-формы:
Code:
DATA: BEGIN OF gt_bdc_data OCCURS 0.
INCLUDE STRUCTURE bdcdata.
DATA: END OF gt_bdc_data.
DATA: gt_bdc_result LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
DATA: gs_bdc_params TYPE ctu_params.
FORM bdc_dynpro USING program dynpro.
CLEAR gt_bdc_data.
gt_bdc_data-program = program.
gt_bdc_data-dynpro = dynpro.
gt_bdc_data-dynbegin = 'X'.
APPEND gt_bdc_data.
ENDFORM. "BDC_DYNPRO
FORM bdc_field USING fnam fval.
CLEAR gt_bdc_data.
gt_bdc_data-fnam = fnam.
gt_bdc_data-fval = fval.
APPEND gt_bdc_data.
ENDFORM. "BDC_FIELD
FORM bdc_digit USING fnam fval.
DATA digit(20) TYPE c.
CLEAR gt_bdc_data.
gt_bdc_data-fnam = fnam.
WRITE fval TO digit.
CONDENSE digit.
REPLACE ALL OCCURRENCES OF '.' IN digit WITH ','.
gt_bdc_data-fval = digit.
APPEND gt_bdc_data.
ENDFORM. "BDC_DIGIT
FORM bdc_date USING fnam fval.
DATA date(10) TYPE c.
WRITE fval TO date.
CLEAR gt_bdc_data.
gt_bdc_data-fnam = fnam.
gt_bdc_data-fval = date.
APPEND gt_bdc_data.
ENDFORM. "BDC_DATE
Рабочий кусок для СС01:
Code:
DATA: lt_bom_main_table TYPE STANDARD TABLE OF stpo_api03,
material TYPE mara-matnr,
index TYPE i,
old_index TYPE i,
bom_lines TYPE i,
txt_indx(2) TYPE c,
bdcommand TYPE string,
bdvalue(2) TYPE c,
last_okcode TYPE bdc_fval,
date(10) TYPE c.
FIELD-SYMBOLS: <transresult> LIKE LINE OF gt_bdc_result,
<mt_element> LIKE LINE OF mt_specification_dms.
WRITE sy-datum TO date.
SELECT SINGLE objky FROM drad INTO material WHERE doknr EQ ls_draw-doknr AND dokob EQ 'MARA'.
REFRESH gt_bdc_data.
PERFORM bdc_dynpro USING 'SAPMC29C' '0100'.
PERFORM bdc_field USING 'BDC_OKCODE' '/00'.
PERFORM bdc_field USING 'RAD_BUT_ECNTYP-NORM' 'X'.
PERFORM bdc_field USING 'RAD_AEFUN-MIFR' 'X'.
PERFORM bdc_field USING 'RC29A-AEPRO' 'Z3'.
PERFORM bdc_dynpro USING 'SAPMC29C' '0010'.
PERFORM bdc_field USING 'BDC_OKCODE' '=FCBU'.
PERFORM bdc_field USING 'RC29A-AETXT' 'Автоматическое извещение для макетов'.
PERFORM bdc_date USING 'RC29A-DATUV' sy-datum.
PERFORM bdc_field USING 'RC29A-AENST' '1'.
gs_bdc_params-dismode = 'N'.
REFRESH gt_bdc_result.
CALL TRANSACTION 'CC01' USING gt_bdc_data
OPTIONS FROM gs_bdc_params
MESSAGES INTO gt_bdc_result.
И, собственно, главная проблема - CS02:
Code:
READ TABLE gt_bdc_result ASSIGNING <transresult> WITH KEY msgtyp = 'S'.
CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
EXPORTING
material = material
plant = so_werks-low
bom_usage = '1'
valid_from = date
TABLES
t_stpo = lt_bom_main_table.
READ TABLE gt_bdc_result ASSIGNING <transresult> WITH KEY msgtyp = 'S'.
REFRESH gt_bdc_data.
PERFORM bdc_dynpro USING 'SAPLCSDI' '0100'.
PERFORM bdc_field USING 'BDC_OKCODE' '/00'.
SHIFT material LEFT DELETING LEADING '0'.
PERFORM bdc_field USING 'RC29N-MATNR' material.
PERFORM bdc_field USING 'RC29N-WERKS' so_werks-low.
PERFORM bdc_field USING 'RC29N-STLAN' '1'.
PERFORM bdc_field USING 'RC29N-AENNR' <transresult>-msgv1.
PERFORM bdc_date USING 'RC29N-DATUV' sy-datum.
PERFORM bdc_dynpro USING 'SAPLCCCN' '0201'.
PERFORM bdc_field USING 'BDC_OKCODE' '=CLWI'.
PERFORM bdc_dynpro USING 'SAPLCSDI' '2150'.
PERFORM bdc_field USING 'BDC_OKCODE' '=FCDL'.
DESCRIBE TABLE lt_bom_main_table LINES bom_lines.
WHILE bom_lines GT 0.
WRITE bom_lines TO txt_indx.
IF bom_lines GE 10.
CONCATENATE 'RC29P-AUSKZ(' txt_indx ')' INTO bdcommand.
ELSE.
CONCATENATE 'RC29P-AUSKZ(0' txt_indx ')' INTO bdcommand.
ENDIF.
PERFORM bdc_field USING bdcommand 'X'.
bom_lines = bom_lines - 1.
CLEAR bdcommand.
ENDWHILE.
PERFORM bdc_dynpro USING 'SAPLSP01' '0100'.
PERFORM bdc_field USING 'BDC_OKCODE' '=YES'.
PERFORM bdc_dynpro USING 'SAPLCSDI' '2150'.
PERFORM bdc_field USING 'BDC_OKCODE' '=TCDO'.
last_okcode = '=TCDO'.
CALL FUNCTION 'CSAP_MAT_BOM_CLOSE'.
BREAK-POINT.
read_specification( ).
DESCRIBE TABLE mt_specification_dms LINES bom_lines.
index = 1.
WHILE index LE bom_lines.
READ TABLE mt_specification_dms ASSIGNING <mt_element> INDEX index.
WRITE <mt_element>-postp TO bdvalue.
WRITE index TO txt_indx.
IF index GE 10.
CONCATENATE 'RC29P-POSTP(' txt_indx ')' INTO bdcommand.
ELSE.
CONCATENATE 'RC29P-POSTP(0' txt_indx ')' INTO bdcommand.
ENDIF.
IF bdvalue EQ 'T'.
IF last_okcode EQ '=TCDO'.
PERFORM bdc_dynpro USING 'SAPLCSDI' '2150'.
PERFORM bdc_field USING 'BDC_OKCODE' '=TCMA'.
last_okcode = '=TCMA'.
ENDIF.
PERFORM bdc_field USING bdcommand 'D'.
CLEAR bdcommand.
PERFORM bdc_field USING 'RC29P-DOKNR' <mt_element>-doknr.
PERFORM bdc_field USING 'RC29P-DOKAR' <mt_element>-dokar.
PERFORM bdc_field USING 'RC29P-DOKTL' <mt_element>-doktl.
PERFORM bdc_field USING 'RC29P-DOKVR' <mt_element>-dokvr.
PERFORM bdc_digit USING 'RC29P-MENGE' <mt_element>-menge.
ELSEIF bdvalue EQ 'D'.
IF last_okcode EQ '=TCMA'.
PERFORM bdc_dynpro USING 'SAPLCSDI' '2150'.
PERFORM bdc_field USING 'BDC_OKCODE' '=TCDO'.
last_okcode = '=TCDO'.
ENDIF.
PERFORM bdc_field USING bdcommand 'L'.
CLEAR bdcommand.
SELECT SINGLE objky FROM drad INTO material WHERE doknr EQ <mt_element>-doknr AND dokob EQ 'MARA'.
SHIFT material LEFT DELETING LEADING '0'.
IF index GE 10.
CONCATENATE 'RC29P-IDNRK(' txt_indx ')' INTO bdcommand.
ELSE.
CONCATENATE 'RC29P-IDNRK(0' txt_indx ')' INTO bdcommand.
ENDIF.
PERFORM bdc_field USING bdcommand material.
CLEAR bdcommand.
IF index GE 10.
CONCATENATE 'RC29P-MENGE(' txt_indx ')' INTO bdcommand.
ELSE.
CONCATENATE 'RC29P-MENGE(0' txt_indx ')' INTO bdcommand.
ENDIF.
PERFORM bdc_digit USING bdcommand <mt_element>-menge.
CLEAR bdcommand.
IF index GE 10.
CONCATENATE 'RC29P-MEINS(' txt_indx ')' INTO bdcommand.
ELSE.
CONCATENATE 'RC29P-MEINS(0' txt_indx ')' INTO bdcommand.
ENDIF.
PERFORM bdc_field USING bdcommand <mt_element>-meins.
CLEAR bdcommand.
IF index GE 10.
CONCATENATE 'RC29P-SORTF(' txt_indx ')' INTO bdcommand.
ELSE.
CONCATENATE 'RC29P-SORTF(0' txt_indx ')' INTO bdcommand.
ENDIF.
PERFORM bdc_field USING bdcommand <mt_element>-sortf.
CLEAR bdcommand.
ELSE.
MESSAGE s500(fe) WITH 'Ошибка при изменении спецификации(предусмотрены позиции типов D, L)' DISPLAY LIKE 'E'.
ENDIF.
index = index + 1.
ENDWHILE.
gs_draw-doktl = 'V02'.
read_specification( ).
DESCRIBE TABLE mt_specification_dms LINES bom_lines.
old_index = index.
index = 1.
WHILE index LE bom_lines.
READ TABLE mt_specification_dms ASSIGNING <mt_element> INDEX index.
WRITE <mt_element>-postp TO bdvalue.
WRITE old_index TO txt_indx.
IF old_index GE 10.
CONCATENATE 'RC29P-POSTP(' txt_indx ')' INTO bdcommand.
ELSE.
CONCATENATE 'RC29P-POSTP(0' txt_indx ')' INTO bdcommand.
ENDIF.
IF bdvalue EQ 'T'.
IF last_okcode EQ '=TCDO'.
PERFORM bdc_dynpro USING 'SAPLCSDI' '2150'.
PERFORM bdc_field USING 'BDC_OKCODE' '=TCMA'.
last_okcode = '=TCMA'.
ENDIF.
PERFORM bdc_field USING bdcommand 'D'.
CLEAR bdcommand.
PERFORM bdc_field USING 'RC29P-DOKNR' <mt_element>-doknr.
PERFORM bdc_field USING 'RC29P-DOKAR' <mt_element>-dokar.
PERFORM bdc_field USING 'RC29P-DOKTL' <mt_element>-doktl.
PERFORM bdc_field USING 'RC29P-DOKVR' <mt_element>-dokvr.
PERFORM bdc_digit USING 'RC29P-MENGE' <mt_element>-menge.
ELSEIF bdvalue EQ 'D'.
IF last_okcode EQ '=TCMA'.
PERFORM bdc_dynpro USING 'SAPLCSDI' '2150'.
PERFORM bdc_field USING 'BDC_OKCODE' '=TCDO'.
last_okcode = '=TCDO'.
ENDIF.
PERFORM bdc_field USING bdcommand 'L'.
CLEAR bdcommand.
SELECT SINGLE objky FROM drad INTO material WHERE doknr EQ <mt_element>-doknr AND dokob EQ 'MARA'.
SHIFT material LEFT DELETING LEADING '0'.
IF old_index GE 10.
CONCATENATE 'RC29P-IDNRK(' txt_indx ')' INTO bdcommand.
ELSE.
CONCATENATE 'RC29P-IDNRK(0' txt_indx ')' INTO bdcommand.
ENDIF.
PERFORM bdc_field USING bdcommand material.
CLEAR bdcommand.
IF old_index GE 10.
CONCATENATE 'RC29P-MENGE(' txt_indx ')' INTO bdcommand.
ELSE.
CONCATENATE 'RC29P-MENGE(0' txt_indx ')' INTO bdcommand.
ENDIF.
PERFORM bdc_digit USING bdcommand <mt_element>-menge.
CLEAR bdcommand.
IF old_index GE 10.
CONCATENATE 'RC29P-MEINS(' txt_indx ')' INTO bdcommand.
ELSE.
CONCATENATE 'RC29P-MEINS(0' txt_indx ')' INTO bdcommand.
ENDIF.
PERFORM bdc_field USING bdcommand <mt_element>-meins.
CLEAR bdcommand.
IF old_index GE 10.
CONCATENATE 'RC29P-SORTF(' txt_indx ')' INTO bdcommand.
ELSE.
CONCATENATE 'RC29P-SORTF(0' txt_indx ')' INTO bdcommand.
ENDIF.
PERFORM bdc_field USING bdcommand <mt_element>-sortf.
CLEAR bdcommand.
ELSE.
MESSAGE s500(fe) WITH 'Ошибка при изменении спецификации(предусмотрены позиции типов D, L)' DISPLAY LIKE 'E'.
ENDIF.
index = index + 1.
old_index = old_index + 1.
ENDWHILE.
IF last_okcode EQ '=TCDO'.
PERFORM bdc_dynpro USING 'SAPLCSDI' '2150'.
PERFORM bdc_field USING 'BDC_OKCODE' '=TCMA'.
CLEAR last_okcode.
ENDIF.
WRITE old_index TO txt_indx. "добавление текущей версии спецификации
IF old_index GE 10.
CONCATENATE 'RC29P-POSTP(' txt_indx ')' INTO bdcommand.
ELSE.
CONCATENATE 'RC29P-POSTP(0' txt_indx ')' INTO bdcommand.
ENDIF.
PERFORM bdc_field USING bdcommand 'D'.
SHIFT gs_draw-doknr LEFT DELETING LEADING '0'.
PERFORM bdc_field USING 'RC29P-DOKNR' gs_draw-doknr.
PERFORM bdc_field USING 'RC29P-DOKAR' gs_draw-dokar.
PERFORM bdc_field USING 'RC29P-DOKTL' '002'.
PERFORM bdc_field USING 'RC29P-DOKVR' gs_draw-dokvr.
PERFORM bdc_digit USING 'RC29P-MENGE' '1'.
PERFORM bdc_dynpro USING 'SAPLSP01' '0100'.
PERFORM bdc_field USING 'BDC_OKCODE' '=YES'.
BREAK-POINT.
gs_bdc_params-dismode = 'E'.
gs_bdc_params-nobinpt = abap_true.
REFRESH gt_bdc_result.
CALL TRANSACTION 'CS02' USING gt_bdc_data
OPTIONS FROM gs_bdc_params
MESSAGES INTO gt_bdc_result.
Пример части БДЦ-таблицы, сформированной этим кодом на момент запуска транзакции:
http://pixs.ru/showimage/SnimokJPG_4257582_21647438.jpg