unit UMemtableToSql;

interface

uses SysUtils, Classes, DB, kbmMemTable, Variants, Dialogs, SuperObject;

function GenerateDataToInsertSQL(memtbale: TkbmMemTable; UpdateTableName: AnsiString; NoUpdateFields: TStrings): TStringList; //插入数据
//不需要更新的字段描述 [NoUpdateFields]
function GenerateDataToModifySQL(memtbale: TkbmMemTable; UpdateTableName: AnsiString; NoUpdateFields: TStrings; sWhereFiled: string): TStringList; //编辑数据

function GenerateDataToDeleteSQL(memtbale: TkbmMemTable; UpdateTableName: AnsiString; KeyFields: TStrings; sWhereFiled: string): TStringList; //删除数据

function ConvertStringsToJSON(ss: TStrings): WideString;

function ApplyInsertMemtable(memtbale: TkbmMemTable; UpdateTableName: AnsiString):AnsiString;

implementation

uses UBizServerModule;
function ExistString(subString: string;
sList: TStrings): boolean;
var
i: integer;
begin
result := false;
for i := 0 to sList.Count - 1 do
begin
if UpperCase(subString) = UpperCase(sList[i]) then
result := true;
end;

end;

procedure CustomSysdate(var ss: string;
const sField, DateTimeType: string);
begin
if (trim(DateTimeType) = '') or (UpperCase(DateTimeType) = 'ORACLE') then
ss := ss + sField + ' sysdate , ';

if UpperCase(DateTimeType) = 'MYSQL' then
ss := ss + sField + ' sysdate() , ';

if UpperCase(DateTimeType) = 'SQLSERVER' then
ss := ss + sField + ' GetDate() , ';

if UpperCase(DateTimeType) = 'SQLITE' then
ss := ss + sField + ' datetime(''now'') , ';

end;

