[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Feb 2003
    Beiträge
    16

    Daten variabel dem richtigen Feld zuordnen

    Folgendes Problem:

    In einer Datei (Datei1) stehen:
    Artikelnummer, Merkmal und Merkmalsausprägung.
    Jede Artikelnummer kommt darin n-mal vor. Je nachdem wieviele Merkmale für diesen Artikel gefüllt sind.

    Aus dieser Datei möchte ich eine Datei machen, in der jeder Artikel nur noch 1x vorkommt und die Merkmalsausprägungen spaltenorientiert gefüllt sind.

    Um das ganze variabel zu halten für künftig neu angelegte Merkmale, hab ich folgendes gemacht.

    - Merkmalsstamm lesen und DDS füllen mit Feldnamen und Länge der Felder.
    - Datei umwandeln (Datei2) (per CL zur Laufzeit)
    - Nun lese ich die Datei1 und möchte anhand des Merkmals dieses Satzes die Merkmalsausprägung in die Spalte moven, die den gleichen Namen hat wie das Merkmal dieses Satzes.

    Bsp.: In Datei1 steht:
    Artikelnummer 00000004 Merkmal LAENGE Ausprägung 1200
    --> 1200 soll in Spalte LAENGE von Datei2 gemovt werden
    Nächster Satz:
    Artikelnummer 00000004 Merkmal BREITE Ausprägung 600
    --> 600 soll in Spalte BREITE von Datei2 gemovt werden
    usw..
    Write in Datei2, wenn sich Artikelnummer in Datei1 ändert.

    Ich dachte, das wär ganz simpel, aber jetzt komme ich nicht darauf, wie man das macht.

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Sowas kannst Du nur mit dynamischem embedded SQL machen.

    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
    Jan 2003
    Beiträge
    759
    Nur SQL? Wenn man nur einen Hammer hat, sieht jedes Problem wie ein Nagel aus...

    1) DS-1, die Lfd. Nummer + Artikelnummer enthält
    2) DS-2 mit Lfd. Nummer + Artikelnummer + Felder aus Datei2, OCCURS auf lfd. Nummer
    2) Leseschleife um Datei1, Lookup in DS: vorhanden=Artikelnummer rein, nicht vorhanden: DS-1 Vorkommen plus 1, Artikelnummer rein
    3) Leseschleife um Datei 2, mit Artikelnummer Vorkommen in DS-1 suchen, mit Occur in DS-2 Feld aktualisieren
    4) 1 DO (max. Vorkommen DS-1), OCCUR, fortschreiben
    5) Monitor oder Commit drum rum

    In der Annahme, dass die Keys passen ;-)

  4. #4
    Registriert seit
    Jan 2003
    Beiträge
    759
    Oder, falls die Anzahl der Sätze zu groß ist: temp. Arbeitsdatei3 - nicht mehr ganz zeitgemäß, aber noch nicht verboten

  5. #5
    Registriert seit
    Feb 2003
    Beiträge
    16
    Das würde m.E. doch nur dann funktionieren, wenn die Merkmale bereits vorher in den richtigen Spalten stehen würden.

    Ich muß aber anhand des Inhaltes des Feldes MERKMAL
    die Merkmalsausprägung in die entsprechende Spalte schreiben.

    Nach dem Motto:
    if MERKMAL = 'LAENGE'
    move Merkmalsausprägung nach LAENGE
    endif
    und das für jedes MERKMAL.

    Aber das ist halt dann nicht mehr dynamisch und muß bei neuen Merkmalen angepaßt werden.

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Zitat Zitat von Fertig Beitrag anzeigen
    Das würde m.E. doch nur dann funktionieren, wenn die Merkmale bereits vorher in den richtigen Spalten stehen würden.

    Ich muß aber anhand des Inhaltes des Feldes MERKMAL
    die Merkmalsausprägung in die entsprechende Spalte schreiben.

    Nach dem Motto:
    if MERKMAL = 'LAENGE'
    move Merkmalsausprägung nach LAENGE
    endif
    und das für jedes MERKMAL.

    Aber das ist halt dann nicht mehr dynamisch und muß bei neuen Merkmalen angepaßt werden.
    Deshalb hatte ich SQL vorgeschlagen.
    Anstatt eine physische Datei zu erstellen würde ich eine SQL View generieren.

    Angenommen die Datei hat 3 Spalten: Artikel-Nr. ArtNr, Merkmal MRK, Wert Wert.
    Dann könnte die View etwa so aussehen:
    C
    Code:
    reate View MySchema/MyView
    as Select ArtNr, Max(Case When MRK = 'A' Then Wert Else '' End) as MrkA,
                     Max(Case When MRK = 'B' Then Wert Else '' End) as MrkB,
                     Max(Case When MRK = 'C' Then Wert Else '' End) as MrkC,
                     ...
                     Max(Case When MRK = 'X' Then Wert Else '' End) as MrkX
        From MySchema/MyTable
        Group By ArtNr;
    Die Daten sind immer aktuell, da eine View eine logische Sicht auf die Daten darstellt. Es wäre sogar möglich die Spalten in unterschiedlichen Datentypen und Längen auszugeben. Sofern neue Merkmale hinzukommen, das SQL-Statement entsprechend anpassen und die View neu erstellen.

    Auf die View kann mit (embedded) SQL und sogar mit Query/400 zugegriffen werden.
    Im Bedarfsfall könnte basierend auf dem gleichen SELECT-Statement natürlich auch eine physische Datei (bzw. SQL Tabelle) erstellt werden.

    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
    Feb 2003
    Beiträge
    16
    Aber damit bräuchte ich auch genausoviele case-Abfragen wie im RPG if-Abfragen. Und ich müßte bei neuen Merkmalen das SQL anfasssen.

    Ich wollte eigentlich sowas:
    Datei1 hat 3 Spalten:
    Artikel, Merkmal, Wert

    Aus den unterschiedlichen Merkmalen erzeuge ich per PGM eine DDS uns wandle die um in eine PF.
    Diese Datei hat die Spalten Artikel, Merkmal1, Merkmal2 etc. soviele Spalten wie es unterschiedliche Merkmale gibt.

    Nun lese ich Datei1 und möchte Datei2 damit füllen, also die Daten sozusagen transponieren.
    Schreibe Wert in das Feld von Datei2, das genauso heißt, wie der Inhalt des Feldes Merkmal in Datei1.
    Sobald sich die Artikelnummer nach n Sätzen ändert, schreibe 1 Satz nach Datei2.

    Das fett gedruckte sollte also idealerweise nur 1 Anweisung sein.

  8. #8
    Registriert seit
    Mar 2012
    Beiträge
    71
    Du erstellst die ja eine DDS mit den entsprechenden Feldern horizontal und compilierst die zur Runtime, richtig?

    Dein Problem ist nun, dass Du wohl die Felder hast, aber nicht weisst welcher Wert (Merkmal) darin stehen sollte...

    Mein Vorschlag:
    1. Headerfile erstellen mit nur einem Datensatz (Array)
    Pro Merkmal 1 Feld (Name egal, aber Benamsen COLHDG nach dem Merkmal)
    und Merkmaltext als DFT-Value
    DDS entsprechend aufbereiten und einen Record schreiben

    2. Artikelfile erstellen mit Artikelnummer und Raster aus Header.

    Verarbeitung:
    Arrays erstellen im Programm und mit einem Scan des Merkmals (Headerfile) die Position ermitteln. Felder entsprechend moven - Write und fertig.

    Ist ein bisschen hölzern und muss halt jeweils aufbereitet werden aber ich würde diesen Ansatz verfolgen. Ist das dynamisch genug?

    Ach ja, die Queries bzw. nachfolgende RPG-PGM's ändern sich halt dann nicht dynamisch. Stichwort: Levelcheck, aber für Export to Excel alleweil gut.

    Just my 5ct

  9. #9
    Registriert seit
    Jun 2001
    Beiträge
    2.044
    Birgittas Lösung ist M.E. einfacher/schöner.
    Daher würde ich anstatt 'automatisch eine DDS zu schreiben'
    lieber "automatisch die SQL-Source" schreiben.

    Die Source dann, nach einem Drop View, mit RUNSQLSTMT ausführen, fertig.

    Aber das sit natürlich Geschmacksache

    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  10. #10
    Registriert seit
    Mar 2012
    Beiträge
    71
    Zitat Zitat von Robi Beitrag anzeigen
    Birgittas Lösung ist M.E. einfacher/schöner.
    Einverstanden.

    BTW. das Headerfile könnte man sich auch sparen und nur mit dem Array arbeiten.

    Aber eben, ist halt ein Schnellschuss... ;-)

  11. #11
    Joe is offline [professional_User]
    Registriert seit
    Mar 2001
    Beiträge
    365
    Hallo.
    Alle Feldnamen aus Datei1 ermitteln und prüfen, ob diese in Datei2 vorkommen. (Über QADBIFLD o. entsprechende View mit Berechtigung) Bei Änderung 1. ein Rpg erstellen, das aufgrund der gefundenen Felder einen Create-Table macht und 2. ein RPG-Programm das genauso dynamisch zur Laufzeit ein Programm erstellt mit den entspr.CASE-Anweisungen, dieses komnpiliert und ausführt.
    Aber: ist der Aufwand gerechtfertigt, und was machen andere Programme, die auf Datei2 zugreifen. Diese müssten doch alle zum Zeitpunkt der Dateiänderung kompiliert werden. Oder ist das eine reine SQL Umgebung?

    Gruß Joe

  12. #12
    Registriert seit
    Feb 2003
    Beiträge
    16
    Das ist schon richtig.

    Aber hauptsächlich ist das für Übertragung nach Excel oder interaktives Query gedacht.

    Man bräuchte halt nicht immer hinterherprogrammieren, wenn neue Merkmale für Artikel angelegt werden.

    Ich werde mal versuchen automatisch die SQL-Source zu schreiben.

Similar Threads

  1. Antworten: 6
    Letzter Beitrag: 26-07-06, 12:22
  2. sql num. Feld formatieren
    By rr2001 in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 11-07-06, 14:10
  3. Prüfung, ob Eingabe in Feld
    By M Scheid in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 12-06-06, 13:02
  4. 2 Dimensionales Feld
    By Sulla in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 17-05-06, 16:06
  5. ILE Feld in Feld ansprechen
    By jogisarge in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 10-05-06, 16:26

Berechtigungen

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