Текущее время: Вс, авг 03 2025, 00:47

Часовой пояс: UTC + 3 часа


Правила форума


Вопросы по ППМ (MRP) - сюда.
Вопросы по классификации - сюда.
Вопросы по входящим поставкам - сюда.



Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Приведение запасов WM к остаткам IM
СообщениеДобавлено: Ср, июн 29 2011, 21:09 
Специалист
Специалист

Зарегистрирован:
Вт, дек 16 2008, 14:09
Сообщения: 131
Здравствуйте.
Не могу найти решение, как корректно выровнять остатки СУС и ММ. Вернее нашёл ноты и отчеты, когда ММ-сский остатки приводятся с СУС-овским(они считаются более правильными). Но у нас ситуация другая.
Материалы без расширения СУС закупались и продавались долгое время(несколько лет). Когда-то(в разное время) к ним насоздавали ракурсов управления складами и получилось, что ММ по запасам в порядке, а в СУС-е полная по ним ерунда.
Вроде проблема должна быть не уникальная, но что-то "нетрудоёмкое" изрядно покопавшись не нашёл.

Никто не сталкивался с подобным или по каким словам искать решения?
Заранее спасибо!


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Приведение запасов WM к остаткам IM
СообщениеДобавлено: Чт, июн 30 2011, 07:18 
Ассистент
Ассистент

Зарегистрирован:
Вс, май 17 2009, 15:12
Сообщения: 29
Посмотрите ноту 32236. Должно помочь.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Приведение запасов WM к остаткам IM
СообщениеДобавлено: Чт, июн 30 2011, 08:53 
Специалист
Специалист

Зарегистрирован:
Вт, дек 16 2008, 14:09
Сообщения: 131
К сожалению это не тот случай. там описывается разница в оценке и FI.

Нормальная нота есть: Note 535043 - Stock comparison with LX23: Difference between WM and IM
Но там приводятся ММ - к WM данным. Получается, мне надо "запомнить" ММ, и в 2 шага: вначале привести в СУС-у, а потом оприходовать/списать.
Так и сделаю, если не найду раньше более простого способа. Проблема то вроде должна быть распространённой


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Приведение запасов WM к остаткам IM
СообщениеДобавлено: Вт, июл 05 2011, 17:01 
Специалист
Специалист

Зарегистрирован:
Вт, дек 16 2008, 14:09
Сообщения: 131
На всякий случай выкладываю решение, как мне казалось, на распространённую проблему:

Основной метод для выравнивания используется тот, который описан в этой ноте.
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


След.сообщение - продолжение


Последний раз редактировалось salas1 Вт, июл 05 2011, 17:06, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Приведение запасов WM к остаткам IM
СообщениеДобавлено: Вт, июл 05 2011, 17:03 
Специалист
Специалист

Зарегистрирован:
Вт, дек 16 2008, 14:09
Сообщения: 131
Code:
*-----------------------------------------------------------------------
*        FORM READ_WM
*-----------------------------------------------------------------------
*        Liest den aktuellen Tabelleneintrag wm_tabix fќr
*        0 < wm_tabix <= wm_lines
*-----------------------------------------------------------------------
FORM READ_WM USING WM_TABIX.

*........Naechsten WM-Eintrag lesen, wenn vorhanden.....................
  IF WM_TABIX = 0 AND
     WM_LINES > 0.
    READ TABLE WM_BESTAND INDEX 1.
  ELSEIF WM_TABIX <= WM_LINES.
    READ TABLE WM_BESTAND INDEX WM_TABIX.
    IF SY-SUBRC NE 0.
      MESSAGE E219 WITH CON_WM WM_TABIX WM_LINES WERKS. "Lesen miпlg.
    ENDIF.
  ENDIF.

*........Wurde bereits der letzte WM-Eintrag gelesen....................
  IF WM_TABIX = WM_LINES OR
     WM_LINES = 1.
    FLG_WM_DURCH = CON_X.
  ELSE.
    CLEAR FLG_WM_DURCH.
  ENDIF.

ENDFORM.                    "READ_WM

*-----------------------------------------------------------------------
*        FORM WM_QUANT_OHNE_IMBEZUG
*-----------------------------------------------------------------------
*        Hier wurden WM_Quants gefunden, die keine Entsprechung
*        in der MARD haben. Ein harter Fehler ist, wenn die SUMME
*        ќber die entsprechendne Quants ungleich Null, ist sonst
*        haben wir einen weichen Fehler.
*-----------------------------------------------------------------------
FORM WM_QUANT_OHNE_IMBEZUG.

  IF NOT ( ( ALT_WM_BESTAND-MATNR = WM_BESTAND-MATNR AND
     ALT_WM_BESTAND-CHARG = WM_BESTAND-CHARG AND
     ALT_WM_BESTAND-SOBKZ = WM_BESTAND-SOBKZ AND
     ALT_WM_BESTAND-LIFNR = WM_BESTAND-LIFNR AND
     ALT_WM_BESTAND-PSPNR = WM_BESTAND-PSPNR AND
     ALT_WM_BESTAND-VBELN = WM_BESTAND-VBELN AND
     ALT_WM_BESTAND-POSNR = WM_BESTAND-POSNR ) OR
     ALT_WM_BESTAND IS INITIAL ).
*....->Weiteres Material ohne IM Entsprechung erst alte SUMME speichern.
    PERFORM MERKEN_WM_OHNE_IM.
  ENDIF.
*........Quantsumme bilden..............................................
  PERFORM WM_QUANTS_SUMMIEREN.

*........Materialschlќssel in ALT_IM_BESTAND ablegen, Stand speichern...
  MOVE-CORRESPONDING WM_BESTAND TO ALT_WM_BESTAND.
  WM_STAND_ALT = WM_TABIX.

ENDFORM.                    "WM_QUANT_OHNE_IMBEZUG

*-----------------------------------------------------------------------
*        FORM WM_QUANTS_SUMMIEREN
*-----------------------------------------------------------------------
*        Entsprechende WM_Quants werden im SUMMEnsatz aufaddiert,
*        den Vergleich mit dem IM-Bestand zu ermіglichen.
*-----------------------------------------------------------------------
FORM WM_QUANTS_SUMMIEREN.

  MOVE: WM_BESTAND-MATNR TO WM_SUMME-MATNR, "Damit WM_SUMME <> initial
        WM_BESTAND-CHARG TO WM_SUMME-CHARG,
        WM_BESTAND-SOBKZ TO WM_SUMME-SOBKZ,
        WM_BESTAND-LIFNR TO WM_SUMME-LIFNR,
        WM_BESTAND-PSPNR TO WM_SUMME-PSPNR,
        WM_BESTAND-VBELN TO WM_SUMME-VBELN,
        WM_BESTAND-POSNR TO WM_SUMME-POSNR,
        WM_BESTAND-MEINS TO WM_SUMME-MEINS.

  CASE WM_BESTAND-SOBKZ.
    WHEN SOBKZ_LIEFERANT.              "Konsibestand Lieferant

      PERFORM SUMME_SONDERBESTAND.

    WHEN SOBKZ_EINZELBESTAND.          "Kundeneinzelbestand

      PERFORM SUMME_SONDERBESTAND.

    WHEN SOBKZ_AUFTRAG.                "Auftragsbestand
    WHEN SOBKZ_KUNDE.                  "Konsibestand Kunde
    WHEN SOBKZ_PROJEKT.                "Projektbestand

      PERFORM SUMME_SONDERBESTAND.

    WHEN SOBKZ_MEHRWEG.                "Mehrweg

      PERFORM SUMME_SONDERBESTAND.
* neu zu 4.0
    WHEN SOBKZ_VERSELEMENTE.           "Versandelemente
* neu zu 4.0
    WHEN OTHERS.                       "Kein Sonderbestand

      CASE WM_BESTAND-BESTQ.
        WHEN CON_BESTQ_Q.              "-> Qualitфtsprќfung
          WM_SUMME-INSME = WM_SUMME-INSME + WM_BESTAND-GESME.
        WHEN CON_BESTQ_S.              "-> Sperrbestand
          WM_SUMME-SPEME = WM_SUMME-SPEME + WM_BESTAND-GESME.
        WHEN CON_BESTQ_R.              "-> Retourenbestand
          WM_SUMME-RETME = WM_SUMME-RETME + WM_BESTAND-GESME.
        WHEN OTHERS.                   "-> frei verwendbar
          WM_SUMME-LABST = WM_SUMME-LABST + WM_BESTAND-GESME.
      ENDCASE.

  ENDCASE.

ENDFORM.                    "WM_QUANTS_SUMMIEREN

*-----------------------------------------------------------------------
*        FORM CONVERSION_SONUM_IMKEY
*-----------------------------------------------------------------------
*        Konvertierung der LVS_SONUM in die LIFNR der Bestands-
*        fќhrung.
*-----------------------------------------------------------------------
FORM CONVERSION_SONUM_IMKEY USING WM_BESTAND-SOBKZ
                                  WM_BESTAND-SONUM
                                  WM_BESTAND-LIFNR
                                  WM_BESTAND-PSPNR
                                  WM_BESTAND-VBELN
                                  WM_BESTAND-POSNR.

  DATA:  BEGIN OF LVS_SONUM,           "Struktur Kundeneinzelbestand
           KDAUF LIKE MSEG-KDAUF,
           KDPOS LIKE MSEG-KDPOS,
         END OF LVS_SONUM.

  CASE WM_BESTAND-SOBKZ.
    WHEN SPACE.
    WHEN SOBKZ_AUFTRAG.
* neu zu 4.0
    WHEN SOBKZ_VERSELEMENTE.
* neu zu 4.0
    WHEN SOBKZ_KUNDE.
    WHEN SOBKZ_EINZELBESTAND.
      MOVE WM_BESTAND-SONUM TO LVS_SONUM.
      MOVE LVS_SONUM-KDAUF  TO WM_BESTAND-VBELN.
      MOVE LVS_SONUM-KDPOS  TO WM_BESTAND-POSNR.
    WHEN SOBKZ_LIEFERANT.
      IF WM_BESTAND-SONUM CO CON_NUM.
        UNPACK WM_BESTAND-SONUM TO WM_BESTAND-LIFNR.
      ELSE.
        MOVE WM_BESTAND-SONUM TO WM_BESTAND-LIFNR.
      ENDIF.
    WHEN SOBKZ_PROJEKT.
      MOVE WM_BESTAND-SONUM TO WM_BESTAND-PSPNR.
    WHEN SOBKZ_MEHRWEG.
      IF WM_BESTAND-SONUM CO CON_NUM.
        UNPACK WM_BESTAND-SONUM TO WM_BESTAND-LIFNR.
      ELSE.
        MOVE WM_BESTAND-SONUM TO WM_BESTAND-LIFNR.
      ENDIF.
    WHEN OTHERS.
      MESSAGE E223 WITH WM_BESTAND-SOBKZ.
  ENDCASE.

ENDFORM.                    "CONVERSION_SONUM_IMKEY

*-----------------------------------------------------------------------
*        FORM KEINE_DIFFERENZ
*-----------------------------------------------------------------------
*        Das betrachtete Material ist in TMP_MATNR_BEST zwischen-
*        zuspeichern.
*-----------------------------------------------------------------------
FORM KEINE_DIFFERENZ.

  PERFORM SPEICHERN_IM USING SPACE.
  PERFORM SPEICHERN_WM USING SPACE.

ENDFORM.                    "KEINE_DIFFERENZ

*-----------------------------------------------------------------------
*        FORM MERKEN_DIFFERENZ
*-----------------------------------------------------------------------
*        Zum betrachteten Material ist Differenz aufgetreten
*        Die betrachteten Tabelleneintrфge werden in die der temporфren
*        Differenzentabelle ќberfќhrt, es sei denn:
*        - in MARD Differenzen nur im Konsibestand auftreten
*        - in MARD Summe der Chargen
*-----------------------------------------------------------------------
FORM MERKEN_DIFFERENZ.

*........Folgeeintrag fќr Prќfung lesen.................................
  HLP_IM_TABIX = IM_TABIX + 1.
  IF IM_TABIX < IM_LINES.      "Sicherstellen, daп nicht Ende IM_BESTAND
    READ TABLE IM_BESTAND INDEX HLP_IM_TABIX.
    HLP_MATNR    = IM_BESTAND-MATNR.
    HLP_SOBKZ    = IM_BESTAND-SOBKZ.
    HLP_CHARG    = IM_BESTAND-CHARG.
    READ TABLE IM_BESTAND INDEX IM_TABIX.
  ENDIF.

  IF   IM_BESTAND-SOBKZ IS INITIAL        AND
       IM_BESTAND-LABST =  WM_SUMME-LABST AND
       IM_BESTAND-INSME =  WM_SUMME-INSME AND
       IM_BESTAND-SPEME =  WM_SUMME-SPEME AND
       IM_BESTAND-RETME =  WM_SUMME-RETME AND
     ( IM_BESTAND-KLABS NE WM_SUMME-KLABS OR
       IM_BESTAND-KINSM NE WM_SUMME-KINSM OR
       IM_BESTAND-KSPEM NE WM_SUMME-KSPEM ) AND
       IM_BESTAND-MATNR =  HLP_MATNR  AND
       NOT  ( HLP_SOBKZ IS INITIAL ).
*..-> Keine Differenz, weil MARD SUMME der Konsibestфnde enthфlt,.......
*.....die Quants aber mit dem entsprechenden MKOL Satz verglichen werden
    PERFORM SPEICHERN_IM USING SPACE.
    PERFORM SPEICHERN_WM USING SPACE.
  ELSEIF ( WM_SUMME-LABST = 0 AND
           WM_SUMME-INSME = 0 AND
           WM_SUMME-RETME = 0 AND
           WM_SUMME-SPEME = 0 AND
           WM_SUMME-KLABS = 0 AND
           WM_SUMME-KINSM = 0 AND
           WM_SUMME-KSPEM = 0 AND
           IM_BESTAND-CHARG IS INITIAL AND
           NOT ( HLP_CHARG IS INITIAL ) AND
           IM_BESTAND-MATNR = HLP_MATNR ).
*..-> Keine Differenz, weil MARD- Summe der Chargenbestфnde enthфlt,
*.....die zugehіrigen WM-Quants leer sind
    PERFORM SPEICHERN_IM USING SPACE.
    PERFORM SPEICHERN_WM USING SPACE.
  ELSE.
*........Differenz zwischen WM und IM...................................
    PERFORM SPEICHERN_IM USING CON_X.
    PERFORM SPEICHERN_WM USING CON_X.

  ENDIF.

  CLEAR: HLP_MATNR,
         HLP_SOBKZ.

ENDFORM.                    "MERKEN_DIFFERENZ

*-----------------------------------------------------------------------
*        FORM MERKEN_IM_OHNE_WM
*-----------------------------------------------------------------------
*        Durch den Schleifenabbruch in der nichtsynchronen Schleife muп
*        der IM_Bestands-Satz gemerkt werden, es sei denn:
*        - MARD-Satz SUMME der Chargen enthфlt (ohne Quantentsprechung)
*        - Im IM ein Nullbestand besteht (ohne Quants im WM)
*        - in MARD Differenzen nur im Konsibestand auftreten
*-----------------------------------------------------------------------
FORM MERKEN_IM_OHNE_WM.

*........Folgeeintrag fќr Prќfzwecke lesen..............................
  HLP_IM_TABIX = IM_TABIX + 1.
  IF IM_TABIX < IM_LINES.      "Sicherstellen, daп nicht Ende IM_BESTAND
    READ TABLE IM_BESTAND INDEX HLP_IM_TABIX.
    HLP_MATNR    = IM_BESTAND-MATNR.
    HLP_SOBKZ    = IM_BESTAND-SOBKZ.
    HLP_CHARG    = IM_BESTAND-CHARG.
    READ TABLE IM_BESTAND INDEX IM_TABIX.
  ENDIF.

  IF IM_BESTAND-MATNR = WM_BESTAND-MATNR AND
     IM_BESTAND-CHARG IS INITIAL AND
     NOT ( WM_BESTAND-CHARG IS INITIAL ).
*..-> Keine Differenz, weil MARD SUMME der Chargen enthфlt, ohne........
*.....Entsprechung im WM -> OK..........................................
  ELSEIF ( IM_BESTAND-MATNR = HLP_MATNR AND            "insert
           IM_BESTAND-CHARG IS INITIAL  AND            "insert
           NOT HLP_CHARG IS INITIAL ). "insert

*..-> Keine Differenz, weil MARD SUMME der Chargen enthфlt, ohne........
*.....Entsprechung im WM -> OK..........................................
  ELSEIF ( IM_BESTAND-LABST = 0 AND    "Denn Nullsфtze sind OK
           IM_BESTAND-INSME = 0 AND
           IM_BESTAND-SPEME = 0 AND
           IM_BESTAND-RETME = 0 AND
           IM_BESTAND-KLABS = 0 AND
           IM_BESTAND-KINSM = 0 AND
           IM_BESTAND-KSPEM = 0 ).
*..-> Keine Differenz, weil Nullbestand im IM und nicht vorhanden im WM.
*.....-> OK.............................................................
  ELSEIF ( IM_BESTAND-LABST = 0 AND
           IM_BESTAND-INSME = 0 AND
           IM_BESTAND-SPEME = 0 AND
           IM_BESTAND-RETME = 0 AND
           IM_BESTAND-SOBKZ IS INITIAL AND
           HLP_SOBKZ = SOBKZ_LIEFERANT ).
*..-> Keine Differenz, weil Summe der Konsibestфnde keine Entsprechung..
*.....im WM haben mќssen -> OK..........................................
  ELSE.
*........Differenz fќr IM ohne WM-Entsprechung..........................
*........Read correct UOM 'MEINS' from table 'MARA'.

    PERFORM SPEICHERN_IM USING CON_X.
    PERFORM SPEICHERN_DUMMY_WM USING CON_X CON_WD.

  ENDIF.
ENDFORM.                    "MERKEN_IM_OHNE_WM

*-----------------------------------------------------------------------
*        FORM MERKEN_WM_OHNE_IM
*-----------------------------------------------------------------------
*        Es existieren WM-Quants ohne IM-Entsprechung. Handelt es sich
*        um Nullquants, so ist der Fehler unkritisch -> SPACE)
*        Weicher Fehler, wenn WM_SUMME = Null
*-----------------------------------------------------------------------
FORM MERKEN_WM_OHNE_IM.

  IF ( WM_SUMME-LABST = 0 AND          "Nullsфtze sind 'weicher' Fehler
       WM_SUMME-INSME = 0 AND          "d.h. eigentlich kein Fehler
       WM_SUMME-RETME = 0 AND
       WM_SUMME-SPEME = 0 AND
       WM_SUMME-KLABS = 0 AND
       WM_SUMME-KINSM = 0 AND
       WM_SUMME-KSPEM = 0 ).

*........Differenz fќr WM ohne IM-Entsprechung..........................
    PERFORM SPEICHERN_DUMMY_IM USING SPACE CON_ID.
    PERFORM SPEICHERN_WM USING SPACE.

  ELSE.                          "Keine Nullsфtze -> Harter Fehler.

*........Differenz fќr WM ohne IM-Entsprechung..........................
    PERFORM SPEICHERN_DUMMY_IM USING CON_X CON_ID.
    PERFORM SPEICHERN_WM USING CON_X.

  ENDIF.

  WM_STAND_NS = WM_STAND_ALT + 1.
  CLEAR WM_SUMME.

*........Nur wenn Neue Materialnummer aufgetreten.......................
  IF IM_BESTAND-MATNR > ALT_WM_BESTAND-MATNR.
    PERFORM NAECHSTE_MATNR.
  ENDIF.

ENDFORM.                    "MERKEN_WM_OHNE_IM

*-----------------------------------------------------------------------
*        NAECHSTE_MATNR
*-----------------------------------------------------------------------
*        Nфchste Materialnummer wurde selektiert. Gemфп der Auswahl
*        (AUSG_KOM) werden die entsprechenden Datensфtze aus
*        TMP_MATNR_BEST in DIFFERENZ ќbernommern.
*-----------------------------------------------------------------------
FORM NAECHSTE_MATNR.

  IF DIFF_AUFGETRETEN = CON_X.

    LOOP AT TMP_MATNR_BEST.

      IF AUSG_KOM = CON_X.
        MOVE-CORRESPONDING TMP_MATNR_BEST TO DIFFERENZ.
        APPEND DIFFERENZ.
      ELSEIF TMP_MATNR_BEST-DIFF = CON_X.
        MOVE-CORRESPONDING TMP_MATNR_BEST TO DIFFERENZ.
        APPEND DIFFERENZ.
      ENDIF.

    ENDLOOP.

    CLEAR DIFF_AUFGETRETEN.

  ENDIF.

  REFRESH TMP_MATNR_BEST.
  CLEAR TMP_MATNR_BEST.

ENDFORM.                    "NAECHSTE_MATNR

*-----------------------------------------------------------------------
*        SPEICHERN_IM
*-----------------------------------------------------------------------
*        Speichern des aktuellen IM_Bestandsatzes in TMP_MATNR_BEST
*        mit dem Differenzenkennzeichen SPACE/con_x
*-----------------------------------------------------------------------
FORM SPEICHERN_IM USING DIFF_PLATZHALTER.

  IF DIFF_PLATZHALTER = CON_X.
    DIFF_AUFGETRETEN = CON_X.
  ENDIF.

  MOVE-CORRESPONDING IM_BESTAND TO TMP_MATNR_BEST.
  TMP_MATNR_BEST-IDENT = CON_IM.
  TMP_MATNR_BEST-DIFF = DIFF_PLATZHALTER.
  APPEND TMP_MATNR_BEST.

ENDFORM.                    "SPEICHERN_IM

*-----------------------------------------------------------------------
*        SPEICHERN_DUMMY_IM
*-----------------------------------------------------------------------
*        Speichern eines Leersatzes in TMP_MATNR_BEST
*        mit dem Differenzenkennzeichen SPACE/con_x
*-----------------------------------------------------------------------
FORM SPEICHERN_DUMMY_IM USING DIFF_PLATZHALTER CON_ART.

  CLEAR TMP_MATNR_BEST.
  TMP_MATNR_BEST-MATNR = WM_SUMME-MATNR.   "Weil DUMMY zur WM_SUMME
  TMP_MATNR_BEST-CHARG = WM_SUMME-CHARG.
  TMP_MATNR_BEST-SOBKZ = WM_SUMME-SOBKZ.
  TMP_MATNR_BEST-LIFNR = WM_SUMME-LIFNR.
  TMP_MATNR_BEST-VBELN = WM_SUMME-VBELN.
  TMP_MATNR_BEST-POSNR = WM_SUMME-POSNR.
  TMP_MATNR_BEST-PSPNR = WM_SUMME-PSPNR.
  TMP_MATNR_BEST-IDENT = CON_ART.
  TMP_MATNR_BEST-DIFF = DIFF_PLATZHALTER.
  TMP_MATNR_BEST-WERKS = IT320-WERKS.
  TMP_MATNR_BEST-LGORT = IT320-LGORT.
  APPEND TMP_MATNR_BEST.

ENDFORM.                    "SPEICHERN_DUMMY_IM

*-----------------------------------------------------------------------
*        SPEICHERN_WM
*-----------------------------------------------------------------------
*        Speichern des aktuellen WM_Bestandsatzes in TMP_MATNR_BEST
*        mit dem Differenzenkennzeichen SPACE/con_x
*-----------------------------------------------------------------------
FORM SPEICHERN_WM USING DIFF_PLATZHALTER.

  IF DIFF_PLATZHALTER = CON_X.
    DIFF_AUFGETRETEN = CON_X.
  ENDIF.

  MOVE-CORRESPONDING WM_SUMME TO TMP_MATNR_BEST.
  TMP_MATNR_BEST-IDENT = CON_WM.
  TMP_MATNR_BEST-DIFF = DIFF_PLATZHALTER.
  APPEND TMP_MATNR_BEST.

ENDFORM.                    "SPEICHERN_WM

*-----------------------------------------------------------------------
*        SPEICHERN_DUMMY_WM
*-----------------------------------------------------------------------
*        Speichern eines leeren WM_Bestandsatzes in TMP_MATNR_BEST
*        mit dem Differenzenkennzeichen SPACE/con_x
*-----------------------------------------------------------------------
FORM SPEICHERN_DUMMY_WM USING DIFF_PLATZHALTER CON_ART.

  CLEAR TMP_MATNR_BEST.
  TMP_MATNR_BEST-MATNR = IM_BESTAND-MATNR.  "Weil DUMMY zum IM_bestand
  TMP_MATNR_BEST-CHARG = IM_BESTAND-CHARG.
  TMP_MATNR_BEST-SOBKZ = IM_BESTAND-SOBKZ.
  TMP_MATNR_BEST-LIFNR = IM_BESTAND-LIFNR.
  TMP_MATNR_BEST-VBELN = IM_BESTAND-VBELN.
  TMP_MATNR_BEST-POSNR = IM_BESTAND-POSNR.
  TMP_MATNR_BEST-PSPNR = IM_BESTAND-PSPNR.
  TMP_MATNR_BEST-IDENT = CON_ART.
  TMP_MATNR_BEST-DIFF = DIFF_PLATZHALTER.
  APPEND TMP_MATNR_BEST.

ENDFORM.                    "SPEICHERN_DUMMY_WM

*-----------------------------------------------------------------------
*        SUMME_SONDERBESTAND
*-----------------------------------------------------------------------
*        Sonderbestфnde werden entsprechend der Bestandsqualifikation
*        in der Vergleichsstruktur aufsummiert
*-----------------------------------------------------------------------
FORM SUMME_SONDERBESTAND.

  CASE WM_BESTAND-BESTQ.
    WHEN CON_BESTQ_Q.                  "-> Qualitфtsprќfung
      WM_SUMME-KINSM = WM_SUMME-KINSM + WM_BESTAND-GESME.
    WHEN CON_BESTQ_S.                  "-> Sperrbestand
      WM_SUMME-KSPEM = WM_SUMME-KSPEM + WM_BESTAND-GESME.
    WHEN OTHERS.                       "frei verwendbar
      WM_SUMME-KLABS = WM_SUMME-KLABS + WM_BESTAND-GESME.
  ENDCASE.

ENDFORM.                    "SUMME_SONDERBESTAND

*-----------------------------------------------------------------------
*        FORM INIT_YWEWA
*-----------------------------------------------------------------------
*        Dataset wird geіffnet, beim ersten Mal wird ein eventuell
*        bestehender Dataset gelіscht, ansonsten werden neue Sфtze
*        angehфngt.
*-----------------------------------------------------------------------
FORM INIT_YWEWA.

  IF FLG_NFIRST IS INITIAL.
    FLG_NFIRST = CON_X.
    REFRESH YWEWA.
  ENDIF.
  CLEAR YWEWA.

*........Im Dataset gemeinsame Felder belegen...........................
  MOVE:  CON_BEZ_MAPPE   TO YWEWA-MAPPE,
         CON_BEZ_TCODE   TO YWEWA-TCODE,
         SY-DATLO        TO YWEWA-ZLDAT,
         SY-DATLO        TO YWEWA-BLDAT,
         SY-DATLO        TO YWEWA-BUDAT,
         SY-DATLO        TO YWEWA-GIDAT,
         IT320-WERKS     TO YWEWA-WERKS,
         IT320-LGORT     TO YWEWA-LGORT.
ENDFORM.                    "INIT_YWEWA

*-----------------------------------------------------------------------
*        FORM FUELLEN_YWEWA
*-----------------------------------------------------------------------
*        Entsprechenden Satz in YWEWA einstellen.
*-----------------------------------------------------------------------
FORM FUELLEN_YWEWA.

*  WRITE: TMP_MATNR_BEST-MATNR TO YWEWA-MATNR,
  MOVE:  TMP_MATNR_BEST-MATNR TO YWEWA-MATNR.
  WRITE: TMP_MATNR_BEST-PSPNR TO YWEWA-PS_PSP_PNR.

  IF TMP_MATNR_BEST-MEINS IS INITIAL.           " v_n_685710
    MOVE TMP_IM_SATZ-MEINS TO TMP_MATNR_BEST-MEINS.
  ENDIF.                                        " ^_n_685710

  IF IWMSDEC-CENSY = SPACE.                     " v_n_680195
    WRITE:  TMP_MATNR_BEST-MEINS TO YWEWA-ERFME.
  ELSE.                                         " ^_n_680195
    MOVE:  TMP_MATNR_BEST-MEINS TO YWEWA-ERFME.
  ENDIF.                                        " ^_n_680195
  MOVE:  TMP_MATNR_BEST-CHARG TO YWEWA-CHARG,
         TMP_MATNR_BEST-SOBKZ TO YWEWA-SOBKZ,
         TMP_MATNR_BEST-LIFNR TO YWEWA-LIFNR,
         TMP_MATNR_BEST-VBELN TO YWEWA-KDAUF.
* if not tmp_matnr_best-posnr is initial.
  IF YWEWA-SOBKZ = SOBKZ_EINZELBESTAND. "<<<<<INSERTION Hinweis 305548
    WRITE: TMP_MATNR_BEST-POSNR TO YWEWA-KDPOS.
  ENDIF.                                "<<<<<INSERTION Hinweis 305548
* endif.
  APPEND YWEWA.
  CLEAR YWEWA-KDPOS.                    "<<<<<INSERTION Hinweis 378873
  FLG_NLEER = CON_X.

ENDFORM.                    "FUELLEN_YWEWA

*-----------------------------------------------------------------------
*        FORM WM_NEG_RET_MERKEN
*-----------------------------------------------------------------------
*        Negative WM-Bestфnde kіnnen nicht ausgebucht werden, daher
*        mќssen sie zwischengespeichert werden und ggf. am Ende der
*        Liste ausgegeben werden.
*-----------------------------------------------------------------------
FORM WM_NEG_RET_MERKEN.

  MOVE: TMP_MATNR_BEST-MATNR TO WM_NEG_RET-MATNR,
        TMP_MATNR_BEST-CHARG TO WM_NEG_RET-CHARG,
        TMP_MATNR_BEST-SOBKZ TO WM_NEG_RET-SOBKZ,
        TMP_MATNR_BEST-LIFNR TO WM_NEG_RET-LIFNR,
        TMP_MATNR_BEST-VBELN TO WM_NEG_RET-VBELN,
        TMP_MATNR_BEST-POSNR TO WM_NEG_RET-POSNR,
        TMP_MATNR_BEST-MEINS TO WM_NEG_RET-MEINS,
        IT320-WERKS          TO WM_NEG_RET-WERKS,
        IT320-LGNUM          TO WM_NEG_RET-LGNUM.
  APPEND WM_NEG_RET.
ENDFORM.                    "WM_NEG_RET_MERKEN

*-----------------------------------------------------------------------
*        FORM MAPPE_ERSTELLEN
*-----------------------------------------------------------------------
*        Batchinputmappe fќr SM35 ќber MI40 erzeugen.
*-----------------------------------------------------------------------
FORM MAPPE_ERSTELLEN.

  REFRESH BDC_DATEN.

  CLEAR BDC_DATEN.
  BDC_DATEN-PROGRAM  = MODPL_DIF_MAP.
  BDC_DATEN-DYNPRO   = ADYNP_DIF_MAP.
  BDC_DATEN-DYNBEGIN = CON_X.
  APPEND BDC_DATEN.

*.........OK-CODE FмR DIE FOLGEBILDSTEUERUNG............................
  CLEAR BDC_DATEN.
  BDC_DATEN-FNAM = 'BDC_OKCODE'.
  BDC_DATEN-FVAL = '/08'.
  APPEND BDC_DATEN.

  EXPORT YWEWA TO MEMORY ID 'CPIC_YWEWA'.

  CALL TRANSACTION TCODE_DIF_MAP
                   USING  BDC_DATEN
                   MODE   ANZ_NICHTS
                   UPDATE UPD_SYNCHRON.

*.........Fehlerstatus abfragen, ggf. ausdgeben.........................
  SKIP 2.

  IF SY-SUBRC <> 0.
    LMESS-MSGID = SY-MSGID.
    LMESS-MSGNO = SY-MSGNO.
    LMESS-MSGV1 = SY-MSGV1.
    LMESS-MSGV2 = SY-MSGV2.
    LMESS-MSGV3 = SY-MSGV3.
    LMESS-MSGV4 = SY-MSGV4.
    CALL FUNCTION 'L_MESSAGE_AUFBEREITEN'
      EXPORTING
        I_MESS = LMESS
      IMPORTING
        O_TEXT = HLP_TEXT.
    WRITE: / HLP_TEXT.
  ELSE.
    WRITE: / TEXT-090,
           / TEXT-091.
  ENDIF.

ENDFORM.                    "MAPPE_ERSTELLEN

*-----------------------------------------------------------------------
*        FORM TOP_OF_PAGE
*-----------------------------------------------------------------------
FORM TOP_OF_PAGE.

  ULINE /(132).
  WRITE: /  TEXT-001 COLOR COL_HEADING INTENSIFIED ON, "1.Matrialinfo
         /  TEXT-002 COLOR COL_HEADING INTENSIFIED ON. "2. spezMatinfo
  IF AUSG_DET = CON_X.
    FORMAT INTENSIFIED OFF.
    WRITE / TEXT-003 COLOR COL_HEADING INTENSIFIED OFF."3. Zeile Quant
    FORMAT INTENSIFIED.
  ENDIF.
  ULINE /(132).

ENDFORM.                    "TOP_OF_PAGE

*-----------------------------------------------------------------------
*        FORM LISTE_AUSGEBEN
*-----------------------------------------------------------------------
*        Ausgabe der Differenzen Liste gemфп Selektions-Parameter
*        AUSG_DET mit/ohne Einzelquants.
*-----------------------------------------------------------------------
FORM LISTE_AUSGEBEN.

  REFRESH TMP_MATNR_BEST.
  CLEAR TMP_MATNR_BEST.
*........Ausgabe mit Quanteinzelinformationen, erstes Quant lesen.......
  IF AUSG_DET = CON_X AND
     WM_LINES > 0.
    WM_TABIX = 1.
    PERFORM READ_WM USING WM_TABIX.
  ENDIF.

*........Wenn die Batchinputmappe erzeugt werden soll...................
  IF AUSG_MAP = CON_X.
    PERFORM INIT_YWEWA.
  ENDIF.

*.........Differenzentabelle durchloopen................................
  LOOP AT DIFFERENZ.

    ON CHANGE OF DIFFERENZ-MATNR.
      IF NOT TMP_MATNR_BEST-MATNR IS INITIAL.
        PERFORM SCHREIBE_MATKOPF.
        PERFORM MATNR_PACK_AUSGABE.
        PERFORM SCHREIBE_SUMME.
        ULINE.
      ENDIF.
      REFRESH TMP_MATNR_BEST.
      CLEAR: SUMME1,
             SUMME2,
             SUMME3.
    ENDON.

*........Gleiche Materialien in temporфrer Tabelle speichern............
    MOVE-CORRESPONDING DIFFERENZ TO TMP_MATNR_BEST.
    APPEND TMP_MATNR_BEST.

  ENDLOOP.

  IF SY-SUBRC = 0.
*........Letzten Schleifendurchgang auswerten...........................
    PERFORM SCHREIBE_MATKOPF.
    PERFORM MATNR_PACK_AUSGABE.
    PERFORM SCHREIBE_SUMME.
    ULINE.
    IF IT320-OBEST IS INITIAL AND IT320-XHUPF = CON_X. "HU verwaltet
      WRITE: / TEXT-099.
      WRITE: / TEXT-101.
    ENDIF.
  ELSEIF SY-SUBRC = 4.
    IF WM_LINES > 0 OR
       IM_LINES > 0.
*........Keine Differenzen selektiert...................................
*   KEINE_AUSGABE = CON_X.
      FORMAT INTENSIFIED OFF.
      WRITE:  /1  SY-VLINE,
               2  IT320-WERKS,
               7  IT320-LGORT,
              12  IT320-LGNUM,
             132  SY-VLINE.
      FORMAT INTENSIFIED.
      WRITE: /  TEXT-011.            "sind keine Differenzen aufgetreten
      ULINE /(132).
      IF IT320-OBEST IS INITIAL AND IT320-XHUPF = CON_X. "HU verwaltet
        WRITE: / TEXT-099.
        WRITE: / TEXT-101.
      ENDIF.
    ELSE.
*      IF IT320-OBEST IS INITIAL AND IT320-XHUPF = CON_X. "HU verwaltet
*        FORMAT INTENSIFIED OFF.
*        WRITE:  /1  SY-VLINE,
*                 2  IT320-WERKS,
*                 7  IT320-LGORT,
*                 12 IT320-LGNUM,
*                132 SY-VLINE.
*        FORMAT INTENSIFIED.
*        WRITE: /  TEXT-013.              "kein Abgl. weil HU Verwaltung
*        ULINE /(132).
*      ELSE.
      FORMAT INTENSIFIED OFF.
      WRITE:  /1  SY-VLINE,
               2  IT320-WERKS,
               7  IT320-LGORT,
               12 IT320-LGNUM,
              132 SY-VLINE.
      FORMAT INTENSIFIED.
      WRITE: /  TEXT-012.              "Keine Bestфnde in IM und WM
      ULINE /(132).
      IF IT320-OBEST IS INITIAL AND IT320-XHUPF = CON_X. "HU verwaltet
        WRITE: / TEXT-099.
        WRITE: / TEXT-101.
      ENDIF.
*     ENDIF.
    ENDIF.
  ENDIF.

ENDFORM.                    "LISTE_AUSGEBEN

*-----------------------------------------------------------------------
*        FORM MATNR_PACK_AUSGABE
*-----------------------------------------------------------------------
*        Ausgabe der aktuellen Eintrфge zum Material, dabei werden
*        immer zwei Sфtze (IM&WM) der temporфren Materialtabelle
*        gebќndelt ausgegeben.
*-----------------------------------------------------------------------
FORM MATNR_PACK_AUSGABE.

  LOOP AT TMP_MATNR_BEST.

    IF TMP_IM_SATZ IS INITIAL.
      MOVE-CORRESPONDING TMP_MATNR_BEST TO TMP_IM_SATZ.
    ELSE.
      PERFORM DOPPELSATZ_AUSWERTEN.
      CLEAR TMP_IM_SATZ.
    ENDIF.

  ENDLOOP.

ENDFORM.                    "MATNR_PACK_AUSGABE

*-----------------------------------------------------------------------
*        FORM DOPPELSATZ_AUSWERTEN
*-----------------------------------------------------------------------
*        Ausgabe des Doppelpackes (IM & WM)
*-----------------------------------------------------------------------
FORM DOPPELSATZ_AUSWERTEN.

*........LABST vergleichen, ggf. ausdrucken.............................
  IF TMP_IM_SATZ-LABST NE TMP_MATNR_BEST-LABST OR
    ( AUSG_KOM = CON_X  AND
    TMP_MATNR_BEST-LABST > 0 ).
    ASSIGN TMP_IM_SATZ-LABST TO <FELDNAME1>.
    ASSIGN TMP_MATNR_BEST-LABST TO <FELDNAME2>.
    PERFORM SCHREIBE_SATZ USING SPACE.
  ENDIF.

*........INSME vergleichen, ggf. ausdrucken.............................
  IF TMP_IM_SATZ-INSME NE TMP_MATNR_BEST-INSME OR
    ( AUSG_KOM = CON_X  AND
     TMP_MATNR_BEST-INSME > 0 ).
    ASSIGN TMP_IM_SATZ-INSME TO <FELDNAME1>.
    ASSIGN TMP_MATNR_BEST-INSME TO <FELDNAME2>.
    PERFORM SCHREIBE_SATZ USING CON_BESTQ_Q.
  ENDIF.

*........SPEME vergleichen, ggf. ausdrucken.............................
  IF TMP_IM_SATZ-SPEME NE TMP_MATNR_BEST-SPEME OR
    ( AUSG_KOM = CON_X  AND
     TMP_MATNR_BEST-SPEME > 0 ).
    ASSIGN TMP_IM_SATZ-SPEME TO <FELDNAME1>.
    ASSIGN TMP_MATNR_BEST-SPEME TO <FELDNAME2>.
    PERFORM SCHREIBE_SATZ USING CON_BESTQ_S.
  ENDIF.

*........RETME vergleichen, ggf. ausdrucken.............................
  IF TMP_IM_SATZ-RETME NE TMP_MATNR_BEST-RETME OR
    ( AUSG_KOM = CON_X  AND
     TMP_MATNR_BEST-RETME > 0 ).
    ASSIGN TMP_IM_SATZ-RETME TO <FELDNAME1>.
    ASSIGN TMP_MATNR_BEST-RETME TO <FELDNAME2>.
    PERFORM SCHREIBE_SATZ USING CON_BESTQ_R.
  ENDIF.

*........KLABS vergleichen, ggf. ausdrucken.............................
  IF NOT TMP_IM_SATZ-SOBKZ IS INITIAL  AND
     ( TMP_IM_SATZ-KLABS NE TMP_MATNR_BEST-KLABS OR
     ( AUSG_KOM = CON_X  AND
     TMP_MATNR_BEST-KLABS > 0 ) ) AND NOT
     ( TMP_IM_SATZ-LABST NE TMP_MATNR_BEST-LABST OR  "keine LABST-Diff.
     ( AUSG_KOM = CON_X  AND
      TMP_MATNR_BEST-LABST > 0 ) ).
    ASSIGN TMP_IM_SATZ-KLABS TO <FELDNAME1>.
    ASSIGN TMP_MATNR_BEST-KLABS TO <FELDNAME2>.
    PERFORM SCHREIBE_SATZ USING SPACE.
  ENDIF.

*........KINSM vergleichen, ggf. ausdrucken.............................
  IF NOT TMP_IM_SATZ-SOBKZ IS INITIAL  AND
     ( TMP_IM_SATZ-KINSM NE TMP_MATNR_BEST-KINSM OR
     ( AUSG_KOM = CON_X  AND
     TMP_MATNR_BEST-KINSM > 0 ) ) AND NOT
     ( TMP_IM_SATZ-INSME NE TMP_MATNR_BEST-INSME OR  "keine INSME-Diff.
     ( AUSG_KOM = CON_X  AND
      TMP_MATNR_BEST-INSME > 0 ) ).
    ASSIGN TMP_IM_SATZ-KINSM TO <FELDNAME1>.
    ASSIGN TMP_MATNR_BEST-KINSM TO <FELDNAME2>.
    PERFORM SCHREIBE_SATZ USING CON_BESTQ_Q.
  ENDIF.

*........KSPEM vergleichen, ggf. ausdrucken.............................
  IF NOT TMP_IM_SATZ-SOBKZ IS INITIAL  AND
     ( TMP_IM_SATZ-KSPEM NE TMP_MATNR_BEST-KSPEM OR
     ( AUSG_KOM = CON_X  AND
     TMP_MATNR_BEST-KSPEM > 0 ) ) AND NOT
     ( TMP_IM_SATZ-SPEME NE TMP_MATNR_BEST-SPEME OR  "keine SPEME-Diff.
     ( AUSG_KOM = CON_X  AND
     TMP_MATNR_BEST-SPEME > 0 ) ).
    ASSIGN TMP_IM_SATZ-KSPEM TO <FELDNAME1>.
    ASSIGN TMP_MATNR_BEST-KSPEM TO <FELDNAME2>.
    PERFORM SCHREIBE_SATZ USING CON_BESTQ_S.
  ENDIF.

*........Wenn nichts gedruckt, wenigstens LABST ausgeben................
  IF MAT_GEDRUCKT IS INITIAL.
    ASSIGN TMP_IM_SATZ-LABST TO <FELDNAME1>.
    ASSIGN TMP_MATNR_BEST-LABST TO <FELDNAME2>.
    PERFORM SCHREIBE_SATZ USING SPACE.
  ENDIF.

*........Gedrucktflag zurќcknehmen......................................
  CLEAR MAT_GEDRUCKT.

*........Schreiben fќr BI-Mappe, falls erforderlich.....................
  IF NOT AUSG_MAP IS INITIAL.

*........LABST vergleichen, ggf. abspeichern............................
    IF TMP_IM_SATZ-LABST NE TMP_MATNR_BEST-LABST AND
       TMP_MATNR_BEST-LABST >= 0.
      WRITE TMP_MATNR_BEST-LABST TO YWEWA-ERFMG.
      MOVE CON_1                TO YWEWA-BSTAR.
      IF TMP_MATNR_BEST-LABST = 0.
        MOVE CON_X              TO YWEWA-XNULL.
      ELSE.
        MOVE SPACE              TO YWEWA-XNULL.
      ENDIF.
      PERFORM FUELLEN_YWEWA.
    ELSEIF TMP_IM_SATZ-LABST NE TMP_MATNR_BEST-LABST.
      MOVE TMP_MATNR_BEST-LABST TO WM_NEG_RET-GESME.
      MOVE SPACE                TO WM_NEG_RET-BESTQ.
      PERFORM WM_NEG_RET_MERKEN.
    ENDIF.

*........INSME vergleichen, ggf. abspeichern............................
    IF TMP_IM_SATZ-INSME NE TMP_MATNR_BEST-INSME AND
       TMP_MATNR_BEST-INSME >= 0.
      WRITE TMP_MATNR_BEST-INSME TO YWEWA-ERFMG.
      MOVE CON_2                TO YWEWA-BSTAR.
      IF TMP_MATNR_BEST-INSME = 0.
        MOVE CON_X              TO YWEWA-XNULL.
      ELSE.
        MOVE SPACE              TO YWEWA-XNULL.
      ENDIF.
      PERFORM FUELLEN_YWEWA.
    ELSEIF TMP_IM_SATZ-INSME NE TMP_MATNR_BEST-INSME.
      MOVE TMP_MATNR_BEST-INSME TO WM_NEG_RET-GESME.
      MOVE CON_BESTQ_Q                TO WM_NEG_RET-BESTQ.
      PERFORM WM_NEG_RET_MERKEN.
    ENDIF.

*........SPEME vergleichen, ggf. abspeichern............................
    IF TMP_IM_SATZ-SPEME NE TMP_MATNR_BEST-SPEME AND
       TMP_MATNR_BEST-SPEME >= 0.
      WRITE TMP_MATNR_BEST-SPEME TO YWEWA-ERFMG.
      MOVE CON_4                TO YWEWA-BSTAR.
      IF TMP_MATNR_BEST-SPEME = 0.
        MOVE CON_X              TO YWEWA-XNULL.
      ELSE.
        MOVE SPACE              TO YWEWA-XNULL.
      ENDIF.
      PERFORM FUELLEN_YWEWA.
    ELSEIF TMP_IM_SATZ-SPEME NE TMP_MATNR_BEST-SPEME.
      MOVE TMP_MATNR_BEST-SPEME TO WM_NEG_RET-GESME.
      MOVE CON_BESTQ_S                TO WM_NEG_RET-BESTQ.
      PERFORM WM_NEG_RET_MERKEN.
    ENDIF.

*........RETME vergleichen, ggf. abspeichern............................
    IF TMP_IM_SATZ-RETME NE TMP_MATNR_BEST-RETME.   "Kein ausbuchen mіg.
      MOVE TMP_MATNR_BEST-RETME TO WM_NEG_RET-GESME.
      MOVE CON_BESTQ_R                TO WM_NEG_RET-BESTQ.
      PERFORM WM_NEG_RET_MERKEN.
    ENDIF.

*........KLABS vergleichen, ggf. abspeichern............................
    IF NOT TMP_IM_SATZ-SOBKZ IS INITIAL AND             "bei Sonderbest.
       TMP_IM_SATZ-KLABS NE TMP_MATNR_BEST-KLABS AND    "wo Differenz
       TMP_IM_SATZ-LABST = TMP_MATNR_BEST-LABST.

      IF TMP_MATNR_BEST-KLABS >= 0.
        WRITE TMP_MATNR_BEST-KLABS TO YWEWA-ERFMG.
        MOVE CON_1                TO YWEWA-BSTAR.
        IF TMP_MATNR_BEST-KLABS = 0.
          MOVE CON_X              TO YWEWA-XNULL.
        ELSE.
          MOVE SPACE              TO YWEWA-XNULL.
        ENDIF.
        PERFORM FUELLEN_YWEWA.
      ELSE.
        MOVE TMP_MATNR_BEST-KLABS TO WM_NEG_RET-GESME.
        MOVE SPACE                TO WM_NEG_RET-BESTQ.
        PERFORM WM_NEG_RET_MERKEN.
      ENDIF.
    ENDIF.

*........KINSM vergleichen, ggf. abspeichern............................
    IF NOT TMP_IM_SATZ-SOBKZ IS INITIAL AND
       TMP_IM_SATZ-KINSM NE TMP_MATNR_BEST-KINSM AND
       TMP_IM_SATZ-INSME =  TMP_MATNR_BEST-INSME.

      IF TMP_MATNR_BEST-KINSM >= 0.
        WRITE TMP_MATNR_BEST-KINSM TO YWEWA-ERFMG.
        MOVE CON_2                TO YWEWA-BSTAR.
        IF TMP_MATNR_BEST-KINSM = 0.
          MOVE CON_X              TO YWEWA-XNULL.
        ELSE.
          MOVE SPACE              TO YWEWA-XNULL.
        ENDIF.
        PERFORM FUELLEN_YWEWA.
      ELSE.
        MOVE TMP_MATNR_BEST-KINSM TO WM_NEG_RET-GESME.
        MOVE CON_BESTQ_Q                TO WM_NEG_RET-BESTQ.
        PERFORM WM_NEG_RET_MERKEN.
      ENDIF.
    ENDIF.

*........KSPEM vergleichen, ggf. abspeichern............................
    IF NOT TMP_IM_SATZ-SOBKZ IS INITIAL AND
       TMP_IM_SATZ-KSPEM NE TMP_MATNR_BEST-KSPEM AND
       TMP_IM_SATZ-SPEME NE TMP_MATNR_BEST-SPEME.

      IF TMP_MATNR_BEST-KSPEM >= 0.
        WRITE TMP_MATNR_BEST-KSPEM TO YWEWA-ERFMG.
        MOVE CON_4                TO YWEWA-BSTAR.
        IF TMP_MATNR_BEST-KSPEM = 0.
          MOVE CON_X              TO YWEWA-XNULL.
        ELSE.
          MOVE SPACE              TO YWEWA-XNULL.
        ENDIF.
        PERFORM FUELLEN_YWEWA.
      ELSE.
        MOVE TMP_MATNR_BEST-KSPEM TO WM_NEG_RET-GESME.
        MOVE CON_BESTQ_S                TO WM_NEG_RET-BESTQ.
        PERFORM WM_NEG_RET_MERKEN.
      ENDIF.
    ENDIF.

  ENDIF.

ENDFORM.                    "DOPPELSATZ_AUSWERTEN

*-----------------------------------------------------------------------
*        FORM SCHREIBE_SATZ
*-----------------------------------------------------------------------
*        Schreiben der Ausgabezeile
*-----------------------------------------------------------------------
FORM SCHREIBE_SATZ USING BQ.

  IF TMP_MATNR_BEST-IDENT = CON_WD.    "Dummy WM ->MEINS aus MARA lesen
    WRITE: /(132) SPACE COLOR COL_TOTAL INTENSIFIED OFF.
    WRITE:  1  SY-VLINE,
            17 TMP_IM_SATZ-CHARG COLOR COL_TOTAL INTENSIFIED OFF,
            28 TMP_IM_SATZ-SOBKZ COLOR COL_TOTAL INTENSIFIED OFF.

*........Sonderbestandsnummer (Lieferant/Projekt/Auftrag&Position)......
    IF TMP_IM_SATZ-SOBKZ = SOBKZ_EINZELBESTAND.
      WRITE: 30 TMP_IM_SATZ-VBELN COLOR COL_TOTAL INTENSIFIED OFF,
             41 TMP_IM_SATZ-POSNR COLOR COL_TOTAL INTENSIFIED OFF.
    ELSEIF TMP_IM_SATZ-SOBKZ = SOBKZ_LIEFERANT.
      WRITE: 30 TMP_IM_SATZ-LIFNR COLOR COL_TOTAL INTENSIFIED OFF.
    ELSEIF TMP_IM_SATZ-SOBKZ = SOBKZ_MEHRWEG.
      WRITE: 30 TMP_IM_SATZ-LIFNR COLOR COL_TOTAL INTENSIFIED OFF.
    ELSEIF TMP_IM_SATZ-SOBKZ = SOBKZ_PROJEKT.
      WRITE: 30 TMP_IM_SATZ-PSPNR COLOR COL_TOTAL INTENSIFIED OFF.
    ENDIF.

  ELSE.
    WRITE: /(132) SPACE COLOR COL_TOTAL INTENSIFIED OFF.
    WRITE:  1  SY-VLINE,
            17 TMP_MATNR_BEST-CHARG COLOR COL_TOTAL INTENSIFIED OFF,
            28 TMP_MATNR_BEST-SOBKZ COLOR COL_TOTAL INTENSIFIED OFF.

*........Sonderbestandsnummer (Lieferant/Projekt/Auftrag&Position)......
    IF TMP_MATNR_BEST-SOBKZ = SOBKZ_EINZELBESTAND.
      WRITE: 30 TMP_MATNR_BEST-VBELN COLOR COL_TOTAL INTENSIFIED OFF,
             41 TMP_MATNR_BEST-POSNR COLOR COL_TOTAL INTENSIFIED OFF.
    ELSEIF TMP_MATNR_BEST-SOBKZ = SOBKZ_LIEFERANT.
      WRITE: 30 TMP_MATNR_BEST-LIFNR COLOR COL_TOTAL INTENSIFIED OFF.
    ELSEIF TMP_MATNR_BEST-SOBKZ = SOBKZ_MEHRWEG.
      WRITE: 30 TMP_MATNR_BEST-LIFNR COLOR COL_TOTAL INTENSIFIED OFF.
    ELSEIF TMP_MATNR_BEST-SOBKZ = SOBKZ_PROJEKT.
      WRITE: 30 TMP_MATNR_BEST-PSPNR COLOR COL_TOTAL INTENSIFIED OFF.
    ENDIF.
  ENDIF.

  CASE BQ.
    WHEN CON_BESTQ_Q.                  "Qualitфtsprќfung
      WRITE: 55(14) TEXT-050 COLOR COL_TOTAL INTENSIFIED OFF.
    WHEN CON_BESTQ_R.                  "Retourensperrbestand
      WRITE: 55(14) TEXT-051 COLOR COL_TOTAL INTENSIFIED OFF.
    WHEN CON_BESTQ_S.                  "Sperrbestand
      WRITE: 55(14) TEXT-052 COLOR COL_TOTAL INTENSIFIED OFF.
    WHEN OTHERS.                       "Anderes
      WRITE: 55 BQ COLOR COL_TOTAL INTENSIFIED OFF.
  ENDCASE.

  IF TMP_MATNR_BEST-MEINS IS INITIAL.
    PERFORM MEINS_LESEN.
    WRITE: 69 SY-VLINE,
           70 TMP_IM_SATZ-MEINS COLOR COL_TOTAL INTENSIFIED OFF.
  ELSE.
    WRITE: 69 SY-VLINE,
           70 TMP_MATNR_BEST-MEINS COLOR COL_TOTAL INTENSIFIED OFF.
  ENDIF.

  DELTA = <FELDNAME1> - <FELDNAME2>.

  WRITE:  73  SY-VLINE,
          74  <FELDNAME1> COLOR COL_TOTAL INTENSIFIED OFF,
          92  SY-VLINE,
          94  <FELDNAME2> COLOR COL_TOTAL INTENSIFIED OFF,
          112 SY-VLINE,
          114 DELTA COLOR COL_TOTAL INTENSIFIED OFF,
          132 SY-VLINE.

  SUMME1 = SUMME1 + <FELDNAME1>.
  SUMME2 = SUMME2 + <FELDNAME2>.
  SUMME3 = SUMME3 + DELTA.
  MAT_GEDRUCKT = CON_X.

  IF AUSG_DET = CON_X.
    PERFORM QUANTS_SUCHEN USING BQ.
  ENDIF.
ENDFORM.                    "SCHREIBE_SATZ

*-----------------------------------------------------------------------
*        FORM SCHREIBE_MATKOPF
*-----------------------------------------------------------------------
*        Ausgabe der gemeinsamen Materialinformationen
*-----------------------------------------------------------------------
FORM SCHREIBE_MATKOPF.

  WRITE: /(132) SPACE COLOR COL_KEY.
  WRITE:  1  SY-VLINE,
           2 IT320-WERKS COLOR COL_KEY,
           7 IT320-LGORT COLOR COL_KEY,
          12 IT320-LGNUM COLOR COL_KEY,
          17 TMP_MATNR_BEST-MATNR COLOR COL_KEY,
          69 SY-VLINE,
          73 SY-VLINE,
          92 SY-VLINE,
         112 SY-VLINE,
         132 SY-VLINE.

ENDFORM.                    "SCHREIBE_MATKOPF

*-----------------------------------------------------------------------
*        FORM NEGATIVE_WM_AUSGEBEN
*-----------------------------------------------------------------------
*        Ausgabe der nicht-ausbuchbaren WM-Quants (Summeninfo)
*        (Negative Quants und Retourenbestand)
*-----------------------------------------------------------------------
FORM NEGATIVE_WM_AUSGEBEN.

  DESCRIBE TABLE WM_NEG_RET LINES WM_NEG_LINES.

  IF WM_NEG_LINES > 0.
    FORMAT INTENSIFIED OFF.
    SKIP.
    WRITE: / TEXT-080,
           / TEXT-081.
    SKIP.
    LOOP AT WM_NEG_RET.
      WRITE: /1   SY-VLINE,
              2   WM_NEG_RET-WERKS,
              12  WM_NEG_RET-LGNUM,
              17  WM_NEG_RET-MATNR,
             132  SY-VLINE.
      WRITE: /1   SY-VLINE,
              17  WM_NEG_RET-CHARG,
              28  WM_NEG_RET-SOBKZ.

*........Lieferantennummer oder Vertiebsbeleg und Positionsnummer?......
      IF WM_NEG_RET-SOBKZ = SOBKZ_EINZELBESTAND.
        WRITE: 30 WM_NEG_RET-VBELN,
               41 WM_NEG_RET-POSNR.
      ELSEIF WM_NEG_RET-SOBKZ = SOBKZ_LIEFERANT.
        WRITE: 30 WM_NEG_RET-LIFNR.
      ELSEIF WM_NEG_RET-SOBKZ = SOBKZ_MEHRWEG.
        WRITE: 30 WM_NEG_RET-LIFNR.
      ELSEIF WM_NEG_RET-SOBKZ = SOBKZ_PROJEKT.
        WRITE: 30 WM_NEG_RET-PSPNR.
      ENDIF.

      CASE WM_NEG_RET-BESTQ.
        WHEN CON_BESTQ_Q.
          WRITE: 55(14) TEXT-050.      "Qualitфtsprќfung
        WHEN CON_BESTQ_R.
          WRITE: 55(14) TEXT-051.      "Retourensperrbestand
        WHEN CON_BESTQ_S.
          WRITE: 55(14) TEXT-052.      "Sperrbestand
        WHEN OTHERS.
          WRITE: 55 WM_NEG_RET-BESTQ.
      ENDCASE.

      WRITE:  69  SY-VLINE,
              70  WM_NEG_RET-MEINS,
              73  SY-VLINE,
              92  SY-VLINE,
              94  WM_NEG_RET-GESME,
             112  SY-VLINE,
             132  SY-VLINE.
    ENDLOOP.
  ENDIF.

