PDA

View Full Version : SQL update



Joe
11-04-03, 18:48
Hallo Forum.

mit folgender RPG-Anweisung
wird aus einer "Zähler-Datei" die nächste
Rechnungsnummer ermittelt:
Key Chain Datei
If %Found
eval RENR = RENR + 1
update Datei
endif

Das möchte ich mit EINER Sql-Anweisung erledigen.
C/EXEC-SQL
C+ update Datei set RENR = RERN + 1 where...
C/END EXEC

Der update funktioniert, aber wie stelle ich dem Pgm die um 1 erhöhte RENR zur Verfügung?

Gruss Joe

Fuerchau
11-04-03, 20:25
Nun, SQL funktioniert hier wie bei der normalen Dateiverarbeitung, mittels:

C/exec sql
c+ select renr into :myrenr from file where ...
c/end-exec

Ohne Commit-Steuerung gibts natürlich ein Problem, dass zwischen Update und Select ein anderes Programm bereits weitergezählt hat.

Dann geht es nur mit einem Cursor:

declare mycursor for select renr from file where ... for update

open mycursor
fetch into :myrenr
set :myrenr = :myrenr + 1
update myfile set renr=:myrenr where current of mycursor

Dies entspricht im weitesten der RPG-Logik.

B.Hauser
12-04-03, 12:18
Hallo Joe,

in einem SQL-Statement geht das nicht.

Aber, was willst Du erreichen?
Ein einziges SQL-Statement, statt 5 RPG-Statements plus F-Bestimmungen?

In diesem Fall würde ich mir eine Funktion basteln, die die neue Rechnungs-Nr. zurückgibt und die Zähler-Datei fortschreibt.

Birgitta

Joe
14-04-03, 17:08
Danke für die schnelle Hilfe.

Declare und Fetch liefert mir das richtige
Ergebnis. Mir war nicht bekannt, dass der
zuerst gelesene Satz bis zum Update bzw. Close gesperrt ist.

Der Tabellenzugriff soll per SQL erfolgen,
weil ich mit meinem Programm (VARPG)
die DB2/400 bzw. die DB2 auf einem Client
bedienen "können" muss.


Gruss Joe


<BLOCKQUOTE><font size="1" face="Verdana, Arial">Zitat:</font><HR>Original erstellt von B.Hauser:

Hallo Joe,

in einem SQL-Statement geht das nicht.

Aber, was willst Du erreichen?
Ein einziges SQL-Statement, statt 5 RPG-Statements plus F-Bestimmungen?

In diesem Fall würde ich mir eine Funktion basteln, die die neue Rechnungs-Nr. zurückgibt und die Zähler-Datei fortschreibt.

Birgitta[/quote]

Fuerchau
15-04-03, 15:06
Dass kann bei VARPG ggf. in die Hose gehen, da die Klausel "for update" AS/400-Spezifisch ist (daher auch die Satzsperre!).
Evtl. wird die Klausel ignoriert und die Satzsperre wird nicht gesetzt !
Desweiteren ist auch die Klausel beim Update "current of" ggf. nicht möglich.

Dies ist nur möglich, wenn "Serversite-Curser" verwendet werden !!

Ich würde dann, wie Birgitta empfiehlt, eine SQL-Funktion schreiben, die genau diese Probleme behebt.
Vorteil: Die Funktion läuft auf der AS/400, kann ein RPG-Programm sein und ist auch von VARPG verwendbar.