中间件解析FDMEMTABLE.delta生成SQL的方法
遍历Delta.DataView.Rows,Delta.DataView.Rows是记录的行集,由行组成 TFDDatSRow,即是一行记录的对象 TFDDatSRow的方法: GetData(),SetData()获取一行一列的数值或设置一行一列的数值 fdmemtable.delta直接提交给中间件,中间件可以解析fdmemtable.delta生成 INSERT OR UPDATE SQL { 引用 System.JSON; 函数名称:DBToJSON(TFDMemTable 数据转成SQL脚本更新) 参数: DB:TFDMemTable数据集 sTable:更新表名 sKey:关键字段,写法:ID,Name 以逗号区分 sNoField:不需要修改或增加的字段: 写法:ID,Sex 以逗号区分 } function DBToJSON(DB:TFDMemTable;sTable:string;sKey:String;sNoField:String):String; Var ItemKey,ItemNoField:TStringlist; JA:TJSONArray; sField,sValue,sSQL,sTmp,sName:string; i,j:Integer; begin JA:=TJSONArray.Create; ItemKey:=TStringlist.Create; ItemNoField:=TStringlist.Create; ItemKey.Delimiter:=','; ItemKey.DelimitedText:=sKey; ItemNoField.Delimiter:=','; ItemNoField.DelimitedText:=sNoField; sField:=''; sValue:=''; sSQL:=''; with DB.Delta.DataView.Rows do begin for I := 0 to Count-1 do begin //判断数据的操作状态 :插入 if ItemsI[i].RowState=TFDDatSRowState.rsInserted then begin //循环对应的数据字段 for j := 0 to DB.Fields.Count-1 do begin //获取字段名称 sName:=DB.Fields[J].FieldName; //排除不需要插入的字段信息 if ItemNoField.IndexOf(sName)>-1 then Continue; //判断字段的数据类型 case DB.Fields[J].DataType of ftString,ftWideString,ftMemo: sTmp:=VarToStr(ItemsI[i].GetValues(sName)).QuotedString; ftSmallint, ftInteger,ftFloat, ftCurrency, ftBCD: sTmp:=VarToStr(ItemsI[i].GetValues(sName)); ftDateTime: begin sTmp:=VarToStr(ItemsI[i].GetValues(sName)); //日期如何没有填写默认为Null if sTmp='' then sTmp:='Null' else sTmp:=FormatDateTime('yyyy-mm-dd hh:ss:mm',StrToDateTime(sTmp)).QuotedString; end; ftBoolean: begin if ItemsI[i].GetValues(sName)=True then sTmp:='1' else sTmp:='0'; end; else sTmp:=VarToStr(ItemsI[i].GetValues(sName)).QuotedString; end; //累积字段和插入值 sField:=sField+sName+','; sValue:=sValue+sTmp+','; end; //拼接成SQL并插入到数组中 JA.Add('Insert Into '+sTable+' ('+Copy(sField,1,Length(sField)-1)+')'+#13#10 +' Values('+Copy(sValue,1,Length(sValue)-1)+')'+#13#10 ) ; end //判断数据的操作状态 :修改 else if ItemsI[i].RowState in [TFDDatSRowState.rsModified, TFDDatSRowState.rsEditing] then begin for j := 0 to DB.Fields.Count-1 do begin sName:=DB.Fields[J].FieldName; //排除不需要插入的字段信息 if ItemNoField.IndexOf(sName)>-1 then Continue; //判断字段的数据类型 case DB.Fields[J].DataType of ftString,ftWideString,ftMemo: sTmp:=VarToStr(ItemsI[i].GetValues(sName)).QuotedString; ftSmallint, ftInteger,ftFloat, ftCurrency, ftBCD: sTmp:=VarToStr(ItemsI[i].GetValues(sName)); ftDateTime: begin sTmp:=VarToStr(ItemsI[i].GetValues(sName)); if sTmp='' then sTmp:='Null' else sTmp:=FormatDateTime('yyyy-mm-dd hh:ss:mm',StrToDateTime(sTmp)).QuotedString; end; ftBoolean: begin if ItemsI[i].GetValues(sName)=True then sTmp:='1' else sTmp:='0'; end; else sTmp:=VarToStr(ItemsI[i].GetValues(sName)).QuotedString; end; //累积更新字段值 sField:=sField+sName+'='+sTmp+','; //修改数据关键字段,条件值 if ItemKey.IndexOf(sName)>-1 then sSQL:=sSQL+' And '+ sName+' = '+VarToStr(ItemsI[i].GetData(sName,rvOriginal)); end; //拼接成SQL并插入到数组中 JA.Add('Update '+sTable+' Set '+Copy(sField,1,Length(sField)-1)+' Where '+Copy(sSQL,5,Length(sSQL)) ); end else if ItemsI[i].RowState in [TFDDatSRowState.rsDeleted] then begin sSQL:=''; //删除数据关键字段,条件值 for J := 0 to ItemKey.Count-1 do begin sValue:=ItemsI[i].GetValues(ItemKey.Strings[j]); if sValue.Trim<>'' then sSQL:=sSQL+' And '+ ItemKey.Strings[j]+' = '+QuotedStr(sValue.Trim); end; //拼接成SQL并插入到数组中 if sSQL<>'' then JA.Add('Delete '+sTable+' Where '+Copy(sSQL,5,Length(sSQL)) ); end; end; end; Result:=JA.ToString; FreeAndNil(JA); FreeAndNil(ItemKey); FreeAndNil(ItemNoField); end;
好的代码像粥一样,都是用时间熬出来的
分类:
Delphi
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)