1

Konu: Table daki değişiklikleri kayıt etmek için!

Selamlar;

Table daki değişiklikleri kayıt etmek için cetin abinin bir kodu vardı.
Ama ben kaybettim gören duyan bilen varsa bir yardım edermi acaba.
Yada bu konudaki önerileriniz?
Hangi alanlarda işlem yapıldıysa o lanlarıdaki eski ve yeni durumu log olarak tutmak istiyorum.

Teş.

Bilmediğin Neyse Yanıldığındır.

2

Re: Table daki değişiklikleri kayıt etmek için!

selamlar tekrar.
Sesimi duyan varmı? tongue

Bilmediğin Neyse Yanıldığındır.

3

Re: Table daki değişiklikleri kayıt etmek için!

Hadi bakalim simdi hangi koddu acaba:)

GetFldState(), GetNextModified() var. XML diffgram var.

Database stored procedure olarak kullandiklarimdan birisi:

Visual Fox Pro
PROCEDURE SaveData

LPARAMETERS tcAlias, tnMode, tlForce
tlForce = IIF(PARAMETERS()<3, .T., tlForce) && Default to .T.
tnMode = IIF(VARTYPE(tnMode)='N',tnMode,2) && Default to 2
IF ( CURSORGETPROP("Buffering",tcAlias)>1 )
    logmodification(tcAlias)
    RETURN ( TABLEUPDATE(tnMode,tlForce,tcAlias) )
endif
 
Procedure _XMLUPDATEGRAM
Lparameters tcAlias
Local lnRec As Integer, Operation As String, ;
    tablename As String, lcUpdateGramXml As String, ;
    ix as integer, jx as Integer
LOCAL ARRAY arrStruc[1]
 
Select(tcAlias)
Locate
Afields(arrStruc) && Afields return 16 columns
LOCAL ARRAY arrDataGram[ALEN(arrStruc,1)+2,ALEN(arrStruc,2)]
* Fill first 2 rows from first row of arrStruc
ACOPY(arrStruc,arrDataGram,1,ALEN(arrStruc,2),1)
ACOPY(arrStruc,arrDataGram,1,ALEN(arrStruc,2),ALEN(arrStruc,2)+1)
* Fill rest with arrStruc
ACOPY(arrStruc,arrDataGram,1,-1,ALEN(arrStruc,2)*2+1)
* Modify name and types for first 2 rows
arrDataGram[1,1]="Tablename"
arrDataGram[1,2]="C"
arrDataGram[1,3]=30
arrDataGram[1,4]=0
arrDataGram[2,1]="Operation"
arrDataGram[2,2]="C"
arrDataGram[2,3]=10
arrDataGram[2,4]=0
FOR ix=1 TO 2 && Clear out data like database name, default
    FOR jx = 7 TO 16
        arrDataGram[ix,jx] = ""
    endfor
endfor
Create Cursor _DataGram_ From Array arrDataGram
 
m.tablename = Upper(tcAlias)
Select (tcAlias)
lnRec = 0
Do While .T.
    lnRec=Getnextmodified(lnRec,tcAlias,.T.)
    If lnRec=0
        Exit
    Endif
    Go lnRec
    Scatter MEMVAR memo
    Do Case
        Case Deleted()
            m.Operation = "DELETED"
        Case lnRec>0
            m.Operation = "UPDATED"
        Case lnRec<0
            m.Operation = "INSERTED"
        Otherwise
            Exit
    Endcase
    Insert Into _DataGram_ From MEMVAR
Enddo
Select _DataGram_
Cursortoxml('_datagram_','lcUpdateGramXml',2,0,0,"")
Use In '_DataGram_'
Return lcUpdateGramXml
 
Procedure LogModification
Lparameters tcAlias
Local lcAlias
lcAlias = Alias()
If !(CursorGetProp("Buffering",tcAlias)>1 And Set("Multilocks")='ON')
    Return
Endif
Local lcXML As String, oZipper As 'Zipit' Of 'Zipper.prg'
 
lcXML = _XMLUPDATEGRAM(tcAlias)
 
oZipper = Newobject('ZipIt','Zipper.prg')
If oZipper.CompressString(lcXML)
 
    Insert Into rollcaller!bkplog ;
        (tablename, ucrc, usize, ccrc, csize, backup) ;
        VALUES ;
        (Upper(tcAlias), Sys(2007,lcXML), Len(lcXML), ;
        SYS(2007,oZipper.cCOMPRESSED), oZipper.nCOMPRESSEDSIZE, ;
        oZipper.cCOMPRESSED)
    Use In 'bkplog'
Endif
If !Empty(lcAlias) And Used(lcAlias)
    Select (lcAlias)
Endif
Endproc

4

Re: Table daki değişiklikleri kayıt etmek için!

sen engüzelini seçmişsindir.
teş.

Bilmediğin Neyse Yanıldığındır.