[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Oct 2008
    Beiträge
    56

    IF in COBOL funktioniert nicht immer

    Liebe Experten

    In einer Datei gibt es ein 10-stelliges alphanumerisches Feld mit dem Namen PAGUMB, das derzeit in allen ca. 23000 Datensätzen den Wert *NONE enthält. In einem COBOL-Programm werden alle diese Sätze gelesen und für jeden Satz die folgenden Zeilen ausgeführt:
    IF NOT(PAGUMB = SPACES OR *NONE)
    PERFORM CALL-DOKUMB THRU CALL-DOKUMB-EXIT
    END-IF.
    CALL-DOKUMB dürfte also in dem Fall nie aufgerufen werden. Das geht auch genau 20044 Mal gut, aber beim 20045. Datensatz wird CALL-DOKUMB aus unerklärlichen Gründen doch aufgerufen!
    Das Feld PAGUMB enthält 100%ig wie bei allen anderen Datensätzen auch beim 20045. Mal *NONE und 5 Blanks, also hexadezimal '5CD5D6D5C540404040'. (zumindest wird es im Debugger so angezeigt und auch eine entsprechende Abfrage in SQL bestätigt das)
    Auch eine Umformulierung der Abfrage in
    IF PAGUMB NOT = SPACES AND PAGUMB NOT = "*NONE"
    oder eine nochmalige gleichartige Abfrage im Paragraf CALL-DOKUMB ergeben kein anderes Ergebnis.

    Wie kann das möglich sein?

    Vielen Dank im Voraus

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Ich würde da erst mal per STRDBG den Feldinhalt tatsächlich kontrollieren (Hex).
    Also noch mal GENAU prüfen.
    Ich glaube nicht an einen Rechenfehler der CPU.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    what about NULL?
    D*B

    Zitat Zitat von Daechsle Beitrag anzeigen
    Liebe Experten

    In einer Datei gibt es ein 10-stelliges alphanumerisches Feld mit dem Namen PAGUMB, das derzeit in allen ca. 23000 Datensätzen den Wert *NONE enthält. In einem COBOL-Programm werden alle diese Sätze gelesen und für jeden Satz die folgenden Zeilen ausgeführt:
    IF NOT(PAGUMB = SPACES OR *NONE)
    PERFORM CALL-DOKUMB THRU CALL-DOKUMB-EXIT
    END-IF.
    CALL-DOKUMB dürfte also in dem Fall nie aufgerufen werden. Das geht auch genau 20044 Mal gut, aber beim 20045. Datensatz wird CALL-DOKUMB aus unerklärlichen Gründen doch aufgerufen!
    Das Feld PAGUMB enthält 100%ig wie bei allen anderen Datensätzen auch beim 20045. Mal *NONE und 5 Blanks, also hexadezimal '5CD5D6D5C540404040'. (zumindest wird es im Debugger so angezeigt und auch eine entsprechende Abfrage in SQL bestätigt das)
    Auch eine Umformulierung der Abfrage in
    IF PAGUMB NOT = SPACES AND PAGUMB NOT = "*NONE"
    oder eine nochmalige gleichartige Abfrage im Paragraf CALL-DOKUMB ergeben kein anderes Ergebnis.

    Wie kann das möglich sein?

    Vielen Dank im Voraus
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #4
    Registriert seit
    Jun 2004
    Beiträge
    17
    Hallo Daechsle,

    wegen der Besonderheiten von COBOL (z.B. Ein-/Ausgabepuffer) kann das Phänomen auch an einer ganz anderen Stelle ausgelöst werden.
    Die IF-Anweisung sieht korrekt aus, also muss man sich das gesamte Programm anschauen.

    Bogomil

  5. #5
    Registriert seit
    Jul 2005
    Beiträge
    232
    Zitat Zitat von Bogomil Beitrag anzeigen
    Hallo Daechsle,

    wegen der Besonderheiten von COBOL (z.B. Ein-/Ausgabepuffer) kann das Phänomen auch an einer ganz anderen Stelle ausgelöst werden.
    Die IF-Anweisung sieht korrekt aus, also muss man sich das gesamte Programm anschauen.

    Bogomil
    Wenn es genau beim letzten Datensatz passiert, scheint es ja eine andere Bedingung im Programm zu geben, welche das Problem auslöst. Heisser Tip: Vielleicht steht irgendwo ein GOTO zu einer Stelle in einer anderen Section, oder aber die Sprungmarke gibt es 2x. Das bringt ein COBOL Programm ins Schleudern, so das es IF-Abfragen oder sogar Section-Grenzen überrennt !

    Karsten
    __________________________________
    -An eye for an eye leaves the whole world blind- -Mahatma Ghandi-

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Sprungmarke 2x ?
    => Wird vom Compiler bereits abgelehnt
    IF-Abfragen überrennen ?
    => nur bei Dezimalfehlern, die ignoriert werden, hier wird aber ein Zeichenvergleich gemacht

    Der einzige Grund kann sein, dass ein
    READ ... AT END
    oder
    READ ... INVALID KEY
    nicht korrekt mit GOTO oder Status-Feld abgefangen wird und somit der IF auf den vorherigen Inhalt vergleicht.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Nov 2003
    Beiträge
    2.403
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Sprungmarke 2x ?
    => Wird vom Compiler bereits abgelehnt
    Unter V5R4 leider noch nicht.

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    OK, du hast ja Recht (war ich von anderen Compilern eigentlich gewohnt).

    Allerdings:
    Der Compiler nimmt als Ziel
    a) das erste Vorkommen innerhalb der Section
    b) das erste Vorkommen in der Quelle

    Das führt sicherlich zu Verwirrungen in der Ausführung, wenn man mal schnell einen Paragraph kopiert hat.

    Aber nichts ist so schlimm wie:

    MYLABEL.
    GO TO.
    :
    MYLABELX.
    :
    MYLABELY.
    :
    MYLABELZ.
    :
    ALTER MYLABEL TO PROCEED TO MYLABELX.
    :
    :
    ALTER MYLABEL TO PROCEED TO MYLABELY.
    :
    :
    ALTER MYLABEL TO PROCEED TO MYLABELZ.
    :
    :
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    dafür gabs früher schon die Referenzhandbücher, zum erschlagen der Programmierer, die sowas machen, (Stichwort: Das Buch als Waffe)

    D*B

    Zitat Zitat von Fuerchau Beitrag anzeigen
    OK, du hast ja Recht (war ich von anderen Compilern eigentlich gewohnt).

    Allerdings:
    Der Compiler nimmt als Ziel
    a) das erste Vorkommen innerhalb der Section
    b) das erste Vorkommen in der Quelle

    Das führt sicherlich zu Verwirrungen in der Ausführung, wenn man mal schnell einen Paragraph kopiert hat.

    Aber nichts ist so schlimm wie:

    MYLABEL.
    GO TO.
    :
    MYLABELX.
    :
    MYLABELY.
    :
    MYLABELZ.
    :
    ALTER MYLABEL TO PROCEED TO MYLABELX.
    :
    :
    ALTER MYLABEL TO PROCEED TO MYLABELY.
    :
    :
    ALTER MYLABEL TO PROCEED TO MYLABELZ.
    :
    :
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  10. #10
    Registriert seit
    Jul 2005
    Beiträge
    232
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Sprungmarke 2x ?
    => Wird vom Compiler bereits abgelehnt
    IF-Abfragen überrennen ?
    => nur bei Dezimalfehlern, die ignoriert werden, hier wird aber ein Zeichenvergleich gemacht

    Der einzige Grund kann sein, dass ein
    READ ... AT END
    oder
    READ ... INVALID KEY
    nicht korrekt mit GOTO oder Status-Feld abgefangen wird und somit der IF auf den vorherigen Inhalt vergleicht.
    Ungter V5R3 leider noch keine Ablehnung. Aber fatal ist folgendes:

    AAA SECTION.

    GOTO MARKEXXX.
    EXIT.

    BBB SECTION.
    MARKEXXX.
    EXIT.

    Führt auch dazu, das das Programm macht was es will. Wenn ich dann einen Trace der ausgeführen Anweisungen anschaue, läuft das Programm zum Anfang und dann (meist) 1x komplett bis zum Ende durch, ohne sich an Sectiongrenzen oder IF's zu stören. Hatte ich schon ein paar mal in diversen Programmen.

    Fazit: Wodurch unterscheiden sich gute von schlechten Programmierern ? Die guten denken daran, nach dem Kopieren alle betroffenen Stellen zu ändern!

    -K.-
    __________________________________
    -An eye for an eye leaves the whole world blind- -Mahatma Ghandi-

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Section-Grenzen stimme ich zu, "IF" stimme ich nicht zu.

    Wenn man sich mal die Mühe gemacht hat, den MI-Code zu studieren, sieht man folgendes:

    Ein Perform setzt für eine Section bzw. einen Paragraph eine Rücksprungadresse.

    Wird nun an Stelle des Perform ein GO TO verwendet, erfolgt der Rücksprung mit der zuletzt gemerkten Adresse.
    War diese mangels Perform nicht initialisiert, läuft das Programm da weiter.

    Das ist auch der Grund, warum ein rekursiver Perform nicht funktioniert, da Rücksprünge nicht über einen Stack laufen.

    RPG/LE kennt das i.Ü. genauso.
    Ich kann zwar nicht per GOTO in eine BEGSR-Routine springen, das lehnt der Compiler ab.
    Was der aber nicht verhindert ist eine Rekursion von EXSR-Aufrufen, was mir schon mal passiert ist.

    Auch hier sieht man in der MI-Auflösung, dass die EXSR-Anweisung nur die Rücksprungadresse (per GOTO) des ENDSR setzt.

    EXSR UPA

    UPA BEGSR
    EXSR UPB
    EXSR UPC
    ENDSR

    UPB BEGSR
    : tuwas
    ENDSR

    UPC BEGSR
    EXSR UPA <= Dieser überschreibt den Rücksprung von ganz oben
    ENDSR
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  12. #12
    Registriert seit
    Jul 2005
    Beiträge
    232
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Section-Grenzen stimme ich zu, "IF" stimme ich nicht zu.

    .....

    Stimmt, dabei hätte ich geschworen, das ich den Fall vor langer Zeit mal gehabt habe. Hab versucht den Fehler zu provozieren - leider (oder zum Glück) vergeblich !

    K.
    __________________________________
    -An eye for an eye leaves the whole world blind- -Mahatma Ghandi-

Similar Threads

  1. Dekleration Cobol <-> RPG
    By Xanas in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 12-01-07, 07:32
  2. Programmbibliothek in einem Cobol oder CL Programm ermitteln
    By schatte in forum NEWSboard Programmierung
    Antworten: 19
    Letzter Beitrag: 10-01-07, 11:32
  3. Cobol <> RPGLE
    By Xanas in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 13-12-06, 13:38
  4. Hilfe! Rollback bei Transaktionen funktioniert nicht
    By remo2010 in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 23-11-06, 13:31
  5. Cobol
    By Uli Müller in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 09-11-06, 09:21

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •