if li = 1 dbsetprop(pViewName+'.'+aFlds[li,1], 'Field', 'KeyField', .T.) else dbsetprop(pViewName+'.'+aFlds[li,1], 'Field', 'KeyField', .F.) endifThe code assumes that the first column is the PK. I wouldn't rely on this assumption. You could use the stored procedure sp_pkeys to get the key field(s).
>* 1. Create the connection and set its propeties. This works fine. > >* 2. Create views with the selects I have in a table >* Typical mRemoteSel is [SELECT * from dbo.plsis] or [SELECT * from dbo.plsis plsis] >lc = [CREATE SQL VIEW "]+ALLTRIM(TablDict.cViewName) ; > + [" REMOTE CONNECTION "coneccion" AS ] ; > + ALLTRIM(TablDict.mRemoteSel) >&lc > >* Populate aFlds with the information about the updateable fields from the view >... >AFIELDS('aFlds',lcViewName) && Populate the array with the field definitions >* Remove fields that are not updateable >SetViewProperties(lcViewName,lcMainTable,.F.) > > >PROCEDURE SetViewPropeties >LPARAMETERS pViewName, pSourceTable, pPKUpdateable > >DBSetProp(pViewName, 'View', 'UpdateType', 1) >DBSetProp(pViewName, 'View', 'WhereType', 1) && Key only >DBSetProp(pViewName, 'View', 'FetchMemo', .T.) >DBSetProp(pViewName, 'View', 'SendUpdates', .T.) >DBSetProp(pViewName, 'View', 'UseMemoSize', 255) >DBSetProp(pViewName, 'View', 'FetchSize', 100) >DBSetProp(pViewName, 'View', 'MaxRecords', -1) >DBSetProp(pViewName, 'View', 'Tables', pSourceTable) >DBSetProp(pViewName, 'View', 'Prepared', .F.) >DBSetProp(pViewName, 'View', 'CompareMemo', .T.) >DBSetProp(pViewName, 'View', 'FetchAsNeeded', .F.) >DBSetProp(pViewName, 'View', 'FetchSize', 100) >DBSetProp(pViewName, 'View', 'Comment', "") >DBSetProp(pViewName, 'View', 'BatchUpdateCount', 1) >DBSetProp(pViewName, 'View', 'ShareConnection', .F.) >for li = 1 to alen(aFlds,1) > if li = 1 > dbsetprop(pViewName+'.'+aFlds[li,1], 'Field', 'KeyField', .T.) > else > dbsetprop(pViewName+'.'+aFlds[li,1], 'Field', 'KeyField', .F.) > endif > if li <> 1 or (pPKUpdateable) > dbsetprop(pViewName+'.'+aFlds[li,1], 'Field', 'Updatable', .T.) > dbsetprop(pViewName+'.'+aFlds[li,1], 'Field', 'UpdateName', pSourceTable+'.'+aFlds[li,1]) > DO CASE > CASE aFlds[li,2]$'NF' > dbsetprop(pViewName+'.'+aFlds[li,1], 'Field', 'DataType', ; > aFlds[li,2]+'('+ltrim(str(aFlds[li,3]))+','+ltrim(str(aFlds[li,4]))+')') > CASE aFlds[li,2]='C' > dbsetprop(pViewName+'.'+aFlds[li,1], 'Field', 'DataType', ; > aFlds[li,2]+'('+ltrim(str(aFlds[li,3]))+')') > CASE aFlds[li,2]='B' > dbsetprop(pViewName+'.'+aFlds[li,1], 'Field', 'DataType', ; > aFlds[li,2]+'('+ltrim(str(aFlds[li,4]))+')') > CASE aFlds[li,2]$'DTIMGL' > dbsetprop(pViewName+'.'+aFlds[li,1], 'Field', 'DataType',aFlds[li,2]) > OTHERWISE > dbsetprop(pViewName+'.'+aFlds[li,1], 'Field', 'DataType', ; > aFlds[li,2]+'('+ltrim(str(aFlds[li,3]))+','+ltrim(str(aFlds[li,4]))+')') > ENDCASE > else > dbsetprop(pViewName+'.'+aFlds[li,1], 'Field', 'Updatable', .F.) > endif >endfor >