Coding Fehler

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
14 Beiträge • Seite 1 von 1
14 Beiträge Seite 1 von 1

Coding Fehler

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Hallo zusammen,

ich habe mal wieder einen kleinen Denkfehler!!! Mein Coding schickt mich in einen Kurzdump mit der Meldung ITAB_DUPLICATE_KEY

Es existiert bereits eine Zeile mit demselben Schlüssel

Es sollte ein Eintrag in die Tabelle "\PROGRAM=!_ZZ1_KONTROLLE\DATA=GT_DRAW",
die mit eindeutigem
Tabellenschlüssel (UNIQUE KEY) vereinbart war, eingefügt werden.
Es gab aber bereits eine Zeile mit identischem Schlüssel.

Code: Alles auswählen.

**&---------------------------------------------------------------------*
**& Report  Z_ZZ1_KONTROLLE
**&
**&---------------------------------------------------------------------*
**&
**&
**&---------------------------------------------------------------------*
*
REPORT  z_zz1_kontrolle.


**&---------------------------------------------------------------------*
* Sämtliche relevanten Felder aus der Tabelle DRAW lesen
**&---------------------------------------------------------------------*
TYPES: BEGIN OF t_draw,
  dokar LIKE draw-dokar,
  doktl LIKE draw-doktl,
  dokst LIKE draw-dokst,
  loedk LIKE draw-loedk,

END OF t_draw.

DATA: gt_draw TYPE SORTED TABLE OF t_draw
       WITH UNIQUE KEY dokar doktl dokst loedk,
      wa_draw LIKE LINE OF gt_draw.

"eventuell eine Checkbox einbauen mit den Einschränkungen auf ZZ1 usw.
**&---------------------------------------------------------------------*
* Selektieren auf die relevanten abfragen
**&---------------------------------------------------------------------*
SELECT  draw~dokar draw~doktl draw~dokst draw~loedk
  FROM draw
 APPENDING TABLE gt_draw.


LOOP AT gt_draw INTO wa_draw." WHERE dokar = 'zz1' AND doktl = '001'.
  IF wa_draw-dokar = 'zz1'.

    WRITE: / wa_draw-doktl.
  ENDIF.
ENDLOOP.
ULINE.
Kann mir jemand helfen. Ich habe gerade keine Ahnung warum.


DANKE!!!!

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


Re: Coding Fehler

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Weil es zu einer Kombination Dokumentenart/Teildokument durchaus mehrere Dokumente geben kann, die den gleichen Status und eine Löschvormerkung (oder eben keine) haben.

Guck Dir einfach mal den Schlüssel der DRAW an.
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Re: Coding Fehler

Beitrag von a-dead-trousers (Top Expert / 4419 / 224 / 1189 ) »
hi!

Das stimmt! DRAW hat DOKAR DOKNR DOKVR und DOKTL als Schlüssel.
Wenn du aber nur die Kombinationen aus DOKAR/DOKTL/LOEDK benötigst, kannst du entweder dein Select-Statement mit GROUP BY versehen oder du verwendest anstatt APPENDING TABLE ein INTO TABLE.

GROUP BY würde die Datenmenge schon von der DB reduzieren lassen, umgeht aber die Pufferug. Ist also auch nur sinnvoll wenn du viele verschiedene DOKNR/DOKVR hast aber nur wenige DOKAR/DOKTL und eine Übertragung unnötiger Datenmengen schwerer wiegt als eine "Überbelastung" der DB.
INTO TABLE fügt bei Sortierten (und Hashed) Tabellen neue Zeilen ein ODER modifiziert vorhandene Einträge (laut Schlüssel) während APPENDING (wie der Name schon sagt) nur hinzufügt.

lg ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
commolus

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Coding Fehler

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Morgen zusammen!

Habe das Problem von oben Dank eurer Hilfe beseitigen können. Habe aber schon das nächste Problem :)!

Ich habe nun auch noch 4 Parametersanweisungen eingebaut. Nun bräuchte ich noch eine Idee für eine selektions anweisung damit ich nach den verschiedenen Parametern selektieren kann.

Mein Gedanke war so etwas wie:

Code: Alles auswählen.

IF pa_dokar IS INITIAL.
  SELECT  draw~dokar draw~doknr draw~dokvr draw~doktl draw~dokst draw~loedk
  FROM draw
 INTO TABLE gt_draw
    WHERE draw~dokar = pa_dokar.
else.
  if pa_dokvr is initial.
    SELECT  draw~dokar draw~doknr draw~dokvr draw~doktl draw~dokst draw~loedk
  FROM draw
 INTO TABLE gt_draw
    WHERE draw~dokvr = pa_dokvr.
ENDIF.
Leider geht das nicht ganz so wie ich wollte.

Danke!!!!

Re: Coding Fehler

Beitrag von a-dead-trousers (Top Expert / 4419 / 224 / 1189 ) »
Wenn ich dich richtig verstehe möchtest du, wenn der Paremter nicht ausgewählt wurde, diesen bei der Abfrage ignorieren, oder?
Am Besten machst du aus deinen Parametern SELECT-OPTIONS und verwendest diese mit dem Operator IN bei deinem SELECT.
Damit ersparst du dir die vielen ansonsten notwendigen IF-Abfragen, da leere INs laut ABAP/SAP gleichzusetzen sind mit ALLES.

Ach ja: Die IF-Abfragen in deinem Beispiel sollten eigentlich IF ... IS NOT INITIAL lauten damit sie richtig funktionieren.

Wenn du wirklich mit Parameter arbeiten musst (willst) gäbe es noch eine Möglichkeit via dynamische Select-Statements etwas an Schreibarbeit einzusparen. Dazu musst du einen STRING zusammenbasteln der die tatsächliche WHERE-Klausel enthält.

Sowas in der Art

Code: Alles auswählen.

IF pa_doknr IS NOT INITAL.
  CONCATENATE `AND pa_doknr EQ '` pa_doknr `'` INTO la_where.
ENDIF.
...
SELECT *
  FROM DRAW
  INTO gt_draw
  WHERE (la_where).
Mehr Infos dazu findest du in der ABAP-Hilfe!
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Coding Fehler

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Hallo zusammen,
ich habe das Programm erneut umgeschrieben damit ich über die dms_... einen Schlüssel bekomme und mit diesem in weiterer folge das original Verzeichnis der Ablage herausgeben kann.


Warum bekomme ich in meinem Programm immer einen Fehler mit ITAB_DUPLICATE_KEY.

Hier ist mein Coding

Code: Alles auswählen.

**&---------------------------------------------------------------------*
**& Report  Z_ZZ1_KONTROLLE
**&
**&---------------------------------------------------------------------*
**& Es fehlt noch: 1. eine Zählung, 2. eine Ausgabe wenn verglichen wird, 3. und eine Ausgebe was gelöscht wurde
**&
**&---------------------------------------------------------------------*
*
REPORT  z_zz1_kontrolle.


**&---------------------------------------------------------------------*
* Sämtliche relevanten Felder aus der Tabelle DRAW lesen
**&---------------------------------------------------------------------*
TYPES: BEGIN OF t_draw,
  dokar LIKE draw-dokar,
  doknr LIKE draw-doknr,
  dokvr LIKE draw-dokvr,
  doktl LIKE draw-doktl,
  dokst LIKE draw-dokst,
  loedk LIKE draw-loedk,
  filep LIKE draw-filep1, "BW 29.05.2012 +
END OF t_draw.

DATA: gt_draw TYPE SORTED TABLE OF t_draw
       WITH UNIQUE KEY dokar doknr dokvr doktl dokst loedk ,
      wa_draw LIKE LINE OF gt_draw.

**&---------------------------------------------------------------------*
* sämtliche Felder der Tabelle DMS_DOC2LOIO
**&---------------------------------------------------------------------*
TYPES: BEGIN OF t_doc2loio,
  dokar LIKE dms_doc2loio-dokar,
  doknr LIKE dms_doc2loio-doknr,
  dokvr LIKE dms_doc2loio-dokvr,
  doktl LIKE dms_doc2loio-doktl,
  lo_index like dms_doc2loio-lo_index,
  lo_type LIKE dms_doc2loio-lo_type,
  lo_objid LIKE dms_doc2loio-lo_objid,
END OF t_doc2loio.

DATA: gt_doc2loio TYPE SORTED TABLE OF t_doc2loio
       WITH UNIQUE KEY lo_objid,"dokar doknr dokvr doktl lo_type lo_objid ,
      wa_doc2loio LIKE LINE OF gt_doc2loio.

**&---------------------------------------------------------------------*
* Parameters Abfrage zur Reduktion der Datenmenge
**&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK auswahl WITH FRAME TITLE text-001.
SELECT-OPTIONS: so_dokar FOR wa_draw-dokar,
                       so_dokvr FOR wa_draw-dokvr,
                       so_dokst FOR wa_draw-dokst,
                       so_doktl FOR wa_draw-doktl,
                       so_loedk FOR wa_draw-loedk.
"so_filep for wa_draw-filep. "BW 29.05.2012 +