ENDFORM.                    "NEGATIVE_WM_AUSGEBEN

*-----------------------------------------------------------------------
*        FORM SCHREIBE_SUMME
*-----------------------------------------------------------------------
*        Ausgabe der Summeninformationen zum Material
*-----------------------------------------------------------------------
FORM SCHREIBE_SUMME.

  WRITE: /(132) SPACE COLOR COL_TOTAL INTENSIFIED ON.
  WRITE:  1   SY-VLINE,                "Summenzeile
          16  TEXT-020 COLOR COL_TOTAL INTENSIFIED ON,
          69  SY-VLINE,
          73  SY-VLINE,
          74  SUMME1 COLOR COL_TOTAL INTENSIFIED ON,
          92  SY-VLINE,
          94  SUMME2 COLOR COL_TOTAL INTENSIFIED ON,
          112 SY-VLINE,
          114 SUMME3 COLOR COL_TOTAL INTENSIFIED ON,
          132 SY-VLINE.

ENDFORM.                    "SCHREIBE_SUMME

*-----------------------------------------------------------------------
*        FORM SCHREIBEN_QUANT
*-----------------------------------------------------------------------
*        Schreiben einer Quantinformation
*-----------------------------------------------------------------------
FORM SCHREIBEN_QUANT.

  WRITE: /(132) SPACE COLOR COL_NORMAL INTENSIFIED OFF.
  WRITE:  1   SY-VLINE,
          54  WM_BESTAND-LGTYP COLOR COL_NORMAL INTENSIFIED OFF,
          58  WM_BESTAND-LGPLA COLOR COL_NORMAL INTENSIFIED OFF,
          69  SY-VLINE,
          70  WM_BESTAND-MEINS COLOR COL_NORMAL INTENSIFIED OFF,
          73  SY-VLINE,
          92  SY-VLINE,
          94  WM_BESTAND-GESME COLOR COL_NORMAL INTENSIFIED OFF,
         112  SY-VLINE,
         132  SY-VLINE.

ENDFORM.                    "SCHREIBEN_QUANT

*-----------------------------------------------------------------------
*        FORM QUANTS_SUCHEN
*-----------------------------------------------------------------------
*        WM_Bestand nach den zur Ausgabe vorgesehenen Quants
*        durchsuchen und Ausgabe anstoпen.
*-----------------------------------------------------------------------
FORM QUANTS_SUCHEN USING BQ.

  WHILE TMP_MATNR_BEST-MATNR >  WM_BESTAND-MATNR OR
      ( TMP_MATNR_BEST-MATNR = WM_BESTAND-MATNR AND
        TMP_MATNR_BEST-CHARG > WM_BESTAND-CHARG ) OR
      ( TMP_MATNR_BEST-MATNR = WM_BESTAND-MATNR AND
        TMP_MATNR_BEST-CHARG = WM_BESTAND-CHARG AND
        TMP_MATNR_BEST-SOBKZ > WM_BESTAND-SOBKZ ) OR
      ( TMP_MATNR_BEST-MATNR = WM_BESTAND-MATNR AND
        TMP_MATNR_BEST-CHARG = WM_BESTAND-CHARG AND
        TMP_MATNR_BEST-SOBKZ = WM_BESTAND-SOBKZ AND
        TMP_MATNR_BEST-LIFNR > WM_BESTAND-LIFNR ) OR
      ( TMP_MATNR_BEST-MATNR = WM_BESTAND-MATNR AND
        TMP_MATNR_BEST-CHARG = WM_BESTAND-CHARG AND
        TMP_MATNR_BEST-SOBKZ = WM_BESTAND-SOBKZ AND
        TMP_MATNR_BEST-VBELN > WM_BESTAND-VBELN ) OR
      ( TMP_MATNR_BEST-MATNR = WM_BESTAND-MATNR AND
        TMP_MATNR_BEST-CHARG = WM_BESTAND-CHARG AND
        TMP_MATNR_BEST-SOBKZ = WM_BESTAND-SOBKZ AND
        TMP_MATNR_BEST-VBELN = WM_BESTAND-VBELN AND
        TMP_MATNR_BEST-POSNR > WM_BESTAND-POSNR ).

*........Schleife verlassen, wenn identisch.............................
    IF TMP_MATNR_BEST-MATNR = WM_BESTAND-MATNR AND
       TMP_MATNR_BEST-CHARG = WM_BESTAND-CHARG AND
       TMP_MATNR_BEST-SOBKZ = WM_BESTAND-SOBKZ AND
       TMP_MATNR_BEST-LIFNR = WM_BESTAND-LIFNR AND
       TMP_MATNR_BEST-VBELN = WM_BESTAND-VBELN AND
       TMP_MATNR_BEST-POSNR = WM_BESTAND-POSNR .
      EXIT.
    ENDIF.
    ADD 1 TO WM_TABIX.
*........WM_TABIX an Tabellenende?......................................
    IF WM_TABIX > WM_LINES.
      EXIT.                      "Schleife verlassen, weil Tab-Ende
    ENDIF.
*........WM_Bestand lesen...............................................
    PERFORM READ_WM USING WM_TABIX.
  ENDWHILE.
  FORMAT INTENSIFIED OFF.

  WHILE TMP_MATNR_BEST-MATNR = WM_BESTAND-MATNR AND
        TMP_MATNR_BEST-CHARG = WM_BESTAND-CHARG AND
        TMP_MATNR_BEST-SOBKZ = WM_BESTAND-SOBKZ AND
        TMP_MATNR_BEST-LIFNR = WM_BESTAND-LIFNR AND
        TMP_MATNR_BEST-VBELN = WM_BESTAND-VBELN AND
        TMP_MATNR_BEST-POSNR = WM_BESTAND-POSNR .

*........Nur die Quants zur Bestandsqualifikation.......................
    IF BQ = WM_BESTAND-BESTQ.
      PERFORM SCHREIBEN_QUANT.
    ELSEIF BQ < WM_BESTAND-BESTQ.
      EXIT.
    ENDIF.
    ADD 1 TO WM_TABIX.
*........WM_TABIX an Tabellenende?......................................
    IF WM_TABIX > WM_LINES.
      EXIT.                      "Schleife verlassen, weil Tab-Ende
    ENDIF.
*........WM_Bestand lesen...............................................
    PERFORM READ_WM USING WM_TABIX.
  ENDWHILE.
  FORMAT INTENSIFIED.

ENDFORM.                    "QUANTS_SUCHEN

*-----------------------------------------------------------------------
*        FORM LGNUM_SPERREN
*-----------------------------------------------------------------------
*        Sperren aller Materialien zur selektierten Lagernummer.
*        Notwendig, damit bei BatchInputMappenerstellung keine
*        bestandsverфndernden Buchungen stattfinden.
*-----------------------------------------------------------------------
FORM LGNUM_SPERREN.

  IF AUSG_MAP = CON_X.

*.........Sperre fќr den Fall der Sperrmimik ' ' (Alte Mimik)...........
    CALL FUNCTION 'ENQUEUE_ELLQUAE'
      EXPORTING
        LGNUM          = IT320-LGNUM
      EXCEPTIONS
        FOREIGN_LOCK   = 1
        SYSTEM_FAILURE = 2.

    CASE SY-SUBRC.
      WHEN 1.
        IF SY-BATCH = CON_X.
          FLG_WARNUNG = CON_X.
          CLEAR AUSG_MAP.
        ELSE.
          MESSAGE E215.
        ENDIF.
      WHEN 2.
        IF SY-BATCH = CON_X.
          FLG_WARNUNG = CON_X.
          CLEAR AUSG_MAP.
        ELSE.
          MESSAGE E216.
        ENDIF.
    ENDCASE.

*.........Sperre fќr den Fall der Sperrmimik 'A' (Platzbezogen).........
    CALL FUNCTION 'ENQUEUE_ELLQUAX'
      EXPORTING
        LGNUM          = IT320-LGNUM
      EXCEPTIONS
        FOREIGN_LOCK   = 1
        SYSTEM_FAILURE = 2.

    CASE SY-SUBRC.
      WHEN 1.
        IF SY-BATCH = CON_X.
          FLG_WARNUNG = CON_X.
          CLEAR AUSG_MAP.
        ELSE.
          MESSAGE E215.
        ENDIF.
      WHEN 2.
        IF SY-BATCH = CON_X.
          FLG_WARNUNG = CON_X.
          CLEAR AUSG_MAP.
        ELSE.
          MESSAGE E216.
        ENDIF.
    ENDCASE.

*.........Sperre fќr den Fall der Sperrmimik 'B'........................
    CALL FUNCTION 'ENQUEUE_ELLQUAY'
      EXPORTING
        LGNUM          = IT320-LGNUM
      EXCEPTIONS
        FOREIGN_LOCK   = 1
        SYSTEM_FAILURE = 2.

    CASE SY-SUBRC.
      WHEN 1.
        IF SY-BATCH = CON_X.
          FLG_WARNUNG = CON_X.
          CLEAR AUSG_MAP.
        ELSE.
          MESSAGE E215.
        ENDIF.
      WHEN 2.
        IF SY-BATCH = CON_X.
          FLG_WARNUNG = CON_X.
          CLEAR AUSG_MAP.
        ELSE.
          MESSAGE E216.
        ENDIF.
    ENDCASE.

  ENDIF.

ENDFORM.                    "LGNUM_SPERREN

*-----------------------------------------------------------------------
*        FORM MEINS_LESEN
*-----------------------------------------------------------------------
*        Fќr Materialien, wo keine WM-Bestфnde existieren, muп die
*        Basismengeneinheit aus der MARA gelesen werden. Dies wird
*        hier vollbracht.
*-----------------------------------------------------------------------
FORM MEINS_LESEN.

  SELECT SINGLE * FROM MARA
*        where matnr = im_bestand-matnr.                "delete
         WHERE MATNR = TMP_MATNR_BEST-MATNR.            "insert
  TMP_IM_SATZ-MEINS = MARA-MEINS.

ENDFORM.                    "MEINS_LESEN

*-----------------------------------------------------------------------
*        FORM DEZENTRAL_PRUEFEN
*-----------------------------------------------------------------------
*        Prќfen fќr welches Werk/Lagerort die dezentrale Abwicklung
*        aktiv ist.
*-----------------------------------------------------------------------
FORM DEZENTRAL_PRUEFEN.

  CLEAR HLP_DECENTRAL_WMS.

*........Zu prќfendes Werk/lagerort aufbereiten.........................

  LOOP AT IT320.
    MOVE-CORRESPONDING IT320 TO IWMSDEC.
    APPEND IWMSDEC.
  ENDLOOP.

*........Werk/lagerort prќfen...........................................
  CALL FUNCTION 'L_WMS_DEC_CHECK'
    TABLES
      T_WMSDEC             = IWMSDEC
    EXCEPTIONS
      LGNUM_DOES_NOT_EXIST = 1
      OTHERS               = 2.

  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

*........Prќfen, ob Fehler aufgetretten.................................
  LOOP AT IWMSDEC.
    IF NOT IWMSDEC-MSGNO IS INITIAL.
      MESSAGE ID IWMSDEC-MSGID TYPE IWMSDEC-MSGTY NUMBER IWMSDEC-MSGNO
           WITH IWMSDEC-MSGV1 IWMSDEC-MSGV2 IWMSDEC-MSGV3 IWMSDEC-MSGV4.
    ENDIF.
  ENDLOOP.

*........Warnung, falls dezentrale Abwicklung...........................
  LOOP AT IWMSDEC
    WHERE NOT CENSY IS INITIAL.
    MOVE CON_X TO HLP_DECENTRAL_WMS.
    MESSAGE W034 WITH IWMSDEC-WERKS
                      IWMSDEC-LGORT.
  ENDLOOP.

