Anmelden

View Full Version : [gelöst] SETLL und READ mit Gruppenwechsel ???



Seiten : 1 [2]

FNeurieser
23-04-12, 18:54
@Fuerchau,

ich habe mich villeicht falsch ausgedrückt; ich meinte es in etwa so:



*-------------------------------------------------
***** für SQL Statement
*-------------------------------------------------
D SIDX1 S 5 0 Inz(1)
D SIDX2 S 5 0 Inz(1)
D
DS00S01L DS OCCURS(5000)
D L1TXNR 6A
D L1TXB1 30A
*
DS1PTR S * INZ(%ADDR(S00S01L))
D DS BASED (S1PTR)
DS00S02L 235A DIM(5000) DESCEND
D L2TXNR 6A OVERLAY(S00S02L:1)
D L2TXB1 30A OVERLAY(S00S02L:*NEXT)
*
* ANZAHL DER FELDER ( DIM(XX) ) MUSS MIT ANZAHL IN SELECT ÜBEREINSTIMMEN !!
DIND_ARRAY DS OCCURS(5000)
D INDS 4B 0 DIM(12)



und dann in den C-Bestimmungen




/free
#SQLSTM =
'Select TXTXNR, TXTXB1, TXTXB2, TXTXB3, TXTXB4, TXTXB5, TXTXB6, ' +
'TXTXB7, TXSTK1, TXSTK2, TXSTK3, TXKDF1 from TABD ' +
'WHERE TXSART = ''TX'' and TXFIRM = ''1'' and TXWKNR = ''000'' ' +
'and TXTXRT = ''PE'' ';
/end-free

*
* 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 Eval SIDX1 = 1
C Eval %OCCUR(S00S01L) = SIDX1
C DOW SIDX1 <= I#
* Verarbeitung
C Move L1TXNR S0PERS#
C Movel L1TXB1 S0NAME
*
C EVAL SIDX1 = SIDX1 + 1
C EVAL %OCCUR(S00S01L) = SIDX1
C EndDo

FNeurieser
23-04-12, 18:56
Nö.
Wie willst du denn die Daten anders als per Fetch von SQL holen ?

FETCH kann nicht ersetzt werden, ist mir klar, aber wenn fetch nur einmal alle Datensätze rüberschiebt... das war gemeint.

Fuerchau
24-04-12, 07:54
Ob du nun die Daten erst in ein Array lädst oder direkt verarbeitest, von der Performance wirst du da keinen Unterschied bemerken.
Einfacher ist natürlich die Direktverarbeitung, vor allem wenn ich nicht weiß, wie viele Sätze ich denn so bekommen kann.

Ansonsten ist ein
for SIDX1 = 1 to I#;
endfor;
einfacher :).

B.Hauser
24-04-12, 08:04
FETCH kann nicht ersetzt werden, ist mir klar, aber wenn fetch nur einmal alle Datensätze rüberschiebt... das war gemeint.

Aber auch beim Multiple Row Fetch ist ein Pointer-Handling nicht erforderlich, sofern das SQL-Statement (bzw. die im SELECT angegebenen Spalten) zur Compile-Zeit bekannt sind.
Das Ergebnis wird direkt in eine Mehrfach-Datenstruktur (Schlüssel-Wort OCCURS) oder Array-Datenstruktur (Schlüssel-Wort DIM) eingelesen.
Die Anzahl der eingelesenen Datensätze wird dann aus der Mehrfach/Array-Datenstruktur ausgelesen. Sofern mehr Datensätze als die Mehrfach/Array-Datenstruktur halten kann eingelesen werden müssen, erfolgt ein weiterer Fetch.

Birgitta

FNeurieser
24-04-12, 12:37
@All

Danke an alle. Jetzt ist mir wieder einmal etwas viel klarer geworden.