补齐方法

This commit is contained in:
“ddf” 2025-02-24 21:01:56 +08:00
parent 392fc649b9
commit 7075ab03dd

View File

@ -4,15 +4,16 @@ interface
uses uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, StdCtrls, BtnEdit, cxStyles, cxCustomData,System.Types, Dialogs, ComCtrls, ToolWin, StdCtrls, BtnEdit, cxStyles, cxCustomData,
cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit, DBGrids, DB, cxDBData, System.Types, cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit, DBGrids, DB,
cxGridLevel, cxClasses, cxControls, cxGridCustomView, ADODB, StrUtils, Midas, cxDBData, cxGridLevel, cxClasses, cxControls, cxGridCustomView, ADODB,
cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxTimeEdit, StrUtils, Midas, cxGridCustomTableView, cxGridTableView, cxGridDBTableView,
cxTreeView, cxGrid, cxDBLookupComboBox, cxCalendar, cxCurrencyEdit,dxLayoutContainer, cxTimeEdit, cxTreeView, cxGrid, cxDBLookupComboBox, cxCalendar, cxCurrencyEdit,
cxGridExportLink, ExtCtrls, Buttons, DBClient, RTComboBox, cxDropDownEdit, dxLayoutContainer, cxGridExportLink, ExtCtrls, Buttons, DBClient, RTComboBox,
cxGridBandedTableView, cxGridDBBandedTableView, cxRichEdit, cxButtonEdit, cxDropDownEdit, cxGridBandedTableView, cxGridDBBandedTableView, cxRichEdit,
IniFiles, WinSock, IdHTTP, dxcore, cxTextEdit, FireDAC.Comp.Client, cxButtonEdit, IniFiles, WinSock, IdHTTP, dxcore, cxTextEdit,
Vcl.Clipbrd, cxMemo,dxLayoutControl; FireDAC.Comp.Client, Vcl.Clipbrd, cxMemo, dxLayoutControl, uSZHN_JSON,
System.JSON;
type type
TA = class(TComponent) TA = class(TComponent)
@ -22,9 +23,12 @@ type
// 调用DLL文件 // 调用DLL文件
procedure InitDllEvt(FromFile: string; FormID: Integer; Para: string; FormType: Integer; Title: string; Def1: string; Def2: string; Def3: string; Def4: string; Def5: string; Def6: string; Def7: string; Def8: string; Def9: string; Def10: string); procedure InitDllEvt(FromFile: string; FormID: Integer; Para: string; FormType: Integer; Title: string; Def1: string; Def2: string; Def3: string; Def4: string; Def5: string; Def6: string; Def7: string; Def8: string; Def9: string; Def10: string);
procedure pasteDatatTocxGrid(Tv1: TcxGridDBTableView); procedure pasteDatatTocxGrid(Tv1: TcxGridDBTableView);
// 取主键 // 取主键
function GetLSNo(ADOQueryTmp: TADOQuery; var mMaxNo: string; mFlag: string; mTable: string; mlen: Integer; mtype: Integer = 0): Boolean; function GetLSNo(ADOQueryTmp: TADOQuery; var mMaxNo: string; mFlag: string; mTable: string; mlen: Integer; mtype: Integer = 0): Boolean;
function GetLSNo20(ADOQueryTmp: TADOQuery; var mMaxNo: string; mFlag: string; mTable: string; mlen: Integer; mtype: Integer = 0): Boolean; function GetLSNo20(ADOQueryTmp: TADOQuery; var mMaxNo: string; mFlag: string; mTable: string; mlen: Integer; mtype: Integer = 0): Boolean;
procedure GetFileInfo(mFile: string; var mfileSize: integer; var CreationTime: tdatetime; var WriteTime: tdatetime); procedure GetFileInfo(mFile: string; var mfileSize: integer; var CreationTime: tdatetime; var WriteTime: tdatetime);
@ -32,10 +36,13 @@ procedure GetFileInfo(mFile: string; var mfileSize: integer; var CreationTime: t
function SGetServerDate(ADOQueryTmp: TADOQuery): TdateTime; // 取服务器日期 function SGetServerDate(ADOQueryTmp: TADOQuery): TdateTime; // 取服务器日期
function SGetServerDateTime(ADOQueryTmp: TADOQuery): TdateTime; // 取服务器日期时间 function SGetServerDateTime(ADOQueryTmp: TADOQuery): TdateTime; // 取服务器日期时间
function SLGetFilters(layoutControl: TdxLayoutControl; EquTag, LikeTag: Integer): string; function SLGetFilters(layoutControl: TdxLayoutControl; EquTag, LikeTag: Integer): string;
procedure LSCSHData(ADOQueryTmp: TADOQuery; mParent: TdxLayoutControl; FTag: Integer); procedure LSCSHData(ADOQueryTmp: TADOQuery; mParent: TdxLayoutControl; FTag: Integer);
procedure LRTSetsavedata(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TdxLayoutControl; MyTag: Integer); procedure LRTSetsavedata(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TdxLayoutControl; MyTag: Integer);
procedure addAdoSelField(SADOQry: TADOQuery; mSelFieldName: string = 'Ssel'); procedure addAdoSelField(SADOQry: TADOQuery; mSelFieldName: string = 'Ssel');
{四舍五入取指定位小数} {四舍五入取指定位小数}
@ -55,9 +62,13 @@ function RoundFloat(f: double; i: Integer): double;
{执行过滤 }procedure SDofilter(ADOQry: TADOQuery; FilterStr: string); {执行过滤 }procedure SDofilter(ADOQry: TADOQuery; FilterStr: string);
{创建CDS列名 }procedure SCreateCDS(SADOQry: TADOQuery; mClientDataset: TclientDataSet); {创建CDS列名 }procedure SCreateCDS(SADOQry: TADOQuery; mClientDataset: TclientDataSet);
{CDS赋值 }procedure SInitCDSData(fromADO: TADOQuery; toCDS: TclientDataSet); {CDS赋值 }procedure SInitCDSData(fromADO: TADOQuery; toCDS: TclientDataSet);
procedure InitAdoData(ADO1: TADOQuery; Tv1: TcxGridDBTableView; SqlStr, FilterStr, MarkStr: string); procedure InitAdoData(ADO1: TADOQuery; Tv1: TcxGridDBTableView; SqlStr, FilterStr, MarkStr: string);
{终极刷新 }procedure InitCDSData(ADO1: TADOQuery; CDS1: TclientDataSet; Tv1: TcxGridDBTableView; SqlStr, FilterStr, MarkStr: string); {终极刷新 }procedure InitCDSData(ADO1: TADOQuery; CDS1: TclientDataSet; Tv1: TcxGridDBTableView; SqlStr, FilterStr, MarkStr: string);
{ÖÕ¼«¹ýÂË }procedure CDSDataFilter(ADO1: TADOQuery; CDS1: TclientDataSet; Tv1: TcxGridDBTableView; JsonArgs: string); overload;
{ÖÕ¼«¹ýÂË }procedure CDSDataFilter(ADO1: TADOQuery; CDS1: TclientDataSet; Tv1: TcxGridDBBandedTableView; JsonArgs: string); overload;
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// **************** 刷新 ADO CDS TV *****************// // **************** 刷新 ADO CDS TV *****************//
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
@ -183,6 +194,12 @@ procedure SelOKNo(CDS_MainSel: TclientDataSet; FSel: Boolean); // ȫѡ/ȫ
procedure SelOKNoFiler(Tv1: TcxGridDBTableView; FSel: Boolean); // Tv1全选/全弃 procedure SelOKNoFiler(Tv1: TcxGridDBTableView; FSel: Boolean); // Tv1全选/全弃
function CommonFiltersByContainer(TMControl: TControl; JsonArgs: string): string;
function CommonFiltersByTv(Tv1: TcxGridDBTableView; JsonArgs: string): string;
function CommonGetSingleFilter(MyControl: TControl; EquTag, LikeTag, FieldTag: Integer; MFields: TStringList): string;
procedure SelTVToCDS(Tv1: TcxGridDBTableView; CDS1: TclientDataSet; KeyId: string); // 通过KeyId将Tv1选择映射到CDS1 procedure SelTVToCDS(Tv1: TcxGridDBTableView; CDS1: TclientDataSet; KeyId: string); // 通过KeyId将Tv1选择映射到CDS1
function SelCDSKey(CDS_1: TclientDataSet; Keys: TArray<string>): TArray<string>; // 返回选择列key function SelCDSKey(CDS_1: TclientDataSet; Keys: TArray<string>): TArray<string>; // 返回选择列key
@ -194,8 +211,11 @@ procedure HiddenTVColumn(Tv1: TcxGridDBTableView; FieldName: string); //
procedure CopyTVFocusValue(Tv1: TcxGridDBTableView); // 复制TV焦点内容 procedure CopyTVFocusValue(Tv1: TcxGridDBTableView); // 复制TV焦点内容
//是否能删除数据记录 //是否能删除数据记录
function isCanDataDelete(mFillerId: string = ''; mfiller: string = ''): boolean; function isCanDataDelete(mFillerId: string = ''; mfiller: string = ''): boolean;
function isCanDataEdit(mFillerId: string = ''; mfiller: string = ''): boolean; function isCanDataEdit(mFillerId: string = ''; mfiller: string = ''): boolean;
procedure raiseException(msg: string); //抛出异常 procedure raiseException(msg: string); //抛出异常
// **************** 访问网页 *****************// // **************** 访问网页 *****************//
@ -220,6 +240,7 @@ function Split(const s: string; Separator: char): TStringDynArray;
// **************** 师爷写的 *****************// // **************** 师爷写的 *****************//
procedure SInitTcxComBoxBySql(ADOQueryTmp: TADOQuery; cb: TcxComboBox; emptyFlag: Boolean; mSql: string); procedure SInitTcxComBoxBySql(ADOQueryTmp: TADOQuery; cb: TcxComboBox; emptyFlag: Boolean; mSql: string);
type type
TMyF = function(App: TApplication; // 主应用程序 (对Delphi而言) TMyF = function(App: TApplication; // 主应用程序 (对Delphi而言)
FormH: HWND; // 创建窗口的父窗口句柄 (对PB而言) FormH: HWND; // 创建窗口的父窗口句柄 (对PB而言)
@ -239,6 +260,150 @@ implementation
uses uses
U_DataLink, U_globalVar; U_DataLink, U_globalVar;
function CommonFiltersByTv(Tv1: TcxGridDBTableView; JsonArgs: string): string;
var
i: integer;
JSONObject: TJSONObject;
MFields: TStringList;
begin
Result := '';
JSONObject := TJSONObject.ParseJSONValue(JsonArgs) as TJSONObject;
MFields := TStringList.Create();
ExtractStrings(['|'], [' '], PChar(JSONObject.S['Fields']), MFields);
for i := 0 to Tv1.ColumnCount - 1 do
begin
if MFields.IndexOf(Tv1.Columns[i].DataBinding.FieldName) >= 0 then
begin
Result := Result + 'and isnull(' + Tv1.Columns[i].DataBinding.FieldName + ','''')=' + quotedStr(Trim(Tv1.DataController.DataSet.FieldByName(Tv1.Columns[i].DataBinding.FieldName).AsString)) + ' ';
end;
end;
MFields.Free;
if Trim(Result) <> '' then
Result := Trim(RightStr(Result, Length(Result) - 4));
end;
function CommonFiltersByContainer(TMControl: TControl; JsonArgs: string): string;
var
i, EquTag, LikeTag, FieldTag: Integer;
JSONObject: TJSONObject;
MFields: TStringList;
begin
Result := '';
JSONObject := TJSONObject.ParseJSONValue(JsonArgs) as TJSONObject;
MFields := TStringList.Create();
ExtractStrings(['|'], [' '], PChar(JSONObject.S['Fields']), MFields);
EquTag := JSONObject.I['EquTag'];
LikeTag := JSONObject.I['LikeTag'];
FieldTag := JSONObject.I['FieldTag'];
if TMControl is TPanel then
begin
with TPanel(TMControl) do
begin
for i := 0 to ControlCount - 1 do
begin
if Controls[i] is TLabel then
continue;
Result := Result + CommonGetSingleFilter(Controls[i], EquTag, LikeTag, FieldTag, MFields);
end;
end;
end
else if TMControl is TdxLayoutControl then
begin
with TdxLayoutControl(TMControl) do
begin
for i := 0 to ControlCount - 1 do
begin
if Controls[i] is TLabel then
continue;
Result := Result + CommonGetSingleFilter(Controls[i], EquTag, LikeTag, FieldTag, MFields);
end;
end;
end;
MFields.Free;
if Trim(Result) <> '' then
Result := Trim(RightStr(Result, Length(Result) - 4));
end;
function CommonGetSingleFilter(MyControl: TControl; EquTag, LikeTag, FieldTag: Integer; MFields: TStringList): string;
var
MValue, MField, MResult: string;
MTag: Integer;
begin
MResult := '';
if MyControl is TEdit then
begin
if Trim(TEdit(MyControl).Text) <> '' then
begin
if FieldTag = 1 then
MField := MyControl.Hint
else
MField := MyControl.Name;
MValue := Trim(TEdit(MyControl).Text);
MTag := MyControl.Tag;
end;
end
else if MyControl is TcxTextEdit then
begin
if Trim(TcxTextEdit(MyControl).Text) <> '' then
begin
if FieldTag = 1 then
MField := MyControl.Hint
else
MField := MyControl.Name;
MValue := Trim(TcxTextEdit(MyControl).Text);
MTag := MyControl.Tag;
end;
end
else if MyControl is TComboBox then
begin
if Trim(TComboBox(MyControl).Text) <> '' then
begin
if FieldTag = 1 then
MField := MyControl.Hint
else
MField := MyControl.Name;
MValue := Trim(TComboBox(MyControl).Text);
MTag := MyControl.Tag;
end;
end
else if MyControl is TcxComboBox then
begin
if Trim(TcxComboBox(MyControl).Text) <> '' then
begin
if FieldTag = 1 then
MField := MyControl.Hint
else
MField := MyControl.Name;
MValue := Trim(TcxComboBox(MyControl).Text);
MTag := MyControl.Tag;
end;
end;
if MValue <> '' then
begin
if MFields.Count = 0 then
begin
if MTag = EquTag then
MResult := MResult + 'and ' + MField + '=' + quotedStr(MValue)
else if MTag = LikeTag then
MResult := MResult + 'and ' + MField + ' like ' + quotedStr('%' + MValue + '%');
end
else
begin
if MFields.IndexOf(MField) >= 0 then
begin
if MTag = EquTag then
MResult := MResult + 'and ' + MField + '=' + quotedStr(MValue)
else if MTag = LikeTag then
MResult := MResult + 'and ' + MField + ' like ' + quotedStr('%' + MValue + '%');
end;
end;
end;
Result := MResult;
end;
function ExportToFtErp(mFileName: string; ADOQueryCmd: TADOQuery): boolean; function ExportToFtErp(mFileName: string; ADOQueryCmd: TADOQuery): boolean;
var var
fFileName, fpathFileName: string; fFileName, fpathFileName: string;
@ -1458,7 +1623,6 @@ begin
end; end;
end; end;
procedure LRTSetsavedata(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TdxLayoutControl; MyTag: Integer); procedure LRTSetsavedata(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TdxLayoutControl; MyTag: Integer);
var var
i: Integer; i: Integer;
@ -1576,7 +1740,6 @@ begin
end; end;
end; end;
procedure SClearData(mParent: TWinControl; FTag: Integer); procedure SClearData(mParent: TWinControl; FTag: Integer);
var var
i, idx: Integer; i, idx: Integer;
@ -2099,6 +2262,40 @@ begin
Result := Trim(RightStr(Result, Length(Result) - 4)); Result := Trim(RightStr(Result, Length(Result) - 4));
end; end;
procedure CDSDataFilter(ADO1: TADOQuery; CDS1: TclientDataSet; Tv1: TcxGridDBTableView; JsonArgs: string);
var
JSONObject: TJSONObject;
begin
JSONObject := TJSONObject.ParseJSONValue(JsonArgs) as TJSONObject;
if ADO1.Active then
begin
Tv1.BeginUpdate();
SDofilter(ADO1, JSONObject.S['FilterStr']);
SCreateCDS(ADO1, CDS1);
SInitCDSData(ADO1, CDS1);
Tv1.EndUpdate;
end;
end;
procedure CDSDataFilter(ADO1: TADOQuery; CDS1: TclientDataSet; Tv1: TcxGridDBBandedTableView; JsonArgs: string);
var
JSONObject: TJSONObject;
begin
JSONObject := TJSONObject.ParseJSONValue(JsonArgs) as TJSONObject;
if ADO1.Active then
begin
Tv1.BeginUpdate();
SDofilter(ADO1, JSONObject.S['FilterStr']);
SCreateCDS(ADO1, CDS1);
SInitCDSData(ADO1, CDS1);
Tv1.EndUpdate;
end;
end;
/// ///////////////////////////////////////////////////////// /// /////////////////////////////////////////////////////////
// 公用过滤函数Hint // 公用过滤函数Hint
/// ///////////////////////////////////////////////////////// /// /////////////////////////////////////////////////////////
@ -2303,10 +2500,11 @@ begin
if trim(MarkStr) <> '' then if trim(MarkStr) <> '' then
CDS1.Locate(MarkStr, MarkStrValue, []); CDS1.Locate(MarkStr, MarkStrValue, []);
finally finally
tv1.EndUpdate; Tv1.EndUpdate;
end; end;
end; end;
////////////////////////////////////// //////////////////////////////////////
procedure InitAdoData(ADO1: TADOQuery; Tv1: TcxGridDBTableView; SqlStr, FilterStr, MarkStr: string); procedure InitAdoData(ADO1: TADOQuery; Tv1: TcxGridDBTableView; SqlStr, FilterStr, MarkStr: string);
var var
MarkStrValue: string; MarkStrValue: string;
@ -2335,6 +2533,7 @@ begin
Tv1.EndUpdate(); Tv1.EndUpdate();
end; end;
end; end;
procedure SInitRadioGroupBySql(ADOQueryTmp: TADOQuery; rg: TRadioGroup; emptyFlag: Boolean; mSql: string); procedure SInitRadioGroupBySql(ADOQueryTmp: TADOQuery; rg: TRadioGroup; emptyFlag: Boolean; mSql: string);
begin begin
with ADOQueryTmp do with ADOQueryTmp do
@ -2409,7 +2608,7 @@ begin
end; end;
while not Eof do while not Eof do
begin begin
A := TA.create(Nil); A := TA.create(nil);
A.S := Trim(fieldByName('Code').AsString); A.S := Trim(fieldByName('Code').AsString);
if PState = 1 then if PState = 1 then
(c3.Properties as TcxComboBoxProperties).Items.AddObject(Trim(fieldByName('name').AsString), TObject(A)) (c3.Properties as TcxComboBoxProperties).Items.AddObject(Trim(fieldByName('name').AsString), TObject(A))
@ -2445,7 +2644,7 @@ begin
end; end;
while not Eof do while not Eof do
begin begin
A := TA.create(Nil); A := TA.create(nil);
A.S := Trim(fieldByName('Code').AsString); A.S := Trim(fieldByName('Code').AsString);
if PState = 1 then if PState = 1 then
(c3.Properties as TcxComboBoxProperties).Items.AddObject(Trim(fieldByName('name').AsString), TObject(A)) (c3.Properties as TcxComboBoxProperties).Items.AddObject(Trim(fieldByName('name').AsString), TObject(A))
@ -3279,6 +3478,7 @@ begin
Result := RTValues; Result := RTValues;
end; end;
// 复制TV焦点内容 // 复制TV焦点内容
procedure CopyTVFocusValue(Tv1: TcxGridDBTableView); procedure CopyTVFocusValue(Tv1: TcxGridDBTableView);
var var
MVlaue: string; MVlaue: string;
@ -3496,6 +3696,7 @@ begin
end; end;
////////////////////////////// //////////////////////////////
//是否能删除数据记录 //是否能删除数据记录
function isCanDataDelete(mFillerId: string = ''; mfiller: string = ''): boolean; function isCanDataDelete(mFillerId: string = ''; mfiller: string = ''): boolean;
begin begin
result := false; result := false;
@ -3525,8 +3726,7 @@ begin
begin begin
Close; Close;
sql.Clear; sql.Clear;
sql.Add('select item_value,data_type from sy_module_param_set where dll_name=''' + sql.Add('select item_value,data_type from sy_module_param_set where dll_name=''' + Trim(DllName) + ''' and config_name=''' + Trim(ConfigName) + '''');
Trim(DllName) + ''' and config_name=''' + Trim(ConfigName) + '''');
Open; Open;
if RecordCount > 0 then if RecordCount > 0 then
begin begin
@ -3553,6 +3753,7 @@ end;
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
/// 粘贴剪贴板中的数据到表格 /// 粘贴剪贴板中的数据到表格
/// ///
procedure pasteDatatTocxGrid(Tv1: TcxGridDBTableView); procedure pasteDatatTocxGrid(Tv1: TcxGridDBTableView);
var var
SelectedCount: Integer; SelectedCount: Integer;
@ -3563,7 +3764,8 @@ var
startColIndex: integer; startColIndex: integer;
startrowIndex: integer; startrowIndex: integer;
begin begin
if Tv1.Controller.SelectedRowCount=0 then exit; if Tv1.Controller.SelectedRowCount = 0 then
exit;
startColIndex := Tv1.Controller.CellSelectionAnchor.Index; startColIndex := Tv1.Controller.CellSelectionAnchor.Index;
@ -3578,7 +3780,8 @@ begin
// 遍历每一行 // 遍历每一行
for i := 0 to StringList.Count - 1 do for i := 0 to StringList.Count - 1 do
begin begin
if i>tv1.Controller.SelectedRowCount-1 then break; if i > Tv1.Controller.SelectedRowCount - 1 then
break;
// 将每行按制表符(或其他分隔符)拆分为单元格数据 // 将每行按制表符(或其他分隔符)拆分为单元格数据
RowData := Split(StringList[i], #9); // 假设使用制表符作为分隔符 RowData := Split(StringList[i], #9); // 假设使用制表符作为分隔符
@ -3587,15 +3790,16 @@ begin
// 遍历每一列并将数据填充到cxGrid // 遍历每一列并将数据填充到cxGrid
for j := 0 to Length(RowData) - 1 do for j := 0 to Length(RowData) - 1 do
begin begin
if j>tv1.Controller.SelectedColumnCount-1 then break; if j > Tv1.Controller.SelectedColumnCount - 1 then
break;
// 假设cxGrid已经初始化且有足够的行和列 // 假设cxGrid已经初始化且有足够的行和列
TV1.DataController.Values[Tv1.Controller.FocusedRecordIndex, startColIndex+j] := RowData[j]; Tv1.DataController.Values[Tv1.Controller.FocusedRecordIndex, startColIndex + j] := RowData[j];
Tv1.DataController.DataSet.Edit; Tv1.DataController.DataSet.Edit;
Tv1.DataController.DataSet.FieldByName(Tv1.Columns[startColIndex + j].DataBinding.FieldName).AsString := RowData[j]; Tv1.DataController.DataSet.FieldByName(Tv1.Columns[startColIndex + j].DataBinding.FieldName).AsString := RowData[j];
TV1.Controller.EditingController.ShowEdit; Tv1.Controller.EditingController.ShowEdit;
end; end;
end; end;
@ -3644,5 +3848,6 @@ begin
Result[ItemIndex] := Copy(s, Start, len - Start + 1); Result[ItemIndex] := Copy(s, Start, len - Start + 1);
end; end;
end. end.