ENDFORM.                    "DEZENTRAL_PRUEFEN


*-----------------------------------------------------------------------
*        FORM DEZENTRAL_DIFFERENZ
*-----------------------------------------------------------------------
*        Bei dezentraler Abwicklung im WM werden die Differnzen zwischen
*        den WM ind IM-Bestфnden als Differenzenbuchungen von WMS-System
*        an ERP-System ќbergeben. Dabei werden die Bestфnde immer an
*        die WM-Bestфnden angepasst.
*        Die Differenzenbuchung wird aus diesem Report angesteurt,
*        um die Daten vorzubereiten und an ERP zu versenden. Dabei
*        dќrfen keine einseitige Buchungen im WM veranlaпt werden.
*-----------------------------------------------------------------------
FORM DEZENTRAL_DIFFERENZEN.

  DATA: LF_BLDAT LIKE BISEG-BLDAT,
        LF_BUDAT LIKE BISEG-BUDAT.

  SORT YWEWA BY WERKS LGORT TCODE BLDAT BUDAT.

*........Alle Differenzen fќr dez. Abwicklung selektieren und buchen....

  LOOP AT IWMSDEC
    WHERE CENSY EQ CON_X
      AND MSGNO IS INITIAL
      AND MESSAGE IS INITIAL.

    REFRESH IIMSEG.
    LOOP AT YWEWA
      WHERE WERKS EQ IWMSDEC-WERKS
        AND LGORT EQ IWMSDEC-LGORT.

*........Gruppenwechsel -> Differenzenbuchung ansteuern.................
      IF YWEWA-BUDAT NE LF_BUDAT OR
         YWEWA-BLDAT NE LF_BLDAT.
        IF NOT IIMSEG[] IS INITIAL.
          PERFORM DEZENTRAL_DIFFERENZEN_BUCHEN.
          REFRESH IIMSEG.
        ENDIF.
        PERFORM KOPF_FUELLEN_DIFF.
      ENDIF.
      MOVE YWEWA-BUDAT TO LF_BUDAT.
      MOVE YWEWA-BLDAT TO LF_BLDAT.

      PERFORM IMSEG_FUELLEN_DIFF.
      DELETE YWEWA.

    ENDLOOP.
*........Noch was zum Buchen -> Differenzenbuchung ansteuern............
    IF NOT IIMSEG[] IS INITIAL.
      PERFORM DEZENTRAL_DIFFERENZEN_BUCHEN.
      REFRESH IIMSEG.
    ENDIF.
  ENDLOOP.

ENDFORM.                    "DEZENTRAL_DIFFERENZEN


*&---------------------------------------------------------------------*
*&      Form  KOPF_FUELLEN_DIFF
*&---------------------------------------------------------------------*
*       Die Kopfdaten fќr die IM-Buchung fќllen
*----------------------------------------------------------------------*
*  -->  YWEWA     Differenzensatz
*  <--  KOPF      Kopfsatz fќr die IM-Buchung
*----------------------------------------------------------------------*
FORM KOPF_FUELLEN_DIFF.

  CLEAR KOPF.
  MOVE-CORRESPONDING YWEWA TO KOPF.

ENDFORM.                    " KOPF_FUELLEN_DIFF

*&---------------------------------------------------------------------*
*&      Form  IMSEG_FUELLEN_DIFF
*&---------------------------------------------------------------------*
*       Die Positionsdaten fќr die IM-Buchung fќllen
*----------------------------------------------------------------------*
*  -->  YWEWA     Differenzensatz
*  <--  IIMSEG    Tabelle der zu buchenden Materialpositionen
*----------------------------------------------------------------------*
FORM IMSEG_FUELLEN_DIFF.

  DATA: HLP_BESTQ       LIKE LQUA-BESTQ,
        HLP_PSPNR       LIKE RLMMQ-PSPNR,
        HLP_MENGE       LIKE MARD-LABST,
        HLP_ERFMG       LIKE MARD-LABST,      "in P-Format
        HLP_ERFMG_N(17) TYPE N.               "in N-Format


*.......Allgemeine Daten................................................

  CLEAR IIMSEG.
  MOVE: YWEWA-ERFME TO IIMSEG-ERFME,
        YWEWA-MATNR TO IIMSEG-MATNR,
        YWEWA-WERKS TO IIMSEG-WERKS,
        YWEWA-LGORT TO IIMSEG-LGORT,
        YWEWA-CHARG TO IIMSEG-CHARG,
        YWEWA-SOBKZ TO IIMSEG-SOBKZ,
        YWEWA-LIFNR TO IIMSEG-LIFNR,
        YWEWA-KDAUF TO IIMSEG-MAT_KDAUF,
        YWEWA-KDPOS TO IIMSEG-MAT_KDPOS,
        YWEWA-KUNNR TO IIMSEG-KUNNR.
*       ywewa-ps_psp_pnr to iimseg-ps_psp_pnr.

*.......Ergфnzende Daten................................................

*........IM-Bewegungsarten bestimmen....................................
  CASE YWEWA-BSTAR.
    WHEN CON_1. MOVE SPACE       TO HLP_BESTQ.
    WHEN CON_2. MOVE CON_BESTQ_Q TO HLP_BESTQ.
    WHEN CON_4. MOVE CON_BESTQ_S TO HLP_BESTQ.
  ENDCASE.
  PERFORM T322_LESEN USING LGNUM HLP_BESTQ.

*........Differenzenmenge  bestimmen....................................

  IF NOT YWEWA-PS_PSP_PNR IS INITIAL.
    CALL FUNCTION 'CONVERSION_EXIT_KONPR_INPUT'
         EXPORTING
              INPUT     = YWEWA-PS_PSP_PNR
         IMPORTING
              OUTPUT    = HLP_PSPNR
*             prpswa    =
         EXCEPTIONS
              NOT_FOUND = 1
              OTHERS    = 2.
  ELSE.
    CLEAR HLP_PSPNR.
  ENDIF.
  READ TABLE DIFFERENZ_SAVE WITH KEY IDENT =  CON_IM
                                     DIFF  =  CON_X
                                     MATNR =  YWEWA-MATNR
                                     WERKS =  YWEWA-WERKS
                                     LGORT =  YWEWA-LGORT
                                     CHARG =  YWEWA-CHARG
                                     SOBKZ =  YWEWA-SOBKZ
                                     PSPNR =  HLP_PSPNR
                                     LIFNR =  YWEWA-LIFNR
                                     VBELN =  YWEWA-KDAUF
                                     POSNR =  YWEWA-KDPOS.
  IF SY-SUBRC NE 0.
    READ TABLE DIFFERENZ_SAVE WITH KEY IDENT =  CON_ID
                                       DIFF  =  CON_X
                                       MATNR =  YWEWA-MATNR
                                       WERKS =  YWEWA-WERKS
                                       LGORT =  YWEWA-LGORT
                                       CHARG =  YWEWA-CHARG
                                       SOBKZ =  YWEWA-SOBKZ
                                       PSPNR =  HLP_PSPNR
                                       LIFNR =  YWEWA-LIFNR
                                       VBELN =  YWEWA-KDAUF
                                       POSNR =  YWEWA-KDPOS.
  ENDIF.
  IF SY-SUBRC NE 0.
  ELSE.
    MOVE YWEWA-ERFMG TO HLP_ERFMG_N.
    MOVE DIFFERENZ_SAVE-PSPNR TO IIMSEG-MAT_PSPNR.
    MOVE YWEWA-ERFMG TO HLP_ERFMG_N.
    PACK HLP_ERFMG_N TO HLP_ERFMG.
    CASE YWEWA-BSTAR.
      WHEN CON_1.
        IF YWEWA-SOBKZ IS INITIAL.
          HLP_MENGE = DIFFERENZ_SAVE-LABST - HLP_ERFMG.
        ELSE.
          HLP_MENGE = DIFFERENZ_SAVE-KLABS - HLP_ERFMG.
        ENDIF.
      WHEN CON_2.
        IF YWEWA-SOBKZ IS INITIAL.
          HLP_MENGE = DIFFERENZ_SAVE-INSME - HLP_ERFMG.
        ELSE.
          HLP_MENGE = DIFFERENZ_SAVE-KINSM - HLP_ERFMG.
        ENDIF.
      WHEN CON_4.
        IF YWEWA-SOBKZ IS INITIAL.
          HLP_MENGE = DIFFERENZ_SAVE-SPEME - HLP_ERFMG.
        ELSE.
          HLP_MENGE = DIFFERENZ_SAVE-KSPEM - HLP_ERFMG.
        ENDIF.
    ENDCASE.
    IF HLP_MENGE > 0.
      IIMSEG-BWART = T322-BWMIN.
    ELSE.
      IIMSEG-BWART = T322-BWPLU.
    ENDIF.

*........Auszubuchende Menge............................................
    IIMSEG-ERFMG = HLP_MENGE.
    IF IIMSEG-ERFMG < 0.
      IIMSEG-ERFMG = IIMSEG-ERFMG * -1.
    ENDIF.

    APPEND IIMSEG.

  ENDIF.

ENDFORM.                    " IMSEG_FUELLEN_DIFF


*&---------------------------------------------------------------------*
*&      Form  T322_LESEN
*&---------------------------------------------------------------------*
*       Lesen der IM Ausbuchbewegungsarten fќr die Differenzen         *
*----------------------------------------------------------------------*
*      --> P_LGNUM   Lagernummer                                       *
*      --> P_BESTQ   Bestandsqualifikation                             *
*      <-- T322      passender Tabelleneintrag                         *
*-------------------------------------------------------------- -------*
FORM T322_LESEN USING VALUE(P_LGNUM)
                      VALUE(P_BESTQ).

  IF ( NOT T322-BWPLU IS INITIAL ) AND
     ( NOT T322-BWMIN IS INITIAL ) AND
       P_BESTQ = T322-BESTQ.
    CLEAR SY-SUBRC.
    CHECK 0 = 1.
  ENDIF.

  SELECT SINGLE * FROM T322
  WHERE LGNUM = P_LGNUM
    AND BESTQ = P_BESTQ.

  IF SY-SUBRC <> 0.
    SELECT SINGLE * FROM T322
    WHERE LGNUM = MASK3
      AND BESTQ = P_BESTQ.

    IF SY-SUBRC <> 0.
      MESSAGE A094(L4) WITH P_BESTQ.
    ENDIF.
  ENDIF.

ENDFORM.                    " T322_LESEN



Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Приведение запасов WM к остаткам IM
СообщениеДобавлено: Вт, июл 05 2011, 17:03 
Специалист
Специалист

Зарегистрирован:
Вт, дек 16 2008, 14:09
Сообщения: 131
Code:
*&---------------------------------------------------------------------*
*&      Form  DEZENTRAL_DIFFERENZEN_BUCHEN
*&---------------------------------------------------------------------*
*      Fќr selektierte Positionen die Differenzen im IM ausbuchen
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DEZENTRAL_DIFFERENZEN_BUCHEN.

*........S-Messages fќr die allgemeine INFOs..........................
  DESCRIBE TABLE IIMSEG LINES SY-TABIX.
  MESSAGE S035 WITH SY-TABIX.

*........Differenzen ausbuchen........................................

  CALL FUNCTION 'L_IM_DIFF_CLEAR_FOR_COMPARISON'
    EXPORTING
      I_IMKPF       = KOPF
      I_ITEM_NUMBER = CON_ITEM_NUMBER
      I_TCODE       = CON_IM_TCODE_DIFF
    TABLES
      T_IMSEG       = IIMSEG
      T_EMSEG       = T_EMSEG_PROT
      T_IDOCS       = T_IDOC_PROT
    EXCEPTIONS
      ERROR_MESSAGE = 99
      OTHERS        = 0.

