Текущее время: Ср, июл 23 2025, 02:54

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Проблема с BDC для транзакции CS02
СообщениеДобавлено: Пт, апр 22 2016, 11:36 
Специалист
Специалист

Зарегистрирован:
Ср, окт 07 2015, 12:36
Сообщения: 124
Коллеги, доброго времени суток всем.

Хотел спросить, приходилось ли кому делать пакетный ввод (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


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Проблема с BDC для транзакции CS02
СообщениеДобавлено: Пн, апр 25 2016, 09:40 
Специалист
Специалист

Зарегистрирован:
Ср, окт 07 2015, 12:36
Сообщения: 124
Неужели никто не занимался пакетным вводом?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Проблема с BDC для транзакции CS02
СообщениеДобавлено: Пн, апр 25 2016, 16:19 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
Цитата:
сначала хотел руками таблицы править, но потом понял, что гиблое дело - слишком много всяких левых счётчиков и ссылок везде,

это исключено.

Цитата:
а вот CS02 максимум удаляет старые позиции, а дальше ничего не происходит.

Что значит ничего не происходит? карта пакетного ввода может "потеряться" если в коде например есть coomit work, а Вы в свою очередь не используете спец опцию racommit (гуглите).

Может кривая сама запись пакетника.

Какие симптомы в режиме А?

Цитата:
даже выглядит иначе

На этот счет тоже есть спец опции при запуске call transaction (f1 жмите на операторе см дополнение options)

Еще вариант, так как Вы работаете с двумя связанными объектами, может первый не успевает закомититься. Там уже нужно смотреть по ситуации от использования типа обновления L до оборачивания процесса в ФМ с отложенным запуском.

Нужны детали.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB