[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Nov 2017
    Beiträge
    25

    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

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    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
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Nov 2017
    Beiträge
    25
    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

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Nov 2017
    Beiträge
    25
    Hallo Fuerchau,

    vielen Dank für die Antwort.
    Hat mit deinem Beispiel einwandfrei funktioniert.

    Vielen Dank

    Gruß
    Muller

Similar Threads

  1. CPYFRMARCF - Daten aus einem Archiv extrahieren
    By edig in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 25-01-19, 15:20
  2. Pointer Variable in TFR?
    By LordCinimod in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 06-11-15, 05:56
  3. Extrahieren Hausnummer und Zusätze von einem Strassennamen
    By peter.kinne in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 04-02-09, 09:58
  4. Pointer ins Nirwana nach Proc Aufruf???
    By AndreasH in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 22-09-02, 11:00
  5. BIGINT und ODBC
    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
  •