中间件解析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;
复制代码

 

posted on   癫狂编程  阅读(337)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
好的代码像粥一样,都是用时间熬出来的
点击右上角即可分享
微信分享提示