[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    Mar 2002
    Beiträge
    5.376
    ... between ist auch noch eine Option

    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
    Jan 2012
    Beiträge
    1.215
    Dietlinde, dann ist wahrscheinlich Birgittas Vorschlag mit dem dynamischen "Values-Statement" die eleganteste Lösung. Ich wusste nicht, dass das geht und habe das bisher mit einem Cursor gelöst.

    Die Lösung mit statischem SQL scheidet ja aus, wie du selbst geschrieben hast:

    "leider ist das so nicht machbar!
    Alle Werte können alle Inhalte haben, wenn sie nicht selektiert sind."

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.716
    Statisch kannst du das ebenso machen, denn immerhin gibts ja noch NULL-Anzeiger:

    Code:
    where (   feld1 = :wert1 :Null1) 
           or feld2 = :wert2 :Null2)
           or feld3 = :wert3 :Null3)
           or feld4 = :wert4 :Null4)
           or feld5 = :wert5 :Null5)
           or feld6 = :wert6 :Null6)
    Null-Anzeiger sind vom Typ int(5) und enthalten den Wert -1 wenn die Variable NULL sein soll.
    Der NULL-Vergleich mit Feld führt zu NULL und ist nicht Wahr.
    Der Inhalt der Variablen selber wird in diesem Fall ignoriert.
    Also musst du die Null-Anzeiger auf -1 setzen, wenn die Bedingung nicht erfolgreich werden soll.

    Nullanzeiger kann man immer auch beo Parametern verwenden.
    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

  4. #4
    Registriert seit
    Jan 2012
    Beiträge
    1.215
    Entweder habt ihr die Fragestellung nicht richtig gelesen oder ich habe gerade ein Brett vorm Kopf:

    Dietlinde hat doch geschrieben, dass sie an den Selektionsfeldern nicht erkennen kann, ob die Selektion gewünscht ist oder nicht. Deshalb scheidet das Konstrukt "(feld1 = :wert1 or :wert1 = '') aus!

    Aus meiner Sicht ist das dynamische SQL die einzige Möglichkeit.

  5. #5
    Registriert seit
    Nov 2009
    Beiträge
    227
    Hallo zusammen und vielen Dank,

    ich denke, eine der beiden Versionen von Birgitta ist am besten.
    Nicht verstanden habe ich das mit dem between von Herrn Bender - ich glaube nicht das das geht -
    und das mit dem NULL von Herrn Fuerchau auch nicht.
    Da müsste das OR zu einem AND werden, und Null1 -1, wenn ich feld1 NICHT abfragen will?

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.716
    Auch bei Dynamic muss der Programmierer ja wissen, welche Felder er nicht in die Where-Klausel aufnimmt.
    Also kann er bei der statischen Variante einfach die NULL-Anzeiger für die nicht benötigten Felder setzen verwenden, da dies so wirkt, als wäre die Bedingung nicht vorhanden.
    Denn mit NULL kann man nur mit " is null" vergleichen und sonst nicht.

    @dibe

    Wenn du eine Spalte mit NULL vergleichst, ist das Ergebnis NULL.
    Da du aber alle mit Or verknüpfst, benötigst du mindestens 1 Bedingung die nicht NULL sondern Wahr ist um zum Ergebnis zu kommen.
    In RPG Kann man aber NULL halt nur mit einem NULL-Indikator markieren.

    Wenn du also z.B. Null2 bis Null6 mit -1 belegst, muss "Feld1 = : Wert1" zum Ziel führen, oder auch nicht wenn es ebenso ein akzeptables Ergebnis ist.

    Ach ja:
    Die 2. Variante von Birgitta ist dieselbe wie die in der ersten Antwort, nur komplizierter geschrieben.
    Warum soll ich Col1 mit sich selber vergleichen wenn die Variable leer ist und ich doch eigentlich alles mit or verknüpfe?
    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
    Jan 2012
    Beiträge
    1.215
    Die Antwort von Baldur klingt interessant. Aber verstanden habe ich sie auch nicht.

    Im where habe ich noch nie Null Indikators gesetzt. Was bedeutet denn:

    where ( feld1 = :wert1 :Null1)
    or feld2 = :wert2 :Null2)
    or feld3 = :wert3 :Null3)



    Ich denke, du meinst, dass ich mehrere numerische Variablen Null1, Null2, ... im RPG deklariere und z.B. Null1 und Null3 auf -1 setze? Dann würde nur die Selektion für feld2 geprüft? Ist das so?

    Falls ja, ist das eine coole Idee, aber ich verstehe noch nicht, weshalb das funktioniert.

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.376
    select count(*)
    from ...
    where ...
    and col1 between :low1 and :high2
    and col2 between :low2 and :high2
    ...

    wenn in :lowx, :highx lowval bzw highval ist die Bedingung immer true
    schreibe ich einen Wert in beide rein, nimmt er nur diesen

    et voila!

    mit dem null habe ich Bedenken, das sieht mir nach einer Fehlerbedingung aus (Vergleiche mit einem Nuulwert gehen nur mit is null, bzw. is not null

    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/

  9. #9
    Registriert seit
    Jan 2012
    Beiträge
    1.215
    Die Lösung von Dieter Bender finde ich auch cool. Gefällt mir persönlich sogar am besten, weil sie
    statisches SQL ermöglicht und ohne Nullwerte auskommt (ist ja in RPG oft ungewohnt).

    (Die Lösung von Baldur habe ich immer noch nicht verstanden)

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.716
    Das mit dem NULL ist ja Absicht, da das Ergebnis nicht relavant, also ebenso nicht TRUE ist.
    Da es ja eine Bedingung für den Ausschluss des dynamischen SQL's gibt, kann dieselbe Bedingung auch für das statische SQL gelten.

    NULL und Null-Anzeiger:

    Eine Where-Klausel will als Ergebnis ein WAHR haben, dabei wird boolsche Algebra ausgewertet.
    Generell gilt: wenn ein Teil-Ausdruck NULL ist, wird der gesamte Ausdruck NULL.
    folglich:

    where Feld = : Parm : NullInd

    ergibt: Wenn Parm nicht NULL ist (NullInd <> -1) und Feld = Parm ist, ist die Bedingung wahr.
    Wenn du also NullInd auf -1 setzt ist das Ergebnis nicht Wahr, wenn du es auf 0 setzt ist das Ergebnis wahr.
    Null-Idikatoren können nicht nur bei Results angewendet werden sondern auch bei Parametern um z.B. NULL beim Insert/Update zu schreiben.

    NullInd ist aber nur nötig, wenn es keine andere Ausschlussbedingung gibt:
    Also

    where (: P1 = 0 or : P1 = Feld1 )
    and (: P2 = '' or : P2 = Feld2 )
    usw. usf.
    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
    Mar 2002
    Beiträge
    5.376
    Zitat Zitat von Fuerchau Beitrag anzeigen
    where Feld = : Parm : NullInd
    wenn ich den nullind setze, steht da

    where Feld = null

    und das ist illegal. Selbst wenn es das durchlässt hätte ich Bedenken. Wenn das bei einem PTF oder release korrigiert wird, fällt das pgm auf die Schnauze.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  12. #12
    Registriert seit
    Nov 2009
    Beiträge
    227
    Was mich verwirrt ist das OR

    Der Anwender selektiert

    Name: Hugo
    Land: D
    Verkäufer: 37
    Artikel: --> egal
    Farbe: --> egal
    Größe: --> egal

    Also ... where Name = 'Hugo' and Land = 'D' and Verkäufer = 37

    oder in der Fuerchau Schreibweise
    ind1 = 0
    ind2 = 0
    ind3 = 0
    ind4 = -1
    ind5 = -1
    ind6 = -1
    Na = 'Hugo'
    LN = 'D'
    VK = 37
    AR =' '
    FA = ' '
    GR = 0

    where (Name = :Na :ind1
    or Land = :LN :ind2
    or Verkäufer = :VK :ind3
    or Artikel = :AR :ind4
    or Farbe = :FA :ind5
    or Größe = :GR :in6)


    Das verstehe ich nicht.

    Dietlind Beck

Similar Threads

  1. Dynamischer Call per Prototype
    By dschroeder in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 28-02-25, 13:42
  2. Antworten: 6
    Letzter Beitrag: 15-01-20, 08:17
  3. set :Z = geht nicht, ohne das set sehrwohl
    By dibe in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 13-11-18, 08:14
  4. SQL Select into
    By alexander may in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 30-03-05, 14:56
  5. SQL Selektion mit LIKE
    By RLurati in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 18-01-05, 11:38

Berechtigungen

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