SELECTION-SCREEN END OF BLOCK auswahl.

**&---------------------------------------------------------------------*
* Selektion auf das was ausgeführt werden soll löschen, vergleichen oder kopieren
**&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK auswahl2 WITH FRAME TITLE text-002.
PARAMETERS: r1 RADIOBUTTON GROUP rad1 ,
            r4 RADIOBUTTON GROUP rad1 DEFAULT 'X' .

SELECTION-SCREEN END OF BLOCK auswahl2.

**&---------------------------------------------------------------------*
* Selektieren auf die relevanten abfragen
**&---------------------------------------------------------------------*

PERFORM lesen_daten.


*&---------------------------------------------------------------------*
*&      Form  lesen_daten
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM lesen_daten .

  SELECT  dokar doknr dokvr doktl dokst loedk filep1 "um filep1 regänzt 29.05.2012+
 FROM draw APPENDING TABLE gt_draw
          WHERE dokar IN so_dokar
            AND dokvr IN so_dokvr
            AND dokst IN so_dokst
            AND doktl IN so_doktl
            AND loedk IN so_loedk.

  IF r1 = 'X'.
    LOOP AT gt_draw INTO wa_draw.
      """"""""""""""""""""""""""""""""""""""""""""""""""""BW 30.05.12 ANFANG +


      SELECT  lo_index lo_type lo_objid "dokar doknr dokvr doktl lo_index lo_type lo_objid BW 31.05.2012 -
  FROM dms_doc2loio APPENDING TABLE gt_doc2loio
        "from dms_doc2loio into wa_doc2loio
  WHERE dokar IN so_dokar.
*        AND dokvr IN so_dokvr
*        AND doktl IN so_doktl.
      LOOP AT gt_doc2loio INTO wa_doc2loio.
        """"""""""""""""""""""""""""""""""""""""""""""""""""BW 30.05.12 ENDE +
        WRITE: / wa_draw-dokar,
          wa_draw-doknr,

         wa_draw-dokvr,
          wa_draw-doktl,
          wa_draw-dokst,
          wa_draw-loedk,
   "       wa_draw-filep. "BW 30.05.2012 -
   wa_draw-filep,
   wa_doc2loio-lo_objid.
clear wa_doc2loio.
      ENDLOOP.
    ENDLOOP.
    IF sy-dbcnt = 0.
      ULINE.
      WRITE: 'Es wurde nichts gefunden! Bitte die Eingabeparameter prüfen.'.
      ULINE.
    ELSE.
      ULINE.
      WRITE:  sy-dbcnt , 'Dokumente gefunden'.
      ULINE.
    ENDIF.
  ENDIF.

  IF r4 = 'X'.
    LOOP AT gt_draw INTO wa_draw.
    ENDLOOP.
    IF sy-dbcnt = 0.
      ULINE.
      WRITE: 'Es wurde nichts gefunden! Bitte die Eingabeparameter prüfen.'.
      ULINE.
    ELSE.
      ULINE.
      WRITE:   sy-dbcnt ,
      'Dokumente gefunden'.
      ULINE.
    ENDIF.
  ENDIF.



**&---------------------------------------------------------------------*
* Zählen der Ergebnisse und Ausgabe der Daten in Abhängigkeit der gefunden Einträge
**&---------------------------------------------------------------------*

ENDFORM.                    "lesen_daten
Wo liegt mein Fehler? Danke

Re: Coding Fehler

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Mein Problem ist soweit gelöst dass das Programm läuft.

Ich hab irgend ein Problem allerdings noch mit den Loops.

Sie Loopen zwar ab der Laufzeit geht mir dabei komplett flöten. Wenn ich nach ca. 100 Dokumenten suche funktioniert es einwandfrei. Jedoch gibt es auch Dokumentarten mit mehr als 50.000 Einträgen. Bei dieser Menge braucht er länger als 35 Min. :shock:

Wie kann ich meine Laufzeit verbessern?


Herzlichen Dank!!!!

Code: Alles auswählen.

**&---------------------------------------------------------------------*
**& Report  Z_ZZ1_KONTROLLE
**&
**&---------------------------------------------------------------------*
**& Es fehlt noch: 1. eine Zählung, 2. eine Ausgabe wenn verglichen wird, 3. und eine Ausgebe was gelöscht wurde
**&
**&---------------------------------------------------------------------*
*
REPORT  z_zz1_kontrolle.


**&---------------------------------------------------------------------*
* Sämtliche relevanten Felder aus der Tabelle DRAW lesen
**&---------------------------------------------------------------------*
TYPES: BEGIN OF t_draw,
  dokar LIKE draw-dokar,
  doknr LIKE draw-doknr,
  dokvr LIKE draw-dokvr,
  doktl LIKE draw-doktl,
  dokst LIKE draw-dokst,
  loedk LIKE draw-loedk,
  filep LIKE draw-filep1, "BW 29.05.2012 +
END OF t_draw.

DATA: gt_draw TYPE SORTED TABLE OF t_draw
       WITH UNIQUE KEY dokar doknr dokvr doktl dokst loedk ,
      wa_draw LIKE LINE OF gt_draw.

**&---------------------------------------------------------------------*
* sämtliche Felder der Tabelle DMS_DOC2LOIO
**&---------------------------------------------------------------------*
TYPES: BEGIN OF t_doc2loio,
  dokar LIKE dms_doc2loio-dokar,
  doknr LIKE dms_doc2loio-doknr,
  dokvr LIKE dms_doc2loio-dokvr,
  doktl LIKE dms_doc2loio-doktl,
  lo_type LIKE dms_doc2loio-lo_type,
  lo_index LIKE dms_doc2loio-lo_index,
  lo_objid LIKE dms_doc2loio-lo_objid,
END OF t_doc2loio.

DATA: gt_doc2loio TYPE SORTED TABLE OF t_doc2loio
       WITH UNIQUE KEY dokar doknr dokvr doktl lo_type lo_index lo_objid ,
      wa_doc2loio LIKE LINE OF gt_doc2loio.



**&---------------------------------------------------------------------*
* sämtliche Felder der Tabelle DMS_PH_CD1
**&---------------------------------------------------------------------*
TYPES: BEGIN OF t_ph_cd1,
  loio_id LIKE dms_ph_cd1-loio_id,
  stor_cat LIKE dms_ph_cd1-stor_cat,

END OF t_ph_cd1.

DATA: gt_ph_cd1 TYPE SORTED TABLE OF t_ph_cd1
       WITH UNIQUE KEY loio_id,
      wa_ph_cd1 LIKE LINE OF gt_ph_cd1.
**&---------------------------------------------------------------------*
* Parameters Abfrage zur Reduktion der Datenmenge
**&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK auswahl WITH FRAME TITLE text-001.
SELECT-OPTIONS: so_dokar FOR wa_draw-dokar,
                       so_dokvr FOR wa_draw-dokvr,
                       so_dokst FOR wa_draw-dokst,
                       so_doktl FOR wa_draw-doktl,
                       so_loedk FOR wa_draw-loedk.
"so_filep for wa_draw-filep. "BW 29.05.2012 +

SELECTION-SCREEN END OF BLOCK auswahl.

**&---------------------------------------------------------------------*
* Selektion auf das was ausgeführt werden soll löschen, vergleichen oder kopieren
**&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK auswahl2 WITH FRAME TITLE text-002.
PARAMETERS: r1 RADIOBUTTON GROUP rad1 ,
            r4 RADIOBUTTON GROUP rad1 DEFAULT 'X' .

SELECTION-SCREEN END OF BLOCK auswahl2.

**&---------------------------------------------------------------------*
* Selektieren auf die relevanten abfragen
**&---------------------------------------------------------------------*

PERFORM lesen_daten.


*&---------------------------------------------------------------------*
*&      Form  lesen_daten
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM lesen_daten .

  SELECT  dokar doknr dokvr doktl dokst loedk filep1 "um filep1 regänzt 29.05.2012+
 FROM draw APPENDING TABLE gt_draw
          WHERE dokar IN so_dokar
            AND dokvr IN so_dokvr
            AND dokst IN so_dokst
            AND doktl IN so_doktl
            AND loedk IN so_loedk.

  IF r1 = 'X'.
    LOOP AT gt_draw INTO wa_draw.
      """"""""""""""""""""""""""""""""""""""""""""""""""""BW 30.05.12 ANFANG +
      SELECT  dokar doknr dokvr doktl lo_type lo_index lo_objid "BW 31.05.2012 -
          FROM dms_doc2loio INTO TABLE gt_doc2loio
  WHERE dokar IN so_dokar.
      LOOP AT gt_doc2loio INTO wa_doc2loio.
      ENDLOOP.
      SELECT SINGLE stor_cat
      "SELECT loio_id stor_cat
        "FROM dms_ph_cd1 INTO TABLE gt_ph_cd1
        FROM dms_ph_cd1 INTO  wa_ph_cd1
        WHERE loio_id =  wa_doc2loio-lo_objid.
      "LOOP AT gt_ph_cd1 INTO wa_ph_cd1.
      """"""""""""""""""""""""""""""""""""""""""""""""""""BW 30.05.12 ENDE +
      WRITE: / wa_draw-dokar,
        wa_draw-doknr,

       wa_draw-dokvr,
        wa_draw-doktl,
        wa_draw-dokst,
        wa_draw-loedk,

 wa_draw-filep,
 wa_ph_cd1."-stor_cat.
      SKIP.
      CLEAR wa_doc2loio.
      CLEAR wa_ph_cd1.
      ULINE.
      "  ENDLOOP.
    ENDLOOP.

    IF sy-dbcnt = 0.
      ULINE.
      WRITE: 'Es wurde nichts gefunden! Bitte die Eingabeparameter prüfen.'.
      ULINE.
    ELSE.
      ULINE.
      WRITE:  sy-dbcnt , 'Dokumente gefunden'.
      ULINE.
    ENDIF.
  ENDIF.

  IF r4 = 'X'.
    LOOP AT gt_draw INTO wa_draw.
    ENDLOOP.
    IF sy-dbcnt = 0.
      ULINE.
      WRITE: 'Es wurde nichts gefunden! Bitte die Eingabeparameter prüfen.'.
      ULINE.
    ELSE.
      ULINE.
      WRITE:   sy-dbcnt ,
      'Dokumente gefunden'.
      ULINE.
    ENDIF.
  ENDIF.



