[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    ... das geht wohl nur als dynamic sql, sprich dein resultierendes SQL Statement zusammenbasteln und mit execute gegen die Datenbank fahren.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Soweit ich weiß, sind in GroupBy keine Hostvariablen möglich.

    Wie Dieter schon sagt, den SQL per Statement zusammenbauen und per Prepare vorbereiten.
    Der Cursor muss auf "declare cursor for Statement-Name" umgestellt werden, der Fetch kann trotzdem unverändert bleiben.
    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
    May 2005
    Beiträge
    103
    Vielen Dank euch beiden für die Hilfe.

    Muss euch jedoch sagen, dass es doch funktioniert.
    Mein Fehler lag einzig in einer vertauschten Feldangabe, die der Dateibeschreibung zuwider lief. Konnte mir natürlich niemand im Forum beantworten, da ich das Satzbett nicht veröffentlicht hatte.

    Trotzdem vielen Dank.

    Bin jedoch mit dem bisher Erreichten noch nicht ganz zufrieden.
    Da das Resultat dieser Abfrage dem Anwender direkt in Excel dargestellt wird, würde ich gerne noch eine Sortierung in meiner Insert-Anweisung ergänzen.

    Diese muss - natürlich - auch wieder in Abhängigkeit der gewünschten Kumulationskriterien erfolgen.

    Folgende Order by-Anweisungen bringen mir jedoch bei der Kompilierung pro Zeile einen Fehler ein:

    PHP-Code:
     
    ..
     
    Order By
    case when :IndKumLd '1' then b.acoi end,
    case 
    when :IndKumVt '1' then vsvtr end,
    case 
    when :IndKumVb '1' or :IndKumKd '1' then vsvbnr end,
    case 
    when :IndKumKd '1' then vskdnr end,
    case 
    when :IndKumWG '1' then vsmrze end,
    case 
    when :IndKumPG '1' then vsprgr end,
    case 
    when :IndKumPr '1' then vspgrg end,
    case 
    when :IndKumTn '1' then vstnr end
    Im Fehlerprotokoll heißt es dann:

    SQL0122 - Position 59 ACOI oder Ausdruck in Select-Liste nicht gültig. Wertigkeit: 30
    usw.

    Ein "Pseudo"-else
    PHP-Code:
    case when :IndKumLd '1' then b.acoi else ' ' end
    habe ich übrigens auch schon versucht, jedoch ohne Erfolg.
    Hört spätestens im Order by die Verwendungmöglichkeit von Hostvariablen auf?

  4. #4
    Registriert seit
    Jan 2007
    Beiträge
    189
    Versuch es so:
    Code:
    case when :IndKumLd = '1' then b.acoi else NULL end,
    Dann wird diese Spalte ignoriert. (ist das was Du wolltest?)
    mfg

    Kit
    www.ecofitonline.com
    DeskfIT - ChangefIT - XrefIT

  5. #5
    Registriert seit
    May 2005
    Beiträge
    103
    Danke für den Tipp, aber NULL anstelle von ' ' hat leider auch nichts geändert.
    Habs eben probiert.

    Zitat Zitat von kitvb1 Beitrag anzeigen
    Versuch es so:
    Code:
    case when :IndKumLd = '1' then b.acoi else NULL end,
    Dann wird diese Spalte ignoriert. (ist das was Du wolltest?)

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Möglicherweise.
    Allerdings gibst du im OrderBy den Ergebnisnamen und keinen Ausdruck an.

    In deinem "Select case " musst du jedem Ausdruck einen Namen verpassen " case ... end as name", den du dann im OrderBy angibst, ein Ausdruck ist nicht erlaubt.

    Du siehst, eine "bedingte" Sortierung ist leider nicht möglich.
    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
    May 2005
    Beiträge
    103
    Hallo Fuerchau,

    danke für deine Erklärung.
    ABER...
    jetzt denke ich umso mehr, dass es doch gehen müsste.

    Habe nun die entsprechenden Felder, nach denen ich anschließend sortieren lassen könnte mit Namen versehen:

    PHP-Code:
    Exec SQL
    Insert into VOGIO
    /WUVT0547
    Select
    case when :IndKumVb '1' or :IndKumKd '1' then vsman else 0 end,
    case 
    when :IndKumVb '1' or :IndKumKd '1' then vsvbnr else 0 end
    Verband
    ,
    case 
    when :IndKumVb '1' or :IndKumKd '1' then a.ana1 else ' ' end,
    case 
    when :IndKumVb '1' or :IndKumKd '1' then a.ana2 else ' ' end,
    case 
    when :IndKumVb '1' or :IndKumKd '1' then a.acoi else ' ' end,
    case 
    when :IndKumVb '1' or :IndKumKd '1' then a.apla else ' ' end,
    case 
    when :IndKumVb '1' or :IndKumKd '1' then a.aort else ' ' end,
    case 
    when :IndKumVb '1' or :IndKumKd '1' then a.astr else ' ' end,
    case 
    when :IndKumKd '1' then vskdnr else 0 end Kunde,
    case 
    when :IndKumKd '1' then kdslst else 0 end,
    case 
    when :IndKumKd '1' then b.ana1 else ' ' end,
    case 
    when :IndKumKd '1' then b.ana2 else ' ' end,
    case 
    when :IndKumKd '1' or :IndKumLd '1' then b.acoi else ' ' end
    KdLand
    ,
    case 
    when :IndKumKd '1' then b.apla else ' ' end,
    case 
    when :IndKumKd '1' then b.aort else ' ' end,
    case 
    when :IndKumKd '1' then b.astr else ' ' end,
    case 
    when :IndKumKd '1' then vskdgr else ' ' end,
    case 
    when :IndKumKd '1' then c.tabbez else ' ' end,
    case 
    when :IndKumKd '1' then kdslbr else ' ' end,
    case 
    when :IndKumKd '1' then d.tabbez else ' ' end,
    case 
    when :IndKumKd '1' then kdslpt else ' ' end,
    case 
    when :IndKumKd '1' or :IndKumVt '1' then vsvtr else 0 end
    Vertreter
    ,
    case 
    when :IndKumKd '1' or :IndKumVt '1' then e.tabbez else ' '
    end,
    case 
    when :IndKumKd '1' then kdsbdw else ' ' end,
    case 
    when :IndKumKd '1' then kdfu1 else 0 end,
    // Teilenr, Bez, Status, Eigen-/Fremdfertigung, Prod.EAN, Karton.EAN, Zolltarif-Nr.
    case when :IndKumTn '1' then vstnr else ' ' end Teilenr
    ... 
    Wenn ich nun mein Order By-Statement folgendermaßen aufbaue:
    PHP-Code:
    Order By
    KdLand
    VertreterVerbandKunde
    funktioniert alles bestens, d. h. er sortiert in Reihenfolge der fix angegebenen Namen.

    Baue ich aber mein Order By-Statement mit Case-Anweisungen auf:
    PHP-Code:
    Order By
    case when :IndKumLd '1' then KdLand end,
    case 
    when :IndKumVt '1' then Vertreter end,
    case 
    when :IndKumVb '1' or :IndKumKd '1' then Verband end,
    case 
    when :IndKumKd '1' then Kunde end,
    case 
    when :IndKumWG '1' then Warengr end,
    case 
    when :IndKumPG '1' then Produktgr end,
    case 
    when :IndKumPr '1' then Preisgr end,
    case 
    when :IndKumTn '1' then Teilenr end
    dann bringt mir der Compiler wieder die SQL0122-Fehler.
    Setze ich die Namen im Order by in Hochkommas:
    PHP-Code:
    Order By
    case when :IndKumLd '1' then 'KdLand' end,
    case 
    when :IndKumVt '1' then 'Vertreter' end
    wandelt er mir das Programm zwar um, sortiert aber nicht

    WIESO??
    Ich kapiers einfach nicht!

  8. #8
    Registriert seit
    Jan 2007
    Beiträge
    189
    It's too late in the afternoon to translate this into German

    Have you maybe read this article? SQL: Made to Order.

    This is the Article published in the July 2009 edition iSeries Nation Network newsletter. The original article can be found in the Tekkie-Corner (Chapter 3) at http://www.sss-software.de/inn/power...-PowerInfo.pdf
    The above link does not work anymore, but you can still access it here SQL: Made to Order. (with some extra info as well**).

    IMO, using too many "case when" statements makes the statement hard to maintain for the next developer (as you have found). In your example I would definitely use traditional dynamic SQL (at the cost of a slight performance hit) and build the statement into a string.

    **For example, you can put your sort sequences into a file and simply fetch the sequence needed. This means should you have a new sequence option, you add it to the file and don't need to even change the program anymore.

    Hope this helps.
    mfg

    Kit
    www.ecofitonline.com
    DeskfIT - ChangefIT - XrefIT

  9. #9
    Registriert seit
    May 2005
    Beiträge
    103
    Thank you for your article.

    I have to admit that it's getting complex, but until today I used different SQL-Statements for each accumulation criterion and therefore only one criteria could be used at the same time.

    Since I wanted to offer our users more possibilities it's necessary to have a dynamic statement.
    IMO, the current statement is not too complex (furthermore I'm the only programmer in our team who is able to code RPGIV and SQL ).

    In the meantime I've helped myself by arranging the "order by" criterias in a common way, which works in 99% of upcoming cases.

    Thanks again and have good remainder of the day.

    -- Tobias

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Für die Sortierung brauchst du Namen und keine Konstanten.
    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

  11. #11
    Registriert seit
    May 2005
    Beiträge
    103
    Ja... hab' mich nun auch damit abgefunden.
    Aber wie oben schon beschrieben, habe ich nun eine passable Lösung für 99% der Fälle. Sollte ein Benutzer die Konstellation für das eine Prozent erwischen, dann muss er sich halt in Excel die Darstellung optimieren

    Dankeschön und einen erholsamen Feierabend.

    -- Tobias

  12. #12
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    ... das ist doch mit dynamic SQL kein Hexenwerk. Du hast bereits eine fixe Tabellenstruktur mit allen potentiellen Feldern in die du eine Variable Struktur mapst, indem du die nicht belegbaren Felder mit Konstanten belegst. Jetzt brauchst du nur noch das SQL Statement für den Insert, das du dir in deinem Programm zusammen baust, inklusive dem order by, ohne das ganze case Gedöns, das macht die Programmlogik - und dieses zusammengebastelte Statement schickst du mit execute gegen die Datenbank und das wars. Warum mit aller Gewalt so kompliziert?

    D*B

    Zitat Zitat von Tobse77 Beitrag anzeigen
    Ja... hab' mich nun auch damit abgefunden.
    Aber wie oben schon beschrieben, habe ich nun eine passable Lösung für 99% der Fälle. Sollte ein Benutzer die Konstellation für das eine Prozent erwischen, dann muss er sich halt in Excel die Darstellung optimieren

    Dankeschön und einen erholsamen Feierabend.

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

Similar Threads

  1. Hilfe! Rollback bei Transaktionen funktioniert nicht
    By remo2010 in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 23-11-06, 13:31
  2. Authorization Problem nach ändern der Primary Group
    By ChrisX in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 11-10-06, 15:31
  3. Group und fetch first xx rows
    By linguin in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 04-08-06, 10:38
  4. overlay funktioniert nicht
    By steven_r in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-05-06, 07:59
  5. SQLRPGLE group by
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 21-12-05, 19:02

Berechtigungen

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