*........Globale Fehler in der Verarbeitung............................
  IF SY-SUBRC NE 0.
    PERFORM ERROR_SAVE_DIFF.
    ROLLBACK WORK.
    MESSAGE S036.
  ELSE.
    LOOP AT T_EMSEG_PROT
      TRANSPORTING NO FIELDS
      WHERE NOT MSGNO IS INITIAL.
    ENDLOOP.
    IF SY-SUBRC EQ 0.
      MESSAGE S036.
    ENDIF.
  ENDIF.

*........Differenzenausbuchung Protokollieren..........................

  PERFORM PROTOKOLL_DIFFERENZEN_BUCHEN.

ENDFORM.                    " DEZENTRAL_DIFFERENZEN_BUCHEN

*&---------------------------------------------------------------------*
*&      Form  ERROR_SAVE_DIFF
*&---------------------------------------------------------------------*
*      Fehler die durch ERROR_MESSAGE abgefangen werden mќssen in     *
*      internen Tabelle T_EMSEG_PROT gesichert werden.                *
*      Dieser Fehler werden nicht positionsbezogen gesichert ( mit    *
*      Quantnummer = 0000000000 ).                                    *
*---------------------------------------------------------------------*
FORM ERROR_SAVE_DIFF.

  CLEAR T_EMSEG_PROT.
  MOVE: SY-MSGTY TO T_EMSEG_PROT-MSGTY,
        SY-MSGID TO T_EMSEG_PROT-MSGID,
        SY-MSGNO TO T_EMSEG_PROT-MSGNO,
        SY-MSGV1 TO T_EMSEG_PROT-MSGV1,
        SY-MSGV2 TO T_EMSEG_PROT-MSGV2,
        SY-MSGV3 TO T_EMSEG_PROT-MSGV3,
        SY-MSGV4 TO T_EMSEG_PROT-MSGV4.
  APPEND T_EMSEG_PROT.

ENDFORM.                    " ERROR_SAVE_DIFF

*&---------------------------------------------------------------------*
*&      Form  PROTOKOLL_DIFFERENZEN_BUCHEN
*&---------------------------------------------------------------------*
*       Das Ausbuchen der Differenzen protokollieren.
*       Es werden die erzeugten IDOCs sowie die Fehlern angelistet
*----------------------------------------------------------------------*
*  -->  T_IDOC_PROT   Tabelle der erzeugten IDOCs
*  <--  T_EMSEG_PROT  Tabelle der zu buchenden Positionen
*----------------------------------------------------------------------*
FORM PROTOKOLL_DIFFERENZEN_BUCHEN.

*........мberschrift fќr dezentrale Abwicklung..........................

  SKIP 2.
  WRITE: TEXT-100 INTENSIFIED ON COLOR COL_GROUP.
  SKIP.

*........Erzeugte IDocs ausgeben.......................................

  LOOP AT T_IDOC_PROT.
    AT FIRST.
      WRITE:/ TEXT-111 INTENSIFIED ON COLOR COL_POSITIVE.
*        Folgende IDocs wurden gesendet:
      SKIP.
      ULINE /(83).
      WRITE: / TEXT-112 INTENSIFIED OFF,
*        |log.System|Objekttyp |Objektschlќssel                     ...
            83 SY-VLINE.
      ULINE /(83).
    ENDAT.
    WRITE: /01 SY-VLINE,
            02 T_IDOC_PROT-LOGSYS INTENSIFIED ON,
            12 SY-VLINE,
            13 T_IDOC_PROT-OBJTYPE INTENSIFIED OFF,
            23 SY-VLINE,
            24(59) T_IDOC_PROT-OBJKEY INTENSIFIED OFF,
            83 SY-VLINE.
    AT LAST.
      ULINE /(83).
      SKIP 2.
    ENDAT.
  ENDLOOP.

*........Positionsunabhфngige Fehlernachrichten ausgeben...............

  LOOP AT T_EMSEG_PROT
    TRANSPORTING NO FIELDS
    WHERE NOT MSGNO IS INITIAL
      AND TABIX IS INITIAL.
    EXIT.
  ENDLOOP.
  IF SY-SUBRC EQ 0.
    WRITE:/ TEXT-104 COLOR COL_NEGATIVE INTENSIFIED OFF.
*        Bei der Differenzenausbuchung sind folgende allgemeine Fehler..
    SKIP 1.
    ULINE /(83).
    WRITE / TEXT-110 INTENSIFIED OFF.
*        |Fehlertext                                                  ..
    ULINE /(83).
    LOOP AT T_EMSEG_PROT
      WHERE NOT MSGNO IS INITIAL
        AND TABIX IS INITIAL.

      PERFORM MESSAGE_DETERMINE
              USING    T_EMSEG_PROT-MSGID
                       T_EMSEG_PROT-MSGNO
                       T_EMSEG_PROT-MSGV1
                       T_EMSEG_PROT-MSGV2
                       T_EMSEG_PROT-MSGV3
                       T_EMSEG_PROT-MSGV4
              CHANGING HLP_TEXT.

      WRITE: / SY-VLINE,
             2 HLP_TEXT(80) INTENSIFIED OFF,
            83 SY-VLINE.

    ENDLOOP.
    ULINE /(83).
    SKIP 2.
  ENDIF.

*........Positionsabhфngige Fehlernachrichten ausgeben..................
*        Bei der dezentralen Abwicklung sind positionsabhфngige
*        Fehler nicht mіglich, da die Ausbuchung ќber IDOCs erfolgt


ENDFORM.                    " PROTOKOLL_DIFFERENZEN_BUCHEN

*---------------------------------------------------------------------*
*      Form  MESSAGE_DETERMINE                                        *
*---------------------------------------------------------------------*
*      Error-Message aufbereiten                                      *
*---------------------------------------------------------------------*
*      -->P_MSGID  Message-ID                                         *
*      -->P_MSGNO  Messagenummer                                      *
*      -->P_MSGV1  Messagevariable 1                                  *
*      -->P_MSGV2  Messagevariable 2                                  *
*      -->P_MSGV3  Messagevariable 3                                  *
*      -->P_MSGV4  Messagevariabel 4                                  *
*      <--P_TEXT   Messagetext                                        *
*---------------------------------------------------------------------*
FORM MESSAGE_DETERMINE USING    P_MSGID
                                P_MSGNO
                                P_MSGV1
                                P_MSGV2
                                P_MSGV3
                                P_MSGV4
                       CHANGING P_TEXT.


  MOVE: P_MSGID TO LMESS-MSGID,
        P_MSGNO TO LMESS-MSGNO,
        P_MSGV1 TO LMESS-MSGV1,
        P_MSGV2 TO LMESS-MSGV2,
        P_MSGV3 TO LMESS-MSGV3,
        P_MSGV4 TO LMESS-MSGV4.

  CALL FUNCTION 'L_MESSAGE_AUFBEREITEN'
    EXPORTING
      I_MESS = LMESS
    IMPORTING
      O_TEXT = P_TEXT.

ENDFORM.                               " MESSAGE_DETERMINE_LL01LU02
*&---------------------------------------------------------------------*
*&      Form  CREAT_BATCH_INCOME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM CREAT_BATCH_INCOME .

  DATA: BEGIN OF LT_TAB OCCURS 0,
    MATNR TYPE MARA-MATNR,
    WERKS TYPE WERKS_D,
    LGORT TYPE LGORT_D,
    CHARG TYPE CHARG_D,
    LABST TYPE MSEG-ERFMG,
  END OF LT_TAB.

  LOOP AT DIFFERENZ WHERE IDENT EQ 'IM'.
    CLEAR LT_TAB.
    MOVE-CORRESPONDING DIFFERENZ TO LT_TAB.
    COLLECT LT_TAB.
  ENDLOOP.

  LOOP AT DIFFERENZ WHERE IDENT(1) EQ 'W'.
    CLEAR LT_TAB.
    MOVE-CORRESPONDING DIFFERENZ TO LT_TAB.
    LT_TAB-WERKS = WERKS.
    LT_TAB-LGORT = LGORT.
    LT_TAB-LABST = LT_TAB-LABST * ( -1 ).
    COLLECT LT_TAB.
  ENDLOOP.

  CALL FUNCTION 'BDC_OPEN_GROUP'
    EXPORTING
      CLIENT   = SY-MANDT
      GROUP    = 'MIGO_501' "имя сеанса
      USER     = SY-UNAME
      KEEP     = 'X'
      " SPACE " Если надо удалить после выполнения, то "X"
      HOLDDATE = SY-DATUM.

  DATA: LV_DAT(10),
        LV_VAL(15).

  LOOP AT LT_TAB.

    WRITE: SY-DATUM TO LV_DAT,
         LT_TAB-LABST TO LV_VAL.

    REFRESH BDCDATA.
    PERFORM BDC_DYNPRO      USING 'SAPMM07M' '0400'.
    PERFORM BDC_FIELD:      USING 'BDC_OKCODE' '/00',
                            USING 'MKPF-BLDAT' LV_DAT,
                            USING 'MKPF-BUDAT' LV_DAT,
                            USING 'RM07M-BWARTWA' '501',
                            USING 'RM07M-WERKS' LT_TAB-WERKS,
                            USING 'RM07M-LGORT' LT_TAB-LGORT,
                            USING 'XFULL' 'X',
                            USING 'RM07M-XNAPR' ' ',
                            USING 'RM07M-WVERS2' 'X'.

    PERFORM BDC_DYNPRO      USING 'SAPMM07M' '0421'.
    PERFORM BDC_FIELD:      USING 'BDC_OKCODE' '/00',
                            USING 'MSEG-MATNR(01)' LT_TAB-MATNR,
                            USING 'MSEG-ERFMG(01)' LV_VAL,
                            USING 'MSEG-CHARG(01)' LT_TAB-CHARG.


    PERFORM BDC_DYNPRO      USING 'SAPLKACB' '0002'.
    PERFORM BDC_FIELD:      USING 'BDC_OKCODE' '=ENTE',
                            USING 'COBL-GSBER' '2001'
*                            ,USING 'DKACB-FMORE' 'X'
                                  .

    PERFORM BDC_DYNPRO      USING 'SAPLKACB' '0002'.
    PERFORM BDC_FIELD:      USING 'BDC_OKCODE' '=ENTE',
                            USING 'COBL-GSBER' '2001'.


    PERFORM BDC_DYNPRO      USING 'SAPMM07M' '0421'.
    PERFORM BDC_FIELD:      USING 'BDC_OKCODE' '=BU',
                            USING 'DKACB-FMORE' 'X'.

    PERFORM BDC_DYNPRO      USING 'SAPLKACB' '0002'.
    PERFORM BDC_FIELD:      USING 'BDC_OKCODE' '=ENTE'
*          ,                 USING 'COBL-GSBER' '2001'
                                  .
*
    PERFORM BDC_TRANSACTION USING 'MB1C'.

  ENDLOOP.

  CALL FUNCTION 'BDC_CLOSE_GROUP'.

ENDFORM.                    " CREAT_BATCH_INCOME

*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PROGRAM    text
*      -->DYNPRO     text
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
  CLEAR BDCDATA.
  BDCDATA-PROGRAM  = PROGRAM.
  BDCDATA-DYNPRO   = DYNPRO.
  BDCDATA-DYNBEGIN = 'X'.
  APPEND BDCDATA.
ENDFORM.                    "BDC_DYNPRO

*----------------------------------------------------------------------*
*        Insert field                                                  *
*----------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL.

  CLEAR BDCDATA.
  BDCDATA-FNAM = FNAM.
  BDCDATA-FVAL = FVAL.
  APPEND BDCDATA.
ENDFORM.                    "BDC_FIELD

*&---------------------------------------------------------------------*
*&      Form  BDC_TRANSACTION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->TCODE      text
*----------------------------------------------------------------------*
FORM BDC_TRANSACTION USING TCODE.
  DATA: L_CTU TYPE CTU_PARAMS.
  L_CTU-DISMODE = 'N'.
  CALL FUNCTION 'BDC_INSERT'
    EXPORTING
      TCODE     = TCODE
      CTUPARAMS = L_CTU
    TABLES
      DYNPROTAB = BDCDATA.

  REFRESH BDCDATA.
ENDFORM.                    "BDC_TRANSACTION


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


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

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


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

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