BDC - это технология для записи и воспроизведения транзакций. Не всегда известна логика работы транзакции, а провести при помощи нее данные необходимо или нам нужен ввод каких-либо повторяющихся данных.
Транзакция в которой осуществляется запись сеанса пакетного ввода является SHDB или SM35.
Создадим сеанс пакетного ввода зайдем в транзакцию SM35.
Примечание: Запись транзакции будет происходить до первого COMMIT WORK
Попадаем в указанную транзакцию и выполняем необходимый ввод. После чего нажимаем кнопку сохранить.
После сохранения открывается следующий экран. Уже видно, как заполняются поля. Данные последовательности мы можем менять по своему усмотрению, разобраться довольно просто.
Сам сеанс нельзя переносить между системами, но его можно записывать в любой из них. Если есть необходимость использовать его в своей разработке или доработке Можно сгенерировать программу или функциональный модуль.
Вводим параметры также как и при создании обычной программы.
На выходе получаем готовую программу.
Существуют два режима работы.
1. Создать сеанс - создает сеанс пакетного ввода в SM35
2. Call Transaction - запуск транзакции разу. При этом можно ввести режим выполнения и обновления.
Режимы выполнения:
N - запуск в фоновом режиме
A - запуск в диалоговом режиме
E - экраны не отображаются, кроме возникновения ошибок
Режимы обновления
A - COMMIT WORK
S - COMMIT WORK AND WAIT
L - IN UPDATE TASK
Однако, в таком виде программа будет не пригодна для использования. Т.к. файл данных по умолчанию система ищет на сервере. Надо переделывать на чтение файла локального каталога. Программа довольно простая, думаю, особых комментариев не требует. Очень легко корректируются под свои нужды.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
report Z_TEST_PA30 no standard page heading line-size 255. * Include bdcrecx1_s: * The call transaction using is called WITH AUTHORITY-CHECK! * If you have own auth.-checks you can use include bdcrecx1 instead. include bdcrecx1_s. parameters: dataset(132) lower case. *** DO NOT CHANGE - the generated data section - DO NOT CHANGE *** * * If it is nessesary to change the data section use the rules: * 1.) Each definition of a field exists of two lines * 2.) The first line shows exactly the comment * '* data element: ' followed with the data element * which describes the field. * If you don't have a data element use the * comment without a data element name * 3.) The second line shows the fieldname of the * structure, the fieldname must consist of * a fieldname and optional the character '_' and * three numbers and the field length in brackets * 4.) Each field must be type C. * *** Generated data section with specific formatting - DO NOT CHANGE *** data: begin of record, * data element: PERNR_D PERNR_001(038), * data element: TIMRE TIMR6_002(001), * data element: PERNR_D PERNR_003(038), * data element: TIMRE TIMR6_004(001), * data element: CHOIC CHOIC_005(035), * data element: PERNR_D PERNR_006(038), * data element: TIMRE TIMR6_007(001), * data element: CHOIC CHOIC_008(035), * data element: SUBTY SUBTY_009(004), * data element: BEGDA BEGDA_010(010), * data element: ENDDA ENDDA_011(010), * data element: SYSID USRID_012(030), end of record. *** End generated data section *** start-of-selection. perform open_dataset using dataset. perform open_group. do. read dataset dataset into record. if sy-subrc <> 0. exit. endif. perform bdc_dynpro using 'SAPMP50A' '1000'. perform bdc_field using 'BDC_CURSOR' 'RP50G-PERNR'. perform bdc_field using 'BDC_OKCODE' '/00'. perform bdc_field using 'RP50G-PERNR' record-PERNR_001. perform bdc_field using 'RP50G-TIMR6' record-TIMR6_002. perform bdc_dynpro using 'SAPMP50A' '1000'. perform bdc_field using 'BDC_OKCODE' '/00'. perform bdc_field using 'RP50G-PERNR' record-PERNR_003. perform bdc_field using 'RP50G-TIMR6' record-TIMR6_004. perform bdc_field using 'BDC_CURSOR' 'RP50G-CHOIC'. perform bdc_field using 'RP50G-CHOIC' record-CHOIC_005. perform bdc_dynpro using 'SAPMP50A' '1000'. perform bdc_field using 'BDC_OKCODE' '=INS'. perform bdc_field using 'RP50G-PERNR' record-PERNR_006. perform bdc_field using 'RP50G-TIMR6' record-TIMR6_007. perform bdc_field using 'BDC_CURSOR' 'RP50G-CHOIC'. perform bdc_field using 'RP50G-CHOIC' record-CHOIC_008. perform bdc_field using 'RP50G-SUBTY' record-SUBTY_009. perform bdc_dynpro using 'MP010500' '2000'. perform bdc_field using 'BDC_CURSOR' 'P0105-USRID'. perform bdc_field using 'BDC_OKCODE' '=UPD'. perform bdc_field using 'P0105-BEGDA' record-BEGDA_010. perform bdc_field using 'P0105-ENDDA' record-ENDDA_011. perform bdc_field using 'P0105-USRID' record-USRID_012. perform bdc_transaction using 'PA30'. enddo. perform close_group. perform close_dataset using dataset. |
Замечание.
Запись пакетного ввода не очень удобно использовать в случае экранной таблицы. Т.к. мы имитируем сеанс пользователя и количество строк может меняться в зависимости экрана. При этом меняется количество строк на экране. Данные просто полностью не лягут на экран. Один из вариантов решения проблемы это ввод данных в первую строку, прокручивание на одну строку вниз и опять ввод в первую строку.
Подробнее можно почитать тут.