[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Oct 2002
    Beiträge
    46

    Question KLIST "füllen"

    Hi,

    ich bin ziemlich neu in RPG (komme von Java und C und habe darum einige probs). Jedenfalls soll ich nu ein programm schreiben. Das daten durch ne logische liest und verarbeitet. weil nur ein "paar" daten gebraucht werden soll ich ne Klist machen. so weit so gut nur ist das ganze urst langsam. mein ausbilder meinte dann "du must erst die klist einlesen" doch alles was ich mit klist kenne is "reade".
    Hier ist ein teil meines programmcodes (bitte nicht schimpfen... ich progge erst seit ein paar tagen in RPG)

    Code:
    FfoobarlgI   E           K        DISK                           UC  
    FAYBABTUSO   E                    DISK                               
    C                     OPEN foobarlg                                  
    C           *ENTRY    PLIST                                          
    C                     PARM           VDAT    60                      
    C                     PARM           BDAT    60                      
    C           AYB       KLIST                                          
    C                     KFLD           FIELD1                          
    C                     KFLD           FIELD2                          
    C                     KFLD           FIELD3                          
    C                     KFLD           FIELD4                          
    C                     KFLD           FIELD5                            
    C           AYB       READEfoobarlg                 50               
    C           AYB       CHAINfoobarlg             41     
    C          100       SETLLfoobarlg                    
    C           AYB       SETLLfoobarlg                    
    C           *IN26     DOUEQ*ON                         
    C                     READ foobarlg                 26 
    C           *IN26     IFEQ *ON                         
    C                     LEAVE                            
    C                     ENDIF                        
    C           AAC015    IFGE VDAT                        
    C                     DO                               
    C           AAC015    DOUGTBDAT                        
    C                     EXSR FOO                         
    C                     WRITEAYBABTR                     
    C                     ENDDO                                                  
    C                     ENDDO                                                  
    C                     ENDIF                                                  
    C                     ENDDO                                                  
    C                     MOVE *ON       *INLR                                   
    C                     CLOSE*ALL                                              
    CSR         FOO       BEGSR                                                  
    C* hier werden nur ge-movel-t                               
    C                     ENDSR
    Schonmal im vorraus vielen Dank.

    Peace,

    LoCal

  2. #2
    Registriert seit
    Jan 2001
    Beiträge
    833

    Post

    Hallo Local,

    du musst in deinem Programm erst die Felder der Klist mit werten füllen.
    (also Feld1-feld5) erst füllen
    dann zb READE oder Chain.
    RPG liest dann nur Datensätze mit den Werten
    in den Keyfeldern.

    gruss Michael

  3. #3
    Registriert seit
    Oct 2002
    Beiträge
    46

    Post

    Zitat:
    Original erstellt von mk:
    Hallo Local,

    du musst in deinem Programm erst die Felder der Klist mit werten füllen.
    (also Feld1-feld5) erst füllen
    dann zb READE oder Chain.
    RPG liest dann nur Datensätze mit den Werten
    in den Keyfeldern.
    gruss Michael
    [/quote]

    muß ich dann einmal reade machen oder immer reade also wie beim normalen read?
    und muß ich in klist alle felder angeben die auch in der logischen stehen oder kann ich auch nur einen teil nehmen... field4 & 5 bräuchte ich für meine abfrage nämlcih garnicht. mein ausbilder meinte, daß ich die mit nullen oder blanks füllen soll...

    Peace,

    LoCal

  4. #4
    Registriert seit
    Jul 2002
    Beiträge
    53

    Post

    Wenn du Feld4 und Feld5 nicht brauchst, dann weglassen in der KLIST. Ansonsten Felder Filed zu nennen ist wirklich nicht gerade aussagekräftig.
    Ferner nehme ich mal an, daß die Datei nach Datum sortiert ist, dann mußt Du noch BDAT abfragen.
    Also etwa so:

    FfoobarlgI E K DISK UC
    FAYBABTUSO E DISK
    C OPEN foobarlg
    C *ENTRY PLIST
    C PARM VDAT 60
    C PARM BDAT 60
    C AYB KLIST
    C KFLD FIELD1
    C KFLD FIELD2
    C KFLD FIELD3
    C Move StartWert1 Field1 * z.B. VDAT
    C Move StartWert2 Field2
    C Move StartWert3 Field3
    C AYB Setll foobarlg
    C AYB READEfoobarlg 50
    C N50 *IN26 DOUEQ*ON
    C READ foobarlg 26
    C *IN26 IFEQ *ON
    C AAC015 ORGT BDAT
    C LEAVE
    C ENDIF
    C AAC015 IFGE VDAT
    C DO
    C AAC015 DOUGTBDAT
    C EXSR FOO
    C WRITEAYBABTR
    C ENDDO
    C ENDDO
    C ENDIF
    C ENDDO
    C MOVE *ON *INLR
    C CLOSE*ALL
    CSR FOO
    BEGSR
    C* hier werden nur ge-movel-t
    C ENDSR

    Gruß

    Matthias



    [Dieser Beitrag wurde von Gerlitz am 07. Oktober 2002 editiert.]

  5. #5
    Registriert seit
    Oct 2002
    Beiträge
    46

    Post

    Da wirft sich gleich noch ne frage für mich auf: Reade kann also nicht als "ersatz" für read genommen werden, oder?
    FIELD habe ich nur für dieses Forum genommen...fand ich auf den ersten blick übersichtlicher als die eigentlichen namen

    Danke,

    LoCal

  6. #6
    Registriert seit
    Oct 2002
    Beiträge
    46

    Post

    Noch ne Frage: Woran kann das eigentlich liegen, daß das ganze urst lahm is?? Wenn ich das ganze mit sequel mache is das fast sofort da und wenn ich es so wie oben mache dauert das mal 30 Sekunden bis ne minute...

    Peace,

    LoCal

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.873

    Post

    Hallo LoCal,

    Beim READ werden ALLE Daten-Sätze der Reihe nach (also entsprechend der Schlüsselung) abgearbeitet.

    Es ist nicht möglich bei READ eine Schlüssel zu verwenden.

    Nicht benötigte Sätze können nur überlesen werden (z.B. durch eine ITER-Anweisung)

    Werden aus einer Datei mit mehreren 100.000 Sätzen nur eine handvoll benötigt, ist es wenig sinnvoll (Laufzeit-Probleme) die komplette Datei abzuarbeiten.

    Bei geschlüsselten Dateien ist es möglich, über einen einzelnen Schlüssel oder, wenn sich der benötigte Schlüssel aus mehreren Felder zusammensetzt über eine Schlüssel-Liste eine Auswahl von Sätze zu bearbeiten.

    Dazu muss zunächst über einen SETLL-Befehl der Pointer an den Anfang der Auswahl gestellt werden.
    Der Pointer wird auf den 1. Satz der Auswahl oder, wenn keine genaue Übereinstimmung gefunden wurde vor den Satz mit dem nächt höheren Schlüssel positioniert.
    Über die GLEICH-Bezugszahl (sollte in RPGIV vermieden werden) oder die Built-in-Function %Equal, kann geprüft werden ob ein Satz mit der genauen Übereinstimmung gefunden wurde.
    Die Built-In-Function %Found wird auf *On gesetzt, wenn ein Satz mit dem gleichen oder einem höheren Schlüssel vorhanden ist.

    Über READE werden nur die der Auswahl entsprechenden Sätze eingelesen.
    Die GLEICH-Bezugzahl (sollte in RPGIV vermieden werden) oder die Built-in-Function %EOF werden auf *ON gesetzt, wenn der letzte der Auswahl entsprechende Satz verarbeitet wurde.

    Wird CHAIN verwenden, wird der erste Satz mit der genauen Übereinstimmung eingelesen.
    (Also SETLL und READE in einem)
    Mit der HOCH-Bezugszahl (sollte in RPGIV vermieden werden) oder der Built-in-Function %Found, kann geprüft werden, ob ein Satz eingelesen wurde.
    Achtung: Dich HOCH-Bezugszahl geht an, wenn KEIN SATZ gefunden wurde.
    %Found wird auf *ON gesetzt, wenn ein Satz eingelesen wurde.

    Ansonsten würde ich Dir mal die RPG-Referenz ans Herz legen. http://as400bks.rochester.ibm.com/pu.../onlinelib.htm

    Ich habe mir gerade Deine Quelle nochmal angeschaut. Du programmierst ja noch in RPGIII (auch RPG/400 genannt). Wenn es möglich ist, versuche Dir RPGIV (auch ILERPG genannt) anzueignen, da RGPIII nicht mehr weiter entwickelt wird.
    In RPGIV hast Du viel mehr Möglichkeiten und es fällt jemand, der von C++ oder JAVA kommt viel leichter.

    Und noch etwas, versuche nicht soviel IFs und DOs ineinander zuschachteln, lieber eine Subroutine mehr.

    Ich hoffe ich konnte Dir ein bisschend weiterhelfen.

    Birgitta
    Birgitta Hauser

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

  8. #8
    Registriert seit
    Oct 2002
    Beiträge
    46

    Post

    Hallo,

    erstma vielen Dank für die ausfürliche antwort.

    Zitat:
    Original erstellt von B.Hauser:
    Hallo LoCal,

    Beim READ werden ALLE Daten-Sätze der Reihe nach (also entsprechend der Schlüsselung) abgearbeitet.

    Es ist nicht möglich bei READ eine Schlüssel zu verwenden.
    [/quote]

    Also könnte ich statt mit READ auch immer mit READE "weiterlesen"??


    Zitat:

    Nicht benötigte Sätze können nur überlesen werden (z.B. durch eine ITER-Anweisung)

    Werden aus einer Datei mit mehreren 100.000 Sätzen nur eine handvoll benötigt, ist es wenig sinnvoll (Laufzeit-Probleme) die komplette Datei abzuarbeiten.
    [/quote]

    Yo Das "wußte" ich schon, nur das "workaround" kenne ich nicht.

    Zitat:

    Bei geschlüsselten Dateien ist es möglich, über einen einzelnen Schlüssel oder, wenn sich der benötigte Schlüssel aus mehreren Felder zusammensetzt über eine Schlüssel-Liste eine Auswahl von Sätze zu bearbeiten.

    Dazu muss zunächst über einen SETLL-Befehl der Pointer an den Anfang der Auswahl gestellt werden.
    Der Pointer wird auf den 1. Satz der Auswahl oder, wenn keine genaue Übereinstimmung gefunden wurde vor den Satz mit dem nächt höheren Schlüssel positioniert.
    [/quote]

    Das habe ich doch mit
    Code:
    AYB    SETLL FOOBARLG       50
    oder?

    Zitat:


    Ansonsten würde ich Dir mal die RPG-Referenz ans Herz legen. http://as400bks.rochester.ibm.com/pu.../onlinelib.htm
    [/quote]

    schon geschehen

    Zitat:

    Ich habe mir gerade Deine Quelle nochmal angeschaut. Du programmierst ja noch in RPGIII (auch RPG/400 genannt). Wenn es möglich ist, versuche Dir RPGIV (auch ILERPG genannt) anzueignen, da RGPIII nicht mehr weiter entwickelt wird.
    In RPGIV hast Du viel mehr Möglichkeiten und es fällt jemand, der von C++ oder JAVA kommt viel leichter.
    [/quote]

    Würde ich gerne, läuft hier aber leider noch nicht..... und die progger hier können kein RPGIV
    Am liebsten wäre mir Java

    Zitat:

    Und noch etwas, versuche nicht soviel IFs und DOs ineinander zuschachteln, lieber eine Subroutine mehr.
    [/quote]

    Schon passiert.... das habe ich heute morgen als erstes gemacht, weil ich beim durchlesen immer gestolpert bin.

    Zitat:

    Ich hoffe ich konnte Dir ein bisschend weiterhelfen.

    Birgitta
    [/quote]

    Klar

    Danke nochmal.

    Peace,

    LoCal

  9. #9
    Registriert seit
    Oct 2002
    Beiträge
    46

    Post

    Das Datum steht übrigens nicht in Field1 sondern in Field3, macht das "ordnen" aufwendiger...
    das prob ist, daß das alles ewig lang läuft eine minute und länger... habe die zeit gestoppt.

  10. #10
    Registriert seit
    Sep 2002
    Beiträge
    61

    Post

    Also könnte ich statt mit READ auch immer mit READE "weiterlesen"??


    Ich programmiere auch noch nicht lange mit RPGLE. Aber ich glaub das hab ich verstanden.
    Mit READ kannst du eine ganze Datei durchlesen. Du kannst also z. B. alle Datensätze mit einer bestimmten nummer anzeigen lassen oder so:

    READ MYFILE
    IF NUMMER = '45'
    MOVE NUMMER NR$DSPF
    MOVE NAME NR$DSPF
    usw.
    ENDIF

    Mit READE kannst du über einen Schlüssel einen bestimmten oder mehrere bestimme Datensätze suchen.

    Wenn du also über IF-Kriterien suchen willst benutzt du READ (alle datensätze werden eingelesen), wenn du über einen Schlüssel suchst benutzt du READE (nur Datensätze mit übereinstimmung mit dem Schlüssel werden eingelesen.)

    Ich hoffe ich hab hier nicht zu viel Müll erzählt




  11. #11
    Registriert seit
    Sep 2001
    Beiträge
    156

    Post

    Hallo
    Nochmals: READ liest ganz einfach den nächsten Satz in der Datei (gemäss Sortierung sprich Schlüssel).
    Wohingegen READE den nächsten Satz in der Datei liest, dessen Schlüssel dem bei READE angegebenen Schlüssel oder Teilschlüssel (sprich KLIST) entspricht.

    Wegen Performance:
    Das Problem könnte auch bei der logischen Datei liegen. Schau doch mal bei der Dateibeschreibuing, ob eventuell der Parameter MAINT auf *DLY oder *REBLD steht.
    Wenn das der Fall ist, diesen Parameter mittels CHGLF auf *IMMED stellen.

    Gruss
    Rolf

  12. #12
    Registriert seit
    Oct 2002
    Beiträge
    46

    Post

    Zitat:
    Original erstellt von rolf:

    Wegen Performance:
    Das Problem könnte auch bei der logischen Datei liegen. Schau doch mal bei der Dateibeschreibuing, ob eventuell der Parameter MAINT auf *DLY oder *REBLD steht.
    Wenn das der Fall ist, diesen Parameter mittels CHGLF auf *IMMED stellen.
    [/quote]

    Dat steht schon auf *IMMED


Similar Threads

  1. ILE RPG / SQL Füllen einer Feldgruppe
    By homue in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 18-07-07, 16:47
  2. Listenfelder eines Befehls im CL füllen
    By Phuntomias in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 27-06-06, 09:21
  3. DKS Schnittstelle - Datensatz mit "a" füllen
    By programmer in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 22-09-04, 09:20
  4. Variable "zentriert" füllen
    By peter.kinne in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 12-05-04, 08:12

Berechtigungen

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