Специалист |
 |
Зарегистрирован: Ср, ноя 14 2007, 13:09 Сообщения: 114
|
Лучше пакетником. На входе список матеиалов с указанием передаваемого количества.
Вот пример.
REPORT ZMOVESPARE MESSAGE-ID MG LINE-SIZE 80 LINE-COUNT 65 NO STANDARD PAGE HEADING. TABLES: MARD,MCHB,MARC. DATA: KK(15),DD1(8),DD2(8),I(3) TYPE N. DATA: N LIKE SY-TABIX, S LIKE SY-TABIX. SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME TITLE TEXT-M01. PARAMETERS: WERKS LIKE MARD-WERKS MEMORY ID WRK OBLIGATORY, " Завод LGORT LIKE MARD-LGORT OBLIGATORY, " Склад UMLGO LIKE MARD-LGORT OBLIGATORY, BLDAT LIKE MKPF-BLDAT DEFAULT SY-DATUM, BUDAT LIKE MKPF-BUDAT DEFAULT SY-DATUM, FILENAME LIKE RLGRAP-FILENAME MEMORY ID ZSZ, ZMODE(1) TYPE C DEFAULT 'E'. "Режим обработки транзакц. * lll default 'X' as checkbox. RANGES L_LGORT FOR T001L-LGORT. SELECTION-SCREEN END OF BLOCK BL1. DATA : BEGIN OF OS OCCURS 100, "Структура входного файла MATNR(6) TYPE C, " Номер материала KOLVO LIKE MSEG-ERFMG, " Количество END OF OS. DATA: BEGIN OF BDC OCCURS 5000. "Структура BDC INCLUDE STRUCTURE BDCDATA. DATA: END OF BDC. DATA: BEGIN OF TAB OCCURS 5000, "Структура рабочей таблицы мат-лов MATNR(18), " Номер материала CHARG LIKE MCHB-CHARG, " Номер партии, или склада ERFMG LIKE MSEG-ERFMG. " Количество DATA:END OF TAB. DATA: CH(5) TYPE N,L(4),KODMTR(18) TYPE C,LINE_NUMB TYPE N. INITIALIZATION. *ПРи выборе имени файла AT SELECTION-SCREEN ON VALUE-REQUEST FOR FILENAME . CALL FUNCTION 'WS_FILENAME_GET' EXPORTING DEF_FILENAME = SPACE DEF_PATH = SPACE MASK = ',*.txt ,*.txt.' MODE = 'O' IMPORTING FILENAME = FILENAME EXCEPTIONS INV_WINSYS = 01 NO_BATCH = 02 SELECTION_CANCEL = 03 SELECTION_ERROR = 04.
AT SELECTION-SCREEN . IF BLDAT = '00000000'.BLDAT = SY-DATUM.ENDIF. IF BUDAT = '00000000'.BUDAT = SY-DATUM.ENDIF. DD1 = BLDAT+6(2).MOVE BLDAT+4(2) TO DD1+2(2).MOVE BLDAT(4) TO DD1+4(4). DD2 = BUDAT+6(2).MOVE BUDAT+4(2) TO DD2+2(2).MOVE BUDAT(4) TO DD2+4(4). AUTHORITY-CHECK OBJECT 'M_MSEG_WWA' ID 'ACTVT' FIELD '02' ID 'WERKS' FIELD WERKS. IF SY-SUBRC NE 0. MESSAGE E002 WITH 'Нет полномочий на движение материала по заводу'. ENDIF. *-------------- START-OF-SELECTION -------------------- START-OF-SELECTION. CLEAR OS. CALL FUNCTION 'UPLOAD' "Загрузка списка матералов" EXPORTING FILENAME = FILENAME FILETYPE = 'DAT' TABLES DATA_TAB = OS. CLEAR OS. DESCRIBE TABLE OS LINES LINE_NUMB. IF LINE_NUMB = 0. WRITE / 'Список материалов пуст!'. EXIT. ENDIF.
*if lll = 'X'. l = '=NO'.else.l = '=YES'.endif. FREE TAB. * Выбор данных записей материала в раб.табл. STR LOOP AT OS. KODMTR = '000000000000'. KODMTR+12(6) = OS-MATNR. SELECT SINGLE * FROM MARD WHERE WERKS = WERKS AND LGORT = LGORT AND MATNR = KODMTR. IF SY-SUBRC EQ 0. CHECK MARD-LABST NE 0. CLEAR TAB.MOVE MARD-MATNR TO TAB-MATNR. SELECT SINGLE * FROM MARC WHERE MATNR = MARD-MATNR AND WERKS = MARD-WERKS . IF MARC-XCHAR = ' '. MOVE MARD-LABST TO TAB-ERFMG. I = I + 1. IF I > 100. EXIT. ENDIF. IF OS-KOLVO GT TAB-ERFMG. "В списке количество превышает складское? WRITE: / 'Ошибка ', OS-MATNR, OS-KOLVO, 'Больше чем на складе', TAB-ERFMG, 'Строка пропускается'. ELSE. MOVE OS-KOLVO TO TAB-ERFMG. APPEND TAB. ENDIF. ELSE. "ведение партиями SELECT * FROM MCHB WHERE MATNR = MARD-MATNR AND WERKS = MARD-WERKS AND LGORT = MARD-LGORT. CHECK MCHB-CLABS NE 0. MOVE MCHB-CLABS TO TAB-ERFMG.MOVE MCHB-CHARG TO TAB-CHARG. ENDSELECT. I = I + 1. IF I > 100. EXIT. ENDIF. IF OS-KOLVO GT TAB-ERFMG. "В списке количество превышает складское? WRITE: / 'Ошибка ', OS-MATNR, OS-KOLVO, 'Больше чем на складе', TAB-ERFMG, 'Строка пропускается'. ELSE. MOVE OS-KOLVO TO TAB-ERFMG. APPEND TAB. ENDIF.
ENDIF. ENDIF. *ENDSELECT. ENDLOOP. SORT TAB BY MATNR CHARG. DESCRIBE TABLE TAB LINES N. IF N = 0.WRITE: 'Указанных запасов нет на складе',LGORT.EXIT. ENDIF. END-OF-SELECTION. *-------------- END-OF-SELECTION -------------------- * Заполнение динпро 400 и переход на 421 S = 0. PERFORM ZAP_D400. " Заполнение динпро 400 и переход на 421 CLEAR TAB. LOOP AT TAB. ADD 1 TO S. I = SY-TABIX. WRITE TAB-ERFMG LEFT-JUSTIFIED TO KK. * Заполнение строк экрана 410 PERFORM ZAP_421. ENDLOOP. CALL TRANSACTION 'MB1B' USING BDC MODE ZMODE UPDATE 'N'. IF SY-SUBRC NE 0. WRITE :/ TAB-MATNR,SY-MSGID,SY-MSGNO. WRITE: '-не перенесен'. ENDIF. * Заполнение динпро 400 FORM ZAP_D400. REFRESH BDC. CLEAR BDC. PERFORM DYNPRO USING: * 0400 'X' 'SAPMM07M' '0400', ' ' 'BDC_CURSOR' 'MKPF-BUDAT', ' ' 'MKPF-BLDAT' DD1, " Дата документа ' ' 'MKPF-BUDAT' DD2, " Дата поставки ' ' 'RM07M-BWARTWA' '311', " Вид движения ' ' 'RM07M-WERKS' WERKS, " ЗАВОД ' ' 'RM07M-LGORT' LGORT, " СКЛАД ' ' 'RM07M-XNAPR' 'X', " Печать ' ' 'RM07M-WVERS3' 'X', " Сводная накладная ' ' 'BDC_OKCODE' '/00'. " Переход на d421 ENDFORM. * Заполнение строк экрана 421 FORM ZAP_421. IF N = 1. "если входной файл состоит из 1 записи PERFORM DYNPRO USING: 'X' 'SAPMM07M' '0421', ' ' 'BDC_OKCODE' '=BU', ' ' 'MSEGK-UMLGO' UMLGO, ' ' 'MSEG-MATNR(01)' TAB-MATNR+12(6), ' ' 'MSEG-ERFMG(01)' KK, ' ' 'MSEG-CHARG(01)' TAB-CHARG. PERFORM D002. ELSEIF SY-TABIX = 1."если не одна строка во внеш.файле, но первая, PERFORM DYNPRO USING: " пока не сохраняем 'X' 'SAPMM07M' '0421', ' ' 'BDC_OKCODE' '=NLE', ' ' 'MSEGK-UMLGO' UMLGO, ' ' 'MSEG-MATNR(01)' TAB-MATNR+12(6), ' ' 'MSEG-ERFMG(01)' KK, ' ' 'MSEG-CHARG(01)' TAB-CHARG. PERFORM D002. ELSEIF SY-TABIX = N. "последняя, надо сохранить PERFORM DYNPRO USING: 'X' 'SAPMM07M' '0421', ' ' 'BDC_OKCODE' '=BU', ' ' 'MSEGK-UMLGO' UMLGO, ' ' 'MSEG-MATNR(01)' TAB-MATNR+12(6), ' ' 'MSEG-ERFMG(01)' KK, ' ' 'MSEG-CHARG(01)' TAB-CHARG. PERFORM D002. ELSE. "запись в средине файла PERFORM DYNPRO USING: 'X' 'SAPMM07M' '0421', ' ' 'BDC_OKCODE' '=NLE', ' ' 'MSEGK-UMLGO' UMLGO, ' ' 'MSEG-MATNR(01)' TAB-MATNR+12(6), ' ' 'MSEG-ERFMG(01)' KK, ' ' 'MSEG-CHARG(01)' TAB-CHARG. PERFORM D002. ENDIF. ENDFORM. " ZAP_421 * Заполнение таблицы BDC FORM DYNPRO USING DYNBEGIN NAME VALUE. IF DYNBEGIN = 'X'. CLEAR BDC. MOVE: NAME TO BDC-PROGRAM, VALUE TO BDC-DYNPRO, 'X' TO BDC-DYNBEGIN.
APPEND BDC. ELSE. CLEAR BDC. MOVE: NAME TO BDC-FNAM, VALUE TO BDC-FVAL. APPEND BDC. ENDIF. ENDFORM. *&---------------------------------------------------------------------* FORM D002. PERFORM DYNPRO USING: 'X' 'SAPLKACB' '0002', ' ' 'BDC_OKCODE' '=ENTE', 'X' 'SAPLKACB' '0002', ' ' 'BDC_OKCODE' '=ENTE'. ENDFORM. " D002
*&---------------------------------------------------------------------*
[/list][/list]
|
|
|