**&---------------------------------------------------------------------*
* Zählen der Ergebnisse und Ausgabe der Daten in Abhängigkeit der gefunden Einträge
**&---------------------------------------------------------------------*

ENDFORM.                    "lesen_daten

START-OF-SELECTION.

**&---------------------------------------------------------------------*
* Radiobutton 1
**&---------------------------------------------------------------------*



**&---------------------------------------------------------------------*
*2. Radibutton
**&---------------------------------------------------------------------*



**&---------------------------------------------------------------------*
*
**&---------------------------------------------------------------------*

Re: Coding Fehler

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
hi commolus,

schu dir mal genauer dieses Stückchen Code an:

Code: Alles auswählen.

      IF r1 = 'X'.
	  
        LOOP AT gt_draw INTO wa_draw.
      
          SELECT  dokar doknr dokvr doktl lo_type lo_index lo_objid 
              FROM dms_doc2loio INTO TABLE gt_doc2loio
				WHERE dokar IN so_dokar.
				
          LOOP AT gt_doc2loio INTO wa_doc2loio.
          ENDLOOP.
		  
          SELECT SINGLE stor_cat
            FROM dms_ph_cd1 INTO  wa_ph_cd1
            WHERE loio_id =  wa_doc2loio-lo_objid.
          ...
        ENDLOOP
du LOOPSt über die Tabelle gt_draw in das Workarea wa_draw. Bereits das nächste SELECT hat nichts mehr mit diesem LOOP zu tun, die einzige Bedingung verweist auf so_dokar. Da du es in die Schleife gepackt hast, wird es (überflüssigerweise) bei jedem Schleifendurchlauf ausgeführt.

Welchen Zweck hat LOOP AT gt_doc2loio INTO wa_doc2loio und wieviele Datensätze landen in dieser Tabelle? Wenn du nur den ersten Datensatz haben möchtest kannst du den LOOP nach dem ersten Durchlauf abbrechen

SELECT SINGLE stor_cat hat mit dem äußeren LOOP so auch nichts zu tun und könnte auch aus der Schleife raus...
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Coding Fehler

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Servus Alexander,

soweit ich dich verstanden habe habe ich probiert es um zu setzen.

Code: Alles auswählen.

 IF r1 = 'X'.
    LOOP AT gt_draw INTO wa_draw.
         SELECT SINGLE dokar doknr dokvr doktl lo_type lo_index lo_objid
        FROM dms_doc2loio INTO wa_doc2loio
        WHERE dokar IN so_dokar.
          SELECT SINGLE stor_cat
             FROM dms_ph_cd1 INTO  wa_ph_cd1
              WHERE loio_id =  wa_doc2loio-lo_objid.
Wie ich den Loop nach dem ersten Durchlauf abrechen soll ist mir leider noch nicht ganz klar. Vorallem wie?!

Danke

Re: Coding Fehler

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
hi commolus,
commolus hat geschrieben: soweit ich dich verstanden habe habe ich probiert es um zu setzen.
dein Beispielcode ist noch nicht ganz das, was ich gemeint habe. Schau mal:

Code: Alles auswählen.

    
LOOP AT gt_draw INTO wa_draw.
         SELECT SINGLE dokar doknr dokvr doktl lo_type lo_index lo_objid
        FROM dms_doc2loio INTO wa_doc2loio
        WHERE dokar IN so_dokar.
