>LPARAMETERS toBusiness AS ccntBusinessData OF aBasicGen >* >LOCAL llFirstRecord, lcFieldlist, lnFields, lcValueList, lcUpdateList, lcFieldName >LOCAL lnNr, lcKeyFieldValue, llRetVal, lcQuery >* >*-- Compare the alias with the table. >SELECT (THIS.AliasName) >* >lcKeyFieldValue = EVALUATE(This.AliasName + "."+ THIS.KeyFieldName) >* >llFirstRecord = .T. >lcFieldList = "(" >lcValueList = "(" >lcUpdateList = "" >lnFields = 0 >* >IF THIS.cFieldList = "*" > * > *-- If we selected all fields to be updated, create the field list from all fields > *-- in the current cursor. > lnFields = FCOUNT(THIS.AliasName) > * > FOR lnNr = 1 TO m.lnFields > * > lcFieldName = UPPER(FIELD(m.lnNr, THIS.AliasName)) > * > IF UPPER(m.lcFieldName) $ UPPER(toBusiness.cForeignFieldList) > *-- The foreign field list with field names that should or cannot be updated. > LOOP > ENDIF > * > IF m.lcFieldName == UPPER(THIS.KeyFieldName) ; > OR INLIST(GETFLDSTATE(m.lcFieldName,THIS.AliasName),2,4) > * > lcFieldList = m.lcFieldList + IIF(m.llFirstRecord,"",",") + m.lcFieldName > lcValueList = m.lcValueList + IIF(m.llFirstRecord,"",",") + "?" + m.lcFieldName > * > lcUpdateList = m.lcUpdateList + IIF(m.llFirstRecord,"",",") + m.lcFieldName > lcUpdateList = m.lcUpdateList + "= ?" + m.lcFieldName > * > llFirstRecord = .F. > ENDIF > * > ENDFOR >ELSE > * > *-- Only use the fields that are specified in the field list. > lnFields = ALINES(laFields, THIS.cFieldList,.T.,",") > FOR lnNr = 1 TO lnFields > * > lcFieldName = UPPER(laFields[lnNr]) > * > IF lcFieldName == UPPER(THIS.KeyFieldName) ; > OR INLIST(GETFLDSTATE(m.lcFieldName,THIS.AliasName),2,4) > * > lcFieldList = m.lcFieldList + IIF(m.llFirstRecord,"",",") + m.lcFieldName > lcValueList = m.lcValueList + IIF(m.llFirstRecord,"",",") + "?" + m.lcFieldName > * > lcUpdateList = m.lcUpdateList + IIF(m.llFirstRecord,"",",") + m.lcFieldName > lcUpdateList = m.lcUpdateList + "= ?" + m.lcFieldName > * > llFirstRecord = .F. > * > ENDIF > ENDFOR >ENDIF >* >lcFieldList = m.lcFieldList + ")" >lcValueList = m.lcValueList + ")" >* >IF THIS.NewRecord > * > TEXT TO lcQuery TEXTMERGE NOSHOW > INSERT INTO <<THIS.TableName>> > <<lcFieldList>> VALUES <<lcValueList>> > ENDTEXT > * >ELSE > *-- Update the record. > TEXT TO lcQuery TEXTMERGE NOSHOW > UPDATE <<THIS.TableName>> > SET <<lcUpdateList>> > WHERE <<THIS.KeyFieldName>> = ?pcRecordKey > ENDTEXT > * > PRIVATE pcRecordKey > pcRecordKey = THIS.RecordKey > * >ENDIF >* >SELECT(THIS.AliasName) >llRetVal = THIS.DoSQL(m.lcQuery) >* >IF m.llRetVal > =TABLEUPDATE(.F.,.T.,THIS.AliasName) >ENDIF >* >RETURN llRetVal >Yes, that could work. In the case of a set of records, there is a separate cursor of edited records, so I could scan them and do that.