Code: Alles auswählen.
function z_pkt_luecken_finden.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(SOZVER)
*" EXPORTING
*" REFERENCE(ANFANGSWERTE) TYPE FLAG
*" REFERENCE(LUECKEN) TYPE FLAG
*" REFERENCE(NULLWERTE) TYPE FLAG
*" TABLES
*" LUECKEN_TAB TYPE ZZT_PKT_LUECKEN_TAB
*" EXCEPTIONS
*" INVALID_SOZVERS
*" NO_DATA
*"----------------------------------------------------------------------
ranges: r_lsart for it_zzt_pkt_lsart-lsart.
data: begin of i_zeiten occurs 0.
data: begda like zzs_pkt_luecken_zeil-begda.
data: endda like zzs_pkt_luecken_zeil-endda.
data: pbmg0 like zzt_pkt_versmons-pbmg0.
data: pbmg1 like zzt_pkt_versmons-pbmg1.
data end of i_zeiten.
data: w_zeiten like i_zeiten.
data: w_begprag like zzt_pkt_versns-begprag.
data: w_i type i.
data: i_luecken_tab_temp like zzs_pkt_luecken_zeil occurs 0 with
header line.
data: w_luecken_tab_temp like i_luecken_tab_temp.
data: w_datum like sy-datum.
clear anfangswerte.
clear luecken.
clear nullwerte.
clear luecken_tab.
refresh luecken_tab.
select single * from zzt_pkt_versns
where sozver = sozver
and lotim = 0.
if sy-subrc <> 0.
raise invalid_sozvers.
endif.
if it_zzt_pkt_lsart is initial.
select * from zzt_pkt_lsart into table it_zzt_pkt_lsart.
endif.
w_begprag = zzt_pkt_versns-begprag.
w_begprag+6(2) = '01'.
clear r_lsart.
r_lsart-sign = 'I'.
r_lsart-option = 'EQ'.
r_lsart-high = ' '.
r_lsart-low = ' '.
append r_lsart.
loop at it_zzt_pkt_lsart where pragerf = ' '.
r_lsart-low = it_zzt_pkt_lsart-lsart.
append r_lsart.
endloop.
select begda endda pbmg0 pbmg1
from zzt_pkt_versmons
into corresponding fields of table i_zeiten
where sozver = sozver
and lotim = 0
and lsart in r_lsart
and endda >= w_begprag
order by begda.
if sy-subrc <> 0.
raise no_data.
endif.
w_datum = '20041231'. " fixes 'Endedatum'
* Auf letzten Satz positionieren
loop at i_zeiten.
endloop.
if i_zeiten-endda < w_datum.
* Fiktiven Eintrag erstellen
i_zeiten-begda = w_datum.
i_zeiten-endda = w_datum.
i_zeiten-pbmg0 = 1.
append i_zeiten.
endif.
loop at i_zeiten.
if sy-tabix = 1.
if i_zeiten-begda > w_begprag.
* Erster Eintrag / Anfangswert fehlt
anfangswerte = 'X'.
clear i_luecken_tab_temp.
i_luecken_tab_temp-luecken_typ = 'A'.
i_luecken_tab_temp-begda = w_begprag.
i_luecken_tab_temp-endda = i_zeiten-begda - 1.
append i_luecken_tab_temp.
endif.
else.
w_i = i_zeiten-begda
- w_zeiten-endda.
if w_i > 1.
* Lücken
luecken = 'X'.
clear i_luecken_tab_temp.
i_luecken_tab_temp-luecken_typ = 'L'.
i_luecken_tab_temp-begda = w_zeiten-endda + 1.
i_luecken_tab_temp-endda = i_zeiten-begda - 1.
append i_luecken_tab_temp.
endif.
endif.
if i_zeiten-pbmg0 is initial
and i_zeiten-pbmg1 is initial.
* Nullwert
nullwerte = 'X'.
clear i_luecken_tab_temp.
i_luecken_tab_temp-luecken_typ = 'N'.
i_luecken_tab_temp-begda = i_zeiten-begda.
i_luecken_tab_temp-endda = i_zeiten-endda.
append i_luecken_tab_temp.
endif.
w_zeiten = i_zeiten.
endloop.
sort i_luecken_tab_temp by luecken_typ
begda.
loop at i_luecken_tab_temp.
if i_luecken_tab_temp-luecken_typ = 'A'
or i_luecken_tab_temp-luecken_typ = 'L'.
luecken_tab = i_luecken_tab_temp.
append luecken_tab.
delete i_luecken_tab_temp.
endif.
endloop.
clear luecken_tab.
loop at i_luecken_tab_temp.
if luecken_tab is initial.
luecken_tab = i_luecken_tab_temp.
else.
w_i = i_luecken_tab_temp-begda
- luecken_tab-endda.
if w_i = 1.
luecken_tab-endda = i_luecken_tab_temp-endda.
else.
append luecken_tab.
luecken_tab = i_luecken_tab_temp.
endif.
endif.
endloop.
if sy-subrc = 0.
* Schleife mindestens einmal durchlaufen
append luecken_tab.
endif.
endfunction.Code: Alles auswählen.
REPORT zlobtest04 NO STANDARD PAGE HEADING.
TABLES:
zzt_pkt_versns,
pa0001.
*Konstantendeklaration für die Ausgabe, da die Felder in Hochkommas ausgegeben werden
*und mit einem Strichpunkt getrennt
CONSTANTS:
separator(1) VALUE ';',
hochkomma(1) VALUE '"'.
DATA:
luecken_tab TYPE zzt_pkt_luecken_tab,
ausgstr TYPE string.
*Selektionsblock für die Eingabe des timestamp
SELECTION-SCREEN BEGIN OF BLOCK auswahl WITH FRAME.
*Selektionsbildschirm
SELECT-OPTIONS: s_sozver FOR zzt_pkt_versns-sozver OBLIGATORY MATCHCODE OBJECT zzh_pkt_sozver.
SELECT-OPTIONS: s_vdsk1 FOR pa0001-vdsk1.
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.
SELECT * FROM zzt_pkt_versns
WHERE sozver IN s_sozver
AND lotim EQ 0.
CALL FUNCTION 'Z_PKT_LUECKEN_FINDEN'
EXPORTING
sozver = zzt_pkt_versns-sozver
* IMPORTING
* ANFANGSWERTE =
* LUECKEN =
* NULLWERTE =
TABLES
luecken_tab = luecken_tab
EXCEPTIONS
invalid_sozvers = 1
no_data = 2
OTHERS = 3
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*Löschen des Ausgabestrings
CLEAR ausgstr.
*Ausgabe der Daten aus der Tab. VERSNS
PERFORM ausgeben USING zzt_pkt_versns-sozver CHANGING ausgstr.
IF p_datei = 'X'.
PERFORM ausgabe_zeile USING ausgstr.
WRITE: / 'Erzeugter Dateiname:', p_fname.
ELSE.
WRITE: / ausgstr.
ENDIF.
ENDSELECT.
*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_ausgstr.
*Deklaration der Var. ausgabe_temp
DATA: ausgabe_temp(1000) TYPE c.
*Schreiben des Ausgabestrings
WRITE: p_text TO ausgabe_temp LEFT-JUSTIFIED.
*Die Felder nach CONCATENATE werden aneinandergehängt nach p_ausgstr gestellt
CONCATENATE p_ausgstr
hochkomma
ausgabe_temp
hochkomma
separator
INTO p_ausgstr.
ENDFORM. " ausgeben
*&---------------------------------------------------------------------*
*& Form ausgabe_zeile
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_AUSGSTR text
* -->P_WA_INFO text
*----------------------------------------------------------------------*
FORM ausgabe_zeile USING p_ausgstr.
IF p_datei = 'X'.
TRANSFER p_ausgstr TO p_fname.
ENDIF.
ENDFORM. " ausgabe_zeileCode: Alles auswählen.
REPORT zlobtest04 MESSAGE-ID zpkt NO STANDARD PAGE HEADING LINE-SIZE 132.
TABLES:
zzt_pkt_versns,
pa0001.
DATA:
it_pa0001 TYPE TABLE OF pa0001 WITH HEADER LINE,
it_versns TYPE TABLE OF zzt_pkt_versns WITH HEADER LINE,
w_text80(80).
DATA: BEGIN OF it_zzpkt_selektionsliste OCCURS 0,
sozver LIKE zzt_pkt_versns-sozver,
pernr LIKE zzt_pkt_versns-pernr,
datenluecke LIKE zzpkt_selektionsliste-datenluecke,
nullwerte LIKE zzpkt_selektionsliste-nullwerte,
fehl_anfang LIKE zzpkt_selektionsliste-fehl_anfang,
text LIKE zzpkt_selektionsliste-text,
END OF it_zzpkt_selektionsliste.
DATA:
i_luecken_tab TYPE zzt_pkt_luecken_tab WITH HEADER LINE.
*Selektionsblock für die Eingabe des timestamp
SELECTION-SCREEN BEGIN OF BLOCK auswahl WITH FRAME.
*Selektionsbildschirm
SELECT-OPTIONS: s_sozver FOR zzt_pkt_versns-sozver MATCHCODE OBJECT zzh_pkt_sozver.
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.
SELECT * FROM zzt_pkt_versns
WHERE sozver IN s_sozver
*Gecancelte Daten werden nicht ausgegeben
AND lotim EQ '0'.
* SELECT zzt_pkt_versns~sozver zzt_pkt_versns~pernr pa0001~pernr pa0001~vdsk1
* FROM zzt_pkt_versns INNER JOIN pa0001
* ON zzt_pkt_versns~pernr = pa0001~pernr
* INTO (it_versns-sozver, it_versns-pernr, it_pa0001-pernr, it_pa0001-vdsk1)
* WHERE zzt_pkt_versns~sozver IN s_sozver
* AND pa0001~vdsk1 IN s_vdsk1
* AND zzt_pkt_versns~lotim EQ 0.
CALL FUNCTION 'Z_PKT_LUECKEN_FINDEN'
EXPORTING
sozver = zzt_pkt_versns-sozver
IMPORTING
anfangswerte = it_zzpkt_selektionsliste-fehl_anfang
luecken = it_zzpkt_selektionsliste-datenluecke
nullwerte = it_zzpkt_selektionsliste-nullwerte
TABLES
luecken_tab = i_luecken_tab
EXCEPTIONS
invalid_sozvers = 1
no_data = 2
OTHERS = 3.
CASE sy-subrc.
WHEN 0.
LOOP AT i_luecken_tab.
PERFORM ausgeben USING zzt_pkt_versns-sozver CHANGING it_zzpkt_selektionsliste-sozver.
PERFORM ausgeben USING zzt_pkt_versns-pernr CHANGING it_zzpkt_selektionsliste-pernr.
CLEAR w_text80.
CASE i_luecken_tab-luecken_typ.
WHEN 'A'.
w_text80 = 'Fehl.Anf.-Werte:'.
WHEN 'L'.
w_text80 = 'Dat.Lücken:'.
WHEN 'N'.
w_text80 = 'Nullwerte:'.
ENDCASE.
WRITE i_luecken_tab-begda TO w_text80+40.
w_text80+59(1) = '-'.
WRITE i_luecken_tab-endda TO w_text80+60.
w_text80+79(1) = ';'.
CONDENSE w_text80 NO-GAPS.
CONCATENATE it_zzpkt_selektionsliste-text
w_text80
INTO it_zzpkt_selektionsliste-text
SEPARATED BY ' '.
ENDLOOP.
WHEN 1.
MESSAGE x040.
WHEN 2.
it_zzpkt_selektionsliste-fehl_anfang = 'X'.
it_zzpkt_selektionsliste-datenluecke = 'X'.
it_zzpkt_selektionsliste-nullwerte = 'X'.
it_zzpkt_selektionsliste-text = 'Keine Daten gefunden'.
WHEN OTHERS.
MESSAGE x040.
ENDCASE.
ENDSELECT.
IF p_datei = 'X'.
PERFORM ausgabe_zeile USING it_zzpkt_selektionsliste.
WRITE: / 'Erzeugter Dateiname:', p_fname.
ELSE.
WRITE: / it_zzpkt_selektionsliste.
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.