noch zu liefernde Menge zum Geschäftsjahr

Es soll eine Liste von Bestellungen, zu denen es zum Geschäftsjahr noch offene Bestellpositionen gibt, ausgegeben werden. Eine Auswertung über die SAP-Standart-Transaktionen ME2… führt wegen komplexer Selektionen zu Ressourcenengpässen. Dieser Report hier bietet auf Grundlage von schlanken Abfragen eine Lösung, Daten auszuwerten.

Report ZMM_OFFENE_WE_DATUM

 

Der Report kann sowohl eine ALV-Liste ausgegeben als auch die Daten in eine Datei schreiben. Um möglichst performant zu sein, wird keine ALV-Liste aufgebaut wenn das Feld für die Ablagedatei gefüllt ist. Dadurch wird vermieden, dass intern noch Mal extra Speicher für die Bildschirmausgabe gebraucht wird.

In der Selektion werden bereits die Löschvormerkungen zur Bestellposition und zum Bestellauftrag berücksichtigt.

Hieraus entsteht eine Text-Datei, die in Excel eingelesen werden kann.

Ausgabe als ALV-Liste

Programmcode

REPORT ZMM_OFFENE_WE_DATUM.
INCLUDE ZMM_OFFENE_WE_DATUM_DATA.

* Selectionscreen
* Übergabeverzeichnis
*

SELECTION-SCREEN BEGIN OF BLOCK MAIN WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS S_EBELN FOR EKKO-EBELN.
SELECT-OPTIONS S_BEDAT FOR EKKO-BEDAT.
SELECT-OPTIONS S_PSTYP FOR EKPO-PSTYP.
SELECT-OPTIONS S_MJAHR FOR MSEG-MJAHR.
SELECTION-SCREEN END OF BLOCK MAIN.

SELECTION-SCREEN BEGIN OF BLOCK E1 WITH FRAME TITLE TEXT-002.
PARAMETERS:
E_SPOOL TYPE STRING.
SELECTION-SCREEN END OF BLOCK E1.

INITIALIZATION.

AT SELECTION-SCREEN OUTPUT.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR E_SPOOL.

CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE            = ‚Auswahl Datei‘
DEFAULT_EXTENSION       = ‚*.txt‘
DEFAULT_FILENAME        = ‚*.txt‘
FILE_FILTER             = ‚*.txt‘
*     WITH_ENCODING           =
*     INITIAL_DIRECTORY       =
*     MULTISELECTION          =
CHANGING
FILE_TABLE              = LT_FILE_TABLE
RC                      = LV_RC
*     USER_ACTION             =
*     FILE_ENCODING           =
EXCEPTIONS
FILE_OPEN_DIALOG_FAILED = 1
CNTL_ERROR              = 2
ERROR_NO_GUI            = 3
NOT_SUPPORTED_BY_GUI    = 4
OTHERS                  = 5.
*  IF SY-SUBRC <> 0.
**  Implement suitable error handling here
*  ENDIF.

* ausgewählte Datei bestimmen
READ TABLE LT_FILE_TABLE INTO LV_FILE INDEX 1.
MOVE LV_FILE TO E_SPOOL.

START-OF-SELECTION.

* offene Wareneingänge
PERFORM GET_OPEN_GOODS.

INCLUDE ZMM_OFFENE_WE_DATUM_I01.


*&———————————————————————*
*&  Include           ZMM_NOTFALL_L_DATA
*&———————————————————————*
TABLES: EKKO, EKPO, MSEG.“ ADRC, LFA1, LAGP.

DATA: LT_FILE_TABLE TYPE FILETABLE,
LV_RC         TYPE I,
LV_FILE       TYPE FILE_TABLE.

DATA: BEGIN OF LT_EK OCCURS 1,
EBELN    TYPE EKKO-EBELN,
LIFNR    TYPE EKKO-LIFNR,
ADRNR    TYPE EKKO-ADRNR,
BSTYP    TYPE EKKO-BSTYP,
BSART    TYPE EKKO-BSART,
LOEKZ    TYPE EKKO-LOEKZ,
EKGRP    TYPE EKKO-EKGRP,
WERKS_PO TYPE EKPO-WERKS,
EBELP_PO TYPE EKPO-EBELP,
LOEKZ_PO TYPE EKPO-LOEKZ,
MATNR_PO TYPE EKPO-MATNR,
MENGE_PO TYPE EKPO-MENGE,
MEINS_PO TYPE EKPO-MEINS,
BEDAT    TYPE EKKO-BEDAT,

PEINH_PO TYPE EKPO-PEINH,
BPRME_PO TYPE EKPO-BPRME,
NETPR_PO TYPE EKPO-NETPR,
ELIKZ_PO TYPE EKPO-ELIKZ,
EREKZ_PO TYPE EKPO-ELIKZ,
EBELN_PO TYPE EKPO-EBELN,
ADRN2_PO TYPE EKPO-ADRN2,
PSTYP_PO TYPE EKPO-PSTYP,

EINDT_ET TYPE EKET-EINDT,
WEMNG_ET TYPE EKET-WEMNG,
EBELN_ET TYPE EKET-EBELN,
EBELP_ET TYPE EKET-EBELP,

MBLNR_MS TYPE MSEG-MBLNR,
MJAHR_MS TYPE MSEG-MJAHR,
ERFMG_MS TYPE MSEG-ERFMG,
ERFME_MS TYPE MSEG-ERFME,
SHKZG_MS TYPE MSEG-SHKZG,

END OF LT_EK.

*DATA: GO_EVENTS            TYPE REF TO CL_SALV_EVENTS_TABLE. “ Event
*———————————————————————–
* Beginn Datendeklarationen fuer den ALV
*———————————————————————–
DATA GO_ALV TYPE REF TO CL_SALV_TABLE.
DATA GO_FUNCTIONS TYPE REF TO CL_SALV_FUNCTIONS_LIST.
DATA GO_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE.
DATA GO_DISPLAY TYPE REF TO CL_SALV_DISPLAY_SETTINGS.
*———————————————————————–
* Ende Datendeklarationen fuer den ALV
*———————————————————————–

TYPES: BEGIN OF TT_OUT,
EBELN    TYPE EKKO-EBELN,
EBELP_PO TYPE EKPO-EBELP,
SAKTO_KN TYPE EKKN-SAKTO,
BEDAT    TYPE EKKO-BEDAT,
LIFNR    TYPE EKKO-LIFNR,
NAME_LF  TYPE LFA1-NAME1,
EKGRP    TYPE EKKO-EKGRP,
TEXT1    TYPE STRING,
MATNR_PO TYPE EKPO-MATNR,
MAKTX_MT TYPE MAKT-MAKTX,
MENGE_PO TYPE EKPO-MENGE,
MEINS_PO TYPE EKPO-MEINS,
NETPR_PO TYPE EKPO-NETPR,
PEINH_PO TYPE EKPO-PEINH,
BPRME_PO TYPE EKPO-BPRME,
MENGO    TYPE ZMM_OFBES,
MNGOE    TYPE MSEG-ERFME,
MENGR    TYPE EKPO-MENGE,
MNGRE    TYPE EKPO-MEINS,
END OF TT_OUT.

DATA: BEGIN OF LT_OUT_DESC OCCURS 0,
NAME(100),
END OF LT_OUT_DESC.

DATA: LT_OUT TYPE TABLE OF TT_OUT,
WA_OUT LIKE LINE OF LT_OUT.


*&———————————————————————*
*& Include ZMM_NOTFALL_L_I01
*&———————————————————————*

FORM GET_OPEN_GOODS.
* offene Wareneingänge

SELECT EKKO~EBELN, EKKO~LIFNR, EKKO~ADRNR, EKKO~BSTYP, EKKO~BSART, EKKO~LOEKZ,
EKPO~WERKS, EKPO~EBELP, EKPO~LOEKZ, EKPO~MATNR, EKPO~MENGE, EKPO~MEINS,
EKKO~BEDAT, EKPO~PEINH, EKPO~BPRME,
EKPO~NETPR, EKPO~ELIKZ, EKPO~EREKZ, EKPO~EBELN, EKPO~ADRN2, EKKO~EKGRP,
EKET~EINDT, EKET~WEMNG, EKET~EBELN, EKET~EBELP, EKPO~PSTYP,
MSEG~MBLNR, MSEG~MJAHR, MSEG~ERFMG, MSEG~ERFME, MSEG~SHKZG
INTO (@LT_EK-EBELN, @LT_EK-LIFNR, @LT_EK-ADRNR, @LT_EK-BSTYP, @LT_EK-BSART,
@LT_EK-LOEKZ, @LT_EK-WERKS_PO, @LT_EK-EBELP_PO, @LT_EK-LOEKZ_PO,
@LT_EK-MATNR_PO, @LT_EK-MENGE_PO, @LT_EK-MEINS_PO,
@LT_EK-BEDAT, @LT_EK-PEINH_PO, @LT_EK-BPRME_PO, @LT_EK-NETPR_PO,
@LT_EK-ELIKZ_PO, @LT_EK-EREKZ_PO, @LT_EK-EBELN_PO, @LT_EK-ADRN2_PO, @LT_EK-EKGRP,
@LT_EK-EINDT_ET, @LT_EK-WEMNG_ET, @LT_EK-EBELN_ET, @LT_EK-EBELP_ET, @LT_EK-PSTYP_PO,
@LT_EK-MBLNR_MS, @LT_EK-MJAHR_MS, @LT_EK-ERFMG_MS, @LT_EK-ERFME_MS, @LT_EK-SHKZG_MS )
FROM ( EKKO
INNER JOIN EKPO
ON EKPO~EBELN = EKKO~EBELN
INNER JOIN EKET
ON EKET~EBELN = EKPO~EBELN
AND EKET~EBELP = EKPO~EBELP )
LEFT OUTER JOIN MSEG
ON EKPO~EBELN = MSEG~EBELN
AND EKPO~EBELP = MSEG~EBELP
WHERE
EKKO~BUKRS EQ ‚1000‘
AND EKKO~EBELN IN @S_EBELN
AND EKPO~PSTYP IN @S_PSTYP
AND MSEG~MJAHR IN @S_MJAHR
AND EKKO~BEDAT IN @S_BEDAT
AND EKKO~LOEKZ EQ ‚ ‚
AND EKPO~LOEKZ EQ ‚ ‚
AND EKPO~WERKS EQ ‚100‘
AND NOT EKPO~ELIKZ EQ ‚X‘.

APPEND LT_EK.

ENDSELECT.

* So, jetzt haben wir schon mal alle Bestellaufträge die kein Lieferendkennzeichen oder kein
* Löschkennzeichen besitzen. Nun müssen wir noch die Datensätze verwerfen die bereits vollständig beliefert sind.
*

DELETE LT_EK WHERE LOEKZ_PO GT ‚A‘. „Positionen mit Löschkennzeichen müssen raus!
SORT LT_EK BY EBELN EBELP_PO ASCENDING EBELP_PO ASCENDING.

DATA: LV_SUM TYPE C LENGTH 10.

LOOP AT LT_EK ASSIGNING FIELD-SYMBOL(<EK>)
GROUP BY ( EBELN = <EK>-EBELN EBELP_PO = <EK>-EBELP_PO COUNT = GROUP SIZE )
ASCENDING ASSIGNING FIELD-SYMBOL(<GROUP_KEY>).
CLEAR LV_SUM.
LOOP AT GROUP <GROUP_KEY> ASSIGNING FIELD-SYMBOL(<MEMBER>).
IF <MEMBER>-SHKZG_MS = ‚S‘.
LV_SUM = LV_SUM + <MEMBER>-ERFMG_MS.
ELSE.
LV_SUM = LV_SUM – <MEMBER>-ERFMG_MS.
ENDIF.
ENDLOOP.

MOVE-CORRESPONDING <MEMBER> TO WA_OUT.
* Wenn noch gar kein WE stattgefunden hat, soll die Mengeneinheit
* aus der Bestellmeng genommen werden.
IF <MEMBER>-ERFME_MS IS INITIAL.
MOVE <MEMBER>-MEINS_PO TO WA_OUT-MNGOE.
ELSE.
MOVE <MEMBER>-ERFME_MS TO WA_OUT-MNGOE.
ENDIF.
WA_OUT-MENGO = WA_OUT-MENGE_PO – LV_SUM.
CLEAR LV_SUM.

IF WA_OUT-MENGO > 0 . „keine überbelieferten
APPEND WA_OUT TO LT_OUT.
ENDIF.

ENDLOOP.
UNASSIGN: <EK>, <MEMBER>, <GROUP_KEY>.

* So, nach dieser Aktion erst Mal Luft holen
* Sollte jetzt auch noch die zu berechnende Menge ausgegeben werden,
* muss die Tabelle RSEG ausgwertet werden. Dabei ist darauf zu achten,
* dass es auch Mehrfachkontierungen geben kann, also laufende Kontierung (ZEKKN in der
* RSEG)
* Wir machen jetzt weiter und lesen nur nopch ein paar Kleinigkeiten dazu
* Sachkonto, Name des Lieferanten, Materialtext

LOOP AT LT_OUT ASSIGNING FIELD-SYMBOL(<OUT>). ##NEEDED
SELECT SAKTO FROM EKKN INTO <OUT>-SAKTO_KN
WHERE EBELN EQ <OUT>-EBELN AND
EBELP EQ <OUT>-EBELP_PO.
ENDSELECT.

SELECT NAME1 FROM LFA1 INTO <OUT>-NAME_LF ##NEEDED
WHERE LIFNR = <OUT>-LIFNR.
ENDSELECT.

SELECT MAKTX FROM MAKT INTO <OUT>-MAKTX_MT ##NEEDED
WHERE MATNR EQ <OUT>-MATNR_PO.
ENDSELECT.

ENDLOOP.

UNASSIGN <OUT>.

* Wenn eine Ausgabedatei ausgewählt wurde, erfolgt keine ALV-Ausgabe.
* Dies minimiert den Bedarf an Prozessleistung und Speicherbedarf
IF E_SPOOL IS INITIAL.
PERFORM ALV_AUSGABE.
ELSE.
PERFORM PUT_XLS.
ENDIF.
ENDFORM.

FORM PUT_XLS.

* Kopfzeile mit Spaltennamen der Ausgabetabelle voranstellen

APPEND ‚Bestellnummer‘ TO LT_OUT_DESC.
APPEND ‚Position‘ TO LT_OUT_DESC.
APPEND ‚Sachkonto‘ TO LT_OUT_DESC.
APPEND ‚Best.Datum‘ TO LT_OUT_DESC.
APPEND ‚Lieferant‘ TO LT_OUT_DESC.
APPEND ‚Name Lief.‘ TO LT_OUT_DESC.
APPEND ‚Eink.Gruppe‘ TO LT_OUT_DESC.
APPEND ‚Materialtyp‘ TO LT_OUT_DESC.
APPEND ‚Material‘ TO LT_OUT_DESC.
APPEND ‚Kurztext‘ TO LT_OUT_DESC.
APPEND ‚Bestellmenge‘ TO LT_OUT_DESC.
APPEND ‚Meng.Einh.‘ TO LT_OUT_DESC.
APPEND ‚Nettopreis‘ TO LT_OUT_DESC.
APPEND ‚pro‘ TO LT_OUT_DESC.
APPEND ‚Meng.Einh.‘ TO LT_OUT_DESC.
APPEND ’noch zu liefern‘ TO LT_OUT_DESC.
APPEND ‚Meng.Einh.‘ TO LT_OUT_DESC.
APPEND ’noch zu berechnen‘ TO LT_OUT_DESC.
APPEND ‚Meng.Einh.‘ TO LT_OUT_DESC.

CALL FUNCTION ‚GUI_DOWNLOAD‘
EXPORTING
* BIN_FILESIZE =
FILENAME = E_SPOOL
FILETYPE = ‚ASC‘
* APPEND = ‚ ‚
WRITE_FIELD_SEPARATOR = ‚X‘
* HEADER = ’00‘
* TRUNC_TRAILING_BLANKS = ‚ ‚
* WRITE_LF = ‚X‘
* COL_SELECT = ‚ ‚
* COL_SELECT_MASK = ‚ ‚
* DAT_MODE = ‚ ‚
* CONFIRM_OVERWRITE = ‚ ‚
* NO_AUTH_CHECK = ‚ ‚
CODEPAGE = ‚4103 ‚
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = ‚#‘
WRITE_BOM = ‚X‘
* TRUNC_TRAILING_BLANKS_EOL = ‚X‘
* WK1_N_FORMAT = ‚ ‚
* WK1_N_SIZE = ‚ ‚
* WK1_T_FORMAT = ‚ ‚
* WK1_T_SIZE = ‚ ‚
* WRITE_LF_AFTER_LAST_LINE = ABAP_TRUE
* SHOW_TRANSFER_STATUS = ABAP_TRUE
* VIRUS_SCAN_PROFILE = ‚/SCET/GUI_DOWNLOAD‘
* IMPORTING
* FILELENGTH =
TABLES
DATA_TAB = LT_OUT
FIELDNAMES = LT_OUT_DESC
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
HEADER_NOT_ALLOWED = 7
SEPARATOR_NOT_ALLOWED = 8
FILESIZE_NOT_ALLOWED = 9
HEADER_TOO_LONG = 10
DP_ERROR_CREATE = 11
DP_ERROR_SEND = 12
DP_ERROR_WRITE = 13
UNKNOWN_DP_ERROR = 14
ACCESS_DENIED = 15
DP_OUT_OF_MEMORY = 16
DISK_FULL = 17
DP_TIMEOUT = 18
FILE_NOT_FOUND = 19
DATAPROVIDER_EXCEPTION = 20
CONTROL_FLUSH_ERROR = 21
OTHERS = 22.
* IF SY-SUBRC <> 0.
** Implement suitable error handling here
* ENDIF.

ENDFORM.

FORM ALV_AUSGABE .
*———————————————————————–
* Beginn ALV-Ausgabe
*———————————————————————–

* Instanz der Klasse cl_salv_table erzeugen
TRY.
CL_SALV_TABLE=>FACTORY(
IMPORTING R_SALV_TABLE = GO_ALV
CHANGING T_TABLE = LT_OUT ).
CATCH CX_SALV_MSG. „#EC NO_HANDLER
ENDTRY.
* Funktionstasten (Sortieren, Filtern, Excel-Export etc.)
GO_FUNCTIONS = GO_ALV->GET_FUNCTIONS( ).
GO_FUNCTIONS->SET_ALL( ABAP_TRUE ).

* optimale Spaltenbreite
GO_COLUMNS = GO_ALV->GET_COLUMNS( ).
GO_COLUMNS->SET_OPTIMIZE( ABAP_TRUE ).

* Titel und/oder Streifenmuster
GO_DISPLAY = GO_ALV->GET_DISPLAY_SETTINGS( ).
GO_DISPLAY->SET_LIST_HEADER( VALUE = ‚offene Mengen pro Bestellposition‘ ).
GO_DISPLAY->SET_STRIPED_PATTERN( ABAP_TRUE ).

*GO_EVENTS = GO_ALV->GET_EVENT( ).
*CREATE OBJECT GR_EVENTS.
*SET HANDLER GR_EVENTS->HANDLE_LINK_CLICK FOR GO_EVENTS.

* Liste anzeigen
GO_ALV->DISPLAY( ).
ENDFORM.

Dieser Eintrag wurde veröffentlicht in SAP/ABAP von . Setze ein Lesezeichen zum Permalink.

Schreibe einen Kommentar