Anmelden

View Full Version : SQL - Frage



Heyden
08-12-08, 12:47
Hallo,

ich habe SQL-Statements verwendet. Die übliche Reihenfolge:
- Declare
- Open
- Fetch.

Die Eingabedatei ist geschlüsselt, lese sie aber mit Order By in einer anderen Reihenfolge.

Das Lesen geschieht aber nicht Satz für Satz sondern, und da liegt anscheinend das Problem, sondern aus einer anderen Datei werden die Schlüssel für diese Datei geliefert.

Kann es sein, daß der komplette Vorgang: Cursor wieder schliessen, Deklarieren, Open und dann Lesen wiederholt werden muss?

Momentan erhalte ich nur die Meldung: Kein Satz vorhanden, da nicht alle Schlüssel in der Datei vorhanden sind.

Bitte um Hilfe.

Gruss

Stefan Heyden


*================================================= ========================
d FDBVALR e ds ExtName(FDBVAL)
d FDBNUMV e ds ExtName(FDBNUMView)
d FDBCLIR e ds ExtName(FDBCLI)

*................................................. ........................
* WorkFields
*...........
d WF_NUREFE s like(NUREFE)
d WF_NUGRE s like(NUGRE)
d WF_NURUB s like(NURUB)
d WF_NUMON s like(NUMON)
d WF_NUTYPE s like(NUTYPE)
d WF_NUNIV s like(NUNIV)
d WF_VLVALR s like(VLVALR)
d WF_VLVALS s like(VLVALS)
d WF_CLRACI s like(CLRACI)
d WF_Emittent s like(ISEMIT)


c/Exec Sql
c+ Declare Cursor_FDBNUM Cursor
c+ For Select *
c+ from FDBNUMVIEW
c+ where NUREFE = :WF_NUREFE and
c+ NUGRE = :WF_NUGRE and
c+ NURUB = :WF_NURUB and
c+ NUMON = :WF_NUMON and
c+ NUTYPE = :WF_NUTYPE and
c+ NUNIV = :WF_NUNIV
c+ order by NUREFE,
c+ NUGRE,
c+ NURUB,
c+ NUMON,
c+ NUTYPE,
c+ NUNIV
c+ for Read Only
c/End-Exec
:
:
*------------------
* File: FDBNUM
*------------------
c/Exec Sql
c+
c+ Open Cursor_FDBNUM
c+ using :WF_NUREFE,
c+ :WF_NUGRE,
c+ :WF_NURUB,
c+ :WF_NUMON,
c+ :WF_NUTYPE,
c+ :WF_NUNIV
c/End-Exec
c
c If SqlStt = SqlSttOk
c Eval CsOpen = True
c Else
c Eval CsOpen = False
c Eval SqlStmt = OpenLbl
c EndIf*============================================ =============================
* Get_FDBNUM - Lesen Satz in FDBNUM
*................................................. ........................
c Get_FDBNUM Begsr
c Clear WF_ReadKz
c movel '4' WF_NUNIV
c movel '000' WF_NUGRE
c movel '000' WF_NURUB
c movel '000' WF_NUMON
C movel '281' WF_NUTYPE
c movel(p) ISIN WF_NUREFE

c/Exec Sql
c+ Fetch Cursor_FDBNUM
c+ Into :FDBNUMV
c+
c/End-Exec

c Select
c When SqlStt = SqlsttOk
c If PgmErr = True
c Eval WF_ReadKz = 'F'
c EndIf

c When SqlStt = SqlSttNoRow
c Eval UpMoreRows = False
c Eval WF_ReadKz = 'F'
c
c Other
c Eval SqlStmt = FetchLbl
c Movel 'FDBNUM' WF_TblName
c ExSr UpSqlErr

c EndSl
c EndSr
*================================================= ========================

Fuerchau
08-12-08, 13:23
Der Declare ist nur einmal erforderlich und wird zur Compile-Zeit aufgelöst.
Zur Laufzeit hast du Recht, dass jedesmal per Open/Fetch/Close die Daten gelesen werden müssen.

Wenn du sicher bist, dass die Schlüssel genau einen Satz liefern kannst du das mit

select * into :MyDS
where ...

erreichen. Ein Cursor wird dann nicht benötigt.
Den Order By benötigst du nicht, da du ja nur einen Satz bekommst.

Heyden
08-12-08, 15:22
Danke für die Bestätigung. Wieder etwas gelernt.

Gruss

Stefan