На всякий случай выкладываю решение, как мне казалось, на распространённую проблему:
Основной метод для выравнивания используется тот, который описан в этой ноте.
Note 535043 - Stock comparison with LX23: Difference between WM and IM
Но в нем ММ-ные остатки приводятся к СУС-ным + нельзя посмотреть/скорректировать в разрезе материала(только по всему зваводу/складу).
На основе предложеноной LX23, сделал транзакция ZLX23(ниже код), в которой добавлена возможность выбирать материал(-ы) и дополнительный шаг(1-ый). Отличия смотреть через SM39. По существу добавления с подпрограммы FORM CREAT_BATCH_INCOME + ранее CASE с её вызововом.
Этот шаг оприходует разницу и ММ-е и в СУС-е.
Второй шаг спишет разницу ТОЛЬКО с ММ-е(это в исходном коде). Т.о. мы приведём остатки к к изначально равным в ММ-е.
Что надо сделать, чтобы выправить остатки:
1. В транзакции OBYC надо настроить (ВРЕМЕННО!) общие счёта для списания и прихода
Я указал счёт прихода 15* (согласовав, тут индивидуально)
2. Запустить ZLX23 с параметрами завод/склад и галкой «Z-шаг». (Желательно конкртено указывать материалы с разницами)
3. Зайти в SM35.
Разблокировать и выполнить созданный в шаге 2 пакетни MIGO_501
4. Запустить ZLX23 с параметрами завод/склад и галкой «исходный шаг». (Желательно конкртено указывать материалы с разницами)
5. Зайти в SM35.
Выполнить созданный в шаге 4 пакетник MB_MI10
6. Откатить настройки, сделанные в шаге 1.
7. Проверить наличие разниц.
Code:
REPORT RLABGL00 NO STANDARD PAGE HEADING
LINE-SIZE 132
MESSAGE-ID L1.
*-----------------------------------------------------------------------
* Der Report RLABGL00 wird ќber die Transaktion LX23 gestartet.
* Gemфп der Wahl auf dem Selektionsbild findet ein Bestands-
* abgleich zwischen Bestandsfќhrung und Lagerverwaltung statt.
*-----------------------------------------------------------------------
DATA: BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.
*-----------------------------------------------------------------------
* DATENDEKLARATION
*-----------------------------------------------------------------------
*........Tables.........................................................
TABLES: LQUA_COMP, "Lagerquants
MARA, "Materialstamm A-Segment
MSEG, "Materialsegment
T001L, "Lagerort
T001W, "Werksdaten
T320, "Zuordnung Werk Lagerort
T322, "Bestandsqual. im LVS
T340D, "Lagernummer-Infos
LMESS, "Struktur fќr Fehlermeld.
RLIST. "Interne Tab zu Para.doku.
*........Interne Tabellen...............................................
DATA: BEGIN OF IM_BESTAND OCCURS 200. "Tabelle der IM-Bestфnde
INCLUDE STRUCTURE RLMMQ.
DATA: END OF IM_BESTAND.
DATA: BEGIN OF GT_MATNR OCCURS 0,
MATNR TYPE MARA-MATNR,
END OF GT_MATNR.
*.......................................................................
DATA: BEGIN OF WM_BESTAND OCCURS 200, "Tabelle der WM-Bestфnde
LIFNR LIKE RLMMQ-LIFNR,
PSPNR LIKE RLMMQ-PSPNR,
VBELN LIKE RLMMQ-VBELN,
POSNR LIKE RLMMQ-POSNR,
LGTYP LIKE LQUA-LGTYP,
LGPLA LIKE LQUA-LGPLA.
INCLUDE STRUCTURE RLWMQ.
DATA: END OF WM_BESTAND.
*.......................................................................
DATA: BEGIN OF DIFFERENZ OCCURS 200, "Tabelle der Differenzen
IDENT(2) TYPE C,
DIFF(1) TYPE C. "Differenzensatz
INCLUDE STRUCTURE RLMMQ.
DATA: END OF DIFFERENZ.
*.......................................................................
DATA: BEGIN OF DIFFERENZ_SAVE OCCURS 200, "Tabelle der Differenzen
IDENT(2) TYPE C,
DIFF(1) TYPE C. "Differenzensatz
INCLUDE STRUCTURE RLMMQ.
DATA: END OF DIFFERENZ_SAVE.
*.......................................................................
DATA: BEGIN OF TMP_MATNR_BEST OCCURS 20, "Differenzen zum Material
IDENT(2) TYPE C, "Temporфr
DIFF(1) TYPE C. "Differenzensatz
INCLUDE STRUCTURE RLMMQ.
DATA: END OF TMP_MATNR_BEST.
*.......................................................................
DATA: BEGIN OF IT320 OCCURS 20, "Tabelle der Zuordnung
WERKS LIKE MARC-WERKS, "LVS Lagernr - RM-Lagerort
LGORT LIKE MARD-LGORT,
LGNUM LIKE LQUA-LGNUM,
OBEST LIKE T320-OBEST, "Kennzeichen fќr WM Verwaltung
CHAZV LIKE T001W-CHAZV, "Hat noch keine Bedeutung
XHUPF LIKE T001L-XHUPF, "Kennzeichen fќr HU Verwaltung
END OF IT320.
*.......................................................................
DATA: BEGIN OF WM_NEG_RET OCCURS 10, "Tabelle der negativen WM-
LIFNR LIKE RLMMQ-LIFNR, "Bestфnde (nicht automatisc
PSPNR LIKE RLMMQ-PSPNR,
VBELN LIKE RLMMQ-VBELN,
POSNR LIKE RLMMQ-POSNR.
INCLUDE STRUCTURE RLWMQ. "im IM auszubuchen
DATA: END OF WM_NEG_RET.
*......................................................................
DATA: BEGIN OF BDC_DATEN OCCURS 0.
INCLUDE STRUCTURE BDCDATA.
DATA: END OF BDC_DATEN.
*........Tabelle fќr die Prќfung des dezentralen WMS...................
DATA: IWMSDEC LIKE LWMSDEC_CHECK OCCURS 0 WITH HEADER LINE.
*........Tabelle fќr die Differnzenbuchung in der Bestandsfќhrung......
DATA: IIMSEG LIKE IMSEG OCCURS 0 WITH HEADER LINE.
*........Tabelle der erzeugten IDOCs....................................
DATA: T_IDOC_PROT LIKE SWOTOBJID OCCURS 0 WITH HEADER LINE.
*........Tabelle der protokollierten Positionen.........................
DATA: T_EMSEG_PROT LIKE EMSEG OCCURS 0 WITH HEADER LINE.
*........Feldleisten....................................................
DATA: BEGIN OF WM_SUMME. "Feldleiste zur SUMMATION
INCLUDE STRUCTURE RLMMQ. "ќber entsprechende Quants
DATA: END OF WM_SUMME.
*.......................................................................
DATA: BEGIN OF TMP_IM_SATZ, "Temporфrer IM-Satz(Ausgabe)
IDENT(2) TYPE C,
DIFF(1) TYPE C. "Differenzensatz
INCLUDE STRUCTURE RLMMQ. "ќber entsprechende Quants
DATA: END OF TMP_IM_SATZ.
*.......................................................................
DATA: BEGIN OF ALT_WM_BESTAND, "Feldleiste IM-Bestфnde
LIFNR LIKE RLMMQ-LIFNR, "in Schleifendurchlauf
PSPNR LIKE RLMMQ-PSPNR,
VBELN LIKE RLMMQ-VBELN,
POSNR LIKE RLMMQ-POSNR.
INCLUDE STRUCTURE RLWMQ.
DATA: END OF ALT_WM_BESTAND.
*.......................................................................
DATA: BEGIN OF YWEWA OCCURS 50. "Fќr Aufruf MI40 Export in
INCLUDE STRUCTURE BISEG. "Memory
DATA: END OF YWEWA.
*........Struktur fќr den IM-Beleg-Kopf.................................
DATA: BEGIN OF KOPF.
INCLUDE STRUCTURE IMKPF.
DATA: END OF KOPF.
*........Steuerfelder fќr Tabellenvergleich.............................
DATA: IM_LINES TYPE P, "Anzahl Tabelleneintrфge IM_BE.
WM_LINES TYPE P, "Anzahl Tabelleneintrфge WM_BE.
WM_NEG_LINES TYPE P, "Anzahl Tabelleneintrфge WM_neg
IM_TABIX TYPE P, "Aktuelle Tabellenposition IM_BE
WM_TABIX TYPE P, "Aktuelle Tabellenposition WM_BE
SCHLEIFE_NS_EXIT(1) TYPE C, "Abbruchflag nichtsynchrone S.
SCHLEIFE_NS_SKIP(1) TYPE C, "NS ќbersprungen, weil WM-Ende
DIFF_AUFGETRETEN(1) TYPE C, "Flag Diff zum Material aufgetr.
WM_STAND_NS TYPE P, "Tabellenstand vor nisync S.
WM_STAND_ALT TYPE P, "Tabellenstand bei WM-Q. ohne IM
WM_STAND_IS TYPE P, "Tabellenstand vor synchroner S.
FLG_IM_DURCH(1) TYPE C, "IM-Bestфnde alle eingelesen
FLG_WM_DURCH(1) TYPE C, "WM-Bestфnde alle eingelesen
HLP_IM_TABIX TYPE P, "Hilfsvariablen um nфchsten
HLP_MATNR LIKE MKOL-MATNR, " IM-Satz einzulesen und
HLP_CHARG LIKE MCHB-CHARG, "
HLP_SOBKZ LIKE MKOL-SOBKZ. " zu ќberprќfen
*........Steuerfelder fќr Ausgabe.......................................
DATA: DELTA LIKE MARD-LABST, "Differenz in schreibe_satz
IT320_LINES TYPE P, "Anzahl Tabelleneintrфge IT320.
SUMME1 LIKE MARD-LABST,
SUMME2 LIKE MARD-LABST,
SUMME3 LIKE MARD-LABST,
KEINE_AUSGABE TYPE C,
MAT_GEDRUCKT(1) TYPE C.
*........Steuerfelder fќr Mappenerstellung..............................
DATA: FLG_NFIRST(1) TYPE C, "Nicht erster Tab.vergleich
FLG_NLEER(1) TYPE C, "Nicht leerer Dataset
FLG_WM_DIFF(1) TYPE C, "Kz fќr MI40 (Fehler WM-LGORT)
HLP_TEXT(200) TYPE C. "Fehlertext
*........Hilfsfelder fќr die dezentrale Abwicklung......................
DATA: HLP_DECENTRAL_WMS TYPE C,
HLP_RECEIVER LIKE BDBAPIDEST,
HLP_RFCTYPE LIKE RFCDES-RFCTYPE.
*........Konstanten.....................................................
INCLUDE MLLVSKON.
*........Konstanten fќr FCodes..........................................
DATA: FCODE_BACK(4) TYPE C VALUE 'BAKK',
FCODE_BEND(4) TYPE C VALUE 'BEND'.
*........Konstanten zur Findung der Bestandsqualifikationen.............
DATA: SET_BESTANDSQUAL(2) TYPE C VALUE 'QR', "Set der BESTQ-Eintrфge
CON_1(1) TYPE C VALUE '1', "Frei verwendbar (IM)
CON_2(1) TYPE C VALUE '2', "Qualitфtsprќfung (IM)
CON_4(1) TYPE C VALUE '4', "Sperrbestand (IM)
CON_BESTQ_Q(1) TYPE C VALUE 'Q', "Qualitфtsprќfbestand
CON_BESTQ_R(1) TYPE C VALUE 'R', "Retourensperrbestand
CON_BESTQ_S(1) TYPE C VALUE 'S'. "Sperrbestand
*.......Bei Verфnderung/Ergфnzung der BESTQ/SOBKZ bitte Фnderungen in:..
*.......FORM-Routinen: WM_QUANT_OHNE_IMBEZUG, WM_QUANTS_SUMMIEREN,.....
*.......SUMMIEREN_SONDERBESTAND,........................................
*.......FUELLEN_YWEWA, SCHREIBE_SATZ, NEGATIVE_WM_AUSGEBEN nachziehen...
*.......und neue Textelemente entsprechend 050/051 .. einfќgen..........
*........Sonstige Konstanten............................................
DATA: CON_W(1) TYPE C VALUE 'W', "Weicher Fehler
CON_WM(2) TYPE C VALUE 'WM', "WM-Satz
CON_WD(2) TYPE C VALUE 'WD', "WM-Satz(Dummy)
CON_IM(2) TYPE C VALUE 'IM', "IM-Satz
CON_ID(2) TYPE C VALUE 'ID', "IM-Satz(Dummy)
CON_DD(2) TYPE C VALUE 'DD', "Dummy-Satz
SET_AUSGABE(2) TYPE C VALUE ' X', "Prќfung Sel.Screen
LISTE(4) TYPE C VALUE 'LIST',"PF-Status
TITEL(3) TYPE C VALUE '001', "Titlebar
CON_NUM(10) TYPE C VALUE '1234567890',
RETCO(1) TYPE C. "Retcode dez.R2-Best.
*........Konstanten zur BI-Mappenerzeugung..............................
DATA: CON_BEZ_MAPPE LIKE BISEG-MAPPE VALUE 'MB_MI10',
CON_BEZ_TCODE LIKE BISEG-TCODE VALUE 'MI10',
MODPL_DIF_MAP LIKE SY-REPID VALUE 'RM07II40',
ADYNP_DIF_MAP LIKE SY-DYNNR VALUE '1000',
TCODE_DIF_MAP LIKE SY-TCODE VALUE 'MI40',
FLG_WARNUNG(1) TYPE C.
*........Konstanten fќr Differenzenbuchung..............................
DATA: CON_ITEM_NUMBER LIKE MSEG-ZEILE VALUE '0001'.
*........Feldzeiger.....................................................
FIELD-SYMBOLS: <FELDNAME1>, "Fќr Ausgabe der Ergebnisse
<FELDNAME2>.
* BEGIN: Data Declaration for the Data Consistency Cockpit "v_n_1035124
TYPE-POOLS DSAP.
CONSTANTS: LC_PROJECTID TYPE DSAP_SSF_DTAB-PID VALUE 'EDC'.
DATA: LF_REPORTNAME(30) TYPE C,
LF_GRPID TYPE DSAP_SSF_DTAB-GRPID,
LF_OBJID TYPE DSAP_SSF_DTAB-OBJID,
LT_LOG TYPE TABLE OF DSAP_SSF_LOG,
LF_NUM_KEEP TYPE I VALUE 2, "die letzten 2 Analysen aufbewaren
LF_COMMIT TYPE C VALUE ' '. "kein Commit by default
* END : Data Declaration for the Data Consistency Cockpit "^_n_1035124
*-----------------------------------------------------------------------
* SELEKTIONSBEDINGUNGEN
*-----------------------------------------------------------------------
*........Dummy-Dataanweisung, wenn parameter AUSG_WEI deaktiv...........
DATA: AUSG_WEI(1) TYPE C.
SELECT-OPTIONS: SO_MATNR FOR MARA-MATNR OBLIGATORY.
*........Steuerungsparameter............................................
*arameters: werks like mard-werks, "Werk -> falsche F4-Hilfe
PARAMETERS: WERKS LIKE LQUA-WERKS, "Werk
LGORT LIKE MARD-LGORT, "Lagerort
LGNUM LIKE LQUA-LGNUM. "LagerNUMMER
SELECTION-SCREEN SKIP 1.
*ELECTION-SCREEN COMMENT 1(79) TEXT-010.
PARAMETERS: AUSG_DET LIKE RLIST-AUSGD,"Ausgabe detailliert(Einzelquants)
AUSG_KOM LIKE RLIST-AUSGK, "Ausgabe komplett zum Material
P_INCOM TYPE CHAR01 AS CHECKBOX,
AUSG_MAP LIKE RLIST-AUSGM. "BI-Mappe erstellen?
SELECTION-SCREEN SKIP 1.
PARAMETERS: P_PCCON TYPE C.
*-----------------------------------------------------------------------
* AT SELECTION-SCREEN
*-----------------------------------------------------------------------
AT SELECTION-SCREEN.
*........Pruefen Werk, Lagerort/LagerNUMMERn Kombination................
*........erlaubt ist LGNUM mit/ohne WERKS oder LGORT mit WERKS..........
IF LGORT IS INITIAL AND NOT LGNUM IS INITIAL.
ELSEIF LGNUM IS INITIAL AND
NOT WERKS IS INITIAL AND
NOT LGORT IS INITIAL.
ELSE.
MESSAGE E210.
ENDIF.
IF P_INCOM EQ 'X' AND AUSG_MAP IS NOT INITIAL.
MESSAGE E001(00) WITH 'Выполняйте толлько по одному шагу!'.
ENDIF.
PERFORM FUELLEN_IT320.
PERFORM LESEN_T340D.
*........Im dez. Fall ist 'nur' Lagernummer nicht erlaubt.............
IF T340D-LVSDZ = CON_X.
IF NOT LGNUM IS INITIAL AND WERKS IS INITIAL.
MESSAGE E218. " Wk/Lo oder WK/L#
ENDIF.
ENDIF.
IF AUSG_DET CN SET_AUSGABE.
MESSAGE E214.
ENDIF.
IF AUSG_KOM CN SET_AUSGABE.
MESSAGE E214.
ENDIF.
IF AUSG_MAP CN SET_AUSGABE.
MESSAGE E214.
ENDIF.
PERFORM BERECHTIGUNG_LGNUM(SAPFL000) USING CON_BER_RP
IT320-LGNUM.
IF SY-SUBRC NE 0.
MESSAGE E220 WITH IT320-LGNUM.
ENDIF.
*........Dezentrale Abwicklung fќr Werk/Lagerort prќfen.................
PERFORM DEZENTRAL_PRUEFEN.
*-----------------------------------------------------------------------
* START-OF-SELECTION
*-----------------------------------------------------------------------
START-OF-SELECTION.
REFRESH: GT_MATNR.
SELECT MATNR FROM MARA INTO TABLE GT_MATNR
WHERE
MATNR IN SO_MATNR.
CHECK SY-SUBRC EQ 0.
*........Wenn eine BI-Mappe erzeugt wird, Materialien sperren...........
PERFORM LGNUM_SPERREN.
SET TITLEBAR TITEL.
CLEAR FLG_NFIRST.
CLEAR FLG_NLEER.
*........Wenn Sperren im Batch nicht mіglich war->Mitteilung drucken....
IF FLG_WARNUNG = CON_X.
SKIP.
WRITE: / TEXT-098.
SKIP.
ENDIF.
REFRESH DIFFERENZ_SAVE.
LOOP AT IT320.
PERFORM INTTAB_INITIALISIEREN.
* IF NOT IT320-OBEST IS INITIAL OR IT320-XHUPF <> CON_X.
PERFORM FUELLEN_IMBESTAND.
PERFORM FUELLEN_WMBESTAND.
PERFORM TABELLEN_VERGLEICH.
* ELSE.
* CLEAR: IM_LINES, WM_LINES.
* ENDIF.
PERFORM LISTE_AUSGEBEN.
APPEND LINES OF DIFFERENZ TO DIFFERENZ_SAVE.
ENDLOOP.
* BEGIN: Write Results to the database for the Data Consistency Cockpit
* Obtain generated program name for generic check report and
* fill GRPID, OBJID as identifier "v_n_1035124
PERFORM REGISTRY_GET_PROGNAME IN PROGRAM /SSF/ULIB
TABLES
LT_LOG
USING
LC_PROJECTID
CHANGING
LF_REPORTNAME
IF FOUND.
IF NOT LF_REPORTNAME IS INITIAL.
LF_GRPID = SY-CPROG.
LF_OBJID = SY-SLSET.
* Store current result
PERFORM SAVE_RESULTS_BY_TABLE IN PROGRAM (LF_REPORTNAME)
TABLES
DIFFERENZ_SAVE
IF FOUND.
* Delete outdated results
PERFORM DELETE_RESULTS_BY_PROG_VAR IN PROGRAM (LF_REPORTNAME)
USING
LF_GRPID
LF_OBJID
LF_NUM_KEEP
LF_COMMIT
IF FOUND.
ENDIF. "^ _n_1035124
* END: Write Results to the database for the Data Consistency Cockpit
IF P_INCOM EQ 'X'.
SKIP.
* PERFORM DEZENTRAL_DIFFERENZEN.
PERFORM CREAT_BATCH_INCOME.
* EXPORT FLG_WM_DIFF TO MEMORY ID 'WM_DIFF'.
* PERFORM MAPPE_ERSTELLEN.
* PERFORM NEGATIVE_WM_AUSGEBEN.
CALL FUNCTION 'DEQUEUE_ALL' "v_n_895864
EXPORTING
_SYNCHRON = 'X'. "^_n_895864
ENDIF.
IF AUSG_MAP = CON_X.
SKIP.
IF FLG_NLEER IS INITIAL.
ULINE /(83).
WRITE: / TEXT-070, "Keine Daten -> Keine Mappe
83 SY-VLINE.
ULINE /(83).
ELSE.
PERFORM DEZENTRAL_DIFFERENZEN.
IF NOT YWEWA[] IS INITIAL.
*........Fehlerќbersteuerung in MI40....................................
FLG_WM_DIFF = CON_X.
EXPORT FLG_WM_DIFF TO MEMORY ID 'WM_DIFF'.
PERFORM MAPPE_ERSTELLEN.
ENDIF.
ENDIF.
PERFORM NEGATIVE_WM_AUSGEBEN.
CALL FUNCTION 'DEQUEUE_ALL' "v_n_895864
EXPORTING
_SYNCHRON = 'X'. "^_n_895864
ENDIF.
*-----------------------------------------------------------------------
* TOP-OF-PAGE
*-----------------------------------------------------------------------
TOP-OF-PAGE.
PERFORM TOP_OF_PAGE.
*---------------------------------------------------------------------*
* AT USER_COMMAND *
*---------------------------------------------------------------------*
AT USER-COMMAND.
CASE SY-UCOMM.
*---------------------------------------------------------------------
* WHEN FCODE_BACK
*---------------------------------------------------------------------
* Zurќck zum Anforderdynpro
*---------------------------------------------------------------------
WHEN FCODE_BACK.
IF SY-CALLD <> SPACE.
LEAVE.
ENDIF.
LEAVE TO TRANSACTION SY-TCODE.
SET SCREEN 0.
*---------------------------------------------------------------------
* WHEN FCODE_BEND
*---------------------------------------------------------------------
* Raus aus dem Report
*---------------------------------------------------------------------
WHEN FCODE_BEND.
LEAVE.
ENDCASE.
*-----------------------------------------------------------------------
* FORM-ROUTINEN
*-----------------------------------------------------------------------
* INTTAB_INITIALISIEREN. "Initialisiert int. Tab's
* FUELLEN_IT320 "Relevante Suchbereiche
* LESEN_T340D "Check nicht dez. LGNUM
* FUELLEN_IMBESTAND "Lesen der IM-Bestфnde
* FUELLEN_WMBESTAND "Lesen der WM-Bestфnde
* TABELLEN_VERGLEICH. "Tabellen vergleichen
* WM_QUANT_OHNE_IMBEZUG "WM-Quant ohne IM Entsprech.
* WM_QUANTS_SUMMIEREN "WM_quants zum Material add.
* CONVERSION_SONUM_IMKEY "SONUM -> LIFNR/VBELN+POSNR
* MERKEN_DIFFERENZ "Material mit Differenz
* MERKEN_IM_OHNE_WM "IM-Bestand ohne WM-Quants
* MERKEN_WM_OHNE_IM "WM-Quant ohne IM Entsprech.
* NAECHSTE_MATNR "Neue Matnr
* SPEICHERN_IM "IM_Bestand->tmp_matnr_best
* SPEICHERN_DUMMY_IM "Leersatz
* SPEICHERN_WM "WM_Bestand->tmp_matnr_best
* SPEICHERN_DUMMY_WM "Leersatz
* SUMME_SONDERBESTAND "Aufsummieren Sonderbestфnde
* INIT_YWEWA "YWEWA initialisieren
* FUELLEN_YWEWA "YWEWA fќllen
* WM_NEG_RET_MERKEN "Negative Quantssum. merken
* MAPPE_ERSTELLEN "Mappe fќr SM35 erstellen
* DIFFERENZ_NACH_YWEWA "Konvertierung Diff->YWEWA
* TOP_OF_PAGE "Seitenkopf ausgeben
* LISTE_AUSGEBEN "Ergebnisse,nach Mat ausgeb.
* NEGATIVE_WM_AUSGEBEN "Ausgabe nichtausbuchbarer B
* MATNR_PACK_AUSGABE "Diffs zum Mat. bereitstell.
* DOPPELSATZ_AUSWERTEN "Doppelsфtze auswerten
* SCHREIBE_SATZ "Zeilenausgabe
* SCHREIBE_MATKOPF "Ausgabe der Materialinfo
* SCHREIBE_SUMME "Ausgabe der Summeninfo
* SCHREIBEN_QUANT "Ausgabe der Quantinfo
* QUANT_SUCHEN "Nфchste Quants zur Ausgabe
* LGNUM_SPERREN "Lagernummer fќr Mappe sper.
* MEINS_LESEN "Lesen von MEINS aus MARA
* Dezentrale Abwicklung:
* DEZENTRAL_PRUEFEN "Prќfen, ob dez. Abwicklung
* DEZENTRAL_DIFFERENZ "Differenen fќr dez. ermitte
* KOPF_FUELLEN_DIFF "Fќllen Kopf-Daten fќr MB11
* IMSEG_FUELLEN_DIFF "Fќllen Pos.-Daten fќr MB11
* T322_LESEN "Lesen Tabelle T322
* DEZENTRAL_DIFFERENZEN_BUCHEN "Differenen fќr dez. buchen
* ERROR_SAVE_DIFF "Fehlet beim Ausbuchen siche
* PROTOKOLL_DIFFERENZEN_BUCHEN "Protokoll der Ausbuchung
* MESSAGE_DETERMINE "Fehlertext aus MSGXX ermitt
*-----------------------------------------------------------------------
*-----------------------------------------------------------------------
* FORM INTTAB_INITIALISIEREN
*-----------------------------------------------------------------------
* Initialisieren der internen Tabellen
*-----------------------------------------------------------------------
FORM INTTAB_INITIALISIEREN.
REFRESH DIFFERENZ.
CLEAR DIFFERENZ.
REFRESH IM_BESTAND.
CLEAR IM_BESTAND.
REFRESH WM_BESTAND.
CLEAR WM_BESTAND.
CLEAR FLG_IM_DURCH.
CLEAR FLG_WM_DURCH.
ENDFORM. "INTTAB_INITIALISIEREN
*-----------------------------------------------------------------------
* FORM FUELLEN_IT320
*-----------------------------------------------------------------------
* Eine interne Tabelle wird mit den relevanten Eintrфgen der
* Tabelle IT320 gemфп der Werk, Lagerort, LagerNUMMER Eingaben
* auf dem Selection-Screen gefќllt.
*-----------------------------------------------------------------------
FORM FUELLEN_IT320.
REFRESH IT320.
REFRESH DIFFERENZ.
*........Lesen der betrachteten Werk/Lagerort/Lagernummerkombinationen..
IF WERKS IS INITIAL. "Nur LGNUM ist eingegeben
SELECT * FROM T320
WHERE LGNUM = LGNUM
AND OBEST = SPACE.
MOVE-CORRESPONDING T320 TO IT320.
APPEND IT320.
ENDSELECT.
IF SY-SUBRC NE 0.
MESSAGE E211. "Keine Daten vorhanden
ENDIF.
ELSE.
IF LGNUM IS INITIAL. "WERKS und LGORT wurde eingegeben
SELECT SINGLE * FROM T320
WHERE WERKS = WERKS
AND LGORT = LGORT
AND OBEST = SPACE.
IF SY-SUBRC NE 0.
MESSAGE E212. "Keine Daten vorhanden
ELSE.
MOVE-CORRESPONDING T320 TO IT320.
APPEND IT320.
ENDIF.
ENDIF.
IF LGORT IS INITIAL. "WERKS und LGNUM wurde eingegeben
SELECT * FROM T320
WHERE WERKS = WERKS
AND LGNUM = LGNUM
AND OBEST = SPACE.
* neu zu 4.0
MOVE-CORRESPONDING T320 TO IT320.
APPEND IT320. "mehrere Lagerorte mіglich!
* neu zu 4.0
ENDSELECT.
IF SY-SUBRC NE 0.
MESSAGE E213. "Keine Daten vorhanden
ENDIF.
ENDIF.
ENDIF.
*........Feststellen der Tabellenlфnge IT320............................
DESCRIBE TABLE IT320 LINES IT320_LINES.
*........Lesen des Flags Chargenzustandsverwaltung aktiv (T001W)........
LOOP AT IT320.
SELECT SINGLE * FROM T001W
WHERE WERKS = IT320-WERKS.
IF SY-SUBRC = 0.
MOVE T001W-CHAZV TO IT320-CHAZV.
MODIFY IT320.
ENDIF.
ENDLOOP.
*........Check Lagerort - darf nicht HU verwaltet sein (T001L)..........
LOOP AT IT320.
SELECT SINGLE * FROM T001L
WHERE WERKS = IT320-WERKS
AND LGORT = IT320-LGORT.
IF SY-SUBRC = 0.
MOVE T001L-XHUPF TO IT320-XHUPF.
MODIFY IT320.
ENDIF.
ENDLOOP.
ENDFORM. "FUELLEN_IT320
*-----------------------------------------------------------------------
* FORM LESEN_T340D
*-----------------------------------------------------------------------
* мberprќft, ob Lagernummer nicht als dezentrale Lagernummer
* definiert ist. Sonst gibt's eine Fehlermeldung.
*-----------------------------------------------------------------------
FORM LESEN_T340D.
SELECT SINGLE * FROM T340D
WHERE LGNUM = IT320-LGNUM.
IF T340D-LVSDZ = CON_X.
* MESSAGE E217. "Dezentrale Lagernummer
ENDIF.
ENDFORM. "LESEN_T340D
*-----------------------------------------------------------------------
* FORM FUELLEN_IMBESTAND
*-----------------------------------------------------------------------
* Entsprechende IM-Bestфnde einlesen und sortieren
*-----------------------------------------------------------------------
FORM FUELLEN_IMBESTAND.
DATA: HLP_MSGTEXT(80).
IF T340D-LVSDZ = CON_X.
**........Im dez. Lager R/2-R/3 wird ein sequent. File eingelesen.......
*
* CALL FUNCTION 'L_RM_MATERIALS_READ_LDK35'
* EXPORTING
* LAGERORT = IT320-LGORT
* PCCON = P_PCCON
* WERK = IT320-WERKS
* IMPORTING
* RETCO = RETCO
* TABLES
* MM_QUANTITIES = IM_BESTAND.
*
* IF RETCO <> 0.
* MESSAGE E221. "Bitte BF-daten z.Verfќgg stellen (dez.Lager)
* ENDIF.
ELSE.
*........Prќfen, ob integrierte oder dezentrale Abwicklung............*
DATA: LT_COPY_BESTAND LIKE IM_BESTAND OCCURS 0.
REFRESH: IM_BESTAND, LT_COPY_BESTAND.
LOOP AT GT_MATNR.
REFRESH: LT_COPY_BESTAND.
CLEAR IWMSDEC.
READ TABLE IWMSDEC WITH KEY WERKS = IT320-WERKS
LGORT = IT320-LGORT
LGNUM = IT320-LGNUM.
IF NOT IWMSDEC-CENSY IS INITIAL.
*........Dezentrale Abwicklung.........................................*
*........RFC-Destination fќr den Zugriff auf ERP ermitteln.............*
CALL FUNCTION 'L_WMS_CEN_IM_SYNC_RECEIVER'
EXPORTING
I_WERKS = IT320-WERKS
I_LGORT = IT320-LGORT
I_LGNUM = IT320-LGNUM
IMPORTING
E_RECEIVER = HLP_RECEIVER
E_RFCTYPE = HLP_RFCTYPE
EXCEPTIONS
NOT_UNIQUE_RECEIVER = 1
NO_RFC_DESTINATION_MAINTAINED = 2
ERROR_IN_ALE = 3
ERROR_IN_WM_CUSTOMIZING = 4
INCONSISTENCY_BETWEEN_WM_ALE = 5
OTHERS = 6.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
*........IM-Bestфnde aus ERP-System holen.............................*
CALL FUNCTION 'ZL_MM_MATERIAL_READ_QUANTITY'
DESTINATION HLP_RECEIVER-RFC_DEST
EXPORTING
MATNR = GT_MATNR-MATNR
LAGERORT = IT320-LGORT
WERK = IT320-WERKS
TABLES
MM_QUANTITIES = LT_COPY_BESTAND[]
EXCEPTIONS
COMMUNICATION_FAILURE = 1 MESSAGE HLP_MSGTEXT
SYSTEM_FAILURE = 2 MESSAGE HLP_MSGTEXT.
IF SY-SUBRC NE 0.
MESSAGE E033 WITH HLP_MSGTEXT(50)
HLP_MSGTEXT+50(30).
ENDIF.
ELSE.
*........Integrierte Abwicklung: -> IM-Bestфnde zulesen...............*
CALL FUNCTION 'ZL_MM_MATERIAL_READ_QUANTITY'
EXPORTING
MATNR = GT_MATNR-MATNR
LAGERORT = IT320-LGORT
WERK = IT320-WERKS
TABLES
MM_QUANTITIES = LT_COPY_BESTAND[].
ENDIF.
APPEND LINES OF LT_COPY_BESTAND TO IM_BESTAND.
ENDLOOP.
ENDIF.
*.......Sortieren, weil Tabellen MARD, MCHB, MKOL seriell gelesen.......
SORT IM_BESTAND BY MATNR
WERKS
LGORT
CHARG
SOBKZ
LIFNR
PSPNR
VBELN
POSNR.
ENDFORM. "FUELLEN_IMBESTAND
*-----------------------------------------------------------------------
* FORM FUELLEN_WMBESTAND
*-----------------------------------------------------------------------
* Entsprechende WM-Bestфnde einlesen und sortieren
*-----------------------------------------------------------------------
FORM FUELLEN_WMBESTAND.
SELECT * FROM LQUA_COMP WHERE LGNUM = IT320-LGNUM
AND WERKS = IT320-WERKS
AND LGORT = IT320-LGORT "neu zu 4.0
AND MATNR IN SO_MATNR
ORDER BY MANDT "Entspricht bestehendem Index
LGNUM
MATNR
WERKS
BESTQ
SOBKZ
CHARG.
MOVE-CORRESPONDING LQUA_COMP TO WM_BESTAND.
WM_BESTAND-GESME = WM_BESTAND-GESME + LQUA_COMP-TRAME. "2-Schrittqu
*........Lieferanten-, Projekt und Kundenauftragsnummern lіschen........
CLEAR: WM_BESTAND-LIFNR,
WM_BESTAND-PSPNR,
WM_BESTAND-VBELN,
WM_BESTAND-POSNR.
*........Wandelt SONUM in LieferantenNUMMER um -> LIFNR.................
PERFORM CONVERSION_SONUM_IMKEY USING WM_BESTAND-SOBKZ
WM_BESTAND-SONUM
WM_BESTAND-LIFNR
WM_BESTAND-PSPNR
WM_BESTAND-VBELN
WM_BESTAND-POSNR.
APPEND WM_BESTAND.
ENDSELECT.
*........Sortieren der Tabelle, notwendig fќr Vergleich.................
SORT WM_BESTAND BY MATNR
CHARG
SOBKZ
SONUM
BESTQ
LGTYP
LGPLA.
CLEAR WM_BESTAND.
ENDFORM. "FUELLEN_WMBESTAND
*-----------------------------------------------------------------------
* FORM TABELLEN_VERGLEICH
*-----------------------------------------------------------------------
* Tabellen IM-Bestand und WM-Bestand werden verglichen
* Eintrфge fќr Materialien, deren Bestфnde gleich sind werden
* in beiden Tabellen gelіscht.
*-----------------------------------------------------------------------
FORM TABELLEN_VERGLEICH.
*........Steuerdaten initialisieren/beschaffen..........................
DESCRIBE TABLE IM_BESTAND LINES IM_LINES.
DESCRIBE TABLE WM_BESTAND LINES WM_LINES.
CLEAR IM_TABIX.
CLEAR WM_TABIX.
CLEAR SCHLEIFE_NS_SKIP.
CLEAR SCHLEIFE_NS_EXIT.
*........Tabellenvergleich beginnen.....................................
*........Фuпere Schleife................................................
WHILE IM_TABIX <= IM_LINES AND
WM_TABIX <= WM_LINES AND
NOT ( IM_TABIX = IM_LINES AND
WM_TABIX = WM_LINES ).
*........Nфchsten IM-Eintrag lesen......................................
IF IM_TABIX < IM_LINES.
ADD 1 TO IM_TABIX.
READ TABLE IM_BESTAND INDEX IM_TABIX.
IF SY-SUBRC NE 0.
MESSAGE E219 WITH CON_IM IM_TABIX IM_LINES. "Lesen miпlungen
ENDIF.
CLEAR FLG_IM_DURCH.
ELSE.
FLG_IM_DURCH = CON_X. "IM-Bestand durchforstet
ENDIF.
*........Prќfen ob Фnderung in Materialnummer...........................
ON CHANGE OF IM_BESTAND-MATNR.
PERFORM NAECHSTE_MATNR.
ENDON.
*........Initialisierung Nicht synchrone innere Schleife................
WM_STAND_NS = WM_TABIX. "Aktueller WM-Stand vor SchleifeNS
IF WM_TABIX = WM_LINES. "letzter WM-Satz gelesen.
SCHLEIFE_NS_SKIP = CON_X.
ELSEIF WM_TABIX = 0.
ADD 1 TO WM_TABIX.
PERFORM READ_WM USING WM_TABIX.
ENDIF.
CLEAR WM_SUMME. "Quant SUMME initialisieren
CLEAR ALT_WM_BESTAND. "ALT_WM_BESTAND init.
*........Nicht synchrone innere Schleife, IM_Bestand <> WM_Bestand......
WHILE NOT ( IM_BESTAND-MATNR = WM_BESTAND-MATNR AND
IM_BESTAND-CHARG = WM_BESTAND-CHARG AND
IM_BESTAND-SOBKZ = WM_BESTAND-SOBKZ AND
IM_BESTAND-LIFNR = WM_BESTAND-LIFNR AND
IM_BESTAND-PSPNR = WM_BESTAND-PSPNR AND
IM_BESTAND-VBELN = WM_BESTAND-VBELN AND
IM_BESTAND-POSNR = WM_BESTAND-POSNR ) AND
SCHLEIFE_NS_SKIP IS INITIAL .
*........WM-Quants ohne IM-Entsprechung?...............................
IF ( WM_BESTAND-MATNR < IM_BESTAND-MATNR OR
( WM_BESTAND-MATNR = IM_BESTAND-MATNR AND
WM_BESTAND-CHARG < IM_BESTAND-CHARG ) OR
( WM_BESTAND-MATNR = IM_BESTAND-MATNR AND
WM_BESTAND-CHARG = IM_BESTAND-CHARG AND
WM_BESTAND-SOBKZ < IM_BESTAND-SOBKZ ) OR
( WM_BESTAND-MATNR = IM_BESTAND-MATNR AND
WM_BESTAND-CHARG = IM_BESTAND-CHARG AND
WM_BESTAND-SOBKZ = IM_BESTAND-SOBKZ AND
WM_BESTAND-LIFNR < IM_BESTAND-LIFNR ) OR
( WM_BESTAND-MATNR = IM_BESTAND-MATNR AND
WM_BESTAND-CHARG = IM_BESTAND-CHARG AND
WM_BESTAND-SOBKZ = IM_BESTAND-SOBKZ AND
WM_BESTAND-PSPNR < IM_BESTAND-PSPNR ) OR
( WM_BESTAND-MATNR = IM_BESTAND-MATNR AND
WM_BESTAND-CHARG = IM_BESTAND-CHARG AND
WM_BESTAND-SOBKZ = IM_BESTAND-SOBKZ AND
WM_BESTAND-VBELN < IM_BESTAND-VBELN ) OR
( WM_BESTAND-MATNR = IM_BESTAND-MATNR AND
WM_BESTAND-CHARG = IM_BESTAND-CHARG AND
WM_BESTAND-SOBKZ = IM_BESTAND-SOBKZ AND
WM_BESTAND-VBELN = IM_BESTAND-VBELN AND
WM_BESTAND-POSNR < IM_BESTAND-POSNR ) ) OR
FLG_IM_DURCH = CON_X. "Keine weiteren IM-Bestфnde
PERFORM WM_QUANT_OHNE_IMBEZUG.
ENDIF.
*........WM_TABIX ist 'zu weit' gelaufen................................
IF ( ( WM_BESTAND-MATNR > IM_BESTAND-MATNR ) OR
( WM_BESTAND-MATNR = IM_BESTAND-MATNR AND
WM_BESTAND-CHARG > IM_BESTAND-CHARG ) OR
( WM_BESTAND-MATNR = IM_BESTAND-MATNR AND
WM_BESTAND-CHARG = IM_BESTAND-CHARG AND
WM_BESTAND-SOBKZ > IM_BESTAND-SOBKZ ) OR
( WM_BESTAND-MATNR = IM_BESTAND-MATNR AND
WM_BESTAND-CHARG = IM_BESTAND-CHARG AND
WM_BESTAND-SOBKZ = IM_BESTAND-SOBKZ AND
WM_BESTAND-LIFNR > IM_BESTAND-LIFNR ) OR
( WM_BESTAND-MATNR = IM_BESTAND-MATNR AND
WM_BESTAND-CHARG = IM_BESTAND-CHARG AND
WM_BESTAND-SOBKZ = IM_BESTAND-SOBKZ AND
WM_BESTAND-PSPNR > IM_BESTAND-PSPNR ) OR
( WM_BESTAND-MATNR = IM_BESTAND-MATNR AND
WM_BESTAND-CHARG = IM_BESTAND-CHARG AND
WM_BESTAND-SOBKZ = IM_BESTAND-SOBKZ AND
WM_BESTAND-VBELN > IM_BESTAND-VBELN ) OR
( WM_BESTAND-MATNR = IM_BESTAND-MATNR AND
WM_BESTAND-CHARG = IM_BESTAND-CHARG AND
WM_BESTAND-SOBKZ = IM_BESTAND-SOBKZ AND
WM_BESTAND-VBELN = IM_BESTAND-VBELN AND
WM_BESTAND-POSNR > IM_BESTAND-POSNR ) ) AND
FLG_IM_DURCH IS INITIAL. "noch weitere IM-Bestфnde
SCHLEIFE_NS_EXIT = CON_X.
EXIT. "Schleife verlassen, weil matnr zu hoch
ENDIF.
*........WM_TABIX an Tabellenende?......................................
IF WM_TABIX = WM_LINES.
EXIT. "Schleife verlassen, weil Tab-Ende
ENDIF.
*........Nфchsten Eintrag lesen.........................................
ADD 1 TO WM_TABIX.
PERFORM READ_WM USING WM_TABIX.
ENDWHILE. "Nichtsynchrone innere Schleife
*........Wurde Quantsumme zu Bestфnden ohne IM-Entsprechung gebildet?...
IF NOT WM_SUMME IS INITIAL.
PERFORM MERKEN_WM_OHNE_IM.
ENDIF.
*........Initialisierung synchrone innere Schleife......................
WM_STAND_IS = WM_TABIX. "Aktueller WM-Stand vor Schleife IS
*........Synchrone innere Schleife, IM_Bestand = WM_Bestand.............
WHILE IM_BESTAND-MATNR = WM_BESTAND-MATNR AND
IM_BESTAND-CHARG = WM_BESTAND-CHARG AND
IM_BESTAND-SOBKZ = WM_BESTAND-SOBKZ AND
IM_BESTAND-LIFNR = WM_BESTAND-LIFNR AND
IM_BESTAND-PSPNR = WM_BESTAND-PSPNR AND
IM_BESTAND-VBELN = WM_BESTAND-VBELN AND
IM_BESTAND-POSNR = WM_BESTAND-POSNR.
*........Quants aufsummieren............................................
*........Sicherstellen, daп erster Eintrag nicht doppelt gezфhlt wird...
IF NOT WM_TABIX IS INITIAL.
PERFORM WM_QUANTS_SUMMIEREN.
ENDIF.
*........WM_TABIX an Tabellenende?......................................
IF WM_TABIX = WM_LINES.
EXIT. "Schleife verlassen, weil Tab-Ende
ENDIF.
*........Nфchsten Eintrag lesen.........................................
ADD 1 TO WM_TABIX.
PERFORM READ_WM USING WM_TABIX.
ENDWHILE. "Synchrone innere Schleife
*........Schleifenauswertung............................................
*........Nichtsynchrone Schleife abgebrochen, weil 'zu weit' gelaufen?..
IF SCHLEIFE_NS_EXIT = CON_X.
CLEAR SCHLEIFE_NS_EXIT.
*........WM_TABIX auf WM_TABIX_NS (Zфhler vor NS).......................
WM_TABIX = WM_STAND_NS. "WM_TABIX zurќcksetzten
PERFORM READ_WM USING WM_TABIX.
PERFORM MERKEN_IM_OHNE_WM. "Lіschvormerkung фndern
*........Wurde NS ќbergangen, weil letzter WM-Satz bereits gelesen war?.
ELSEIF SCHLEIFE_NS_SKIP = CON_X AND
WM_SUMME IS INITIAL. "aus innerer Schleife
PERFORM MERKEN_IM_OHNE_WM. "dќrfen keine Quants stehen!
*........Wurde QuantSUMME gebildet?.....................................
ELSEIF NOT WM_SUMME IS INITIAL. "WM-Summe beschrieben
*........WM_SUMME = IM-Bestand?.........................................
IF WM_SUMME-LABST = IM_BESTAND-LABST AND
WM_SUMME-INSME = IM_BESTAND-INSME AND
WM_SUMME-SPEME = IM_BESTAND-SPEME AND
WM_SUMME-RETME = IM_BESTAND-RETME AND
WM_SUMME-KLABS = IM_BESTAND-KLABS AND
WM_SUMME-KINSM = IM_BESTAND-KINSM AND
WM_SUMME-KSPEM = IM_BESTAND-KSPEM.
*.....-> Keine Differenz aufgetreten....................................
PERFORM KEINE_DIFFERENZ.
ELSE. "Differenz aufgetreten
PERFORM MERKEN_DIFFERENZ.
ENDIF.
ENDIF.
ENDWHILE. "Фuпere Schleife IM-Bestand
*........Wenn tmp_matnr_best not initial->Differenz ќbernehmen.........
IF NOT TMP_MATNR_BEST IS INITIAL.
PERFORM NAECHSTE_MATNR.
ENDIF.
ENDFORM. "TABELLEN_VERGLEICH
След.сообщение - продолжение