procedure CustomTo_date(var sSet: string;
const sField, DateTimeType, vNew: string);
begin
if (trim(DateTimeType) = '') or (UpperCase(DateTimeType) = 'ORACLE') then
sSet := sSet + sField + ' to_date(''' + (vNew) + ''' , ''yyyy-MM-dd HH24:mi:ss''), ';
// sSet := sSet + sField + uHHConst.HHUniDateStr(vNew) ;

if UpperCase(DateTimeType) = 'MYSQL' then
sSet := sSet + sField + ' ''' + (vNew) + ''' , ';

if UpperCase(DateTimeType) = 'SQLITE' then
sSet := sSet + sField + ' ''' + (vNew) + ''' , ';

if UpperCase(DateTimeType) = 'SQLSERVER' then
sSet := sSet + sField + ' ''' + (vNew) + ''' , ';

end;

function CustomBoolean(vNew: string;
const sField, DateTimeType: string): string;
begin
Result := vNew;
if (trim(DateTimeType) = '') or (UpperCase(DateTimeType) = 'ORACLE') or (
UpperCase(DateTimeType) = 'MYSQL') then
begin
if UpperCase(vNew) = 'TRUE' then Result := '''1''';
if UpperCase(vNew) = 'FALSE' then Result := '''0''';
end;

{ ' ''' + VarToStr(vNew) + '''
if DateTimeType = 'MYSQL' then
begin
if vNew = 'true' then Result := '''1''' ;
if vNew = 'false' then Result := '''0''';
end;

if DateTimeType = 'SQLSERVER' then
ss := ss + sField + ' GetDate() , ';
}

end;

function GenerateDataToInsertSQL(memtbale: TkbmMemTable; UpdateTableName: AnsiString; NoUpdateFields: TStrings): TStringList;
var
i: integer;
s, sWhere, sFieldNames, sValues: string;
FDataToInsertSQL: TStringList;
vNew: variant;
DateTimeType: string;
begin
DateTimeType := 'MYSQL';
FDataToInsertSQL := TStringList.Create;
FDataToInsertSQL.Clear;
Result := nil;

if UpdateTableName = '' then
begin
ShowMessage('UpdateTableName 不能为空!');
exit;
end;
with memtbale do
begin
First;

while not EOF do
begin
s := 'insert into ' + UpdateTableName;
sWhere := ' ';
sFieldNames := ' (';
sValues := ' VALUES (';

for i := 0 to FieldCount - 1 do
begin
if NoUpdateFields.IndexOf(Fields[i].FieldName) < 0 then
if (not (Fields[i].DataType in kbmBinaryTypes)) or (Fields[i].DataType = ftMemo) then
begin
if UpperCase(Fields[i].FieldName) = 'ID_AUTO' then continue;
if UpperCase(Fields[i].FieldName) = 'ID' then continue;

vNew := Fields[i].Value;
if not (VarIsNull(vNew)) then
begin
sFieldNames := sFieldNames + Fields[i].FieldName + ', ';
if (Fields[i].DataType = ftBoolean) then
begin
//if vNew = 'true' then vNew := '1';
// if vNew = 'false' then vNew := '0';
vNew := CustomBoolean(vNew, '', DateTimeType);
sValues := sValues + VarToStr(vNew) + ', '
end
else if (Fields[i].DataType = ftDateTime) then
begin
if (Fields[i].FieldName = 'OPT_UPDATE_TIME') or
(Fields[i].FieldName = 'STOCK_OUT_TIME') or
(Fields[i].FieldName = 'STOCK_IN_TIME')
then
begin
{if DateTimeType = 'MYSQL' then
sValues := sValues + ' sysdate() , ';

if (trim(DateTimeType) = '') or (DateTimeType = 'ORACLE') then
sValues := sValues + ' sysdate , '; }
CustomSysdate(sValues, '', DateTimeType);
end
else
if (Fields[i].FieldName = 'update_time') or (Fields[i].FieldName = 'sample_time') then
begin
{if (trim(DateTimeType) = '') or (DateTimeType = 'ORACLE') then
sValues := sValues + ' sysdate , ';

if DateTimeType = 'MYSQL' then
sValues := sValues + ' sysdate() , ';

if DateTimeType = 'SQLSERVER' then
sValues := sValues + ' GetDate() , '; }
CustomSysdate(sValues, '', DateTimeType);
end
else
begin
{if (trim(DateTimeType) = '') or (DateTimeType = 'ORACLE') then
sValues := sValues + ' to_date(''' + VarToStr(vNew) + ''' , ''yyyy-MM-dd HH24:mi:ss''), ';

if DateTimeType = 'MYSQL' then
sValues := sValues + '''' + VarToStr(vNew) + ''' , ';

