This is more or less what I'm doing. In reality, The column and table names are variables
and ls_state is built from those, and why I use SetItem instead of lds_obj.Object.col1
string ls_err1, ls_err2, ls_modstr, ls_state, ls_syntax
nds_ds lds_obj
int li_rc
long ll_row
ls_state = "select keycol, col1,col2,col3 from owner.table_name"
ls_syntax = sqlca.SyntaxFromSQL(ls_state,"Style(Type=Grid)", ls_err1)
lds_obj = create nds_ds
lds_obj.create(ls_syntax, ls_err2)
ls_modstr = "Datawindow.Table.UpdateWhere='0' Datawindow.Table.UpdateTable='owner.table_name'" + &
" Datawindow.Table.UpdateKeyInPlace=Yes keycol.key=Yes col1.update=Yes col2.Update=Yes col3.update=Yes"
ls_err1 = lds_obj.Modify(ls_modstr)
lds_obj.settransobject(sqlca)
ll_row = lds_obj.insertrow(0)
lds_obj.SetItem(ll_row,'keycol','keyvalue')
lds_obj.SetItem(ll_row,'col1','value1')
lds_obj.SetItem(ll_row,'col2','value2')
lds_obj.SetItem(ll_row,'col3','value3')
lds_obj.SetItemStatus(ll_row,0,Primary!,DataModified!)
li_rc = lds_obj.update()