Ausgabe einer Fehlerliste

Getting started ... Alles für einen gelungenen Start.
3 Beiträge • Seite 1 von 1
3 Beiträge Seite 1 von 1

Ausgabe einer Fehlerliste

Beitrag von barbara (ForumUser / 50 / 0 / 0 ) »
Hello,
Ich möchte eine Fehlerliste ausgeben, d.h. Ziel meines Reports ist es, es die Sozialversicherungsnummern zu einer Person auszugeben, die Fehler zum Datensatz enthalten. Unter Fehler sind Datenlücken, Anfangswerte und Nullwerte zu verstehen.

Zu diesem Report gibt es folgenden Funktionsbaustein der in das Programm einzubauen ist --> FuBa nennt sich: Z_PKT_LUECKEN_FINDEN.

Meine Frage lautet nun: Wie baue ich den Funktionsbaustein richtig in meinen Report ein?
Kann mir da bitte jemand weiterhelfen?
Danke!!
(die Ausgabe soll entweder als Liste oder in einer Datei möglich sein ..)

Code des FuBa sieht derzeit bei mir so aus (der sollte richtig sein!):

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.
Dann sieht mein derzeitiger Code - an dem noch "herumgebastelt" wird so aus:

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_zeile
Wie baue ich aber den Funktionsbaustein richtig in mein Programm?
Kann mir da bitte jemand helfen?

Vielen Dank!!

liebe Grüsse

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von scott111 (ForumUser / 49 / 0 / 0 ) »
Hallo

Du kennst dich bestimmt mit der SE38 oder Se80 aus. Ok .
Dann gehe in Dein Programm und füge über die Funktion MUSTER den Baustein ein. Dann mußt du noch die Importparamter IMPORTING
*" VALUE(SOZVER
und Exportparamete im Deklarationsbereich einfügen.

Ich hoffe das war so weit verständliche

Tschau Chris

Beitrag von barbara (ForumUser / 50 / 0 / 0 ) »
Danke!!
Ja, stimmt, das hab' ich soeben gemacht , jetzt funkt. auch.

...

Aber darauffolgend eine andere Frage --> Wieso kann ich nicht mehrere Sozialversicherungsnummern eingeben sondern nur eine? Obwohl das Ganze ja im select-endselect - Block verpackt ist!?

Danke!!
lg

Mein Code sieht derzeit so aus -->

Code: 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.

Seite 1 von 1

Vergleichbare Themen

7
Antw.
6432
Views
Write-Ausgabe vor Alv-Grid Ausgabe
von L0w-RiDer » 14.08.2019 14:09 • Verfasst in ABAP® für Anfänger
1
Antw.
2224
Views
Ausgabe DB
von Clarins » 21.05.2017 14:53 • Verfasst in ABAP® für Anfänger
0
Antw.
3007
Views
ALV-Ausgabe
von eddi89 » 16.12.2009 15:49 • Verfasst in ABAP Objects®
3
Antw.
3527
Views
ALV Ausgabe
von Spyder » 26.05.2011 12:09 • Verfasst in ABAP® Core
13
Antw.
6384
Views
ALV Ausgabe
von holderda » 11.06.2014 10:41 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

ATC Finding in Smartforms
vor 3 Tagen von sap_enthusiast 2 / 377
LSMW-Problem
vor 4 Tagen von rob_abc 4 / 435

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

ATC Finding in Smartforms
vor 3 Tagen von sap_enthusiast 2 / 377
LSMW-Problem
vor 4 Tagen von rob_abc 4 / 435

Unbeantwortete Forenbeiträge

SFP/SEGW - Fehler beim Rendering
letzen Monat von Manfred K. 1 / 73815
Benutzerdefinierte Felder PSP
January 2026 von Rabea1103 1 / 126866