[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Sep 2006
    Beiträge
    11

    Triggerbuffer und NullBytes

    Hallo zusammen,

    ich habe eine Frage zum Trigger-Buffer der unter QSYSINC/QRPGLESRC/TRGBUF definiert ist. Wir verwenden Datumsfelder, die nullfähig sind. Bisher mußte ich das Nullbyte eines Datumsfeldes im Neusatz auf '0' setzen, wenn ein Wert zugewiesen wurde(Die Nullbyte-Felder waren im Triggerbuffer einzeln definiert). Wie wird nun in der o.a. Datenstruktur das Nullbyte eines Feldes auf '0' gesetzt? Ist das überhaupt möglich?

    Viele Grüße
    Norbi

  2. #2
    Registriert seit
    Nov 2003
    Beiträge
    2.403
    Probier mal mit EVAL %NULLIND(Feld) = *ON, siehe hier.

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Im Trigger-Buffer ist sowohl das Offset als auch die Länge für die NULL Byte Map hinterlegt.
    In dieser NULL Byte Map ist für jedes Feld 1 Byte vorgesehen, das entweder auf '0' = Kein NULL-Wert oder '1' = NULL-Wert steht.

    Um einen NULL-Wert im Trigger zu setzten, muss das entsprechende Byte von '0' auf '1' gesetzt werden. (bzw. sofern Du einen Wert in ein Feld eintragen willst und das NULL Byte Flag auf '1' steht, muss es zunächst auf '0' gesetzt werden.

    Beachte, dass wenn Du den gleichen Datensatz ändern willst, beim Registrieren des Triggers (ADDPFTRG) die Option ALWREPCHG auf *YES gesetzt werden muss.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  4. #4
    Registriert seit
    Sep 2006
    Beiträge
    11
    Hallo Brigitta,

    das habe ich ja verstanden, aber wie spreche ich das NullbyteFeld eines Feldes an? Eval %Nullind(Neu_Datum) = *on kann doch nicht richtig sein.

    Norbi

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Die RPG Built-In-Function %NULLIND kann nur verwendet werden um einen NULL-Wert in einem Datensatz einer Datei, die in den F-Bestimmungen definiert wurde zu setzen.
    Zum Setzen eines NULL-Wertes in einem Datensatz in einem Trigger-Programm kann dieser Wert nicht verwendet werden.

    Im Trigger-Programm muss die NULL-Byte-Map direkt geändert werden.
    Durch den Offset weißt Du ja wo die NULL-Byte-Map steht und wie lange sie ist.
    Über diese NULL-Byte-Map legst Du eine Feldgruppe mit 1-stelligen alphanumerischen Elementen. Jetzt musst Du nur noch die Position / Nr. des Feldes im Datensatz wissen und das entsprechende Feldgruppen-Element zu ändern (wenn also Dein Datums-Feld das 3. Feld ist, musst Du das 3. Element ändern).

    So in etwa kann das Ganze aussehen (nicht getestet!)
    Code:
     *Prototypen und Copy Strecken
     /COPY QPROLESRC,MyTrgPgm
     /COPY QSYSINC/QRPGLESRC,TrgBuf   
    D DSTrgBuff       DS                  Qualified based(DummyPtr) 
    D  Fix                                likeDS(QDBTB)             
    D  Vary                      65000A  
                                                           
     * Procedure Interface                                               
    D MyTrgPgm        PI                                                 
    D   ParTrgBuf                         LikeDS(DSTrgBuff)              
    D   ParTrgLen                   10I 0                   Const        
     ***********************************************
    D NeuerSatz     E DS                  ExtName(MyFile) Qualified  
    D                                     based(PtrNeuerSatz) 
               
    D NullByteNeu     DS                  Qualified based(PtrNullByteNeu)            
    D   ArrInd                       1A   Dim(32767)                       
      ***********************************************
     /Free                                                                 
                                                                           
         PtrNeuerSatz         = %Addr(ParTrgBuf) + ParTrgBuf.Fix.QDBNRO;   
         PtrNullByteNeu       = %Addr(ParTrgBuf) + ParTrgBuf.Fix.QDBNRNBM; 
                                                                           
         NeuerSatz.MyField     = 'Was auch immer';                                       
                                                                           
         NullByteNeu.ArrInd(3) = '1';                                       
                                                                           
        Return;                                                            
     /End-Free
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •