*&---------------------------------------------------------------------* *& Report Z_NEBP_RAHMEN *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT Z_NEBP_RAHMEN. TABLES: ZNEBP_BELEGE. DATA: PARAM TYPE TPARA-PARAMID VALUE 'BES', I_BES TYPE EKPO-EBELN, II_BES TYPE EKPO-EBELN, I_BEST TYPE SEQG3-GARG, I_SPERR TYPE EKKO, ENQ LIKE TABLE OF SEQG3 WITH HEADER LINE, I_ZNEBP_BELEGE LIKE TABLE OF ZNEBP_BELEGE WITH HEADER LINE, SAVE_FLAG, SAVE_FLAG_FB60, NEBP_EBELN TYPE ZNEBP_BELEGE-NEBP_EBELN, NB_EBELN TYPE ZNEBP_BELEGE-NB_EBELN, I_VPROZ TYPE P LENGTH 3 DECIMALS 2 VALUE '1.99', NUMBER LIKE SY-TABIX, SUBRC LIKE SY-SUBRC. DATA: TEKPO LIKE TABLE OF BEKPO WITH HEADER LINE, TEKET LIKE TABLE OF BEKET WITH HEADER LINE, TEKKN LIKE TABLE OF EKKNU WITH HEADER LINE, TKOMV LIKE TABLE OF KOMV WITH HEADER LINE, POITEM LIKE TABLE OF BAPIMEPOITEM WITH HEADER LINE, I_EKKO TYPE EKKO, EXPPURCHASEORDER LIKE BAPIMEPOHEADER-PO_NUMBER, TBEST_RETURN LIKE TABLE OF BAPIRET2 WITH HEADER LINE, SD_RETURN LIKE TABLE OF BAPIRET2 WITH HEADER LINE. DATA: VBELN LIKE VBAK-VBELN, NETWR LIKE VBAK-NETWR, I_BSART LIKE I_EKKO-BSART, I_KART LIKE I_EKKO-BSTYP, I_FILTER LIKE TABLE OF ZNEBP_FILTER WITH HEADER LINE, I_TAB_COND TYPE C LENGTH 255, LINK TYPE C LENGTH 3, LINK_AD TYPE C LENGTH 3, SUCCESS, COUNTER TYPE I, TRANSACTION TYPE C LENGTH 6. DATA: CODE TYPE TABLE OF ZRSSOURCE-LINE, PROG TYPE C LENGTH 8, MSG TYPE C LENGTH 120, LIN TYPE C LENGTH 3, WRD TYPE C LENGTH 10, OFF TYPE C LENGTH 3, TRUE TYPE C LENGTH 1. FIELD-SYMBOLS: <COND> TYPE C. DATA ZEILEN TYPE I. DATA: BEGIN OF I_VBELN OCCURS 0, VBELN TYPE C LENGTH 18, END OF I_VBELN. DATA: BEGIN OF T_BEDAT OCCURS 0, SIGN TYPE C LENGTH 1,
OPTION TYPE C LENGTH 2, LOW TYPE C LENGTH 8, HIGH TYPE C LENGTH 8, END OF T_BEDAT. SELECT-OPTIONS P_BSART FOR I_EKKO-BSART NO-DISPLAY. SELECT-OPTIONS P_BEDAT FOR I_EKKO-BEDAT NO-DISPLAY. SELECT-OPTIONS P_EKGRP FOR I_EKKO-EKGRP NO-DISPLAY. DO. * Bei der externen Aufwandbuchung keine Endlosschleife IF TRANSACTION = 'FB60'. EXIT. SAVE_FLAG = ''. " Flag zurücksetzen COUNTER = COUNTER + 1. * BREAK PBOLLIG. EXPORT SAVE_FLAG TO MEMORY ID 'NEBP_SAVE'. SET PARAMETER ID PARAM FIELD I_BES. IMPORT TRANSACTION FROM MEMORY ID 'TCFB60'. * Absprung zu Bestellung * SUBMIT RM_MEPO_GUI AND RETURN. IF SY-TCODE = 'ZME21N' AND TRANSACTION NE 'FB60'. TRANSACTION = 'ZME21N'. EXPORT TRANSACTION TO MEMORY ID 'TCODE'. CALL TRANSACTION 'ME21N'. ELSEIF SY-TCODE = 'ZME22N' AND TRANSACTION NE 'FB60'. TRANSACTION = 'ZME22N'. EXPORT TRANSACTION TO MEMORY ID 'TCODE'. * Warten, damit der Sperreintrag sicher entfernt ist WAIT UP TO 1 SECONDS. CALL TRANSACTION 'ME22N'. ELSEIF TRANSACTION = 'FB60'. TRANSACTION = 'FB60'. EXPORT TRANSACTION TO MEMORY ID 'TCODE'. * Der Dynpro-Parameter soll die originäre Bestellnummer behalten, sonst * sieht man in ähnlichen Transaktionen die interne Bestellnummer. * z.b. würde die Transaktion ME9f (Drucken) die interne Bestellung drucken. GET PARAMETER ID PARAM FIELD II_BES. IF NOT II_BES BETWEEN 8100000000 AND 8199999999. I_BES = II_BES. ELSE. SET PARAMETER ID PARAM FIELD I_BES. *----------------------------------------------------------------------* * Aus der externen Aufwandbuchung zur Kreditorenrechnung soll der interne Prozess * NEBP-like durchlaufen werden. D.h. erstellen einer int. Bestellung, anlegen * eines SD-Auftrages, Faktura, Fakturaübernahme und anschließend die * interne Aufwandsbuchung. *----------------------------------------------------------------------* * Nur die Dialogverarbeitung legt eine externe Bestellung an, der Aufruf über die FB60 (Kreditorenrechnung) * springt gleich zur Anlage der internen Bestellung. IMPORT TEKPO FROM MEMORY ID 'NEBP_TEKPO'. IMPORT TEKET FROM MEMORY ID 'NEBP_TEKET'. IMPORT TEKKN FROM MEMORY ID 'NEBP_TEKKN'. IMPORT TKOMV FROM MEMORY ID 'NEBP_TKOMV'.
IMPORT I_EKKO FROM MEMORY ID 'NEBP_I_EKKO'. IMPORT SAVE_FLAG FROM MEMORY ID 'NEBP_SAVE'. IMPORT SAVE_FLAG_FB60 FROM MEMORY ID 'NEBP_FB60'. " wenn die Bestellung nicht gesichert werden soll, verlasse die Schleife IF SAVE_FLAG IS INITIAL AND SAVE_FLAG_FB60 IS INITIAL. EXIT. * eine interne Bestellung wird nur angelegt, wenn die Filterbedingungen stimmen * 1. Belegart * 1.1 Filterbedingung lesen CLEAR I_FILTER[]. CLEAR P_BSART. SELECT ZNEBP_FILTER~ZSIGN ZNEBP_FILTER~ZOPTION ZNEBP_FILTER~LOW ZNEBP_FILTER~HIGH FROM ZNEBP_FILTER INTO (P_BSART-SIGN, P_BSART-OPTION, P_BSART-LOW, P_BSART-HIGH) WHERE FART = 'BSART'. APPEND P_BSART. ENDSELECT. * 1.2 Filterbedingung anwenden CLEAR CODE[]. CLEAR TRUE. CLEAR LINK_AD. CLEAR I_TAB_COND. IF NOT I_EKKO-BSART IN P_BSART. CONTINUE. * 2. Belegdatum CLEAR P_BEDAT. SELECT ZNEBP_FILTER~ZSIGN ZNEBP_FILTER~ZOPTION ZNEBP_FILTER~LOW ZNEBP_FILTER~HIGH FROM ZNEBP_FILTER INTO (T_BEDAT-SIGN, T_BEDAT-OPTION, T_BEDAT-LOW, T_BEDAT-HIGH) WHERE FART = 'BELDAT'. APPEND T_BEDAT. ENDSELECT. * Die Typkonvertierung mit WRITE LOOP AT T_BEDAT. WRITE T_BEDAT TO P_BEDAT. APPEND P_BEDAT. ENDLOOP. IF NOT I_EKKO-BEDAT IN P_BEDAT. CONTINUE. * 3. Die Einkäufergruppe für die der Prozess relevant ist SELECT ZNEBP_FILTER~ZSIGN ZNEBP_FILTER~ZOPTION ZNEBP_FILTER~LOW ZNEBP_FILTER~HIGH FROM ZNEBP_FILTER INTO (P_EKGRP-SIGN, P_EKGRP-OPTION, P_EKGRP-LOW, P_EKGRP-HIGH) WHERE FART = 'EKGRP'. APPEND P_EKGRP. ENDSELECT. IF NOT I_EKKO-EKGRP IN P_EKGRP. CONTINUE. * Weitere Filter werden während der Verarbeitung der internen Bestellung durchlaufen * Der Beleg ist zunächst noch Unvollständig bis auch die interne Bestellung * und der Sd-Beleg erfolgreich angelegt wurden. Dadurch wird verhindert, dass * ein WE oder RE gebucht werden kann.
READ TABLE TEKPO INDEX 1 INTO TEKPO. "erste Zeile in den Arbeitsbereich * UPDATE EKKO SET MEMORY = 'X' WHERE * EBELN = TEKPO-EBELN OR * EBELN = I_BES. * COMMIT WORK AND WAIT. * Merke mir die Bestellnummer in der Tabelle ZNEBP_BELEGE * Es kann sein, dass die 45...-Bestellung noch nicht committet ist, * deswegen frage auch den Parameter BES ab. LOOP AT TEKPO. CLEAR I_ZNEBP_BELEGE. CLEAR I_ZNEBP_BELEGE[]. SELECT SINGLE * FROM ZNEBP_BELEGE INTO I_ZNEBP_BELEGE WHERE NB_EBELN EQ TEKPO-EBELN AND NEBP_EBELN GT '1' AND NB_POS EQ TEKPO-EBELP " IS NOT NULL funktioniert hier nicht OR NB_EBELN EQ I_BES AND NEBP_EBELN GT '1' AND NB_POS EQ TEKPO-EBELP. " noch nicht vorhanden dann schreibe neu IF I_ZNEBP_BELEGE-NB_EBELN IS INITIAL. * MOVE TEKPO-EBELN TO I_ZNEBP_BELEGE-NB_EBELN. * LOOP AT TEKET. IF TRANSACTION = 'FB60'. MOVE I_EKKO-EBELN TO I_ZNEBP_BELEGE-NB_EBELN. MOVE I_BES TO I_ZNEBP_BELEGE-NB_EBELN. MOVE TEKPO-EBELP TO I_ZNEBP_BELEGE-NB_POS. APPEND I_ZNEBP_BELEGE. * ENDLOOP. INSERT INTO ZNEBP_BELEGE VALUES I_ZNEBP_BELEGE. COMMIT WORK. ENDLOOP. * Gehört zur externen Bestellung bereits eine * interne, wenn nicht dann wollen wir sie neu anlegen * Wenn eine neue Position an eine bestehende Bestellung angehängt wird, so kann diese natürlich * nicht in der Tabelle ZNEBP_BELEGE gefunden werden. In der Kopfzeile kann hier also die Belegnummer leer * sein, obwohl es eine interne Bestellung gibt - deshalb ein Read Table mit Ergebnis in die Kopfzeile - * READ TABLE I_ZNEBP_BELEGE WITH KEY NEBP_EBELN = TEKPO-EBELN INTO I_ZNEBP_BELEGE. NEBP_EBELN = I_ZNEBP_BELEGE-NEBP_EBELN. IF I_ZNEBP_BELEGE-NEBP_EBELN IS INITIAL. "nachschauen ob es überhaupt eine int.bestellung dazu gibt SELECT SINGLE * FROM ZNEBP_BELEGE INTO I_ZNEBP_BELEGE WHERE NB_EBELN EQ TEKPO-EBELN AND NEBP_EBELN GT '1' OR NB_EBELN EQ I_BES AND NEBP_EBELN GT '1'. NEBP_EBELN = I_ZNEBP_BELEGE-NEBP_EBELN. NB_EBELN = I_ZNEBP_BELEGE-NB_EBELN. PERFORM INT_BEST IN PROGRAM Z_NEBP_UE TABLES TEKPO TEKET TEKKN TKOMV USING I_EKKO NEBP_EBELN NB_EBELN. * Rückgabeparameter der internen Bestellung IMPORT EXPPURCHASEORDER FROM MEMORY ID 'NEBP_EXPPURCHASEORDER'. IMPORT POITEM FROM MEMORY ID 'NEBP_NB_POITEM'.
IMPORT TBEST_RETURN FROM MEMORY ID 'NEBP_EX_RETURN'. * War die Anlage der internen Bestellung erfolgreich? * IF EXPPURCHASEORDER IS INITIAL. CALL FUNCTION 'Z_POPUP_RETURN_PARAM' TABLES RETURN = TBEST_RETURN. CLEAR SUCCESS. IF NOT EXPPURCHASEORDER = 'NV' OR NOT EXPPURCHASEORDER IS INITIAL. PERFORM CREATE_SD IN PROGRAM Z_NEBP_UE TABLES TKOMV USING EXPPURCHASEORDER SUCCESS TRANSACTION. SUCCESS = 'X'. IMPORT SD_RETURN FROM MEMORY ID 'NEBP_SD_RETURN'. IMPORT VBELN FROM MEMORY ID 'NEBP_SD_VBLEN'. * War die Anlage des SD-Auftrags erfolgreich? IF SUCCESS IS INITIAL. * CALL FUNCTION 'Z_POPUP_RETURN_PARAM' * TABLES * RETURN = SD_RETURN. * Hier könnte man eine e-mail versenden lassen * na, dann ist ja alles glatt gelaufen * Der Beleg ist nun vollständig * UPDATE EKKO SET MEMORY = ' ' WHERE * EBELN = TEKPO-EBELN. * COMMIT WORK AND WAIT. " Bei Änderung der Bestellung - Fehlerfall wird keine interne Bestellnummer zurückgeliefert. " Dann soll die Verknüpfung zur ursprünglichen Bestellung auch nicht verloren gehen. IF EXPPURCHASEORDER IS INITIAL. MOVE I_ZNEBP_BELEGE-NEBP_EBELN TO EXPPURCHASEORDER. " Das gleiche gilt auch für den SD-Auftrag * IF VBELN IS INITIAL. * MOVE I_ZNEBP_BELEGE-NEBP_SD TO VBELN. * * Alle drei Belegnummern in die Tabelle znebp_belege LOOP AT POITEM. IF POITEM-PO_ITEM > 0. MOVE NB_EBELN TO I_ZNEBP_BELEGE-NB_EBELN. * IF NEBP_EBELN eq 'NV'. * MOVE NEBP_EBELN TO EXPPURCHASEORDER. * MOVE EXPPURCHASEORDER TO I_ZNEBP_BELEGE-NEBP_EBELN. MOVE POITEM-PO_ITEM TO I_ZNEBP_BELEGE-NB_POS. * MOVE VBELN TO I_ZNEBP_BELEGE-NEBP_SD. UPDATE ZNEBP_BELEGE SET NEBP_EBELN = EXPPURCHASEORDER WHERE NB_EBELN EQ I_ZNEBP_BELEGE-NB_EBELN AND NB_POS EQ I_ZNEBP_BELEGE-NB_POS. IF SY-SUBRC <> 0.
INSERT INTO ZNEBP_BELEGE VALUES I_ZNEBP_BELEGE. ENDLOOP. COMMIT WORK AND WAIT. ENDDO.