Anmelden

View Full Version : embedded-SQL: Problem mit variablem SQL



zannaleer
17-12-04, 12:23
Hallo Forum,

ich bekomme ein Probelm mittels embedded-SQL nicht so in den Griff, wie ich es mir vorstelle. Vielleicht hat jemand von Euch die zündende Idee.
Ich habe eine Datei, in der täglich die Umsätze von allen unseren Geschäftsbereichen und allen Abteilungen fortgeschrieben werden.

Ich möchte ein Serviceprogramm erstellen das anhand der übergebenen Parameter die Umsätze kumuliert und ausgibt.
Folgende Struktur wird als Übergabestruktur verwendet:

d SummDs ds
d SummFeld 6
d Datum d datfmt(*iso)
d GBereich 2 0
d Abteilung 2 0
d JahrMonTag 3

Der Inhalt des Feldes 'SummFeld' soll kumuliert werden. Sind GBereich und Abteilung gleich 0, soll der Umsatz der gesamten Firma ermittelt werden. Ist GBereich gefüllt und Abteilung = 0 soll nur der Umsatz dieses Geschäftsbereichs ermittelt werden.
Im Parameter JahrMonTag wird vorgegeben, ob nur für den Monat, nur für den Tag oder der Gesamtumsatz des Jahres bis zum übergebenen Monat ermittelt werden soll.

Momentan sieht mein SQL-Statement so aus:
c/EXEC SQL
c+ SELECT Sum(SUT010) into :M_Summe from SUT
c+ WHERE sut005 = :Abteilung and sut016 = :Jahr and
c+ sut008 <= :Monat - 1 or (sut005 = :Abteilung and
c+ sut016 = :Jahr and sut008 = :Monat and
c+ sut009 <= :Tag)
c/END-EXEC
Das hat aber den Nachteil, dass ich 18 verschiedene Statements codieren müsste. Kann ich im SQL-Statement nicht Variablen verwenden, die ich vorher fülle?

Ungefähr so:
c/EXEC SQL
c+ SELECT Sum(:SummFeld) into :M_Summe from SUT
c+ WHERE G_SqlStatement
c/END-EXEC
/free
Und im Feld G_SqlStatement steht dann die where-Bedingung

Vielen Dank.

Gruß
Alexander

mk
17-12-04, 12:32
Hallo Alexander,

wenn ich das richtig sehe muss Du dein SQL in ein Array packen und das in einem Loop ausführen lassen.
Ungefähr so :

DS oder Array mit dem SQL Select
C/EXEC SQL
C+ PREPARE SELECTION FROM :SELECT
C/END-EXEC

C/EXEC SQL
C+ DECLARE xxx SCROLL CURSOR FOR SELECTION
C/END-EXEC

C/EXEC SQL
C+ OPEN SUPPL
C/END-EXEC

danach den Fetch


C/EXEC SQL
C+ FETCH NEXT FROM xxx INTO
c+
C/END-EXEC

so kannst Du in einem Loop arbeiten
gruss Michael

Fuerchau
17-12-04, 12:41
Auch hier gilt: Sinnvolle Gestaltung der Where-Bedingung !
Da es auch möglich ist, eine Konstante zu vergleichen kann man gleich sämtliche Bedingungen vorgeben:

... where ... and (:myvar = 0 or mydbfld = :myvar) ... and (:myvar2 = ' ' or mydbfld2 = :myvar2) ...

Hiermit kann ich eigentlich genau das erreichen:
Ist die Variable = 0 ODER das Dateifeld = meiner Variablen.
Die restlichen Bedingungen sind entsprechend zu kodieren.