du LOOPS hier über gt_draw. Jeder Eintrag der Tabelle gt_draw landet in dem Workarea wa_draw. Anschliessend machst du in dem LOOP (also für jeden Eintrag in gt_draw) ein SELECT SINGLE ...FROM dms_doc2loio mit der Bedingung WHERE dokar IN so_dokar. Was hat jetzt diese Selektionsbedingung mit dem Schleifendurchlauf zu tun? Richtig, garnichts. Die Selektion wird so oft ausgeführt, wie oft du durch die Schleife läufst, genau so gut kannst du diesen SELECT SINGLE ein einziges mal vor dem LOOP ausführen, es läuft auf das Gleiche raus

Code: Alles auswählen.

Wie ich den Loop nach dem ersten Durchlauf abrechen soll ist mir leider noch nicht ganz klar. Vorallem wie?!
mit EXIT, siehe dazu die Hilfe zu dem LOOP-Befehl
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Coding Fehler

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Servus Alex,

wenn ich nun wie du geschrieben hast die selection vor den loop schreibe funktioniert zwar ebenso aber meine Zählerei funktioniert dann nicht mehr.

Und sobald ich ein EXIT einbau bekomme ich nur mehr ein Dokument angezeigt obwohl es ca. 50.000 sein sollten.


Hmm. Ich schick dir morgen nochmals mein Coding, vielleicht fällt mir ja bis morgen noch eine Lösung ein.

Re: Coding Fehler

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
hallo Bernhard,
commolus hat geschrieben: Und sobald ich ein EXIT einbau bekomme ich nur mehr ein Dokument angezeigt obwohl es ca. 50.000 sein sollten.
solche Fehler versucht man am besten im Debugger zu klären. Wo läuft das Programm hin, was landet in den internen Tabellen, wo steigt das Programm aus Schleifen aus usw...
Was die Optimierung der Laufzeit angeht kannst du die Laufzeitanalyse (Transaktion SE30) verwenden um die Performancefresser in deinem Programm zu suchen
commolus hat geschrieben: Hmm. Ich schick dir morgen nochmals mein Coding, vielleicht fällt mir ja bis morgen noch eine Lösung ein.
mach das, ich schau dann noch mal rüber...
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Coding Fehler

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Servus Alexander,

die Laufzeit ist nun auch ok.

Hier mein Coding.

Code: Alles auswählen.

**&---------------------------------------------------------------------*
**& Report  Z_ZZ1_KONTROLLE
**&
**&---------------------------------------------------------------------*
**& 
**&
**&---------------------------------------------------------------------*
*
REPORT  z_zz1_kontrolle.


**&---------------------------------------------------------------------*
* Sämtliche relevanten Felder aus der Tabelle DRAW lesen
**&---------------------------------------------------------------------*
TYPES: BEGIN OF t_draw,
  dokar LIKE draw-dokar,
  doknr LIKE draw-doknr,
  dokvr LIKE draw-dokvr,
  doktl LIKE draw-doktl,
  dokst LIKE draw-dokst,
  loedk LIKE draw-loedk,
  filep LIKE draw-filep1, "BW 29.05.2012 +
END OF t_draw.

DATA: gt_draw TYPE SORTED TABLE OF t_draw
       WITH UNIQUE KEY dokar doknr dokvr doktl dokst loedk ,
      wa_draw LIKE LINE OF gt_draw.

**&---------------------------------------------------------------------*
* sämtliche Felder der Tabelle DMS_DOC2LOIO
**&---------------------------------------------------------------------*
TYPES: BEGIN OF t_doc2loio,
  dokar LIKE dms_doc2loio-dokar,
  doknr LIKE dms_doc2loio-doknr,
  dokvr LIKE dms_doc2loio-dokvr,
  doktl LIKE dms_doc2loio-doktl,
  lo_type LIKE dms_doc2loio-lo_type,
  lo_index LIKE dms_doc2loio-lo_index,
  lo_objid LIKE dms_doc2loio-lo_objid,
END OF t_doc2loio.

DATA: gt_doc2loio TYPE SORTED TABLE OF t_doc2loio
       WITH UNIQUE KEY dokar doknr dokvr doktl lo_type lo_index lo_objid ,
      wa_doc2loio LIKE LINE OF gt_doc2loio.



**&---------------------------------------------------------------------*
* sämtliche Felder der Tabelle DMS_PH_CD1
**&---------------------------------------------------------------------*
TYPES: BEGIN OF t_ph_cd1,
  loio_id LIKE dms_ph_cd1-loio_id,
  stor_cat LIKE dms_ph_cd1-stor_cat,

