• 中间件解析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;
  • 相关阅读:
    虚拟化(五):vsphere高可用群集与容错(存储DRS是一种可用于将多个数据存储作为单个数据存储群集进行管理的功能)
    vmware 桌面虚拟化 horizon view 介绍(使用微软的RDP协议或vmware 专有的PCoIP协议,连接到虚拟桌面,并且可以使用本地的USB设备、本地存储)
    Delphi之萝莉调教篇
    编写自定义PE结构的程序(如何手写一个PE,高级编译器都是编译好的PE头部,例如MASM,TASM等,NASM,FASM是低级编译器.可以自定义结构)
    localStore的storage事件
    对称密码体制和非对称密码体制
    Span<T>和ValueTuple<T>性能是.Net Core非常关键的特性
    分布式高并发下Actor模型
    公众号及H5支付
    BIOS(Basic Input/Output System)是基本输入输出系统的简称
  • 原文地址:https://www.cnblogs.com/jijm123/p/11300957.html
Copyright © 2020-2023  润新知