if DateTimeType = 'SQLSERVER' then
sValues := sValues + '''' + VarToStr(vNew) + ''' , ';
}
CustomTo_date(sValues, '', DateTimeType, VarToStr(vNew));
end;
end
else if (Fields[i].DataType = ftInteger) or (Fields[i].DataType = ftCurrency) or (Fields[i].DataType = ftFloat) then
begin
sValues := sValues + VarToStr(vNew) + ', ';
end
else
sValues := sValues + ' ''' + VarToStr(vNew) + ''', '
end;

{//一般不会用到这个,因为SID一般不能为空
if (VarIsNull(vNew)) then
begin
if Fields[i].FieldName = 'SID' then
begin
//处理Sequence
sFieldNames := sFieldNames + Fields[i].FieldName + ', ';
sValues := sValues + (DataSet as TkbmMemTableHH).UpdateTableName + '_SEQ.nextval, ';
end;
end; }
end;

end;

if sFieldNames = '' then exit;
if sValues = '' then exit;

if sWhere <> '' then sWhere := ' where ' + sWhere;
if sFieldNames <> '' then
begin
sFieldNames := Copy(sFieldNames, 1, Length(sFieldNames) - 2) + ') ';
end;
if sValues <> '' then
begin
sValues := Copy(sValues, 1, Length(sValues) - 2) + ') ';
end;

FDataToInsertSQL.Add(s + sFieldNames + sValues);
Next;
end;
end;

Result := FDataToInsertSQL;

end;

function GenerateDataToModifySQL(memtbale: TkbmMemTable; UpdateTableName: AnsiString; NoUpdateFields: TStrings; sWhereFiled: string): TStringList;
var
i: integer;
s, sWhere, sSet: string;
FDataToModifySQL: TStringList;
vNew: variant;
DateTimeType: string;
begin
Result := nil;
DateTimeType := 'MYSQL';
if UpdateTableName = '' then
begin
ShowMessage('UpdateTableName 不能为空!');
exit;
end;

FDataToModifySQL := TStringList.Create;
FDataToModifySQL.Clear;
with memtbale do
begin
First;
while not EOF do
begin
s := 'Update ' + UpdateTableName;
sWhere := ' ';
sSet := ' ';

for i := 0 to FieldCount - 1 do
begin
if NoUpdateFields.IndexOf(Fields[i].FieldName) < 0 then
if (not (Fields[i].DataType in kbmBinaryTypes)) or (Fields[i].DataType = ftMemo) then
begin
if UpperCase(Fields[i].FieldName) = 'ROWID' then continue;
if UpperCase(Fields[i].FieldName) = 'ID_AUTO' then continue;
if UpperCase(Fields[i].FieldName) = 'ID' then continue;

vNew := Fields[i].Value;
//vOld := OrigValues[i];

if (not (VarIsNull(vNew))) then
//if vNew <> vOld then
begin
//if not ExistString(Fields[i].FieldName, (DataSet as TkbmMemTableHH).KeyFields) then
begin
if (Fields[i].DataType = ftBoolean) then
begin
// if vNew = 'true' then vNew := '1';
//if vNew = 'false' then vNew := '0';
vNew := CustomBoolean(vNew, '', DateTimeType);
sSet := sSet + Fields[i].FieldName + ' = ' + VarToStr(vNew) + ', '
end
else if (Fields[i].DataType = ftDateTime) then
begin
if Fields[i].FieldName = 'OPT_UPDATE_TIME' then
//sSet := sSet + Fields[i].FieldName + ' = sysdate , '
CustomSysdate(sSet, Fields[i].FieldName + ' = ',
DateTimeType)
else
if (Fields[i].FieldName = 'update_time') or (Fields[i].FieldName = 'sample_time') then
begin
if DateTimeType <> 'SQLSERVER' then
sSet := sSet + Fields[i].FieldName + ' = GetDate() , ';

CustomSysdate(sSet, Fields[i].FieldName + ' = ', DateTimeType);
end
else
begin
CustomTo_date(sSet, Fields[i].FieldName + ' = ', DateTimeType, VarToStr(vNew));
end;

end
else if (Fields[i].DataType = ftInteger) or (Fields[i].DataType = ftCurrency) or (Fields[i].DataType = ftFloat) then
begin
sSet := sSet + Fields[i].FieldName + ' = ' + VarToStr(vNew) + ', '
end
else
sSet := sSet + Fields[i].FieldName + ' = ''' + VarToStr(vNew) + ''', '
end;
end;

end;

{if ExistString(Fields[i].FieldName, KeyFields) then
begin
if trim(sWhere) <> '' then
sWhere := sWhere + ' and ' + Fields[i].FieldName + ' = ' + VarToStr(vOld)
else
sWhere := sWhere + Fields[i].FieldName + ' = ' + VarToStr(vOld);

end; }

sWhere := ' ' + sWhereFiled + ' = ' + FieldByName('' + sWhereFiled + '').AsString;
end;

if trim(sSet) = '' then exit;
if trim(sWhere) = '' then
begin
ShowMessage('sWhere 为空!');
exit;
end;

if sWhere <> '' then sWhere := ' where ' + sWhere;
if sSet <> '' then
begin
sSet := ' Set ' + Copy(sSet, 1, Length(sSet) - 2); ;
end;

FDataToModifySQL.Add(s + sSet + sWhere);
Next;

end;
end;
//(DataSet as TkbmMemTableHH).ModifySQL := s + sSet + sWhere;
Result := FDataToModifySQL;

end;

function GenerateDataToDeleteSQL(memtbale: TkbmMemTable; UpdateTableName: AnsiString; KeyFields: TStrings; sWhereFiled: string): TStringList;
var
i: integer;
s, sWhere: string;
v: variant;
FDataToDeleteSQL: TStringList;
begin
FDataToDeleteSQL := TStringList.Create;
FDataToDeleteSQL.Clear;
Result := nil;

if UpdateTableName = '' then
begin
ShowMessage('UpdateTableName 不能为空!');
exit;
end;
with memtbale do
begin
First;

while not EOF do
begin
s := 'Delete from ' + UpdateTableName;
sWhere := '';

for i := 0 to FieldCount - 1 do
begin
v := Fields[i].Value;

if UpperCase(Fields[i].FieldName) = 'ROWID' then continue;
if UpperCase(Fields[i].FieldName) = 'ID_AUTO' then continue;
if UpperCase(Fields[i].FieldName) = 'ID' then continue;

if ExistString(Fields[i].FieldName, KeyFields) then
sWhere := sWhere + Fields[i].FieldName + ' = ' + VarToStr(v) + ' and ';
end;

if sWhere <> '' then sWhere := ' where ' + Copy(sWhere, 1, Length(sWhere) - 4);
// (DataSet as TkbmMemTableHH).DeleteSQL := s + sWhere;

if sWhere = '' then sWhere := ' where ' + sWhereFiled + ' = ' + FieldByName(sWhereFiled).AsString;
FDataToDeleteSQL.Add(s + sWhere);
Next;
end;
end;

Result := FDataToDeleteSQL;
end;

// 转换成json
function ConvertStringsToJSON(ss: TStrings): WideString;
var
jo: ISuperObject;
i: Integer;
begin
jo := TSuperObject.Create;

for i := 0 to ss.Count - 1 do
jo.S['YHYSQL' + IntToStr(i)] := ss[i];

Result := jo.AsString;

end;

//提交数据到服务器,进行操作
function ApplyInsertMemtable(memtbale: TkbmMemTable; UpdateTableName: AnsiString):AnsiString;
var sList:TStringList;
vjson:string;
begin
sList:=TStringList.Create;
sList:=GenerateDataToInsertSQL(memtbale,UpdateTableName,sList);
vjson:=ConvertStringsToJSON(sList);
Result:=fBizServerModule.getBaseService.ExecJsonSqls(vjson);
sList:=nil;
end;

end.

delphi中Tkbmmemtable数据转成SQL脚本的更多相关文章

  1. [软件共享]将数据库中的数据导出为SQL脚本

    可以直接将数据库中的数据导出为脚本,并可以自己设置过滤条件.使用方法很简单,不在多说了.下面是软件截图.123 下载:http://files.cnblogs.com/pw/mssql2.rar

  2. SQL Server将数据导出到SQL脚本文件

    http://www.studyofnet.com/news/list-8883.2-1-4.html 一.SQL Server 2008将数据导出到SQL脚本文件 1.打开SQL Server200 ...

  3. Excel数据转化为sql脚本

    在实际项目开发中,有时会遇到客户让我们把大量Excel数据导入数据库的情况.这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库. 1 在数据前插入一列单元格,用来拼写sql语句. 具体 ...

  4. [转]Excel数据转化为sql脚本

    在实际项目开发中,有时会遇到客户让我们把大量Excel数据导入数据库的情况.这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库. 1 在数据前插入一列单元格,用来拼写sql语句. 具体 ...

  5. 使用excel中的数据快速生成sql语句

    在小公司的话,总是会有要开发去导入历史数据(数据从旧系统迁移到新系统上)的时候.这个时候,现场实施或客户会给你一份EXCEL文档,里面包含了一些别的系统上的历史数据,然后就让你导入到现在的系统上面去. ...

  6. 【原创】SQLServer将数据导出为SQL脚本的方法

    最近很多同学问到一个问题,如何将MSSQLServer的数据库以及里面的数据导出为SQL脚本,主要问的是MSSQLServer2000和2005,因为2008的管理器已经有了这个功能,2000和200 ...

  7. OC中如何把字典中的数据拼接成url字符串

    在使用objective-c语言开发iOS应用中,会向服务器通过URL请求一些数据,因此对URL的拼接肯定少不了.而在iOS中,我们一般是通过将字典中的数据拼接成我们要请求的URL字符串,那这个是怎么 ...

  8. SQLserver将查询的字段中的数据 拼接成字符串用逗号隔开

    ,,'') 将查询的字段中的数据 拼接成字符串用逗号隔开

  9. 在EA中将画出的ER图转换成SQL脚本

    在进行数据库设计的时候,想着正好安装着EA软件呢,看能不能用EA画ER模型.结果发现不仅能画.并且还能进行整套数据库设计(生成SQL脚本). 以下以机房收费系统用户--学生为例.学生能够查看剩余金额. ...

随机推荐

  1. spring boot 2.0 提示 No primary or default constructor found for interface Pageable 解决办法

    在SpringBoot 2.0 以前,我们会配置以下类 @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter ...

  2. X86逆向14:常见的脱壳手法

    本章节内容将介绍软件的脱壳技术.什么是加壳?加壳就是用来压缩或者保护软件不被非法修改破解的一种工具,而脱壳就是将已经加壳的程序从壳中剥离出来,既然能给程序进行加壳,那也就会有相应的脱壳方法,本节课我们 ...

  3. nodejs+gulp+webpack基础知识

    nodejs+gulp+webpack基础知识 2019年08月22日 11:49:40 天府云创 阅读数 22   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文 ...

  4. WAMPSERVER-服务器离线无法切换到在线状态问题的解决

     问题描述:WAMPSERVER-服务器离线“切换到在线状态”则弹出: 解决方案: 本地连接---属性----Internet 协议(TCP/IP)---高级---wins----导入LMHOSTS( ...

  5. cef chromium 编译

    前言 目前客户端引用了cef sharp库来嵌入web页面 cef sharp是对cef (chromium embed framework)的c#封装 cef是对chromium内核的c++封装 什 ...

  6. 管家婆crm9.2 sp2升级问题求助及解决方案

    升级过程中发生如下问题: 弹出对话框1:升级完成,但是有错误产生. 弹出对话框2:升级数据库发生错误:An attempt was made to load an assembly from a ne ...

  7. dedecms 上传目录路径

    DedeCms已经升级到5.7版本了..可惜附件的目录还是不统一,比如我们从后台把附件目录调整为Ym(默认为Ymd)然而我们的附件路径依然是不一样的比如:Ymd代表年月日从文章里上传路径为:/Ym/1 ...

  8. beego中获取url以及参数的方式

    以下都全默认在controller下执行 获取当前请求的referer fmt.Println(this.Ctx.Request.Referer()) 输出:http://localhost:8080 ...

  9. 04-【servlet转发和重定向】

    转发: //forward(将 数据传给下一个资源(servlet,jsp ,html等 ,把请求和响应的数据和参数设置带过去 ) request.getRequestDispatcher(" ...

  10. Alpha版本第一周小结

    姓名 学号 周前计划安排 每周实际工作记录 自我打分(百分制) HTB 061126 1.博客撰写,分配任务 2.编码实现各个模块的功能 1.撰写博客 2.已初步实现各个模块的功能,对某些数据处理还存 ...