END OF t_ph_cd1.

DATA: gt_ph_cd1 TYPE SORTED TABLE OF t_ph_cd1
       WITH UNIQUE KEY loio_id,
      wa_ph_cd1 LIKE LINE OF gt_ph_cd1.
**&---------------------------------------------------------------------*
* sämtliche Felder der Tabelle DMS_DOC_FILES
**&---------------------------------------------------------------------*
TYPES: BEGIN OF t_doc_files,
  dokar LIKE dms_doc_files-dokar,
  doknr LIKE dms_doc_files-doknr,
  dokvr LIKE dms_doc_files-dokvr ,
  doktl LIKE dms_doc_files-doktl ,
  file_idx LIKE dms_doc_files-file_idx,
  filename LIKE dms_doc_files-filename,

END OF t_doc_files.

DATA: gt_doc_files TYPE SORTED TABLE OF t_doc_files
       WITH UNIQUE KEY filename,
      wa_doc_files LIKE LINE OF gt_doc_files.

**&---------------------------------------------------------------------*
* Parameters Abfrage zur Reduktion der Datenmenge
**&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK auswahl WITH FRAME TITLE text-001.
SELECT-OPTIONS: so_dokar FOR wa_draw-dokar,
                       so_dokvr FOR wa_draw-dokvr,
                       so_dokst FOR wa_draw-dokst,
                       so_doktl FOR wa_draw-doktl,
                       so_loedk FOR wa_draw-loedk.
"so_filep for wa_draw-filep. "BW 29.05.2012 +

SELECTION-SCREEN END OF BLOCK auswahl.

**&---------------------------------------------------------------------*
* Selektion auf das was ausgeführt werden soll löschen, vergleichen oder kopieren
**&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK auswahl2 WITH FRAME TITLE text-002.
PARAMETERS: r1 RADIOBUTTON GROUP rad1 ,
            r4 RADIOBUTTON GROUP rad1 DEFAULT 'X' .

SELECTION-SCREEN END OF BLOCK auswahl2.

**&---------------------------------------------------------------------*
* Selektieren auf die relevanten abfragen
**&---------------------------------------------------------------------*

PERFORM lesen_daten.


*&---------------------------------------------------------------------*
*&      Form  lesen_daten
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM lesen_daten .

  SELECT  dokar doknr dokvr doktl dokst loedk filep1 "um filep1 regänzt 29.05.2012+
 FROM draw APPENDING TABLE gt_draw
          WHERE dokar IN so_dokar
            AND dokvr IN so_dokvr
            AND dokst IN so_dokst
            AND doktl IN so_doktl
            AND loedk IN so_loedk.

  SELECT  SINGLE stor_cat
 FROM dms_ph_cd1 INTO  wa_ph_cd1
 WHERE loio_id =  wa_doc2loio-lo_objid.

  SELECT  SINGLE stor_cat
  FROM dms_ph_cd1 INTO  wa_ph_cd1
  WHERE loio_id =  wa_doc2loio-lo_objid.

  IF r1 = 'X'.

    LOOP AT gt_draw INTO wa_draw.

      SELECT  dokar doknr dokvr doktl file_idx filename
             FROM dms_doc_files INTO wa_doc_files
             WHERE dokar IN so_dokar.
 WRITE: /  wa_doc_files-dokar,
                  wa_doc_files-doknr,
                  wa_doc_files-dokvr,
                  wa_doc_files-doktl,
                  wa_doc_files-file_idx,
                  wa_doc_files-filename,
                  wa_draw-loedk,
                  wa_ph_cd1.

        SKIP.
        ULINE.
      ENDSELECT.
      exit.
      uline.
      uline.
    ENDLOOP.


    IF sy-dbcnt = 0.
      ULINE.
      WRITE: 'Es wurde nichts gefunden! Bitte die Eingabeparameter prüfen.'.
      ULINE.
    ELSE.
      ULINE.
      WRITE:  sy-dbcnt , 'Dokumente gefunden'.
      ULINE.
    ENDIF.
  ENDIF.


  IF r4 = 'X'.
    LOOP AT gt_draw INTO wa_draw.
    ENDLOOP.
    IF sy-dbcnt = 0.
      ULINE.
      WRITE: 'Es wurde nichts gefunden! Bitte die Eingabeparameter prüfen.'.
      ULINE.
    ELSE.
      ULINE.
      WRITE:   sy-dbcnt ,
      'Dokumente gefunden'.
      ULINE.
    ENDIF.
  ENDIF.

