PDA

View Full Version : Verarbeitung mit variabler Satzstruktur



RaMai
31-10-07, 19:16
Hallo,
ich arbeite an einem PGM das dafuer sorgen soll in Dateien Kommas und Querstriche in allen alphanumerischen Feldern mit Blanks zu ersetzen.
Mein Ansatz war mit DSPFFD in eine Outfile die alphe felder sowie deren laenge und Position zu finden.
Soweit so gut.
Mein Problem ist jetzt wie bringe ich einen Satz in einen Char String um auf die jeweiligen zeichen zuzugreifen?
In eine DS einlesen geht ja nicht da die Files bei jedem call eine andere struktur haben koennen.
Der Feldname hilft mir im Prinzip auch nichts wenn ich den dann in einem Array habe....jemand einen Tip?

Vielen dank im vorraus.
Achja, Satzlaenge bis zu 9999 - also scheidet DTAARA auch aus.

B.Hauser
31-10-07, 19:50
Hallo,

hast Du eigentlich schon mal daran gedacht mit (embedded) SQL zu arbeiten?

Ich würde über die SQL-View SYSCOLUMS in der Bibliothek QSYS2 die alphanumerischen Felder in der gewünschten Bibliothek ermitteln.

Anschließend über diese Informationen dynamische Update-Statements generieren, in denen mit Hilfe der skalaren Funktion Translate die Sonderzeichen durch Blanks ersetzt werden und diese Statements mit EXECUTE IMMEDIATE ausführen.

Birgitta

RaMai
01-11-07, 12:08
Hallo Birgitta,
um ehrlich zu sein - daran habe ich nicht gedacht :o
Aber wie immer, vielen Dank fuer Deine hilfreiche Anregung. Ich werde das wie von Dir vorgeschlagen versuchen.

Gruss Ralf

RaMai
01-11-07, 19:41
Ich würde über die SQL-View SYSCOLUMS in der Bibliothek QSYS2 die alphanumerischen Felder in der gewünschten Bibliothek ermitteln.

OK, der Teil war einfach. Ich habe die Feldnamen in ein Array geschrieben.


Anschließend über diese Informationen dynamische Update-Statements generieren, in denen mit Hilfe der skalaren Funktion Translate die Sonderzeichen durch Blanks ersetzt werden und diese Statements mit EXECUTE IMMEDIATE ausführen.

Und dazu bin ich zu bloed :mad:
Ich Schreibe folgendes Statement in meine Variable:
UPDATE @LIBRARY/@FILE SET @FIELD = Translate'(:@Field,' ', ',')
Und versuche das dann so auszufuehren:
C/EXEC SQL
C+ execute immediate :sqlComma
C/END-EXEC

Als Fehler bekomme ich:
SQL0312 30 Variable &1 not defined or not usable.

Wie muss ich also das Statement aufbauen um mit Variabler Lib, Variabler File und Variablem Feld eben dieses Feld ggf zu aendern wenn ein Zeichen enthalten ist das ersetzt werden muss?
Also @Library ist eine Variable.
@File ist eine Variable.
@Field enthaelt den aus dem Array uebertragenen Feldnamen.
Hier denke ich liegt auch mein Fehler, einerseits sage ich ja mit @Field das ich in diesem Feld einen Wert aendern moechte und versuche andererseits diese Variable fuer den feldwert zu verwenden.....funzt wohl so nicht. Birgitta, wenns Dir nicht zu bloed ist, kannst Du mir das begreiflich machen?

Vielen Dank, Gruss Ralf

B.Hauser
02-11-07, 06:12
Hallo,

der aufbereitete String muss ein ausführbares SQL-Statement sein. In Deinem String sind nicht aufgelöste Variablen enthalten:

Beispiel:


/Free
MySQLCmd = 'Update ' + %Trim(MyLib) + '/' + %Trim(MyTable)
+ ' Set ' + %Trim(MyFld) + ' = Translate ... usw.;

/End-Free
C/EXEC SQL Execute Immediate :MySQLCMD
C/End-Exec

Achtung vor = Translate (wird ein Hochkomma nicht angezeigt!)

Vergiß außerdem nicht, dass Hochkommata in einem String verdoppelt werden müssen.

Um eine bessere Performance zu erhalten, würde ich nicht für jedes Feld und jedes Sonderzeichen ein Update ausführen, sondern pro Datei ein einziges SQL-Statement aufbereiten und ausführen.

Birgitta

RaMai
02-11-07, 17:21
Danke Birgitta, jetzt funzt es :)
Was mich am meisten verbluefft ist das die Performance sehr gut ist.
Habe Testweise eine Datei mit 1200 Saetzen und 15 Char Feldern verarbeitet - Interaktiv <1 sec

Gruss Ralf