-
SQL - Cursor vernichten ?!?
hallo allerseits,
ich habe folgendes problem und bin daher auf der suche nach einer lösung:
aufgrund verschiedener bedingungen werden unterschiedliche sql-statements generiert, die je nach bedingung ausgeführt werden sollen. jetzt habe ich aber das problem das der cursor immer das erste zutreffende statement auswählt und für dieses werte zurückgibt. kann mir bitte jemand erklären warum und ob man das ändern kann ? cursor vernichten oder so in etwa ?
hier die entsprechenden codezeilen für die vorbereitung
/Free
#SQLSTM =
'Select TXTXNR, TXTXB1, TXTXB2, TXTXB3, TXTXB4, TXTXB5, TXTXB6, ' +
'TXSTK1, TXSTK2, TXSTK3 from TABD ' +
'WHERE TXSART = ''TX'' and TXFIRM = ''1'' and TXWKNR = ''000'' ' +
'and TXTXRT = ''PE''';
#SQLINB = 'and TXTXB4 in(''BFS'', ''B40'', ''B60'', ''B100'')';
#SQLINS = 'and TXTXB4 in(''SFS'', ''SR'', ''SI'', ''SAAB'')';
#SQLOR = ' or TXSART = ''TX'' and TXFIRM = ''1'' ' +
'and TXWKNR = ''000'' and TXTXRT = ''PE'' and TXTXB4 = '' ''';
/End-Free
C INITE ENDSR
hier die bedingungen
If C0PNR# <> *Zeros;
#SQLSEL = ' and TXTXNR = ' + %Char(C0PNR#);
EndIf;
If C0NAME <> *Blanks;
#SQLSEL = ' and TXTXB1 like ''' + %Trim(C0NAME) + '%''';
EndIf;
If C0ART <> *Blanks;
#SQLSEL = ' and TXTXB4 like ''' + %Trim(C0ART) + '%''';
EndIf;
If C0KFZ <> *Blanks;
#SQLSEL = ' and TXTXB5 like ''' + %Trim(C0KFZ) + '%''';
EndIf;
Select;
When (*In31 = '1' and *In21 = '1') or (*In34 = '1' and *In21 = '1');
#SQLSTM = #SQLSTM + #SQLSEL + #SQLORP;
When (*In31 = '1' and *In21 = '0') or (*In34 = '1' and *In21 = '0');
#SQLSTM = #SQLSTM + #SQLSEL + #SQLORN;
When *In32 = '1' and *In21 = '1';
#SQLSTM = #SQLSTM + #SQLSEL + #SQLINB + #SQLOR + #SQLSEL + #SQLORP;
When *In32 = '1' and *In21 = '0';
#SQLSTM = #SQLSTM + #SQLSEL + #SQLINB + #SQLOR + #SQLSEL + #SQLORN;
When *In33 = '1' and *In21 = '1';
#SQLSTM = #SQLSTM + #SQLSEL + #SQLINS + #SQLOR + #SQLSEL + #SQLORP;
When *In33 = '1' and *In21 = '0';
#SQLSTM = #SQLSTM + #SQLSEL + #SQLINS + #SQLOR + #SQLSEL + #SQLORN;
EndSl;
/End-Free
und zu guter letzt das fetch
*
* Statement vorbereiten
*
C/EXEC SQL
C+ PREPARE S1 FROM: #SQLSTM
C/END-EXEC
*
* Cursor defnieren
*
C/EXEC SQL
C+ DECLARE C1 CURSOR FOR S1
C/END-EXEC
*
* Cursor schliessen
*
C/EXEC SQL
C+ CLOSE C1
C/END-EXEC
*
* Cursor öffnen
*
C/EXEC SQL
C+ OPEN C1
C/END-EXEC
*
* alle Zeilen laden
*
C Eval SIDX2 = 5000
C/EXEC SQL
C+ FETCH FROM C1 FOR :SIDX2 ROWS INTO :S00S01L:IND_ARRAY
C/END-EXEC
*
C Eval I# = SQLERRD(3)
-
Hallo,
wenn Du den Cursor nicht am Ende der Verarbeitung schließst, solltest Du ihn unmittelbar vor dem Prepare schließen. Der Close vor dem Open ist zu spät.
Ein erneuter Prepare ist nicht erfolgreich, solange der Cursor aus der vorherigen Verarbeitung noch offen ist.
Wenn Du den SQL-Code oder Status nach dem Prepare-Statement abgefragt hättest, hättest Du eine entsprechende Fehlermeldung erhalten.
Birgitta
-
hallo brigitta,
vielleicht habe ich ja doch nicht so genau erklärt wie ich es wollte.
nach den bedingungen, die in einer subroutine laufen, wird die fetch subroutine aufgerufen und die daraus erhaltenen daten zur anzeige gebracht. der zyklus wiederholt sich da sich die bedingungen jederzeit ändern können.
************************************************** **************
* SR000 HAUPT - ROUTINE
************************************************** **************
C SR000 BEGSR
C ExSr SR100
C ExSr SR110
C ER000 ENDSR
************************************************** **************
C/Eject
*---------------------------------------------------------------
* SR100 - Subfile SFL000 initialisieren
*---------------------------------------------------------------
C SR100 BegSr
C Eval RNRA# = 0
C Eval *In80 = '0'
C Write CTL000
C Eval *In80 = '1'
C ER100 EndSr
C/Eject
*---------------------------------------------------------------
* SR110 - Subfile SFL000 füllen
*---------------------------------------------------------------
C SR110 BegSr
*
/Free
If C0PNR# <> *Zeros;
#SQLSEL = ' and TXTXNR = ' + %Char(C0PNR#);
EndIf;
If C0NAME <> *Blanks;
#SQLSEL = ' and TXTXB1 like ''' + %Trim(C0NAME) + '%''';
EndIf;
If C0ART <> *Blanks;
#SQLSEL = ' and TXTXB4 like ''' + %Trim(C0ART) + '%''';
EndIf;
If C0KFZ <> *Blanks;
#SQLSEL = ' and TXTXB5 like ''' + %Trim(C0KFZ) + '%''';
EndIf;
Select;
When (*In31 = '1' and *In21 = '1') or (*In34 = '1' and *In21 = '1');
#SQLSTM = #SQLSTM + #SQLSEL + #SQLORP;
When (*In31 = '1' and *In21 = '0') or (*In34 = '1' and *In21 = '0');
#SQLSTM = #SQLSTM + #SQLSEL + #SQLORN;
When *In32 = '1' and *In21 = '1';
#SQLSTM = #SQLSTM + #SQLSEL + #SQLINB + #SQLOR + #SQLSEL + #SQLORP;
When *In32 = '1' and *In21 = '0';
#SQLSTM = #SQLSTM + #SQLSEL + #SQLINB + #SQLOR + #SQLSEL + #SQLORN;
When *In33 = '1' and *In21 = '1';
#SQLSTM = #SQLSTM + #SQLSEL + #SQLINS + #SQLOR + #SQLSEL + #SQLORP;
When *In33 = '1' and *In21 = '0';
#SQLSTM = #SQLSTM + #SQLSEL + #SQLINS + #SQLOR + #SQLSEL + #SQLORN;
EndSl;
/End-Free
C ExSr SR112
C Eval SIDX1 = 1
C Eval %OCCUR(S00S01L) = SIDX1
C DOW SIDX1 <= I#
C Add 1 RNRA#
C Move ' ' S0AUSW
C Move L1TXNR S0PERS#
C Movel L1TXB1 S0NAME
C Movel L1TXB2 S0INFO
C Movel L1TXB4 S0ART
C Movel L1TXB6 S0KFZ
C Movel L1STK1 S0STK1
C Movel L1STK2 S0STK2
C Movel L1STK3 S0STK3
C Write SFL000
C EVAL SIDX1 = SIDX1 + 1
C EVAL %OCCUR(S00S01L) = SIDX1
C EndDo
*
C ExSr SR140
C ER110 EndSr
*---------------------------------------------------------------
* SR112 - alle auslesen
*---------------------------------------------------------------
C SR112 BegSr
C CLEAR *ALL S00S01L
*
* Statement vorbereiten
*
C/EXEC SQL
C+ PREPARE S1 FROM: #SQLSTM
C/END-EXEC
*
* Cursor defnieren
*
C/EXEC SQL
C+ DECLARE C1 CURSOR FOR S1
C/END-EXEC
*
* Cursor schliessen
*
C/EXEC SQL
C+ CLOSE C1
C/END-EXEC
*
* Cursor öffnen
*
C/EXEC SQL
C+ OPEN C1
C/END-EXEC
*
* alle Zeilen laden
*
C Eval SIDX2 = 5000
C/EXEC SQL
C+ FETCH FROM C1 FOR :SIDX2 ROWS INTO :S00S01L:IND_ARRAY
C/END-EXEC
*
C Eval I# = SQLERRD(3)
*
* Cursor schliessen
*
C/EXEC SQL
C+ CLOSE C1
C/END-EXEC
C ER112 EndSr
C/Eject
*---------------------------------------------------------------
wie man sehen kann wird der cursor am ende der verarbeitung geschlossen.
also warum funktioniert es trotzdem nicht ???
-
hallo und danke
habe den fehler bereits gefunden. dadurch dass #sqlstm vom typ varying ist und eigentlich nur einmal initialisiert wird, schaukelt sich das ganze auf. #sqlstm muss jedesmal zuerst mit einem leerstring initialisiert werden.
also danke an alle die darüber nachdenken bzw. -dachten.
Similar Threads
-
By christian_lettner in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 16-11-06, 10:15
-
By malzusrex in forum IBM i Hauptforum
Antworten: 8
Letzter Beitrag: 19-09-06, 11:04
-
By Kaufmann in forum IBM i Hauptforum
Antworten: 11
Letzter Beitrag: 28-06-06, 14:11
-
By AS400-Anfänger in forum NEWSboard Programmierung
Antworten: 6
Letzter Beitrag: 27-06-06, 13:18
-
By loeweadolf in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 01-06-06, 09:43
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks