• 中间件解析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;
    
  • 相关阅读:
    springboot 时间戳和 数据库时间相差14个小时
    财富的起源读书笔记1
    高性能mysql读书笔记1
    springboot项目使用 apollo 配置中心
    MongoDB图形化管理工具
    oracle体系结构详解
    三、oracle 体系结构
    用DOS批处理实现FTP自动上传、下载、清理文件
    ORA-01033:ORACLE initialization or shutdown in progress
    从WEB SERVICE 上返回大数据量的DATASET
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/5129649.html
Copyright © 2020-2023  润新知