[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jun 2004
    Beiträge
    26

    Question relative Satznummer in RPG3 abrufbar?

    Hallo,

    wie kann ich die relative Satznummer eines Satzes einer physischen Datei erhalten, den ich in RPG3 gerade im Zugriff habe? Ich habe es schon über die INFDS versucht, aber dort gibt er mir in einer Datei mit 5 Sätzen immer nur 5 an. Hat das was mit der RPG-Blockung zu tun oder bin ich da eh auf dem Holzpfad?
    Hab jetzt grad keine Literatur an der Hand und im Internet nichts gefunden, daher will ich Euch mal wieder anstrengen...

    In Liebe, Euer Dufti

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Hallo,

    die relative Satz-Nr. steht in der Datei-Status-Datenstruktur auf Stelle 397-400 im Binär-Format.
    Beim Einlesen wird die relative Satz-Nr. in dieses Feld ausgegeben.

    Hier ein Beispiel:
    Code:
    FMYFILEL5IF  E           K        DISK         KINFSR *PSSR      
    F                                              KINFDS INFMF5
    FMYFILEP UF  E                    DISK         KINFSR *PSSR A 
    F                                              KCOMIT         
    IINFMF5      DS                                       
    I                                    B 397 4000RRNMF5 
    C                     READ MYFILEF5                 92  
    C           RRNMF5    CHAINMYFILEF              9694  
    C           *IN96     IFEQ *OFF
    C                     UPDATMYFILEF
    C                     ENDIF
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    Jun 2004
    Beiträge
    26

    Thumbs up

    Hallo Birgitta,
    vielen Dank für die schnelle Antwort. So in etwa hatte ich mir das auch gedacht. Es klappte aber einfach nicht. Gibt es da noch irgendwelche Restriktionen? Bei folgendem Beispiel kommt immer 5 raus:
    Datei TESTPU, extern beschrieben, ungeschlüsselt, ein Feld, 5 Sätze stehen drin.

    Code:
    FTESTPU  IF  E					DISK					  
    F											  KINFDS INFMF5
    IINFMF5	  DS											 
    I									B 397 4000RRNMF5	   
    C					 DO   *HIVAL						   
    C					 READ TESTPU				   99	  
    C   99				LEAVE								 
    C		   RRNMF5	DSPLY								 
    C					 ENDDO								 
    C					 MOVEL*ON	   *INLR
    Es kommt auch immer 5 raus, nachdem ich den ersten Satz gelöscht habe. Auch IP-Verarbeitung bringt immer 5.
    Deswegen dachte ich, ob das was mit der Blockung zu tun hat. Wie kann man diese ausschalten?

    Warte mal... [Minuten später] ...aha:
    Wenn ich eine Update-Datei draus mache, funkioniert es einwandtfrei.
    Alles klar! Danke! Bist ein Schatz!

    Dufti

    PS. Thread darf meinetwegen geschlossen werden.

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Bei geblockter Verarbeitung steht halt immer die letzte Satz-Nr. des Blockes in der INFDS, wobei noch nicht mal gesagt ist, dass die Satz-Nr'n in aufsteigender Folge sind.
    Wenn die Datei z.B. über Schlüssel ( K-Spezifikation ) verarbeitet wird ist die RRN in beliebiger Folge möglich.

    Verhindere die Blockung über eine CHAIN-Anweisung in der Quelle, die aber nie ausgeführt wird.
    Dein Programm kann zwar (je nach Satzlänge, Anzahl Sätze/Block) bis zu 100 mal langsamer werden, aber was solls. Wenn ich unbedingt die unzuverlässige Information RRN benötige, kann man das ja in Kauf nehmen.

    Was willst du überhaupt mit der RRN ?
    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

  5. #5
    Registriert seit
    Jun 2004
    Beiträge
    26
    Zitat Zitat von Fuerchau
    Was willst du überhaupt mit der RRN ?
    Wieder Stichwort Edifact. Zu verarbeiten ist eine (zuvor konvertierte) sequentielle Datei fester Satzlänge, mit unterschiedlichen Satzarten, über die aber zunächst einmal kein Schlüsel aufgebaut werden kann.
    Sprich: (1 Kopfsatz, dann viele viele Positionssätze)=1 "Auftrag", (1 Kopfsatz, dann viele viele Positionssätze) =noch 1 "Auftrag", etc.
    oder so:
    100... Kopf Auftrag 1
    200... Position Auftrag 1
    200... Position Auftrag 1
    [...]
    100... Kopf Auftrag 2
    200... Position Auftrag 2
    [...]
    Fehlerhafte Aufträge sollen im Kopf markiert werden. Deswegen merke ich mir die RRN des Kopfsatzes, und die des folgenden Kopfsatzes, um kurz mal wieder nach oben zu springen, zu markieren, und anschliessend wieder nach unten zu hüpfen, um weiter zu prüfen. Da ich die Datei zuvor sperre, kann mir auch niemand dazwischenfunken.
    Ich hätte das ganze ja auch über eine geschlüsselte Zwischendatei lösen können, aber da war irgendwie keine Zeit für. Oder die Lust fehlte, oder wie auch immer.
    Hätte ich vorher keinen Test mit Input-Datei gemacht, hätte es wohl auf Anhieb geklappt, da es ja eine Update-Datei ist und ich einen Chain gemacht hätte. Aber Dufti muss ja immer vorher probieren, bevor er studiert.

    Dufti

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Hallo Dufti,

    wenn Du Deinen Kopf-Satz erst beim Gruppen-Wechsel, also erst dann wenn der nächste Kopf-Satz kommt, schreiben würdest, könntest Du Dir das Ganze Hin- und Hergehüpfe und nochmalige Lesen und Updaten sparen.

    Ich weiß nicht wie Du das Ganze handelst, aber wir benutzen für jede Satz-Art eine eigene Datenstruktur (vorzugsweise extern beschrieben).
    Wird ein Satz eingelesen, wird zunächst die Satz-Art geprüft und dann die entsprechende(n) Datenstruktur(en) gefüllt.
    Deine Positions-Sätze schreibst Du sofort bzw. wenn die nächsten Positions-Informationen eingelesen werden, den Kopf-Satz erst, wenn Du feststellst, dass die nächste Kopf-Satzart kommt. Die Kopf-Informationen sind ja in der Datenstruktur gespeichert.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  7. #7
    Registriert seit
    Jun 2004
    Beiträge
    26
    Hallo Birgitta,

    ich will ja zunächst erstmal nichts schreiben, sondern ich erhalte die Datei. Im ersten Durchgang lese ich sie nur, um fehlerhafte Aufträge von regulären zu trennen. Dazu verwende ich auch Datenstrukturen für jede Satzart. Und Protokoll kommt raus etc.
    Dann entscheidet der Anwender, ob die Datei übernommen werden soll, oder ob er sie zuvor maniupliert und nochmal prüft.
    Bei der Übernahme an sich überlese ich dann einfach die als fehlerhaft markierten Aufträge.

    Aber Du hast sicher Recht, wenn Du sagst, dass dies nicht die optimale Lösung ist. Leider gibt es bei solchen Sachen ja immer unzählige Möglichkeiten. Ich habe jetzt die ausgewählt, die am schnellsten für mich umzusetzen war. Weil muss heute echtstarten das ganze ;/

    Dufti

Similar Threads

  1. SQL: DISTINCT und RRN?
    By Akku in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 10-05-06, 08:07
  2. Datei über relative Satznummern verarbeiten
    By muadeep in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 05-08-04, 09:18
  3. Ermitteln der Satznummer in Subfile
    By peter.kinne in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 24-03-04, 07:18
  4. SQL udn relative satznummer
    By karin-vogelmann in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 10-12-03, 13:13

Berechtigungen

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