-
BigInt Variable aus Pointer String extrahieren
Hallo Zusammen,
ich habe ein Trigger Programm welches an verschiedenen Dateien hängt.
Dieses Trigger Programm empfängt den jeweiligen Datensatz (before/after) als Pointer.
Der Pointer wiederum wird in eine String Variable übergeben.
Im Debug liegt dann der gesamte Datensatz als String vor. Man kann alle Daten lesen.
Ein Dateifeld ist vom Typ BigInt. Dieses wird mir bereits im Debug als ? dargestellt.
Definiere ich die Dateistruktur mit 'extname' und übergebe dann den String direkt in die Struktur, wird das BigInt Feld ohne Probleme übergeben. Wenn ich versuche mit %subst o.ä. den Wert einzeln aus dem String zu extrahieren schlägt dies fehl. Entweder es kommt ein Abbruch oder der Wert ist falsch/nicht lesbar o.ä. (je nach Befehl).
Dies ist erstmal das grundsätzliche Problem.
Nachfolgend mal ein paar Bilder dazu.
Entsprechende Datei um die es geht ist ein SQL Table.
Das Feld ist wie folgt definiert:
eindeutigeID for AKID bigint generated always as identity (start with 1 increment by 1 cycle),
Nun der Prozedur Auszug mit Dateistruktur bei welchem es problemlos funktioniert.
// Prozedur zur Ermittlung der Eindeutige ID des Datensatzes.
dcl-proc pr_ErmittleEindeutigeSatzId_1;
dcl-pi *n like(eindeutigeId);
datenVorVorgang pointer const;
datenNachVorgang pointer const;
dateiBibliothek char(10) const;
dateiName char(10) const;
end-pi;
dcl-s daten char(900) based(datenNachVorgangLokal);
dcl-s startPosition int(5) inz(777);
dcl-s laengeInBytes int(10) inz(8);
dcl-s eindeutigeId varchar(100) inz;
// Eindeutige ID aus den Pointer Informationen extrahieren.
datenNachVorgangLokal = datenNachVorgang;
eindeutigeId = %subst(daten: startPosition: laengeInBytes);
return eindeutigeId;
end-proc;
Nun der Prozedur Auszug bei dem das Feld einzeln extrahiert werden soll.
Hier funktioniert es nicht.
// Prozedur zur Ermittlung der Eindeutige ID des Datensatzes.
dcl-proc pr_ErmittleEindeutigeSatzId_1;
dcl-pi *n like(eindeutigeId);
datenVorVorgang pointer const;
datenNachVorgang pointer const;
dateiBibliothek char(10) const;
dateiName char(10) const;
end-pi;
dcl-s daten char(900) based(datenNachVorgangLokal);
dcl-s startPosition int(5) inz(777);
dcl-s laengeInBytes int(10) inz(8);
dcl-s eindeutigeId varchar(100) inz;
// Eindeutige ID aus den Pointer Informationen extrahieren.
datenNachVorgangLokal = datenNachVorgang;
eindeutigeId = %subst(daten: startPosition: laengeInBytes);
return eindeutigeId;
end-proc;
Bin für jeden Hinweis dankbar!
Gruß
Muller
-
Wenn du einen Trigger genau für eine Tabelle schreibst, steht im Triggerbuffer die relative Adresse des Before und Afterimmage.
Also kannst du für Before/After-Immage je eine DS based Pointer definieren:
dcl-s BeforePointer pointer;
dcl-s AfterPointer pointer;
dcl-ds Before ExtName('DATEI') qualified;
end-ds;
dcl-ds After ExtName('DATEI') qualified;
end-ds;
BeforePointer = %addr(TriggerBuffer) + TriggerBuffer.PosBeforeImage;
AfterPointer = %addr(TriggerBuffer) + TriggerBuffer.PosAfterImage;
damit kannst du dann jederzeit native auf beide Strukturen typesave zugreifen.
Quellen von 2004;-), geht heute moderner:
*
* Definitionen der Trigger-Aufrufparameter
* ----------------------------------------
*
*
D TrgBuff DS
D PhysFile 10
D PhysLib 10
D PhysMember 10
D TrigEvent 1
D TrigTime 1
D ComitLevel 1
D Reserv1 3
D CCSIDData 10I 0
D Reserv2 8
D OrigOffset 10I 0
D OrigRecLen 10I 0
D OrigNulMap 10I 0
D OrigNulLen 10I 0
D NewOffset 10I 0
D NewRecLen 10I 0
D NewNulMap 10I 0
D NewNulLen 10I 0
D Reserv3 16
D TrgBuffLen S 10I 0
*
* Definitionen der ben”tigten Konstanten
* --------------------------------------
* Commit-Level
D CmtNone C const('0')
D CmtChg C const('1')
D CmtCs C const('2')
D CmtAll C const('3')
* NULL-Flags
D IsNotNull C const('0')
D IsNull C const('1')
* Event-Ereignisse
D EventIns C const('1')
D EventDel C const('2')
D EventUpd C const('3')
* Trigger-Time
D AfterChg C const('1')
D BeforeChg C const('2')
*
* Definition der ben”tigten Zeiger
* --------------------------------
D OrigRec S *
D OrigNull S *
D NewRec S *
D NewNull S *
*
* Definition der benötigten Zeiger
* --------------------------------
D OrigRec S *
D OrigNull S *
D NewRec S *
D NewNull S *
* --------------------------------------------------------------------
* Strukturen für Vergleich After-/Before-immage
* Before-Image (BI)
* --------------------------------------------------------------------
DBIAFP1 E DS based(OrigRec)
D extname(AFP1)
D prefix(BI)
* --------------------------------------------------------------------
* After-Image (AI)
* --------------------------------------------------------------------
DAIAFP1 E DS based(NewRec)
D extname(AFP1)
D prefix(AI)
* Übergabeparameter für DB/400-Trigger
C *entry plist
C parm TrgBuff
C parm TrgBuffLen
* Initialisierungen der Basiszeiger
C eval OrigRec = %addr(TrgBuff) + OrigOffset
C eval OrigNull = %addr(TrgBuff) + OrigNulMap
C eval NewRec = %addr(TrgBuff) + NewOffset
C eval NewNull = %addr(TrgBuff) + NewNulMap
-
Hallo Fuerchau,
danke für die schnelle Rückmeldung.
Der Trigger kann für beliebige Dateien angehangen werden.
Deshalb möchte ich ohne die explizite Definition von
dcl-ds Before ExtName('DATEI') qualified;
end-ds;
dcl-ds After ExtName('DATEI') qualified;
end-ds;
auskommen. Ich weiß aber um welche Datei es sich handelt und kenne auch die Stelle an dem das Feld bzw. der Wert vorkommt. Ist es möglich das ohne 'extname' Struktur zu extrahieren?
Gruß
Muller
-
dcl-s ptr pointer;
dcl-s bigint int(20) based(ptr);
pointer = %addr(buffer) + posbigint;
Posbigint ist die relative Position eines Feldes im Gesmtpuffer, start ist 0.
-
Hallo Fuerchau,
vielen Dank für die Antwort.
Hat mit deinem Beispiel einwandfrei funktioniert.
Vielen Dank
Gruß
Muller
Similar Threads
-
By edig in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 25-01-19, 15:20
-
By LordCinimod in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 06-11-15, 05:56
-
By peter.kinne in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 04-02-09, 09:58
-
By AndreasH in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 22-09-02, 11:00
-
By KB in forum IBM i Hauptforum
Antworten: 0
Letzter Beitrag: 14-06-01, 10:51
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