ENDFORM.                    "lesen_daten
Er hat nur eine andere Reihenfolge als vorher. Durch die Zählung scheinen aber alle Daten an zu kommen.

Was hältst du davon?

Danke LG Bernhard

Re: Coding Fehler

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
hi,
commolus hat geschrieben: Er hat nur eine andere Reihenfolge als vorher. Durch die Zählung scheinen aber alle Daten an zu kommen.
Was hältst du davon?
Was meinst du mit "Zählung"? Und bist du dir sicher, dass das Programm wie gewünscht arbeitet? Ist das der komplette Code, oder hast du etwas gekürzt?

folgende Punkte fallen mir auf:

1) du fragst an diesen Stellen auf loio_id = wa_doc2loio-lo_objid ab:

Code: Alles auswählen.

      SELECT  SINGLE stor_cat
     FROM dms_ph_cd1 INTO  wa_ph_cd1
     WHERE loio_id =  wa_doc2loio-lo_objid.

      SELECT  SINGLE stor_cat
      FROM dms_ph_cd1 INTO  wa_ph_cd1
      WHERE loio_id =  wa_doc2loio-lo_objid.
wa_doc2loio-lo_objid wird aber bei dir nirgendwo im Programm gefüllt, ist demnach leer. Was haben diese SELECT SINGLE für einen Sinn?

2) unser alter Bekannter ist immer noch da - ein SELECT in einem LOOP, ohne einen Bezug zu ihm:

Code: Alles auswählen.

        LOOP AT gt_draw INTO wa_draw.

          SELECT  dokar doknr dokvr doktl file_idx filename
                 FROM dms_doc_files INTO wa_doc_files
                 WHERE dokar IN so_dokar.
was hat das für einen Sinn und wieso steht der SELECT in dem LOOP?

3) ich würde sy-dbcnt anders verwenden:

Code: Alles auswählen.

      IF r4 = 'X'.
        LOOP AT gt_draw INTO wa_draw.
        ENDLOOP.

        IF sy-dbcnt = 0.
es zeigt dir ja die Anzahl der vom letzten SELECT gelesenen Datensätze an. Ich schäze du möchtest damit auf die Anzahl der in gt_draw vorhandenen Einträge zugreifen. Leider führst du danach noch zwei SELECT SINGLE aus, der sy-dbcnt ist also zum Programmende der von dem letzten SELECT SINGLE und in meinem Fall = 0, siehe meine Meckerei, Punkt 1.
Für dein Ziel könntest du zum Beispiel eine Variable anlegen, den sy-dbcnt gleich nach dem passenden SELECT dort abspeichern und den Inhalt der Variablen nach Bedarf ausgeben
schöne Grüße
Alexander

ECC 6.0 EHP 7

Seite 1 von 1

Vergleichbare Themen

0
Antw.
2976
Views
2
Antw.
1248
Views
Coding im Query
von chris61 » 12.09.2017 13:35 • Verfasst in ABAP® für Anfänger
12
Antw.
7843
Views
Coding verstecken
von migrationshansel » 11.03.2007 14:34 • Verfasst in ABAP® Core
4
Antw.
2545
Views
Coding umbauen
von Gast » 02.02.2006 13:44 • Verfasst in ABAP® für Anfänger
5
Antw.
2852
Views
Frage zu Coding
von Mark33 » 15.03.2012 10:40 • Verfasst in ABAP® für Anfänger

Aktuelle Forenbeiträge

Absprung VA02 Position
vor 16 Minuten von gs3rr4 3 / 17
OPD Druck im SPOOL
vor einer Stunde von Manfred K. 1 / 9
Hilfe zum FB MATERIAL_MAINTAIN_DARK
Gestern von black_adept gelöst 8 / 1796
HR-Entgeltnachweis
vor 2 Tagen von ChrisB 4 / 2334

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

Absprung VA02 Position
vor 16 Minuten von gs3rr4 3 / 17
OPD Druck im SPOOL
vor einer Stunde von Manfred K. 1 / 9
Hilfe zum FB MATERIAL_MAINTAIN_DARK
Gestern von black_adept gelöst 8 / 1796
HR-Entgeltnachweis
vor 2 Tagen von ChrisB 4 / 2334

Unbeantwortete Forenbeiträge

OPD Druck im SPOOL
vor einer Stunde von Manfred K. 1 / 9
Export von Spools in XLSX
vor 5 Tagen von abapamateur 1 / 376
Feldberechnung ME32K
vor einer Woche von ZF_SAPler 1 / 982
MS-Word als Editor
letzen Monat von tekko 1 / 4485