Code: Alles auswählen.
SELECT zzt_pkt_status~sozver zzt_pkt_status~tstmp zzt_pkt_status~zz_pkt_status
pa0001~endda pa0001~begda pa0001~vdsk1 pa0001~pernr
zzt_pkt_versns~sozver zzt_pkt_versns~pernr
FROM zzt_pkt_versns INNER JOIN zzt_pkt_status
ON zzt_pkt_versns~sozver = zzt_pkt_status~sozver
INNER JOIN pa0001
ON zzt_pkt_versns~pernr = pa0001~pernr
INTO (it_status-sozver, it_status-tstmp, it_status-zz_pkt_status,
it_pa0001-endda, it_pa0001-begda, it_pa0001-vdsk1, it_pa0001-pernr,
it_versns-sozver, it_versns-pernr)
WHERE pa0001~vdsk1 IN s_vdsk1
AND zzt_pkt_status~zz_pkt_status EQ 'HVB_RECEIV'
AND pa0001~begda <= p_tag
AND pa0001~endda >= p_tag
*Gecancelte Daten werden nicht ausgegeben - es gelten nur gültige Nummern
AND zzt_pkt_versns~lotim EQ '0'.
Code: Alles auswählen.
REPORT zlobtest03 LINE-SIZE 500 NO STANDARD PAGE HEADING.
*Deklaration der zu verwendeten Tabellen
*Für die Datenbanktabelle wird eine gleichnamige Struktur - der Tabellenarbeitsbereich - angelegt
*Die Struktur des Tabellenarbeitsbereichs entspricht genau der Zeilenstruktur der Datenbanktabelle
TABLES:
zzt_pkt_status,
pa0001,
zzt_pkt_versns.
*Datendeklaration - Datum und Uhrzeit wird für die Konvertierung des timestamp benötigt
DATA:
datum LIKE sy-datum,
zeit LIKE sy-uzeit,
tag LIKE sy-datum,
*Die internen Tabellen werden für das inner join - select verwendet
it_status TYPE TABLE OF zzt_pkt_status WITH HEADER LINE,
it_pa0001 TYPE TABLE OF pa0001 WITH HEADER LINE,
it_versns TYPE TABLE OF zzt_pkt_versns WITH HEADER LINE,
*Zusätzlich wird eine workarea zum Hinzufügen eines neuen Status in die Statustab. definiert
wa_status TYPE zzt_pkt_status,
*Wird für die Ausgabe als Fixformat gebraucht
wa_tstmp LIKE zspkt_timestamp.
*Selektionsblock für die Eingabe des timestamp
SELECTION-SCREEN BEGIN OF BLOCK auswahl WITH FRAME.
*Selektionsbildschirm
SELECT-OPTIONS: s_vdsk1 FOR pa0001-vdsk1.
PARAMETERS: p_tag LIKE sy-datum.
SELECTION-SCREEN END OF BLOCK auswahl.
*Block für Dateiverarbeitung
SELECTION-SCREEN BEGIN OF BLOCK va WITH FRAME.
PARAMETERS:
p_datei AS CHECKBOX,
*Feld zur Eingabe des Dateinamens - der Pfad wird vorgeschlagen
p_fname(100) DEFAULT '/usr/sap/pmscp/' LOWER CASE.
SELECTION-SCREEN END OF BLOCK va.
*Hauptverarbeitung
START-OF-SELECTION.
*Wenn die Checkbox `Datenausgabe in einer Datei´ angeklickt wurde
IF p_datei = 'X'.
*Wenn der Dateiname in das Feld nicht eingetragen wurde, dann erscheint eine Meldung
IF p_fname = '/usr/sap/pmscp/'.
WRITE: / 'Dateiname fehlt'.
EXIT.
ENDIF.
*Wenn der Dateiname in das Feld nicht eingetragen wurde, dann erscheint eine Meldung
IF p_fname IS INITIAL.
WRITE: / 'Dateiname fehlt'.
EXIT.
ENDIF.
*Datei wird zum Schreiben geöffnet - Daten werden zeilenweise geschrieben
OPEN DATASET p_fname FOR OUTPUT IN TEXT MODE.
ENDIF.
*Wenn der Stichtag leer ist und der Organisationsschlüssel ist befüllt,
*dann wird das Datum auf das akt. Tagesdatum gesetzt
IF p_tag IS INITIAL.
p_tag = sy-datum.
ENDIF.
IF s_vdsk1 IS NOT INITIAL.
p_tag = sy-datum.
ENDIF.
*Die Daten werden aus der Tabelle zzt_pkt_status, pa0001 und zzt_pkt_versns selektiert,
*und mit inner join über die Sozialversicherungsnummer aus den Tabellen versns und status
*und über die Personalnummer der Tabellen versns und pa0001 verbunden.
*Es werden Daten ausgegeben, die nach dem vom User eingegebenen timestamp Daten vom HVB
*enthalten haben, und es sollen die Daten ausgegeben werden, die im Feld zz_pkt_status den
*Eintrag HVB_RECEIV haben.
SELECT zzt_pkt_status~sozver zzt_pkt_status~tstmp zzt_pkt_status~zz_pkt_status
pa0001~endda pa0001~begda pa0001~vdsk1 pa0001~pernr
zzt_pkt_versns~sozver zzt_pkt_versns~pernr
FROM zzt_pkt_versns INNER JOIN zzt_pkt_status
ON zzt_pkt_versns~sozver = zzt_pkt_status~sozver
INNER JOIN pa0001
ON zzt_pkt_versns~pernr = pa0001~pernr
INTO (it_status-sozver, it_status-tstmp, it_status-zz_pkt_status,
it_pa0001-endda, it_pa0001-begda, it_pa0001-vdsk1, it_pa0001-pernr,
it_versns-sozver, it_versns-pernr)
WHERE pa0001~vdsk1 IN s_vdsk1
AND zzt_pkt_status~zz_pkt_status EQ 'HVB_RECEIV'
AND pa0001~begda <= p_tag
AND pa0001~endda >= p_tag
*Gecancelte Daten werden nicht ausgegeben - es gelten nur gültige Nummern
AND zzt_pkt_versns~lotim EQ '0'.
*Wenn Datensätze gefunden wurden
IF sy-subrc EQ 0.
*Konvertiere den timestamp unter Berücksichtigung der Zeitzone in Datum und Zeit
CONVERT TIME STAMP it_status-tstmp TIME ZONE sy-zonlo INTO DATE datum TIME zeit.
*Den Feldern der workarea wird der in die Tab. zzt_pkt_status neu einzutragende Status zugewiesen
*Der eingegebene timestamp des users wird ebenfalls in die Tabelle eingetragen
wa_status-zz_pkt_status = 'BMLV_HVBCH'.
wa_status-statusart = 'T'.
*Der neue Status wird in die Tabelle zzt_pkt_status geschrieben
MODIFY zzt_pkt_status FROM wa_status.
*Ausgabe der Daten
PERFORM ausgeben USING it_pa0001-pernr CHANGING wa_tstmp-pernr.
PERFORM ausgeben USING it_status-sozver CHANGING wa_tstmp-sozver.
PERFORM ausgeben USING datum CHANGING wa_tstmp-datum.
PERFORM ausgeben USING zeit CHANGING wa_tstmp-zeit.
PERFORM ausgeben USING it_pa0001-vdsk1 CHANGING wa_tstmp-vdsk1.
ENDIF.
ENDSELECT.
**Wenn kein Datensatz gefunden wurde
IF sy-subrc NE 0.
*Dann wird eine dementsprechende Meldung ausgegeben
WRITE: / 'Es wurden keine Datensätze gefunden.'.
ENDIF.
IF p_datei = 'X'.
PERFORM ausgabe_zeile USING wa_tstmp.
WRITE: / 'Erzeugter Dateiname:', p_fname.
ELSE.
WRITE: / wa_tstmp.
ENDIF.
*Wenn die Checkbox `Datenausgabe in einer Datei´ angeklickt wurde
IF p_datei = 'X'.
*Schließen der Datei
CLOSE DATASET p_fname.
ENDIF.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form ausgeben
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TEXT text
* <--P_AUSGSTR text
*----------------------------------------------------------------------*
FORM ausgeben USING p_text
CHANGING p_zielfeld.
*Deklaration der Var. ausgabe_temp
DATA: ausgabe_temp(1000) TYPE c.
*Schreiben des Ausgabestrings
WRITE: p_text TO ausgabe_temp LEFT-JUSTIFIED.
p_zielfeld = p_text.
ENDFORM. " ausgeben
*&---------------------------------------------------------------------*
*& Form ausgabe_zeile
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_AUSGSTR text
* -->P_WA_INFO text
*----------------------------------------------------------------------*
FORM ausgabe_zeile USING p_struktur.
IF p_datei = 'X'.
TRANSFER p_struktur TO p_fname.
ELSE.
WRITE: / p_struktur.
ENDIF.
ENDFORM. " ausgabe_zeile