Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Apply DiffGram
Message
General information
Forum:
Visual FoxPro
Category:
XML, XSD
Title:
Miscellaneous
Thread ID:
00949029
Message ID:
00949268
Views:
14
It looks like it is still ignoring update conflicts.. (I haven't tried setting the ConflictCheckType to 4 yet)...
Am I missing something?
I'm attaching some sample code below. In the situation I have, changes are made to a cursor at the client side, sent as an xml diffgram to the back end where it needs to be applied to an SQL Server table.
The approach I'm using currently is illustrated below.. but ignores updateconflicts.
Two questions:
1. What can I do to catch update conflicts?
2. Is there a way I can directly apply the diffgram to SQL server, not via Cursor adapters?

-----------------
ACTIVATE WINDOW debug
SET STEP ON
SET MULTILOCKS on

*** FRONT END
csql = "Select * from users"
cConnect = "driver=SQL Server;Server=SERVER;Database=MYDATABASE;uid='';pwd=''"
nHandle = SQLSTRINGCONNECT(cConnect)
SQLEXEC(nHandle,cSQL,'Users')
CURSORSETPROP("Buffering" ,5)
SELECT Users
BROWSE && modify some data

oxml = CREATEOBJECT('xmladapter')
With oxml
.AddTableSchema('Users')
.IsDiffGram = .T.
lcSchemaLocation = ''
lisFile = .F.
lIncludeBefore =.T.
lChangesOnly = .T.
.ToXML('lcXML',lcSchemaLocation,lisFile,lIncludeBefore,lChangesOnly)
Endwith
USE IN Users
oxml = null

**** BACK END
* now create cursoradapter
* this would normally happen at the back end:
oxml = CREATEOBJECT('xmladapter')
oxml.LoadXml(lcXML)
loTable = oxml.tables[1]

ca = CREATEOBJECT('ca_users')
ca.DataSource = nHandle
ca.ConflictCheckType = 3
loTable.ChangesToCursor('Users') && this creates a buffered cursor from which the changes will be read
loTable.ApplyDiffgram('Users', ca) && this always overwrites the current data.. as if Force is on, even if back end data
* changed in the meantime..

SUSPEND
Return

Define Class ca_USERS As cursoradapter
Alias = "USERS"


Function Init
With This
.KeyFieldList = 'USERPK'
.Tables = 'USERS'
.UpdatableFieldList = [USERPK,USERNAME,UPWORD,UVALID,UADMIN,WHPK,ADDDTIME,ADDUSER,EDTDTIME,EDTUSER,USERLEVEL,UEMAIL]
.UpdateNameList = [USERPK USERS.USERPK,USERNAME USERS.USERNAME,UPWORD USERS.UPWORD,UVALID USERS.UVALID,UADMIN USERS.UADMIN,WHPK USERS.WHPK,]+ ;
[ADDDTIME USERS.ADDDTIME,ADDUSER USERS.ADDUSER,EDTDTIME USERS.EDTDTIME,EDTUSER USERS.EDTUSER,USERLEVEL USERS.USERLEVEL,UE]+ ;
[MAIL USERS.UEMAIL]
.CursorSchema = [USERPK N(10),USERNAME C(25),UPWORD C(25),UVALID I(4),UADMIN I(4),WHPK N(10),ADDDTIME T(8),ADDUSER N(10),EDTDTIME T(8),ED]+ ;
[TUSER N(10),USERLEVEL N(10),UEMAIL C(100)]
.cSql = [SELECT USERPK,USERNAME,UPWORD,UVALID,UADMIN,WHPK,ADDDTIME,ADDUSER,EDTDTIME,EDTUSER,USERLEVEL,UEMAIL FROM USERS]
.SelectCmd = [SELECT USERPK,USERNAME,UPWORD,UVALID,UADMIN,WHPK,ADDDTIME,ADDUSER,EDTDTIME,EDTUSER,USERLEVEL,UEMAIL FROM USERS WHERE USE]+ ;
[RPK = ?tpk]
.cWhere = [USERPK = ?tpk]
.UpdateCmd = [UPDATE USERS SET USERPK = ?USERS.USERPK, USERNAME = ?USERS.USERNAME, UPWORD = ?USERS.UPWORD, UVALID = ?USERS.UVALID,]+ ;
[ UADMIN = ?USERS.UADMIN, WHPK = ?USERS.WHPK, ADDDTIME = ?USERS.ADDDTIME, ADDUSER = ?USERS.ADDUSER, EDTDTIME = ?USER]+ ;
[S.EDTDTIME, EDTUSER = ?USERS.EDTUSER, USERLEVEL = ?USERS.USERLEVEL, UEMAIL = ?USERS.UEMAIL WHERE USERPK = ?USERS.USER]+ ;
[PK]
.InsertCmd = [INSERT INTO USERS (USERPK,USERPK,USERNAME,UPWORD,UVALID,UADMIN,WHPK,ADDDTIME,ADDUSER,EDTDTIME,EDTUSER,USERLEVEL,UEMAIL) ]+ ;
[VALUES (?USERS.USERPK, ?USERS.USERNAME, ?USERS.UPWORD, ?USERS.UVALID, ?USERS.UADMIN, ?USERS.WHPK, ?USERS.ADDDTIME, ?USER]+ ;
[S.ADDUSER, ?USERS.EDTDTIME, ?USERS.EDTUSER, ?USERS.USERLEVEL, ?USERS.UEMAIL)]
.DeleteCmd = [DELETE FROM USERS WHERE USERPK = ?USERS.USERPK]
ENDWITH
DoDefault()

Endfunc

Enddefine
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform