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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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