PDA

View Full Version : SQL Statement in SQLRPGLE



Seiten : 1 [2] 3

KingofKning
21-12-11, 12:07
Du wirst lachen, aber für Cobol gibts das ganz genauso.

Einziger Unterschied:
Für SQL muss man Felder explizit zugänglich machen:

exec sql begin declare section end-exec.
01 ...
77 ...
exec sql end declare section end-exec.

Dies kann in der Quelle beliebig oft wiederholt werden.

Zusätzlich muss man einmalig die SQLCA einbinden:

exec sql
include SQLCA
end-exec.

Alle anderen SQL-Befehle werden genauso eingebunden wie in RPG/LE.

exec sql
:
:
end-exec.

Für die Fehlerbehandlung ist es am einfachsten am Anfang der Procedure Division einmalig

exec sql
whenever sqlerror continue
end-exec.

einzubinden. Dann kann man die Variable SQLCODE direkt auswerten.

Der Member-Typ ist SQLCBL bzw. SQLCBLLE.

Danke, dann weiß ich ja was ich die Feiertage über machen werde...

GG

Vigi
21-12-11, 12:30
... die Bananen Strategie im Software Engineering: die Ware reift beim Kunden

D*B

-> Das ist gut rofl :)

Eine Kleinigkeit hat sich noch ergeben.
Wenn man in der DSPF *blank, also nichts eingibt, dann soll alles angezeigt werden.

Beispiel:
Kundenname: *blank

Das SQL gibt jetzt natürlich keinen Treffer, da es keinen Kunden ohne Namen gibt. Wie kann ich aber sämtliche Kunden angezeigt bekommen, wenn der Anwender keinen Kundennamen eingibt.

Habe versucht, dass *blank durch ein "*" zu ersetzten, das funktioniert aber leider nicht. Hat da jmd ne Idee?

Fuerchau
21-12-11, 12:40
Da must du deinen SQL etwas erweitern:

where ...
and (KDName = : Name or : Name = ' ')

Vigi
21-12-11, 12:58
@Fuerchau

Das dachte ich auch, nur das er dann wenn in Feld Name ein *blank drin steht, mir keinen Kunden anzeigt.
Er soll mir aber sämtliche Kunden anzeigen, wenn er Mitarbeiter das Feld frei lässt.
Hatte versucht durch das ersetzten von '' zu '*' mir alle Kunden anzeigen zu lassen, aber auch das funktioniert nicht.

Update:

EXEC SQL Declare Mycursor Cursor For
select * from scw_data/CXLAGPF
where cxfirm =: DDRFIRM
and cxekvk = 'S'
and cxsart = 'S'
and cxmeng <> 0
and cxrest <> 0
and CXLAGO = : DCXLAGO
and CXLAGP = : DCXLAGP
and CXSTAT = : DCXSTAT
and CXNUMM between : DVCXARTN and : DBCXARTN
For Fetch Only;
Exec Sql Open Mycursor;

Dow Sqlcode = Ok;
Exec Sql Fetch Mycursor Into :Mydata;
If Sqlcode = Ok;
Exsr FuellePRTF;
Endif;
Enddo;
close IVKLSTP0;
open IVKLSTP0;

In dem Fall kann DCXLAGO, DCXLAGP, DCXSTAT aus der DSPF leer sein, dann soll es "ignoriert" werden, sprich, es sollen alle angezeigt werden. Egal was in CXLAGO, CXLAGP, CXSTAT steht.

Ich hatte es so versucht, mit dem Ausschnitt vor dem SQL:

if DCXLAGO = '';
DCXLAGO = '*';
endif;
if DCXLAGP = '';
DCXLAGP = '*';
endif;
if DCXSTAT = '';
DCXSTAT = '*';
endif;

das funktioniert nicht.

Fuerchau
21-12-11, 13:29
Ich sagte doch du musst den Select selber anpassen:


and (CXLAGO = : DCXLAGO or : DCXLAGO = ' ')

Dies ist für alle Felder entsprechend zu definieren.
Deine Sternchen kannst du vergessen, da du ja dann gezielt auf Stern prüfst.

Vigi
21-12-11, 13:47
Das ist Genial!

Vielen Dank Fuerchau.

Vigi
22-12-11, 08:08
Da hat sich zu dem Thema direkt noch eine Frage gebildet.

D MyData E Ds Extname(CXLAGPF)

EXEC SQL Declare Mycursor Cursor For
select * from CXLAGPF
// join artstamm
// on ASFIRM=cxfirm and ASNUMM=CXARTN
where cxfirm =:DDRFIRM
and cxekvk = 'S'
and cxsart = 'S'
and cxmeng <> 0
and cxrest <> 0
and (CXLAGO = :DCXLAGO or :DCXLAGO = ' ')
and (CXLAGP = :DCXLAGP or :DCXLAGP = ' ')
and CXNUMM between :DVCXARTN and :DBCXARTN
order by CXNUMM,CXLAGO,CXLAGP,CXGEBI
For Fetch Only;
Exec Sql Open Mycursor;
Dow Sqlcode = Ok;
Exec Sql Fetch Mycursor Into :Mydata;
If Sqlcode = Ok;
Exsr FuellePRTF;
Endif;
Enddo;
close IVKLSTP0;
open IVKLSTP0;

Wenn ich hier einen Join einbaue, gibt es keine Treffer mehr, obwohl der join 100% richtig ist. Ich vermute, dass das an MyData liegt, das wie CXLAGPF definiert ist und nicht mit einer zweiten Datei zurecht kommt. Kommentiere ich den join aus, bekomme ich die gewünschten Ergebnisse. In strsql bekomme ich sie auch, woran kann das liegen?

Danke vorweg schonmal!

S.Neinawaie
22-12-11, 08:25
Hallo!

Natürlich muss deine ResultDS (hier genannt "MyData") über die entsprechende Struktur verfügen.

(Durchs Join entspricht dein Result nicht mehr dem Aufbau der CXLAGPF.)

Du könntest Beispielsweise eine DS definieren die genauso aufgebaut ist wie das Result aus deinem SQL Statement & das ganze nochmal versuchen :)

Vielleicht noch etwas generelles: Benötigst du wirklich ALLE Spalten aus diesen Dateien?
Laut diversen Spezialisten sollte man wenn nicht unbedingt notwendig kein Select * verwenden.

LG,
Sam

andreaspr@aon.at
22-12-11, 09:14
Hi,

wenn du trotz JOIN dennoch nur die Spalten aus der CXLAGPF benötigst, dann mach ein
Select CXLAGPF.* From ...

Ansonsten kannst du beim Fetch folgendes machen:

D MyData E Ds Extname(CXLAGPF)
D MyData2 E Ds Extname(artstamm)

Fetch Mycursor Into :Mydata, :mydata2;

lg Andreas

Vigi
22-12-11, 09:21
Genau nach so einer Möglichkeit habe ich gesucht.

Danke!