[NEWSboard IBMi Forum]
Seite 2 von 2 Erste 1 2
  1. #13
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Warum der Aufwand?

    Du must das SQL Script für die erste Erstellung (manuell) eintippen, z.B. in STRSQL, in System i Navigator - Eine Prozedur ausführen oder in eine Quellen-Teildatei eintragen.

    Sobald die View (oder Tabelle) einmal erstellt ist kann mit dem Sysem i Navigator - Datenbank die Quelle (IFS-Datei oder Quellen-Teildatei) erzeugt werden. Alternativ kann man auch das API QSQGNDDL verwenden, um den SQL Code zu erzeugen und speichern.

    Ein in einer Teildatei oder IFS-Datei hinterlegter SQL-Code kann mit dem CL-Befehl RUNSQLSTM ausgeführt werden.

    Ändert sich also die View, d.h. es werden neue Merkmale hinzugefügt, wird halt das Skript um die neuen Merkmale erweitert, die View gelöscht (kann ebenfalls in dem SQL Skript hinterlegt werden) und erneut erstellt.

    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

  2. #14
    Registriert seit
    Feb 2003
    Beiträge
    16
    Das Script um die neuen Merkmale erweitern müßte ich dann aber manuell machen, oder?

    Deswegen will ich täglich automatisch den Merkmalsstamm lesen und damit das SQL bei Bedarf erweitern.

  3. #15
    Registriert seit
    Mar 2003
    Beiträge
    80
    Wenn ich richtig gelesen habe, geht es hauptsächlich nur um eine EXCEL-Tabelle.
    Da wäre die billigste Lösung eigentlich eine simple PIVOT-Tabelle

    lg
    alfredo

  4. #16
    Registriert seit
    Mar 2012
    Beiträge
    71
    Zitat Zitat von B.Hauser Beitrag anzeigen
    Angenommen die Datei hat 3 Spalten: Artikel-Nr. ArtNr, Merkmal MRK, Wert Wert.
    Dann könnte die View etwa so aussehen:
    Code:
    Create View MySchema/MyView
    as Select ArtNr, Max(Case When MRK = 'LAENGE' Then Wert Else '' End) as Laenge,
                     Max(Case When MRK = 'BREITE' Then Wert Else '' End) as Breite,                 ...
                        From MySchema/MyTable
        Group By ArtNr;
    Wie Birgitta vorgeschlagen. Was musst du tun um das zu automatisieren?

    Erstelle einen Array mit den vorhandenen Merkmalen (%Scan Merkmal: vorhanden ja = nix tun, nicht vorhanden = in's nächste freie Element einfügen (Blank-Scan).

    Aufgrund des Arrays, SQL-Statements wie oben erstellen. Betrifft jetzt nur die Selects, der Rest bleibt ja immer gleich.

    Automatisiert und ohne Handarbeit

  5. #17
    Registriert seit
    Sep 2005
    Beiträge
    12

    Anderer Vorschlag

    So kann man es auch machen :

    COBOL
    Code:
     identification division.
     program-id. PREPART.
     environment division.
     configuration section.
     special-names.
         decimal-point is comma.
     data division.
     working-storage section.
         EXEC SQL
             include SQLCA
         END-EXEC.
     01  DEFINITIONEN.
    * PREPARE-String
         05  EXECSTRING                    pic x(99).
    * Hier kommen die Felder aus der Datei 1 (Num. Felder GEZONT
    * definieren !)
         05  VARNAME                       pic x(10)
                                            value "LAENGE    ".
         05  WERT                          pic s9(9)
                                            value 1200.
         05  ARTNR                         pic s9(15)
                                            value 4711.
    /
    *****************************************************************
    * Haupsteuerung
    *****************************************************************
     procedure division.
     steuerung.
         perform init.
    * Hier muss eine Schleife 'rein, die die Datei 1 abarbeitet und
    * bei Gruppenwechsel der Artikelnummer einen Satz mit der neuen
    * Artikelnummer (ohne die anderen Feldwerte) in die Datei 2
    * schreibt und ggf. den Update für alle Felder der Datei2 durch-
    * führt.
    * Zusammenbasteln des PREPARE-Strings für alle Felder der Datei 2
         string "update ARTIKEL set " delimited by size,
                VARNAME               delimited by size,
                " = "                 delimited by size,
                WERT                  delimited by size,
                " where ARTNR = "     delimited by size,
                ARTNR                 delimited by size,
             into EXECSTRING
         end-string.
         EXEC SQL
             prepare SETFLD from :EXECSTRING
         END-EXEC.
         EXEC SQL
             execute SETFLD
         END-EXEC.
         goback.
     init.
         initialize SQLCODE,
                    SQLSTATE.
    DDS
    Code:
    A                                      UNIQUE
    A          R ARTIKELREC
    A*
    A            ARTNR         15P 0
    A            LAENGE         9P 0
    A            BREITE         7P 0
    A            HOEHE          5P 0
    A*
    A          K ARTNR
    Hth

    Bernd
    Last edited by bwachs; 24-07-12 at 11:46. Grund: tippfehler

  6. #18
    Registriert seit
    Feb 2003
    Beiträge
    16

    Lösung

    Cobol kann ich leider nicht.

    Ich habe den Vorschlag von Birgitta umgesetzt:

    Code:
                 PGM                                                                                    
    /*         SQL-Statement für View löschen                                                         */
                 CLRPFM     FILE(OWAPF558)                                                              
    /*         View löschen                                                                           */
                 DLTF       FILE(CCMPDTAP/OWALF558)                                                     
                 MONMSG     MSGID(CPF2105)                                                              
    /*         SQL-Statement für View schreiben                                                       */
                 CALL       PGM(OWAPG558)                                                               
    /*         View erstellen                                                                         */
                 OVRPRTF    FILE(QSYSPRT) OUTQ(LOESCH) SPLFOWN(*JOBGRPPRF)                              
                 RUNSQLSTM  SRCFILE(OWAPF558) SRCMBR(OWAPF558) +                                        
                              COMMIT(*NONE)                                                             
                 ENDPGM
    Mit RPG lese ich den Merkmalsstamm und baue folgende SQL-Source zusammen:

    Code:
    CREATE VIEW CCMPDTAP/OWALF558 AS SELECT                            
    SUBSTR(OJKYHJ, 18, 8) AS ARTNR,                                    
    MAX(CASE WHEN FCKYHJ = 'LAENGE' THEN FSN1HJ ELSE 0  END) AS LAENGE,
    MAX(CASE WHEN FCKYHJ = 'BREITE' THEN FSN1HJ ELSE 0  END) AS BREITE,
    MAX(CASE WHEN FCKYHJ = 'DICKE ' THEN FSN1HJ ELSE 0  END) AS DICKE ,
    MAX(CASE WHEN FCKYHJ = 'BAUSTO' THEN FSA1HJ ELSE '' END) AS BAUSTO,
    ...
    MAX(CASE WHEN FCKYHJ = 'NADELA' THEN FSA1HJ ELSE '' END) AS NADELA
    FROM CASPDTAP/CATPF0HJ
    GROUP BY OJKYHJ;
    Das funktioniert so wie es soll!
    Danke

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
  •