From 868daf94f29ce1ffdd799a68c07bb668cd373bcd Mon Sep 17 00:00:00 2001
From: HP\李良庭 <liliangting@lanpucloud.cn:1111>
Date: 星期二, 08 七月 2025 11:49:03 +0800
Subject: [PATCH] 提交分辨率自适应版本V3.1.0.1500

---
 src/uSaveData.pas |  924 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 924 insertions(+), 0 deletions(-)

diff --git a/src/uSaveData.pas b/src/uSaveData.pas
new file mode 100644
index 0000000..cb2d659
--- /dev/null
+++ b/src/uSaveData.pas
@@ -0,0 +1,924 @@
+{------------------------------------------------------------------------------}
+{单元名称:uSaveData.pas                                                       }
+{模块名称:过程数据存储模块                                                    }
+{功能描述:将系统参数存储到本地SQLite数据库                                    }
+{建立日期:2023-10-31                                                          }
+{修改日期:2023-10-31                                                          }
+{版权所有:李良庭 liangtingli@outlook.com                                      }
+{------------------------------------------------------------------------------}
+unit uSaveData;
+
+interface
+
+uses
+  Windows, Classes, SysUtils, Dialogs, StrUtils, DateUtils, Variants, Grids, Math,
+  StdCtrls, SQLite3, SQLiteTable3, sListBox, Global, log4me, PubUtils;
+
+  {申明内部调用函数}
+  procedure createConfigSql(table:string);
+  procedure insertConfigSql(table:string; no:Integer; nam,val:String);
+  procedure updateConfigSql(table:string; nam,val:String);
+  function  queryConfigSql(table,nam:string):string;
+  function  queryConfigCnt(table,nam:string):integer;
+
+  procedure createGrainSql(table:string);
+  procedure insertGrainSql(table:string; cod:Integer; no,nam:String;coef1,coef2,coef3,coef4,coef5,intercept:String; flag:Integer=0);
+  function  queryGrainSql(table,nam:string):TGrainRec;
+  function  queryGrainSql1(table:string; cod:Integer):TGrainRec;
+  procedure queryGrainlistSql(table:string; lb:TsListBox; flag:Integer=2);
+
+  procedure createTestSql(table:string);    
+  procedure insertTestSql(table:string; mode,is_auto,tim,cod:Integer; nam,info:String; mois,temp,water:double);
+
+  {申明外部调用函数}
+  procedure InitConfig();
+  procedure InitConn();
+  procedure InitGrain();
+  procedure InitTestDB();
+  procedure InitWeight();
+  procedure InitManager();
+  procedure AddGrainRecord(nam:string; rec:TGrainRec);
+  procedure deleteGrainSql(table,nam: string);
+  procedure updateNameSql(table,new,nam: string; newcod,cod: Integer);
+  function  queryGrainNumSql(table:string; nam:string; cod:Integer):Integer;
+  procedure queryGrainTypeSql(table:string; typ:Integer; cb:TComboBox);
+
+  procedure LoadParam();
+  procedure SaveParam();
+  procedure SaveWgParam();
+  procedure SaveVerifyParam();
+  procedure SaveInterceptParam(val:string);
+
+implementation
+
+//--------config配置数据库函数--------------------------------------------
+//创建config数据库
+procedure createConfigSql(table:string);
+var
+  sql : String;
+  sqldb : TSQLiteDatabase;
+begin
+  //建 config数据表
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    if not sqldb.TableExists(table) then begin
+      sql := 'CREATE TABLE [' + table + '] ('
+            +'[id] INTEGER PRIMARY KEY,'
+            +'[nam] VARCHAR(20) NULL,'
+            +'[val] VARCHAR(200) NULL );';
+      sqldb.ExecSQL(sql);
+      //新建索引
+      sql := 'CREATE INDEX index_'+table+' ON ['+table+']([id]);';
+      sqldb.ExecSQL(sql);
+    end;
+  finally
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//插入一条config数据
+procedure insertConfigSql(table:string; no:Integer; nam,val:String);
+var
+  sql : String;
+  sqldb : TSQLiteDatabase;
+begin
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    //开启事务,插入数据
+    sqldb.BeginTransaction;
+    sql := Format('INSERT INTO [%s](id,nam,val) VALUES(%d,"%s","%s");',
+                  [table,no,nam,String(AnsiToUtf8(val))]);
+    sqldb.ExecSQL(sql);
+    sqldb.Commit; //执行事务
+  finally
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//更新一条config数据
+procedure updateConfigSql(table:string; nam,val:String);
+var
+  sql : String;
+  sqldb : TSQLiteDatabase;
+begin
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    sql := Format('UPDATE [%s] SET val="%s" WHERE nam="%s";',
+                  [table,String(AnsiToUtf8(val)),nam]);
+    sqldb.ExecSQL(sql);
+  finally
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//查询一条config数据(指定name)
+function queryConfigSql(table,nam:string):string;
+var
+  sqldb : TSQLiteDatabase;
+  sqltb : TSQLiteTable;
+  sql : String;
+begin
+  //初始化返回值
+  Result := '';
+  //查询table表val列
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    sql := Format('SELECT * FROM [%s] WHERE nam="%s"',[table,nam]);
+    sqltb := sqldb.GetTable(sql);
+    if sqltb.Count>0 then
+      Result := Utf8ToAnsi(sqltb.FieldAsString(sqltb.FieldIndex['val']));
+  finally
+    FreeAndNil(sqltb);
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//查询config数据数量
+function queryConfigCnt(table,nam:string):integer;
+var
+  sqldb : TSQLiteDatabase;
+  sqltb : TSQLiteTable;
+  sql : String;
+begin
+  //初始化返回值
+  //Result := 0;
+  //查询table表val列
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    sql := Format('SELECT * FROM [%s] WHERE nam="%s"',[table,nam]);
+    sqltb := sqldb.GetTable(sql);
+    Result := sqltb.Count;
+  finally
+    FreeAndNil(sqltb);
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//-------- Grain数据库函数--------------------------------------------
+//创建 grain数据库,增加截距字段
+procedure createGrainSql(table:string);
+var
+  sql : String;
+  sqldb : TSQLiteDatabase;
+begin
+  //建 config数据表
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    if not sqldb.TableExists(table) then begin
+      sql := 'CREATE TABLE [' + table + '] ('
+            +'[id] INTEGER PRIMARY KEY,'        //id编号
+            +'[cod] INTEGER NULL,'              //一级分类代码
+            +'[no] VARCHAR(10) NULL,'           //粮种编号
+            +'[nam] VARCHAR(20) NULL,'          //粮种名称
+            +'[coef1] VARCHAR(32) NULL,'        //校准系数
+            +'[coef2] VARCHAR(32) NULL,'
+            +'[coef3] VARCHAR(32) NULL,'
+            +'[coef4] VARCHAR(32) NULL,'
+            +'[coef5] VARCHAR(32) NULL,'
+            +'[intercept] VARCHAR(32) NULL,'    //截距
+            +'[flag] INTEGER NULL );';          //是否一级分类
+      sqldb.ExecSQL(sql);
+      //新建索引
+      sql := 'CREATE INDEX index_'+table+' ON ['+table+']([id]);';
+      sqldb.ExecSQL(sql);
+    end;
+  finally
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//插入一条config数据,增加截距
+procedure insertGrainSql(table:string; cod:Integer; no,nam:String;coef1,coef2,coef3,coef4,coef5,intercept:String; flag:Integer=0);
+var
+  sql : String;
+  sqldb : TSQLiteDatabase;
+begin
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    //开启事务,插入数据
+    sqldb.BeginTransaction;
+    sql := Format('INSERT INTO [%s](cod,no,nam,coef1,coef2,coef3,coef4,coef5,intercept,flag) '+
+                  'VALUES(%d,"%s","%s","%s","%s","%s","%s","%s","%s",%d);',
+                  [table,
+                   cod,
+                   no,
+                   String(AnsiToUtf8(nam)),
+                   coef1,
+                   coef2,
+                   coef3,
+                   coef4,
+                   coef5,
+                   intercept,
+                   flag]);
+    sqldb.ExecSQL(sql);
+    sqldb.Commit; //执行事务
+  finally
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//---------------------------------------------------------------------
+//通过大类nam,查询大类Cod
+function queryGrainMainCodSql(table:string; nam:string):Integer;
+var
+  sqldb : TSQLiteDatabase;
+  sqltb : TSQLiteTable;
+  sql : String;
+begin
+  //查询table表val列
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    sql := Format('select cod from [%s] where flag=1 and nam="%s";',[table,AnsiToUtf8(nam)]);
+    sqltb := sqldb.GetTable(sql);
+    Result := sqltb.FieldAsInteger(sqltb.FieldIndex['cod']);
+  finally
+    FreeAndNil(sqltb);
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//使用nam查询一条grain数据
+//扩充一个截距参数,liliangting 2025.1.16
+function queryGrainSql(table,nam:string):TGrainRec;
+var
+  sqldb : TSQLiteDatabase;
+  sqltb : TSQLiteTable;
+  sql,scod : String;
+  cod : Integer;
+begin
+  //初始化返回值
+  Result.Code := 0;
+  Result.No   := '';
+  Result.Name := '';
+  Result.Coef[0] := '0';
+  Result.Coef[1] := '0';
+  Result.Coef[2] := '0';
+  Result.Coef[3] := '0';
+  Result.Coef[4] := '0';
+  Result.Intercept := '0';
+  Result.flag := false;
+
+  //如果nam是:玉米-东北-->拆分为东北,传入真实nam
+  if  Pos('-', nam)>0 then begin
+    scod:= SplitStr(nam, '-', 0);
+    nam := SplitStr(nam, '-', 1);
+    //通过大类名称查cod
+    cod := queryGrainMainCodSql(t_Grain, scod);
+  end
+  else begin//如果nam是:玉米,通过名称查cod
+    cod := queryGrainMainCodSql(t_Grain, nam);
+  end;
+
+  //查询table表val列
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    sql := Format('SELECT * FROM [%s] WHERE nam="%s" and cod=%d;',[table,AnsiToUtf8(nam),cod]);
+    sqltb := sqldb.GetTable(sql);
+    if sqltb.Count>0 then begin
+      Result.Code := sqltb.FieldAsInteger(sqltb.FieldIndex['cod']);
+      Result.No   := sqltb.FieldAsString(sqltb.FieldIndex['no']);               //增加粮种编码
+      Result.Name := Utf8ToAnsi(sqltb.FieldAsString(sqltb.FieldIndex['nam']));
+      Result.Coef[0] := sqltb.FieldAsString(sqltb.FieldIndex['coef1']);
+      Result.Coef[1] := sqltb.FieldAsString(sqltb.FieldIndex['coef2']);
+      Result.Coef[2] := sqltb.FieldAsString(sqltb.FieldIndex['coef3']);
+      Result.Coef[3] := sqltb.FieldAsString(sqltb.FieldIndex['coef4']);
+      Result.Coef[4] := sqltb.FieldAsString(sqltb.FieldIndex['coef5']);
+      Result.Intercept := sqltb.FieldAsString(sqltb.FieldIndex['intercept']);   //增加截距
+      Result.flag := IntToBool(sqltb.FieldAsInteger(sqltb.FieldIndex['flag'])); //增加大类标志
+    end;
+  finally
+    FreeAndNil(sqltb);
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//////////////////////////////////////////////////////////////////////////
+//使用cod查询一条grain数据
+//注意:从Cod查询粮种信息会重复,增加flag=1,仅查大类信息!!!
+function queryGrainSql1(table:string; cod:Integer):TGrainRec;
+var
+  sqldb : TSQLiteDatabase;
+  sqltb : TSQLiteTable;
+  sql : String;
+begin
+  //初始化返回值
+  Result.Code := 0;
+  Result.No   := '';
+  Result.Name := '';
+  Result.Coef[0] := '0';
+  Result.Coef[1] := '0';
+  Result.Coef[2] := '0';
+  Result.Coef[3] := '0';
+  Result.Coef[4] := '0';
+  Result.Intercept := '0';
+  Result.flag := false;
+
+  //查询table表val列
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    ///////////////////////////////////////////////////////////////
+    //这里的查询条件过少,查询结果大于1!!!
+    sql := Format('SELECT * FROM [%s] WHERE cod=%d and flag=1;',[table,cod]);
+    ///////////////////////////////////////////////////////////////
+    sqltb := sqldb.GetTable(sql);
+    if sqltb.Count>0 then begin
+      Result.Code := sqltb.FieldAsInteger(sqltb.FieldIndex['cod']);
+      Result.No   := sqltb.FieldAsString(sqltb.FieldIndex['no']);               //增加粮种编码
+      Result.Name := Utf8ToAnsi(sqltb.FieldAsString(sqltb.FieldIndex['nam']));
+      Result.Coef[0] := sqltb.FieldAsString(sqltb.FieldIndex['coef1']);
+      Result.Coef[1] := sqltb.FieldAsString(sqltb.FieldIndex['coef2']);
+      Result.Coef[2] := sqltb.FieldAsString(sqltb.FieldIndex['coef3']);
+      Result.Coef[3] := sqltb.FieldAsString(sqltb.FieldIndex['coef4']);
+      Result.Coef[4] := sqltb.FieldAsString(sqltb.FieldIndex['coef5']);
+      Result.Intercept := sqltb.FieldAsString(sqltb.FieldIndex['intercept']);   //增加截距
+      Result.flag := IntToBool(sqltb.FieldAsInteger(sqltb.FieldIndex['flag'])); //增加大类标志
+    end;
+  finally
+    FreeAndNil(sqltb);
+    FreeAndNil(sqldb);
+  end;
+end;
+/////////////////////////////////////////////////////////////////////////
+
+//查询粮种清单
+procedure queryGrainlistSql(table:string; lb:TsListBox; flag:Integer=2);
+var
+  sqldb : TSQLiteDatabase;
+  sqltb : TSQLiteTable;
+  sql  : String;
+begin
+  //查询table表val列
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    if (flag=0)or(flag=1) then
+      sql := Format('select a.*,b.nam as codnam from [%s] a left join grain b on a.cod = b.no where a.flag=%d;',[table,flag])
+    else
+      sql := Format('select a.*,b.nam as codnam from [%s] a left join grain b on a.cod = b.no ;',[table]);
+    sqltb := sqldb.GetTable(sql);
+    lb.Items.Clear;
+    while not sqltb.EOF do begin
+      if sqltb.FieldAsInteger(sqltb.FieldIndex['flag'])=1 then
+        lb.Items.Add(Utf8ToAnsi(sqltb.FieldAsString(sqltb.FieldIndex['nam'])))
+      else
+        lb.Items.Add(Format('%s-%s', [Utf8ToAnsi(sqltb.FieldAsString(sqltb.FieldIndex['codnam'])),
+                                      Utf8ToAnsi(sqltb.FieldAsString(sqltb.FieldIndex['nam']))]));
+      sqltb.Next;
+    end;
+  finally
+    FreeAndNil(sqltb);
+    FreeAndNil(sqldb);
+  end;
+end;
+
+
+//查询最新的粮种编号no
+function queryGrainCodSql(table:string):String;
+var
+  sqldb : TSQLiteDatabase;
+  sqltb : TSQLiteTable;
+  sql : String;
+begin
+  //查询table表val列
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    sql := Format('SELECT MAX(no)+1 max_no FROM [%s];',[table]);
+    sqltb := sqldb.GetTable(sql);
+    Result := sqltb.FieldAsString(sqltb.FieldIndex['max_no']);
+  finally
+    FreeAndNil(sqltb);
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//按粮种nam查询记录数量
+function queryGrainNumSql(table:string; nam:string; cod:Integer):Integer;
+var
+  sqldb : TSQLiteDatabase;
+  sqltb : TSQLiteTable;
+  sql : String;
+begin
+  //查询table表val列
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    sql := Format('SELECT * FROM [%s] WHERE [nam]="%s" and [cod]=%d;',[table ,AnsiToUtf8(nam), cod]);
+    sqltb := sqldb.GetTable(sql);
+    Result := sqltb.Count;
+  finally
+    FreeAndNil(sqltb);
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//查询粮种大类,加载到ComboBox
+procedure queryGrainTypeSql(table:string; typ:Integer; cb:TComboBox);
+var
+  sqldb : TSQLiteDatabase;
+  sqltb : TSQLiteTable;
+  sql : String;
+begin
+  //查询table表val列
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    sql := Format('SELECT nam FROM [%s] WHERE [flag]=%d order by cod asc;',[table, typ]);
+    sqltb := sqldb.GetTable(sql);
+    cb.Items.Clear;
+    while not sqltb.EOF do begin
+      cb.Items.Add(Utf8ToAnsi(sqltb.FieldAsString(sqltb.FieldIndex['nam'])));
+      sqltb.Next;
+    end;
+    cb.ItemIndex :=0;
+  finally
+    FreeAndNil(sqltb);
+    FreeAndNil(sqldb);
+  end;
+end;
+
+
+//更新一条grain数据(按名称和大类代码)
+procedure updateGrainSql(table:string; rec:TGrainRec);
+var
+  sql : String;
+  sqldb : TSQLiteDatabase;
+begin
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    sql := Format('UPDATE [%s] SET no="%s",coef1="%s",coef2="%s",coef3="%s",coef4="%s",coef5="%s",flag=%d WHERE nam="%s" and cod=%d;',
+                  [table,
+                   rec.No,
+                   rec.Coef[0],
+                   rec.Coef[1],
+                   rec.Coef[2],
+                   rec.Coef[3],
+                   rec.Coef[4],
+                   Integer(rec.flag),
+                   AnsiToUtf8(rec.Name), rec.Code]);
+    sqldb.ExecSQL(sql);
+  finally
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//更新一条grain数据(按大类代码)
+procedure updateGrainSql1(table:string; rec:TGrainRec);
+var
+  sql : String;
+  sqldb : TSQLiteDatabase;
+begin
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    sql := Format('UPDATE [%s] SET coef1="%s",coef2="%s",coef3="%s",coef4="%s",coef5="%s" WHERE cod=%d;',
+                  [table,
+                   rec.Coef[0],
+                   rec.Coef[1],
+                   rec.Coef[2],
+                   rec.Coef[3],
+                   rec.Coef[4],
+                   rec.Code]);
+    sqldb.ExecSQL(sql);
+  finally
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//更新截距参数
+procedure updateInterceptSql(table,val,name: string; cod: Integer);
+var
+  sql : String;
+  sqldb : TSQLiteDatabase;
+begin
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    sql := Format('UPDATE [%s] SET intercept="%s" WHERE nam="%s" and cod=%d;',
+                  [table, val, AnsiToUtf8(name), cod]);
+    sqldb.ExecSQL(sql);
+  finally
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//更新粮种名称
+procedure updateNameSql(table,new,nam: string; newcod,cod: Integer);
+var
+  sql : String;
+  sqldb : TSQLiteDatabase;
+begin
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    sql := Format('UPDATE [%s] SET nam="%s",cod=%d WHERE nam="%s" and cod=%d;',
+                  [table, AnsiToUtf8(new), newcod, AnsiToUtf8(nam), cod]);
+    sqldb.ExecSQL(sql);
+  finally
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//删除粮种信息--根据nam和cod删除
+procedure deleteGrainSql(table, nam: string);
+var
+  sqldb : TSQLiteDatabase;
+  sql,scod : String;
+  cod : Integer;
+begin
+  //如果nam是:玉米-东北-->拆分为东北,传入真实nam
+  if  Pos('-', nam)>0 then begin
+    scod:= SplitStr(nam, '-', 0);
+    nam := SplitStr(nam, '-', 1);
+    //通过大类名称查cod
+    cod := queryGrainMainCodSql(t_Grain, scod);
+  end
+  else begin//如果nam是:玉米,通过名称查cod
+    cod := queryGrainMainCodSql(t_Grain, nam);
+  end;
+
+  sqldb := TSQLiteDatabase.Create(glAppPath + CONFIG_DIR + table + '.db');
+  try
+    sql := Format('DELETE FROM [%s] WHERE [nam]="%s" and [cod]=%d;', [table, AnsiToUtf8(nam), cod]);
+    sqldb.ExecSQL(sql);
+  finally
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//-------- Test数据库函数--------------------------------------------
+//创建 test数据库
+procedure createTestSql(table:string);
+var
+  sql : String;
+  sqldb : TSQLiteDatabase;
+begin
+  //建 config数据表
+  sqldb := TSQLiteDatabase.Create(glAppPath + DATA_DIR + table + '.db');
+  try
+    if not sqldb.TableExists(table) then begin
+      sql := 'CREATE TABLE [' + table + '] ('
+            +'[id] INTEGER PRIMARY KEY,'                      //自动编号
+            +'[mod] INTEGER NULL,'                            //自动模式=0,手动模式=1
+            +'[is_auto] INTEGER CHECK ([is_auto] IN (0, 1)),' //增加自动保存标志
+            +'[tim] INTEGER NULL,'                            //日期时间
+            +'[cod] INTEGER NULL,'                            //粮种代码
+            +'[nam] VARCHAR(20) NULL,'                        //粮种名称
+            +'[info] VARCHAR(50) NULL,'                       //样本信息
+            +'[mois]  FLOAT NULL,'                            //含水率
+            //+'[ratio] FLOAT NULL,'
+            //+'[weight] FLOAT NULL,'
+            +'[temp]  FLOAT NULL,'                            //温度
+            +'[water] FLOAT NULL );';                         //湿度
+      sqldb.ExecSQL(sql);
+      //新建索引
+      sql := 'CREATE INDEX index_'+table+' ON ['+table+']([id]);';
+      sqldb.ExecSQL(sql);
+    end;
+  finally
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//插入一条 test数据
+procedure insertTestSql(table:string; mode,is_auto,tim,cod:Integer; nam,info:String; mois,temp,water:double);
+var
+  sql : String;
+  sqldb : TSQLiteDatabase;
+begin
+  sqldb := TSQLiteDatabase.Create(glAppPath + DATA_DIR + table + '.db');
+  try
+    //开启事务,插入数据
+    sqldb.BeginTransaction;
+    sql := Format('INSERT INTO [%s](mod,is_auto,tim,cod,nam,info,mois,temp,water) VALUES(%d,%d,%d,%d,"%s","%s",%.6f,%.6f,%.6f);',
+                  [table,mode,is_auto,tim,cod,String(AnsiToUtf8(nam)),String(AnsiToUtf8(info)),mois,temp,water]);
+    sqldb.ExecSQL(sql);
+    sqldb.Commit; //执行事务
+  finally
+    FreeAndNil(sqldb);
+  end;
+end;
+
+//-------第一种全新创建config数据库的方法---------------------------------------
+//创建新的 config数据库
+procedure InitConfig();
+begin
+  if not FileExists(glConfig_db) then begin
+    //建 config数据库表
+    createConfigSql(t_Config);
+    //初始化数据行
+    insertConfigSql(t_Config,1,'StartFreq','10500');
+    insertConfigSql(t_Config,2,'StopFreq','12000');
+    insertConfigSql(t_Config,3,'Step','50');
+    insertConfigSql(t_Config,4,'Freq','0');
+    insertConfigSql(t_Config,5,'Decay','1');
+    insertConfigSql(t_Config,6,'ASK','1');
+    insertConfigSql(t_Config,7,'Volume','0.52');
+    insertConfigSql(t_Config,8,'Tare','1040');
+    //新增开机启动延时时间
+    insertConfigSql(t_Config,9,'Delay','10');
+    //记录日志
+    log4info(Format('系统:初始化创建 %s-参数数据库.',[t_Config]));
+  end;
+end;
+
+//创建新的 conn数据库
+procedure InitConn();
+begin
+  if not FileExists(glConn_db) then begin
+    //建 config数据库表
+    createConfigSql(t_Conn);
+    //初始化数据行
+    insertConfigSql(t_Conn,1,'Ip','127.0.0.1');
+    insertConfigSql(t_Conn,2,'Port','1502');
+    insertConfigSql(t_Conn,3,'SerialPort','COM8');
+    insertConfigSql(t_Conn,4,'Baud','115200');
+    insertConfigSql(t_Conn,5,'Parity','N');
+    insertConfigSql(t_Conn,6,'Data_bit','8');
+    insertConfigSql(t_Conn,7,'Stop_bit','1');   
+    insertConfigSql(t_Conn,8,'AutoRun','false'); 
+    insertConfigSql(t_Conn,9,'Time1','20');
+    insertConfigSql(t_Conn,10,'Time2','30');
+    //记录日志
+    log4info(Format('系统:初始化创建 %s-参数数据库.',[t_Conn]));
+  end;
+end;
+
+//创建新的 grain数据库,增加截距
+procedure InitGrain();
+begin
+  if not FileExists(glGrain_db) then begin
+    //建 config数据库表
+    createGrainSql(t_Grain);
+    //初始化数据行
+    {insertGrainSql(t_Grain,1,'1','小麦','65.160129655062','-0.107375833331','0.000063694808','-0.000000011576','0','0',1);
+    insertGrainSql(t_Grain,2,'2','稻谷','-8.443205789262','0.021404282111','-0.000008683206','0.000000001917','0','0',1);
+    insertGrainSql(t_Grain,3,'3','黄豆','-6.204673384923','0.025161776479','0.000014765722','0.000000003440','0','0',1);
+    insertGrainSql(t_Grain,4,'4','玉米','-16.278037347152','0.033766686581','-0.000015923042','0.000000002881','0','0',1);  }
+    insertGrainSql(t_Grain,1,'1','稻谷','0','0.01','0','0','0','0',1);
+    insertGrainSql(t_Grain,2,'2','玉米','0','0.01','0','0','0','0',1);
+    insertGrainSql(t_Grain,3,'3','大豆','0','0.01','0','0','0','0',1);
+    insertGrainSql(t_Grain,4,'4','小麦','0','0.01','0','0','0','0',1);
+    //记录日志
+    log4info(Format('系统:初始化创建 %s-参数数据库.',[t_Grain]));
+  end;
+end;
+
+//创建新的 test数据库
+procedure InitTestDB();
+begin
+  if not FileExists(glData_db) then begin
+    //建 config数据库表
+    createTestSql(t_Data);
+    //记录日志
+    log4info(Format('系统:初始化创建 %s-存储数据库.',[t_Data]));
+  end;
+end;
+
+//创建新的 重量校准数据库
+procedure InitWeight();
+begin
+  if not FileExists(glWeight_db) then begin
+    //建 weight数据库表
+    createConfigSql(t_Weight);
+    //初始化数据行
+    insertConfigSql(t_Weight,1,'k','1');
+    insertConfigSql(t_Weight,2,'b','1');
+    insertConfigSql(t_Weight,3,'tare','0');
+    insertConfigSql(t_Weight,4,'range','0'); //误差范围
+    insertConfigSql(t_Weight,5,'test1','0');
+    insertConfigSql(t_Weight,6,'test2','0');
+    insertConfigSql(t_Weight,7,'test3','0');
+    insertConfigSql(t_Weight,8,'std1','0');
+    insertConfigSql(t_Weight,9,'std2','0');
+    insertConfigSql(t_Weight,10,'std3','0');
+    //记录日志
+    log4info(Format('系统:初始化创建 %s-参数数据库.',[t_Weight]));
+  end;
+end;
+
+//创建新的 manager 数据库
+procedure InitManager();
+begin
+  if not FileExists(glManager_db) then begin
+    //建 config数据库表
+    createConfigSql(t_Manager);
+    //初始化数据行
+    insertConfigSql(t_Manager,1,'Admin','123456');
+    //记录日志
+    log4info(Format('系统:初始化创建 %s-数据库.',[t_Manager]));
+  end;
+end;
+
+//新建一条 grain数据
+procedure AddGrainRecord(nam:string; rec:TGrainRec);
+var
+  no : String;
+begin
+  if FileExists(glGrain_db) then begin
+    //先查询最新的cod
+    no := queryGrainCodSql(t_Grain);
+    //新增粮种数据行
+    insertGrainSql(t_Grain,
+                   GrainType_rec.Code,
+                   no,nam,
+                   GrainType_rec.Coef[0],
+                   GrainType_rec.Coef[1],
+                   GrainType_rec.Coef[2],
+                   GrainType_rec.Coef[3],
+                   GrainType_rec.Coef[4],
+                   '0',0);
+    //记录日志
+    log4info(Format('系统:数据库 [%s] 新增一条粮种信息.',[t_Grain]));
+  end;
+end;
+//------- 加载和保存各类Config配置信息-----------------------------------------
+//加载各类参数结构
+procedure LoadParam();
+var
+  c : Char;
+begin
+  //加载系统参数
+  if FileExists(glConfig_db) then begin
+    SysConfig.StartFreq := StrToFloatDef(queryConfigSql(t_Config,'StartFreq'), 10500);
+    SysConfig.StopFreq := StrToFloatDef(queryConfigSql(t_Config,'StopFreq'), 12000);
+    SysConfig.Step := StrToIntDef(queryConfigSql(t_Config,'Step'), 50);
+    SysConfig.Freq := StrToFloatDef(queryConfigSql(t_Config,'Freq'), 0);
+    SysConfig.Decay := StrToFloatDef(queryConfigSql(t_Config,'Decay'), 1);
+    SysConfig.ASK := StrToIntDef(queryConfigSql(t_Config,'ASK'), 1);
+    SysConfig.Volume := StrToFloatDef(queryConfigSql(t_Config,'Volume'), 0);
+    SysConfig.Tare := StrToFloatDef(queryConfigSql(t_Config,'Tare'), 1000);
+
+    //新增开机启动延时时间
+    if queryConfigSql(t_Config,'Delay')='' then
+      insertConfigSql(t_Config,9,'Delay','10');
+    SysConfig.delay := StrToIntDef(queryConfigSql(t_Config,'Delay'), 0);
+    
+    //记录日志
+    log4info(Format('系统:载入 %s-系统参数 (设备参数).',[t_Config]));
+  end;
+
+  //加载通讯参数
+  if FileExists(glConn_db) then begin
+    PlcConn.ip := queryConfigSql(t_Conn,'Ip');
+    PlcConn.port := StrToIntDef(queryConfigSql(t_Conn,'Port'), 1502);
+    WrConn.SerialPort := queryConfigSql(t_Conn,'SerialPort');
+    WrConn.baud := StrToIntDef(queryConfigSql(t_Conn,'Baud'), 115200);
+    WrConn.data_bit := StrToIntDef(queryConfigSql(t_Conn,'Data_bit'), 8);
+    WrConn.stop_bit := StrToIntDef(queryConfigSql(t_Conn,'Stop_bit'), 1);
+    glAutoRun := StrToBoolDef(queryConfigSql(t_Conn,'AutoRun'), False);
+    glTime1 := StrToIntDef(queryConfigSql(t_Conn,'Time1'), 20);
+    glTime2 := StrToIntDef(queryConfigSql(t_Conn,'Time2'), 30);
+    //单独处理char类型
+    CopyMemory(@c, PChar(queryConfigSql(t_Conn,'Parity')), 1);
+    WrConn.parity := c;
+
+    //新增数据存储参数
+    if queryConfigCnt(t_Conn, 'AutoSave')=0 then
+      insertConfigSql(t_Conn, 11, 'AutoSave', '0');
+    if queryConfigCnt(t_Conn, 'SamplePrefix')=0 then
+      insertConfigSql(t_Conn, 12, 'SamplePrefix', '');
+    if queryConfigCnt(t_Conn, 'SampleDir')=0 then
+      insertConfigSql(t_Conn, 13, 'SampleDir', '');
+    if queryConfigCnt(t_Conn, 'SampleName')=0 then
+      insertConfigSql(t_Conn, 14, 'SampleName', '');
+    smp.flag := StrToBoolDef(queryConfigSql(t_Conn,'AutoSave'), False);
+    smp.prefix := queryConfigSql(t_Conn,'SamplePrefix');
+    smp.dir := queryConfigSql(t_Conn,'SampleDir');
+    smp.info := queryConfigSql(t_Conn,'SampleName');
+
+    //新增心跳参数
+    if queryConfigCnt(t_Conn, 'HeartIp')=0 then
+      insertConfigSql(t_Conn, 15, 'HeartIp', '192.168.0.200');
+    PlcConn.heart_ip := queryConfigSql(t_Conn,'HeartIp');
+    if queryConfigCnt(t_Conn, 'HeartPort')=0 then
+      insertConfigSql(t_Conn, 16, 'HeartPort', '8868');
+    PlcConn.heart_port := StrToIntDef(queryConfigSql(t_Conn,'HeartPort'), 8868);
+
+    //记录日志
+    log4info(Format('系统:载入 %s-系统参数 (扦捡系统、水分仪、存储参数).',[t_Conn]));
+  end;
+
+  //加载粮种校准系数
+  if FileExists(glGrain_db) then begin
+    Grain := queryGrainSql(t_Grain,'小麦');
+    log4info(Format('系统:载入 %s-粮种参数 (粮种代码、名称、校准系数).',[t_Grain]));
+  end;
+
+  //加载重量校准系数
+  if FileExists(glWeight_db) then begin
+    Wg.k      := StrToFloatDef(queryConfigSql(t_Weight,'k'), 1);
+    Wg.b      := StrToFloatDef(queryConfigSql(t_Weight,'b'), 1);
+    Wg.tare   := StrToFloatDef(queryConfigSql(t_Weight,'tare'), 0);
+    Wg.range  := StrToFloatDef(queryConfigSql(t_Weight,'range'), 0);
+    Wg.test1  := StrToFloatDef(queryConfigSql(t_Weight,'test1'),0);
+    Wg.test2  := StrToFloatDef(queryConfigSql(t_Weight,'test2'),0);
+    Wg.test3  := StrToFloatDef(queryConfigSql(t_Weight,'test3'),0);
+    Wg.std1   := StrToFloatDef(queryConfigSql(t_Weight,'std1'), 0);
+    Wg.std2   := StrToFloatDef(queryConfigSql(t_Weight,'std2'), 0);
+    Wg.std3   := StrToFloatDef(queryConfigSql(t_Weight,'std3'), 0);
+    //记录日志
+    log4info(Format('系统:载入 %s-系统参数 (y=kx+b).',[t_Weight]));
+  end;
+
+  //加载登录口令
+  if FileExists(glManager_db) then begin
+    SysConfig.password := queryConfigSql(t_Manager,'Admin');
+    //记录日志
+    log4info(Format('系统:载入 %s-管理参数 (手动模式口令).',[t_Manager]));
+  end;
+  //调试参数
+  //showmessage(Format('PLC IP: %s:%d',[plcconn.ip, plcconn.prot]));
+  //showmessage(Format('Wr :%s,%d,%s,%d,%d',[wrconn.SerialPort,wrconn.baud,wrconn.parity,wrconn.data_bit,wrconn.stop_bit]));
+end;
+
+//保存各类参数结构
+procedure SaveParam();
+begin
+  //保存系统参数
+  if FileExists(glConfig_db) then begin
+    updateConfigSql(t_Config,'StartFreq',FloatToStr(SysConfig.StartFreq));
+    updateConfigSql(t_Config,'StopFreq',FloatToStr(SysConfig.StopFreq));
+    updateConfigSql(t_Config,'Step', IntToStr(SysConfig.Step));
+    updateConfigSql(t_Config,'Freq',FloatToStr(SysConfig.Freq));
+    updateConfigSql(t_Config,'Decay',FloatToStr(SysConfig.Decay));
+    updateConfigSql(t_Config,'ASK', IntToStr(SysConfig.ASK));
+    updateConfigSql(t_Config,'Volume',FloatToStr(SysConfig.Volume));
+    updateConfigSql(t_Config,'Tare',FloatToStr(SysConfig.Tare));  
+    updateConfigSql(t_Config,'Delay', IntToStr(SysConfig.delay));
+    //记录日志
+    log4info(Format('系统:保存 %s-系统参数 (设备参数).',[t_Config]));
+  end;
+  //保存通讯参数
+  if FileExists(glConn_db) then begin
+    updateConfigSql(t_Conn,'Ip',PlcConn.ip);
+    updateConfigSql(t_Conn,'Port',IntToStr(PlcConn.port));
+    updateConfigSql(t_Conn,'HeartIp',PlcConn.heart_ip);
+    updateConfigSql(t_Conn,'HeartPort',IntToStr(PlcConn.heart_port));
+    updateConfigSql(t_Conn,'SerialPort',WrConn.SerialPort);
+    updateConfigSql(t_Conn,'Baud',IntToStr(WrConn.baud));
+    updateConfigSql(t_Conn,'Parity',WrConn.Parity);
+    updateConfigSql(t_Conn,'Data_bit',IntToStr(WrConn.Data_bit));
+    updateConfigSql(t_Conn,'Stop_bit',IntToStr(WrConn.Stop_bit));
+    updateConfigSql(t_Conn,'AutoRun',BoolToString(glAutoRun));
+    updateConfigSql(t_Conn,'Time1',IntToStr(glTime1));
+    updateConfigSql(t_Conn,'Time2',IntToStr(glTime2));
+    //增加数据存储参数
+    updateConfigSql(t_Conn,'AutoSave',BoolToString(smp.flag));
+    updateConfigSql(t_Conn,'SamplePrefix',smp.prefix);
+    updateConfigSql(t_Conn,'SampleDir',   smp.dir);
+    updateConfigSql(t_Conn,'SampleName',  smp.info);
+    //记录日志
+    log4info(Format('系统:保存 %s-系统参数 (扦捡系统、水分仪、存储参数).',[t_Conn]));
+  end;
+
+  //保存登录口令
+  if FileExists(glManager_db) then begin
+    updateConfigSql(t_Manager,'Admin',SysConfig.password);
+    //记录日志
+    log4info(Format('系统:保存 %s-管理参数 (手动模式口令).',[t_Manager]));
+  end;
+
+  //保存重量系数
+  SaveWgParam();
+end;
+
+//保存重量参数
+procedure SaveWgParam();
+begin
+  //保存重量系数
+  if FileExists(glWeight_db) then begin
+    updateConfigSql(t_Weight,'k',FloatToStr(Wg.k));
+    updateConfigSql(t_Weight,'b',FloatToStr(Wg.b));
+    updateConfigSql(t_Weight,'tare',FloatToStr(Wg.tare));
+    updateConfigSql(t_Weight,'range',FloatToStr(Wg.range));
+    updateConfigSql(t_Weight,'test1',FloatToStr(Wg.test1));
+    updateConfigSql(t_Weight,'test2',FloatToStr(Wg.test2));
+    updateConfigSql(t_Weight,'test3',FloatToStr(Wg.test3));  
+    updateConfigSql(t_Weight,'std1',FloatToStr(Wg.std1));
+    updateConfigSql(t_Weight,'std2',FloatToStr(Wg.std2));
+    updateConfigSql(t_Weight,'std3',FloatToStr(Wg.std3));
+
+    //记录日志
+    log4info(Format('系统:保存 %s-参数 (y=kx+b).',[t_Weight]));
+  end;
+end;
+
+//保存校准参数到数据库
+procedure SaveVerifyParam();
+begin
+  //保存粮种关联的校准系数
+  if FileExists(glGrain_db) then begin
+    //修改大类时,小类同步刷新,反之不改!
+    if Grain.flag then
+      updateGrainSql1(t_Grain, Grain)
+    else
+      updateGrainSql(t_Grain, Grain);
+    log4info(Format('系统:保存 %s-粮种参数 (五个校准系数).',[t_Grain]));
+  end;
+end;
+
+//保存截距参数到数据库
+procedure SaveInterceptParam(val:string);
+begin
+  //grain.db新增一列,用于保存截距参数
+  if FileExists(glGrain_db) then begin
+    updateInterceptSql(t_Grain,val,Grain.Name,Grain.Code);
+    log4info(Format('系统:保存截距参数-[%s] 到 [%s]粮种信息.',[val, Grain.Name]));
+  end;
+end;
+
+end.

--
Gitblit v1.9.3