unit U_Fun;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ToolWin, StdCtrls, BtnEdit, cxStyles, cxCustomData,
  cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit, DBGrids, DB, cxDBData,
  cxGridLevel, cxClasses, cxControls, cxGridCustomView, ADODB, StrUtils, Midas,
  cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxTimeEdit,
  cxTreeView, cxGrid, cxDBLookupComboBox, cxCalendar, cxCurrencyEdit,
  cxGridExportLink, ExtCtrls, Buttons, DBClient, FTComboBox, cxDropDownEdit,
  cxGridBandedTableView, cxGridDBBandedTableView, cxRichEdit, cxButtonEdit,
  IniFiles, WinSock, dxCore, ActiveX, IdHTTP;
//Function sendarp(ipaddr:ulong;temp:dword;ulmacaddr:pointer;ulmacaddrleng:pointer) : DWord; StdCall; External 'Iphlpapi.dll' Name 'SendARP';

type
  TA = class(TComponent)
  public
    S: string;
  end;

function SGetMaxId(AdoQueryTemp: TADOQuery; MyTable: string; MyField: string; var MaxId: Integer): Boolean;

function SIsRepeated(AdoQueryTemp: TADOQuery; MyTable: string; MyField: string; MyCode: string): Boolean;

function SSetSaveDataCDS(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;

function SSetSaveDataCDS10(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;

function SGetServerDate(ADOQueryTmp: TADOQuery): TdateTime;

procedure SSetsavedata(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);

procedure SSetWinData(ADOQueryTmp: TADOQuery; mParent: TWinControl);

function SDelData(ADOQueryCmd: TADOQuery; mDelStr: string): Boolean;

function SGetFilters(TMPanel: TPanel; EquTag, LikeTag: Integer): string;

function SGetFiltersHint(TMPanel: TPanel; EquTag, LikeTag: Integer): string;

procedure SDofilter(ADOQry: TADOQuery; FilterStr: string);

function SGetMaxNo(MyAdoQuery: TADOQuery; MyTable: string; MyField: string; MyFlag: string): string;

procedure SCreateCDS20(SADOQry: TADOQuery; mClientDataset: TclientDataSet);

procedure SInitCDSData20(fromADO: TADOQuery; toCDS: TclientDataSet);

procedure SCreateCDSYS(SADOQry: TADOQuery; mClientDataset: TclientDataSet);

procedure SInitCDSDataYS(fromADO: TADOQuery; toCDS: TclientDataSet);

procedure SInitFtComBoxBySql(ADOQueryTmp: TADOQuery; cb: TFtComboBox; FlagType: string; Boxtype: integer; showMsg: string; emptyFlag: Boolean; mSql: string);

procedure SInitComBoxBySql(ADOQueryTmp: TADOQuery; cb: TComboBox; emptyFlag: Boolean; mSql: string);

procedure SInitComBoxByCustCode(ADOQueryTmp: TADOQuery; cb: TComboBox; FlagType: string; Boxtype: integer; showMsg: string; emptyFlag: Boolean);

procedure SInitCxGridComboBoxByCustCode(ADOQueryTmp: TADOQuery; c3: TcxGriddbColumn; FlagType: string; PState: Integer; IsNull: Boolean; Shmeg: string);

procedure SSetsavedata10(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);

procedure SSetWinData10(ADOQueryTmp: TADOQuery; mParent: TWinControl);

procedure SInitCxGridComboBoxBySql(ADOQueryTmp: TADOQuery; c3: TcxGriddbColumn; FSql: string; PState: Integer; IsNull: Boolean; Shmeg: string);

function SSWR(s: real): real; //*****�������� *****//

procedure SSetWinData20(ADOQueryTmp: TADOQuery; mParent: TWinControl);

procedure SSetWinData30(ADOQueryTmp: TADOQuery; mParent: TWinControl; FTag: Integer);

procedure SCSHData(ADOQueryTmp: TADOQuery; mParent: TWinControl; FTag: Integer);

procedure SSetsavedataNew(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);

function SGetServerDate10(ADOQueryTmp: TADOQuery): TDateTime;

function SGetServerDateTime(ADOQueryTmp: TADOQuery): TDateTime;

procedure SCreateCDSSel(SADOQry: TADOQuery; mClientDataset: TclientDataSet);

procedure SInitCDSDataSel(fromADO: TADOQuery; toCDS: TclientDataSet);

procedure CopyAddRow(Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet); //�������С���groupformat���ֵ��

procedure CopyAddRowBand(Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet);

procedure OneKeyPost(Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet); //һ���滻ճ��

procedure CopyAddRowCDS(CDS_Sub: TClientDataSet);

function SSetSaveDataCDSNew(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;

function SGetFinds(TMPanel: TPanel; EquTag, LikeTag: Integer): string;

function SSetSaveDataCDSBandNew(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;

function GetLSNo(ADOQueryTmp: TADOQuery; var mMaxNo: string; mFlag: string; mTable: string; mlen: integer; mtype: integer = 0): Boolean;

procedure SSetsaveSql(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);

procedure ReadCxGrid(fileName: string; cxgrid: TcxGridDBTableView; filePack: string = '����');

procedure ReadCxBandedGrid(fileName: string; cxgrid: TcxGridDBBandedTableView; filePack: string = '����');

procedure WriteCxGrid(fileName: string; cxgrid: TcxGridDBTableView; filePack: string = '����');

procedure WriteCxBandedGrid(fileName: string; cxgrid: TcxGridDBBandedTableView; filePack: string = '����');

procedure CreateGroupSummarry(tv1: TcxGridDBTableView);

procedure TcxGridToExcel(mfileName: string; gridName: TcxGrid);

procedure TcxGridToExcelEng(mfileName: string; gridName: TcxGrid);

function ReadINIFileStr(ininame, TypeName: string; ValueName, ValueMR: string): string;

procedure SClearData(mParent: TWinControl; FTag: Integer);

procedure SelExportData(FTv: TcxGridDBTableView; FAdoQry: TADOQuery; FTile: string);

procedure SDofilter10(cds_Main: TClientDataSet; FilterStr: string);

procedure GetHTTP(IdHttp: TIdHTTP; FUrl: string);

procedure SInitCxBandGridComboBoxBySql(ADOQueryTmp: TADOQuery; c3: TcxGridDBBandedColumn; FSql: string; PState: Integer; IsNull: Boolean; Shmeg: string);

procedure ColumnView(AdoQueryTemp: TADOQuery; Tv1: TcxGridDBTableView; MKName10: string);

procedure ColumnSet(TV10: TcxGridDBTableView; MKName10: string);

procedure ColumnBandSet(TV10: TcxGridDBBandedTableView; MKName10: string);

procedure ColumnBandView(AdoQueryTemp: TADOQuery; Tv1: TcxGridDBBandedTableView; MKName10: string);

procedure SCSHDataWTag(ADOQueryTmp: TADOQuery; mParent: TWinControl);

procedure GetSWLDZ(IPStr: string);

procedure SCSHDataCDS(CDS_Main: TClientDataSet; mParent: TWinControl; FTag: Integer);

procedure SelPrintData(FTv: TcxGridDBTableView; FAdoQry: TADOQuery; FTitle: string; FLTitle: string; FRTile: string);

procedure SelPrintDataMore(FTv: TcxGridDBTableView; FAdoQry: TADOQuery; FTitle: string; FLTitle: string; FRTile: string; FKK: Integer; FiniName: string);

procedure SelExportDataBand(FTv: TcxGridDBBandedTableView; FAdoQry: TADOQuery; FTile: string);

procedure SSetsaveSqlNew(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);

procedure SCSHDataNew(ADOQueryTmp: TADOQuery; mParent: TWinControl; FTag: Integer);

function RTSetSaveDataCDS(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;

function RTSetSaveDataCDSBand(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;

procedure SCreateCDSOnly(SADOQry: TADOQuery; mClientDataset: TclientDataSet);

procedure SInitCDSDataOnly(fromADO: TADOQuery; toCDS: TclientDataSet);

procedure SelOKNo(CDS_MainSel: TClientDataSet; FSel: Boolean);

procedure SelOKNoAdo(CDS_MainSel: TADOQuery; FSel: Boolean);

function num2cengnum(strArabic: string): string;

function num2ceng(strArabic: string): string;

procedure RTSetsavedata(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);

procedure InitOrderColor(OrdMainId: string; Combox: TComboBox; FAdoQry: TADOQuery);

procedure InitBCGangNo(OrdSubId: string; Combox: TComboBox; FAdoQry: TADOQuery);

procedure InitRCGangNo(OrdSubId: string; Combox: TComboBox; FAdoQry: TADOQuery);

procedure DelCDS(ClientDataSet1: TClientDataSet; ADOCmd: TADOQuery; DelSql: string);

procedure SInitComBoxByTvColumns(cb: TComboBox; Tv1: TcxGridDBTableView; ColumnTag: Integer; TowFlag: Boolean; emptyFlag: Boolean);

procedure HJ(mClientDataset: TclientDataSet; Label1: TLabel; mfieldName: double);

function num2cengnumZS(strArabic: string): string;

function CovFileDate(Fd: _FileTime): TDateTime;

procedure GetFileEditTime(mFile: string; var editTime: tdatetime);

procedure GetFileInfo(mFile: string; var mfileSize: integer; var CreationTime: tdatetime; var WriteTime: tdatetime);

function ExportFtErpFile(mFileName: string; ADORead: TADOQuery): boolean;

function ExportFtErpFile10(mFileName: string; ADORead: TADOQuery): boolean;

procedure UpdateFileTime(FileName: string; CreationTime, LastAccessTime, LastWriteTime: TDateTime);

procedure ClearOrHideControls(TMPanel: TPanel; HintValue: string; IsClear: Boolean; IsHide: Boolean);

procedure AssignmentControls(TMPanel: TPanel; TMClientDataset: TclientDataSet; Hintvalue: string);

procedure IsVisibleTV(TMPanel: TPanel; MTV: TcxGridDBTableView; Hintvalue: string; IsVisible: Boolean);

function RoundFloat(f: double; i: integer): double;

implementation

uses
  U_DataLink, U_SelExportField, U_ColumnSet, U_ColumnBandSet, U_SelPrintFieldNew;

function RoundFloat(f: double; i: integer): double;
var
  s: string;
  ef: Extended;
begin
  if f = 0 then
  begin
    Result := 0;
    Exit;
  end;
  s := '#.' + StringOfChar('0', i);
  if s = '#.' then
    s := '#';
  ef := StrToFloat(FloatToStr(f)); //��ֹ������������
  result := StrToFloat(FormatFloat(s, ef));
end;

function ExportFtErpFile(mFileName: string; ADORead: TADOQuery): boolean;
var
  Stream: TMemoryStream;
  ff: TADOBlobstream;
  mfileSize: integer;
  mCreationTime: TdateTime;
  mWriteTime: TdateTime;
  IsFileHas: boolean;
  mChildPath: string;
  mFilePath: string;
begin
  try
    result := false;
    mChildPath := '';
    ///////////////////////////////////////////////
    //��ȡ�ļ����ص���·��
    with ADORead do
    begin
      close;
      sql.Clear;
      sql.Add('select FilePath ');
      sql.Add('from RT_FileUpdate');
      sql.Add('where FileName=' + quotedStr(mFileName));
      Open;
      if RecordCount > 0 then
      begin
       // if not fieldByName('valid').AsBoolean then exit;
        if trim(fieldByName('FilePath').AsString) <> '' then
          mChildPath := trim(fieldByName('FilePath').AsString) + '\';
      end;
    end;
    //�����Ʒ����
    mFilePath := ExtractFilePath(Paramstr(0)) + mChildPath;
    IsFileHas := FileExists(mFilePath + mFileName);
    if IsFileHas then
    begin
      //////////////////////////
      //��ȡ�ļ���Ϣ
      GetFileInfo(mFilePath + mFileName, mfileSize, mCreationTime, mWriteTime);
    end;
    //////////////////////////////////////////
    //�����ļ�
    if IsFileHas then
    begin
      with ADORead do
      begin
        close;
        sql.Clear;
        sql.Add('select count(FileName) as cnt ');
        sql.Add('from RT_FileUpdate');
        sql.Add('where FileName=' + quotedStr(mFileName));
       // sql.Add('and fileEditDate>'''+formatDateTime('yyyy-MM-dd hh:mm',mWriteTime)+'''');
        sql.Add(' and DATEDIFF(minute,' + quotedStr(formatDateTime('yyyy-MM-dd hh:mm', mWriteTime)) + ',fileEditDate)>0');
        Open;


        //�Ƿ�����µ��ļ�
        if fieldByName('cnt').AsInteger > 0 then
        begin
          close;
          sql.Clear;
          sql.Add('select * ');
          sql.Add('from RT_FileUpdate');
          sql.Add('where FileName=' + quotedStr(mFileName));

          Open;

          ff := TADOBlobstream.Create(fieldByName('Files') as TblobField, bmRead);
        end
        else
        begin
          exit;
        end;

        if trim(fieldByName('FilePath').AsString) <> '' then
          mChildPath := trim(fieldByName('FilePath').AsString) + '\';
      end;
    end
    //////////////////////////////////////
    //������
    else
    begin
      with ADORead do
      begin
        close;
        sql.Clear;
        sql.Add('select * ');
        sql.Add('from RT_FileUpdate');
        sql.Add('where FileName=' + quotedStr(mFileName));
        Open;

        if recordCount > 0 then
        begin
          ff := TADOBlobstream.Create(fieldByName('Files') as TblobField, bmRead);
        end
        else
        begin
          exit;
        end;

        if trim(fieldByName('FilePath').AsString) <> '' then
          mChildPath := trim(fieldByName('FilePath').AsString) + '\';
      end;

    end;

    if ff <> nil then
    begin
      try
        mFileName := trim(ADORead.fieldByName('FileName').asString);
        if not DirectoryExists(ExtractFileDir(mFilePath + mFileName)) then
          ForceDirectories(ExtractFileDir(mFilePath + mFileName));
        Stream := TMemoryStream.Create;
        //OleContainer1.SaveToStream(Stream);
        //ADOQuery1FileContent.SaveToFile('tmp'); //���ݴ�����ʱ�ļ�
        //OleContainer1.LoadFromFile('tmp'); //����ʱ�ļ��ж�ȡOLE����
        ff.SaveToStream(Stream);
        //OleContainer1.SaveToFile(ExtractFilePath(Paramstr(0))+mfielName)
        Stream.SaveToFile(mFilePath + mFileName); //+'\tmpFile\'

        //OleContainer1.SaveToFile('tmp');
      finally
        Stream.Free;
      end;
    end;
    UpdateFileTime(mFilePath + mFileName, ADORead.fieldByName('FileCreateDate').AsDateTime, ADORead.fieldByName('FileEditDate').AsDateTime, ADORead.fieldByName('FileEditDate').AsDateTime);
    Result := true;
  except
    application.MessageBox(pchar('��ȡ�ļ�' + mFileName + 'ʧ��!'), '��ʾ��Ϣ', 0);
  end;
end;

function ExportFtErpFile10(mFileName: string; ADORead: TADOQuery): boolean;
var
  Stream: TMemoryStream;
  ff: TADOBlobstream;
  mfileSize: integer;
  mCreationTime: TdateTime;
  mWriteTime: TdateTime;
  IsFileHas: boolean;
  mChildPath: string;
  mFilePath: string;
begin
  try
    result := false;
    mChildPath := '';
    ///////////////////////////////////////////////
    //��ȡ�ļ����ص���·��
    with ADORead do
    begin
      close;
      sql.Clear;
      sql.Add('select FilePath ');
      sql.Add('from RT_FileUpdate');
      sql.Add('where FileName=' + quotedStr(mFileName));
      Open;
      if RecordCount > 0 then
      begin
       // if not fieldByName('valid').AsBoolean then exit;
        if trim(fieldByName('FilePath').AsString) <> '' then
          mChildPath := 'report10\';
      end;
    end;
    //�����Ʒ����
    mFilePath := ExtractFilePath(Paramstr(0)) + mChildPath;
    IsFileHas := FileExists(mFilePath + mFileName);
    if IsFileHas then
    begin
      //////////////////////////
      //��ȡ�ļ���Ϣ
      GetFileInfo(mFilePath + mFileName, mfileSize, mCreationTime, mWriteTime);
    end;
    //////////////////////////////////////////
    //�����ļ�
    if IsFileHas then
    begin
      with ADORead do
      begin
        close;
        sql.Clear;
        sql.Add('select count(FileName) as cnt ');
        sql.Add('from RT_FileUpdate');
        sql.Add('where FileName=' + quotedStr(mFileName));
       // sql.Add('and fileEditDate>'''+formatDateTime('yyyy-MM-dd hh:mm',mWriteTime)+'''');
        sql.Add(' and DATEDIFF(minute,' + quotedStr(formatDateTime('yyyy-MM-dd hh:mm', mWriteTime)) + ',fileEditDate)>0');
        Open;


        //�Ƿ�����µ��ļ�
        if fieldByName('cnt').AsInteger > 0 then
        begin
          close;
          sql.Clear;
          sql.Add('select * ');
          sql.Add('from RT_FileUpdate');
          sql.Add('where FileName=' + quotedStr(mFileName));

          Open;

          ff := TADOBlobstream.Create(fieldByName('Files') as TblobField, bmRead);
        end
        else
        begin
          exit;
        end;

        if trim(fieldByName('FilePath').AsString) <> '' then
          mChildPath := trim(fieldByName('FilePath').AsString) + '\';
      end;
    end
    //////////////////////////////////////
    //������
    else
    begin
      with ADORead do
      begin
        close;
        sql.Clear;
        sql.Add('select * ');
        sql.Add('from RT_FileUpdate');
        sql.Add('where FileName=' + quotedStr(mFileName));
        Open;

        if recordCount > 0 then
        begin
          ff := TADOBlobstream.Create(fieldByName('Files') as TblobField, bmRead);
        end
        else
        begin
          exit;
        end;

        if trim(fieldByName('FilePath').AsString) <> '' then
          mChildPath := trim(fieldByName('FilePath').AsString) + '\';
      end;

    end;

    if ff <> nil then
    begin
      try
        mFileName := trim(ADORead.fieldByName('FileName').asString);
        if not DirectoryExists(ExtractFileDir(mFilePath + mFileName)) then
          ForceDirectories(ExtractFileDir(mFilePath + mFileName));
        Stream := TMemoryStream.Create;
        //OleContainer1.SaveToStream(Stream);
        //ADOQuery1FileContent.SaveToFile('tmp'); //���ݴ�����ʱ�ļ�
        //OleContainer1.LoadFromFile('tmp'); //����ʱ�ļ��ж�ȡOLE����
        ff.SaveToStream(Stream);
        //OleContainer1.SaveToFile(ExtractFilePath(Paramstr(0))+mfielName)
        Stream.SaveToFile(mFilePath + mFileName); //+'\tmpFile\'

        //OleContainer1.SaveToFile('tmp');
      finally
        Stream.Free;
      end;
    end;
    UpdateFileTime(mFilePath + mFileName, ADORead.fieldByName('FileCreateDate').AsDateTime, ADORead.fieldByName('FileEditDate').AsDateTime, ADORead.fieldByName('FileEditDate').AsDateTime);
    Result := true;
  except
    application.MessageBox(pchar('��ȡ�ļ�' + mFileName + 'ʧ��!'), '��ʾ��Ϣ', 0);
  end;
end;

procedure UpdateFileTime(FileName: string; CreationTime, LastAccessTime, LastWriteTime: TDateTime);
var
  FileHnd: Integer;
  SysTime: TSystemTime;
  tTzi: TTimezoneInformation;
  FCreationTime, FLastAccessTime, FLastWriteTime: TFileTime;
begin
  GetTimezoneInformation(tTzi);
  CreationTime := CreationTime + tTzi.Bias / 1440;
  DateTimeToSystemTime(CreationTime, SysTime);
  SystemTimeToFileTime(SysTime, FCreationTime);
  //LastAccessTime := LastAccessTime + Ttzi.Bias/1440;
  //DateTimeToSystemTime(LastAccessTime,SysTime);
  //SystemTimeToFileTime(SysTime,FLastAccessTime);
  LastWriteTime := LastWriteTime + tTzi.Bias / 1440;
  DateTimeToSystemTime(LastWriteTime, SysTime);
  SystemTimeToFileTime(SysTime, FLastWriteTime);
  try
    FileHnd := FileOpen(FileName, fmOpenWrite or fmShareDenyNone);
    SetFileTime(FileHnd, @FCreationTime, nil, @FLastWriteTime);
  finally
    FileClose(FileHnd);
  end;
end;
////////////////////////////////////////////////////////
  //
///////////////////////////////////////////////////////

procedure GetFileInfo(mFile: string; var mfileSize: integer; var CreationTime: tdatetime; var WriteTime: tdatetime);
var
  vSearchRec: TSearchRec;
begin
  FindFirst(mFile, faAnyFile, vSearchRec);
  mfileSize := vSearchRec.Size;
  CreationTime := CovFileDate(vSearchRec.FindData.ftCreationTime); //����ʱ��
   //vSearchRec.FindData.ftLastAccessTime//����ʱ��
  WriteTime := CovFileDate(vSearchRec.FindData.ftLastWriteTime); //�޸�ʱ��
  FindClose(vSearchRec);
end;

procedure GetFileEditTime(mFile: string; var editTime: tdatetime);
var
  vSearchRec: TSearchRec;
begin
  FindFirst(mFile, faAnyFile, vSearchRec);
   //mfileSize:=vSearchRec.Size;
 //  CreationTime:=CovFileDate(vSearchRec.FindData.ftCreationTime);//����ʱ��
   //vSearchRec.FindData.ftLastAccessTime//����ʱ��
  editTime := CovFileDate(vSearchRec.FindData.ftLastWriteTime); //�޸�ʱ��
  FindClose(vSearchRec);
end;
///////////////////////////////////////////////
  //
/////////////////////////////////////////////

function CovFileDate(Fd: _FileTime): TDateTime;
var
  Tct: _SystemTime;
  Temp: _FileTime;
begin
  FileTimeToLocalFileTime(Fd, Temp);
  FileTimeToSystemTime(Temp, Tct);
  CovFileDate := SystemTimeToDateTime(Tct);
end;
///////////////////////////////////////////////////////
  //�������������ر�����
///////////////////////////////////////////////////////

procedure IsVisibleTV(TMPanel: TPanel; MTV: TcxGridDBTableView; Hintvalue: string; IsVisible: Boolean);
var
  i, j: integer;
begin

  with TMPanel do
  begin
    for j := 0 to TMPanel.ControlCount - 1 do
    begin
      if TMPanel.Controls[j] is TEdit then
      begin
        if Trim(TEdit(TMPanel.Controls[j]).Hint) = Hintvalue then
        begin
          with MTV do
          begin
            for i := 0 to MTV.ColumnCount - 1 do
            begin
              if Trim(TEdit(TMPanel.Controls[j]).Name) = Trim(MTV.Columns[i].DataBinding.FieldName) then
              begin
                MTV.Columns[i].Visible := IsVisible;
                Continue;
              end;
            end;
          end;
        end;
      end;
      if TMPanel.Controls[j] is TComboBox then
      begin
        if Trim(TComboBox(TMPanel.Controls[j]).Hint) = Hintvalue then
        begin
          with MTV do
          begin
            for i := 0 to MTV.ColumnCount - 1 do
            begin
              if Trim(TComboBox(TMPanel.Controls[j]).Name) = Trim(MTV.Columns[i].DataBinding.FieldName) then
              begin
                MTV.Columns[i].Visible := IsVisible;
                Continue;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
end;
///////////////////////////////////////////////////////
  //��������������������
///////////////////////////////////////////////////////

procedure AssignmentControls(TMPanel: TPanel; TMClientDataset: TclientDataSet; Hintvalue: string);
var
  i: integer;
begin
  with TMPanel do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i] is TEdit then
      begin
        if Trim(TEdit(Controls[i]).Hint) = Hintvalue then
        begin
          TEdit(Controls[i]).Text := Trim(TMClientDataset.FieldByName(TEdit(Controls[i]).Name).AsString);
        end;
      end;
      if Controls[i] is TComboBox then
      begin
        if Trim(TEdit(Controls[i]).Hint) = Hintvalue then
        begin
          TComboBox(Controls[i]).ItemIndex := TComboBox(Controls[i]).Items.IndexOf(Trim(TMClientDataset.FieldByName(TComboBox(Controls[i]).Name).AsString));
        end;
      end;
    end;
  end;
end;
///////////////////////////////////////////////////////
  //�����������������
///////////////////////////////////////////////////////

procedure ClearOrHideControls(TMPanel: TPanel; HintValue: string; IsClear: Boolean; IsHide: Boolean);
var
  i: Integer;
begin
  with TMPanel do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i] is TCheckBox then
      begin
        if TCheckBox(Controls[i]).Hint = HintValue then
        begin
          TCheckBox(Controls[i]).Visible := IsHide;
        end;
      end;
      if Controls[i] is TLabel then
      begin
        if TLabel(Controls[i]).Hint = HintValue then
        begin
          TLabel(Controls[i]).Visible := IsHide;
        end;
      end;
      if Controls[i] is TComboBox then
      begin
        if TComboBox(Controls[i]).Hint = HintValue then
        begin
          TComboBox(Controls[i]).Visible := IsHide;
          if IsClear then
            TComboBox(Controls[i]).ItemIndex := -1;
        end;
      end;
      if Controls[i] is TEdit then
      begin

        if Trim(TEdit(Controls[i]).Hint) = HintValue then
        begin
          TEdit(Controls[i]).Visible := IsHide;
          if IsClear then
            TEdit(Controls[i]).Text := '';
        end;
      end;
    end;
  end;
end;

function num2cengnumZS(strArabic: string): string;
var
  p, i, j, x: integer;
  s, Y: string;
begin
  result := '';
  s := strArabic;
  p := pos('.', strArabic);
  if p = 0 then
  begin
    result := num2ceng(strArabic) + 'Only';
    exit;
  end
  else
  begin
    i := length(s) - p; //����С��������м�λ
    delete(strArabic, p, i + 1); //ɾ��С�����������
    result := num2ceng(strArabic) + 'DOLLORS';
  end;
  Y := copy(s, p, i + 1);
  result := result + ' ' + num2ceng(Y) + ' CENTS';
end;

procedure HJ(mClientDataset: TclientDataSet; Label1: TLabel; mfieldName: double);
begin
  if mClientDataset.IsEmpty then
    exit;
  with mClientDataset do
  begin
    if fieldbyname('Ssel').AsBoolean = true then
      Label1.Caption := currtostr(strtoCurr(Label1.Caption) + mfieldName)
    else
      Label1.Caption := currtostr(strtoCurr(Label1.Caption) - mfieldName);
  end;
end;

///////////////////ȡ����Int���ֶ����ֵ///////////////////////////////////////
function SGetMaxId(AdoQueryTemp: TADOQuery; MyTable: string; MyField: string; var MaxId: Integer): Boolean;
begin
  try
    with AdoQueryTemp do
    begin
      Close;
      SQL.Clear;
      SQL.Add('select Max(' + MyField + ')+1 MaxId from ' + MyTable);
      Open;
    end;
    with AdoQueryTemp do
    begin
      if (Trim(FieldByName('MaxId').AsString) = '') or (Trim(FieldByName('MaxId').AsString) = NULL) then
        MaxId := 1
      else
        MaxId := (fieldbyname('MaxId').AsInteger);
      Close;
      SQL.Clear;
    end;
    Result := True;
  except
    Result := False;
    Application.MessageBox('ȡ���ֵʧ�ܣ�', '��ʾ', 0);
  end;
end;

procedure InitBCGangNo(OrdSubId: string; Combox: TComboBox; FAdoQry: TADOQuery);
var
  fsj: string;
begin
  fsj := 'select distinct(AOrdDefStr1) Code from JYOrder_Sub_AnPai ' + ' where Subid=''' + Trim(OrdSubId) + '''';
  with FAdoQry do
  begin
    Close;
    sql.Clear;
    sql.Add(fsj);
    Open;
  end;
  Combox.Clear;
  with FAdoQry do
  begin
    First;
    while not Eof do
    begin
      Combox.Items.Add(Trim(FAdoQry.fieldbyname('Code').AsString));
      Next;
    end;
  end;
  Combox.Items.Add('');
end;

procedure InitRCGangNo(OrdSubId: string; Combox: TComboBox; FAdoQry: TADOQuery);
var
  fsj: string;
begin
  fsj := 'select distinct(gangno) Code from JYOrder_Sub_AnPai ' + ' where Subid=''' + Trim(OrdSubId) + '''';
  with FAdoQry do
  begin
    Close;
    sql.Clear;
    sql.Add(fsj);
    Open;
  end;
  Combox.Clear;
  with FAdoQry do
  begin
    First;
    while not Eof do
    begin
      Combox.Items.Add(Trim(FAdoQry.fieldbyname('Code').AsString));
      Next;
    end;
  end;
  Combox.Items.Add('');
end;

procedure GetHTTP(IdHttp: TIdHTTP; FUrl: string);
var
  ResponseStream: TStringStream; //������Ϣ
  ResponseStr: string;
begin
  //����IDHTTP�ؼ�
  IdHttp := TIdHTTP.Create(nil);
  IdHttp.HTTPOptions := IdHttp.HTTPOptions + [hoKeepOrigProtocol];
  //TStringStream�������ڱ�����Ӧ��Ϣ
  ResponseStream := TStringStream.Create('');
  try
    try
      IdHttp.Get(FUrl, ResponseStream); //�����ַ
    except
      on e: Exception do
      begin
        ShowMessage(e.Message);
      end;
    end;
    //��ȡ��ҳ���ص���Ϣ
    ResponseStr := ResponseStream.DataString;
    //��ҳ�еĴ�������ʱ����Ҫ����UTF8����
    ResponseStr := UTF8Decode(ResponseStr);
//    ShowMessage(ResponseStr);
  finally
    IdHttp.Free;
    ResponseStream.Free;
  end;
end;

procedure InitOrderColor(OrdMainId: string; Combox: TComboBox; FAdoQry: TADOQuery);
var
  fsj: string;
begin
  fsj := 'select distinct(PRTColor) Code from JYOrder_Sub ' + ' where Mainid=''' + Trim(OrdMainId) + '''';
  with FAdoQry do
  begin
    Close;
    sql.Clear;
    sql.Add(fsj);
    Open;
  end;
  Combox.Clear;
  with FAdoQry do
  begin
    First;
    while not Eof do
    begin
      Combox.Items.Add(Trim(FAdoQry.fieldbyname('Code').AsString));
      Next;
    end;
  end;
  Combox.Items.Add('');
end;
////�Զ����ӡ

procedure SelPrintData(FTv: TcxGridDBTableView; FAdoQry: TADOQuery; FTitle: string; FLTitle: string; FRTile: string);
var
  i, j, k, KK: Integer;
  fsj: string;
  FOrder, fcolumnName: string;
begin
  {if FAdoQry.IsEmpty then Exit;
  try
    frmSelPrintFieldNew:=TfrmSelPrintFieldNew.Create(Application);
    with frmSelPrintFieldNew do
    begin
      with frmSelPrintFieldNew.PrnGrid do
      begin
        PrnGrid.Columns.Clear;
        frmSelPrintFieldNew.IniName:=FTitle;
        for i:=0 to FTv.ColumnCount-1 do
        begin
          if FTv.Columns[i].Visible=True then
          begin
            PrnGrid.Columns.Add;
            j:=PrnGrid.Columns.Count-1;
            PrnGrid.Columns[j].Title.Caption:=FTv.Columns[i].Caption;
            PrnGrid.Columns[j].FieldName:=FTv.Columns[i].DataBinding.FieldName;
            PrnGrid.Columns[j].Width:=FTv.Columns[i].Width;
            if FTv.Columns[i].SortOrder=soAscending then
            begin
              FOrder:=' '+FTv.Columns[i].DataBinding.FieldName+'  ';
            end else
            if FTv.Columns[i].SortOrder=soDescending then
            begin
              FOrder:=' '+FTv.Columns[i].DataBinding.FieldName+' DESC';
            end;
          end;
        end;
      end;
      FAdoQry.Sort:=FOrder;
      frmSelPrintFieldNew.RMPrintDBGrid1.PageCaptionMsg.TitleMemo.Add(FTitle);
      frmSelPrintFieldNew.RMPrintDBGrid1.PageCaptionMsg.CaptionMsg.LeftMemo.Add(FLTitle);
      frmSelPrintFieldNew.RMPrintDBGrid1.PageCaptionMsg.CaptionMsg.RightMemo.Add(FRTile);
      SCreatecds20(FAdoQry,frmSelPrintFieldNew.ClientDataSet1);
      SInitCDSData20(FAdoQry,frmSelPrintFieldNew.ClientDataSet1);
      if FTv.OptionsView.Footer=True then
      begin
        if FTv.DataController.Summary.FooterSummaryItems.Count>0 then
        begin
          frmSelPrintFieldNew.ClientDataSet1.Append;
          //frmSelPrintFieldNew.ClientDataSet1.FieldByName('Sindex').Value:=frmSelPrintFieldNew.ClientDataSet1.RecNo+1;
          frmSelPrintFieldNew.ClientDataSet1.Post;
          KK:=0;
          for i:=0 to FTv.ColumnCount-1 do
          begin
            if FTv.Columns[i].Visible=False then  Continue;

            fcolumnName:=FTv.Columns[i].Name;
            if FTv.Columns[i].Summary.FooterKind<>sknone then
            begin
              for k:=0 to FTv.DataController.Summary.FooterSummaryItems.Count-1 do
              begin
                if TcxGridDBTableSummaryItem(FTv.DataController.Summary.FooterSummaryItems.Items[k]).Column.Name=fcolumnName then
                begin
                  frmSelPrintFieldNew.ClientDataSet1.edit;
                  frmSelPrintFieldNew.ClientDataSet1.FieldByName(FTv.Columns[i].DataBinding.FieldName).Value:=
                                                             FTv.DataController.Summary.FooterSummaryValues[k];
                  frmSelPrintFieldNew.ClientDataSet1.Post;
                end;
              end;
            end;
          end;
        end;
      end;
      if ShowModal=1 then
      begin

      end;
    end;

  finally
    frmSelPrintFieldNew.Free;
  end; }
end;
////�Զ����ӡ

procedure SelPrintDataMore(FTv: TcxGridDBTableView; FAdoQry: TADOQuery; FTitle: string; FLTitle: string; FRTile: string; FKK: Integer; FiniName: string);
var
  i, j, k, KK: Integer;
  fsj: string;
  FOrder, fcolumnName: string;
begin
  {if FAdoQry.IsEmpty then Exit;
  try
    frmSelPrintFieldNew:=TfrmSelPrintFieldNew.Create(Application);
    with frmSelPrintFieldNew do
    begin
      with frmSelPrintFieldNew.PrnGrid do
      begin
        PrnGrid.Columns.Clear;
        frmSelPrintFieldNew.IniName:=FiniName;
        for i:=0 to FTv.ColumnCount-1 do
        begin
          if FTv.Columns[i].Visible=True then
          begin
            PrnGrid.Columns.Add;
            j:=PrnGrid.Columns.Count-1;
            PrnGrid.Columns[j].Title.Caption:=FTv.Columns[i].Caption;
            PrnGrid.Columns[j].FieldName:=FTv.Columns[i].DataBinding.FieldName;
            PrnGrid.Columns[j].Width:=FTv.Columns[i].Width;
            if FTv.Columns[i].SortOrder=soAscending then
            begin
              FOrder:=' '+FTv.Columns[i].DataBinding.FieldName+'  ';
            end else
            if FTv.Columns[i].SortOrder=soDescending then
            begin
              FOrder:=' '+FTv.Columns[i].DataBinding.FieldName+' DESC';
            end;
          end;
        end;
      end;
      FAdoQry.Sort:=FOrder;
      frmSelPrintFieldNew.RMPrintDBGrid1.PageCaptionMsg.TitleMemo.Add(FTitle);
      frmSelPrintFieldNew.RMPrintDBGrid1.PageCaptionMsg.CaptionMsg.LeftMemo.Add(FLTitle);
      frmSelPrintFieldNew.RMPrintDBGrid1.PageCaptionMsg.CaptionMsg.RightMemo.Add(FRTile);
      
      SCreatecds20(FAdoQry,frmSelPrintFieldNew.ClientDataSet1);
      SInitCDSData20(FAdoQry,frmSelPrintFieldNew.ClientDataSet1);
      if FTv.OptionsView.Footer=True then
      begin
        if FTv.DataController.Summary.FooterSummaryItems.Count>0 then
        begin
          frmSelPrintFieldNew.ClientDataSet1.Append;

          frmSelPrintFieldNew.ClientDataSet1.Post;
          KK:=0;
          for i:=0 to FTv.ColumnCount-1 do
          begin


            fcolumnName:=FTv.Columns[i].Name;
            if FTv.Columns[i].Summary.FooterKind<>sknone then
            begin
              if KK=0 then
              begin
                frmSelPrintFieldNew.ClientDataSet1.edit;
                frmSelPrintFieldNew.ClientDataSet1.FieldByName(FTv.Columns[i-FKK].DataBinding.FilterFieldName).Value:='Total';
                frmSelPrintFieldNew.ClientDataSet1.Post;
                KK:=99;
              end;
              for k:=0 to FTv.DataController.Summary.FooterSummaryItems.Count-1 do
              begin
                if TcxGridDBTableSummaryItem(FTv.DataController.Summary.FooterSummaryItems.Items[k]).Column.Name=fcolumnName then
                begin
                  frmSelPrintFieldNew.ClientDataSet1.edit;
                  frmSelPrintFieldNew.ClientDataSet1.FieldByName(FTv.Columns[i].DataBinding.FieldName).Value:=
                                                             FTv.DataController.Summary.FooterSummaryValues[k];
                  frmSelPrintFieldNew.ClientDataSet1.Post;
                end;
              end;
            end;
          end;
        end;
      end;
      if ShowModal=1 then
      begin

      end;
    end;

  finally
    frmSelPrintFieldNew.Free;
  end;}
end;
///////////////////////�жϱ��������Ƿ��ظ�///////////////////////////////////

function SIsRepeated(AdoQueryTemp: TADOQuery; MyTable: string; MyField: string; MyCode: string): Boolean;
begin
  try
    Result := False;
    with AdoQueryTemp do
    begin
      Close;
      SQL.Clear;
      SQL.Add('select * from ' + MyTable + ' where ' + MyField + '=''' + Trim(MyCode) + '''');
      Open;
      if IsEmpty then
        Result := True;
      Close;
      SQL.Clear;
    end;
  except
    Result := False;
    Application.MessageBox('�������ֶ�������', '��ʾ', 0);
  end;
end;
////////////////////����ClientDataSet�ı�����Ϣ/////////////////////////////

function SSetSaveDataCDS(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;
var
  i: Integer;
begin
  try
    Result := False;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if Tv1.Columns[i].Tag = MyTag then
      begin
        if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString) <> '' then
        begin
          AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).Value;
        end;

      end;
    end;
    Result := True;
  except
    Result := False;
    Application.MessageBox('����Cds������Ϣʧ��!', '��ʾ', 0);
  end;
end;
////////////////////����ClientDataSet�ı�����Ϣ/////////////////////////////

function SSetSaveDataCDSNew(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;
var
  i: Integer;
begin
  try
    Result := False;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if Tv1.Columns[i].Tag = MyTag then
      begin
        if Tv1.Columns[i].Visible = True then
        begin
          if Trim(Tv1.Columns[i].Summary.GroupFooterFormat) <> '1' then
          begin
            if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString) <> '' then
            begin
              AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).Value;
            end{ else
            begin
              AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value:=null;
            end};
          end;
          if Trim(Tv1.Columns[i].Summary.GroupFormat) <> '' then
          begin
            if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].Summary.GroupFormat).AsString) <> '' then
            begin
              AdoQueryCmd.FieldByName(Tv1.Columns[i].Summary.GroupFormat).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].Summary.GroupFormat).Value;
            end; { else
            begin
              AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value:=null;
            end; }
          end;
        end;

      end;
    end;
    Result := True;
  except
    Result := False;
    Application.MessageBox('����Cds������Ϣʧ��!', '��ʾ', 0);
  end;
end;

function RTSetSaveDataCDS(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;
var
  i: Integer;
begin
  try
    Result := False;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if Tv1.Columns[i].Tag = MyTag then
      begin
        if Trim(Tv1.Columns[i].DataBinding.FilterFieldName) = '' then
          Continue;
        begin
          if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString) <> '' then
          begin
            AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).Value;
          end
          else
          begin
            if Trim(Tv1.Columns[i].Summary.GroupFooterFormat) = '0' then
            begin
              AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := 0;
            end
            else
            begin
              AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := null;
            end;
          end;

        end;

      end;
    end;
    Result := True;
  except
    Result := False;
    Application.MessageBox('����Cds������Ϣʧ��!', '��ʾ', 0);
  end;
end;

function RTSetSaveDataCDSBand(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;
var
  i: Integer;
begin
  try
    Result := False;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if Tv1.Columns[i].Tag = MyTag then
      begin

        begin
          if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString) <> '' then
          begin
            AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).Value;
          end
          else
          begin
            if Trim(Tv1.Columns[i].Summary.GroupFooterFormat) <> '' then
              AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := 0
            else
              AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := Trim(Tv1.Columns[i].Summary.GroupFooterFormat);
          end;

        end;

      end;
    end;
    Result := True;
  except
    Result := False;
    Application.MessageBox('����Cds������Ϣʧ��!', '��ʾ', 0);
  end;
end;

function SSetSaveDataCDSBandNew(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;
var
  i: Integer;
begin
  try
    Result := False;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if Tv1.Columns[i].Tag = MyTag then
      begin
        if Trim(Tv1.Columns[i].Summary.GroupFooterFormat) <> '1' then
        begin
          if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString) <> '' then
          begin
            AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).Value;
          end;
        end;
        if Trim(Tv1.Columns[i].Summary.GroupFormat) <> '' then
        begin
          if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].Summary.GroupFormat).AsString) <> '' then
          begin
            AdoQueryCmd.FieldByName(Tv1.Columns[i].Summary.GroupFormat).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].Summary.GroupFormat).Value;
          end;
        end;

      end;
    end;
    Result := True;
  except
    Result := False;
    Application.MessageBox('����Cds������Ϣʧ��!', '��ʾ', 0);
  end;
end;
////////////////////����ClientDataSet�ı�����Ϣ/////////////////////////////

function SSetSaveDataCDS10(AdoQueryCmd: TADOQuery; Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet; MyTable: string; MyTag: Integer): Boolean;
var
  i: Integer;
begin
  try
    Result := False;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if Tv1.Columns[i].Tag = MyTag then
      begin
        if Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString) <> '' then
          AdoQueryCmd.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).Value;
      end;
    end;
    Result := True;
  except
    Result := False;
    Application.MessageBox('����Cds������Ϣʧ��!', '��ʾ', 0);
  end;
end;
 ///////////////////////////����������//////////////////////////////////////

function SGetServerDate(ADOQueryTmp: TADOQuery): TdateTime;
begin
  try
    with ADOQueryTmp do
    begin
      close;
      sql.Clear;
      sql.Add('select getDate()as dt');
      open;
      result := StrToDate(formatdatetime('yyyy-MM-dd', fieldByName('dt').AsDatetime));
      close;
      SQL.Clear;
    end;
  except
    application.MessageBox('��ȡ��ǰ���ڷ�������!', '��ʾ��Ϣ', 0);
  end;

end;

function SGetServerDateTime(ADOQueryTmp: TADOQuery): TdateTime;
begin
  try
    with ADOQueryTmp do
    begin
      close;
      sql.Clear;
      sql.Add('select getDate()as dt');
      open;
      result := fieldByName('dt').AsDatetime;
      close;
      SQL.Clear;
    end;
  except
    application.MessageBox('��ȡ��ǰ���ڷ�������!', '��ʾ��Ϣ', 0);
  end;

end;

function SGetServerDate10(ADOQueryTmp: TADOQuery): TdateTime;
begin
  try
    with ADOQueryTmp do
    begin
      close;
      sql.Clear;
      sql.Add('select getDate()as dt');
      open;
      result := StrToDate(formatdatetime('yyyy-MM-dd', fieldByName('dt').AsDatetime));
      close;
      SQL.Clear;
    end;
  except
    application.MessageBox('��ȡ��ǰ���ڷ�������!', '��ʾ��Ϣ', 0);
  end;

end;

/////////////////////////////////////////////////////
//��������ʱ�ֶθ�ֵ
/////////////////////////////////////////////////////
procedure SSetsavedata(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);
var
  i: Integer;
begin
  with Myparent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i].Tag = MyTag then
      begin
        if Controls[i] is TEdit then
        begin
          if Trim(TEdit(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TEdit(Controls[i]).Text);
        end
        else if Controls[i] is TRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TcxRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TcxRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TMemo then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TMemo(Controls[i]).Text;
        end;
        if Controls[i] is TFTComboBox then
        begin
          if (TFTComboBox(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TFTComboBox(Controls[i]).Item2);
        end
        else if Controls[i] is TComboBox then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TComboBox(Controls[i]).Text);
        end
        else if Controls[i] is TCheckBox then
        begin
          if TCheckBox(Controls[i]).Checked = True then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := 1
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := 0;
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if TDateTimePicker(Controls[i]).ShowCheckbox then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
          end
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
        end
        else if Controls[i] is TBtnEditA then
        begin
          if TBtnEditA(Controls[i]).Hint = '����' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditA(Controls[i]).Text)
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditA(Controls[i]).TxtCode);
        end
        else if Controls[i] is TBtnEditC then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditC(Controls[i]).TxtCode);
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TcxTimeEdit(Controls[i]).Text);
        end;
      end;
    end;
  end;
end;

procedure SSetsavedataNew(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);
var
  i: Integer;
begin
  with Myparent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i].Tag = MyTag then
      begin
        if Controls[i] is TEdit then
        begin
          if Trim(TEdit(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TEdit(Controls[i]).Text);
        end
        else if Controls[i] is TRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TMemo then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TMemo(Controls[i]).Text;
        end;
        if Controls[i] is TFTComboBox then
        begin
          if (TFTComboBox(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TFTComboBox(Controls[i]).Item2);
        end
        else if Controls[i] is TComboBox then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TComboBox(Controls[i]).Text);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if TDateTimePicker(Controls[i]).ShowCheckbox then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
          end
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
        end
        else if Controls[i] is TBtnEditA then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditA(Controls[i]).TxtCode);
          if (TBtnEditA(Controls[i]).Hint <> '') and (TBtnEditA(Controls[i]).ParentCtl3D = True) then
            ADOQueryCmd.FieldByName(Trim(TBtnEditA(Controls[i]).Hint)).Value := Trim(TBtnEditA(Controls[i]).Text);
        end
        else if Controls[i] is TBtnEditC then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditC(Controls[i]).TxtCode);
          //if (TBtnEditC(Controls[i]).Hint<>'') and (TBtnEditC(Controls[i]).ParentCtl3D=True)then
            //ADOQueryCmd.FieldByName(Trim(TBtnEditC(Controls[i]).Hint)).Value:=Trim(TBtnEditC(Controls[i]).Text);
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TcxTimeEdit(Controls[i]).Text);
        end;
      end;
    end;
  end;
end;

procedure RTSetsavedata(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);
var
  i: Integer;
begin
  with Myparent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i].Tag = MyTag then
      begin
        if Controls[i] is TEdit then
        begin
          if Trim(TEdit(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TEdit(Controls[i]).Text);
        end
        else if Controls[i] is TRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TMemo then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TMemo(Controls[i]).Text;
        end;
        if Controls[i] is TFTComboBox then
        begin
          if (TFTComboBox(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TFTComboBox(Controls[i]).Item2);
        end
        else if Controls[i] is TComboBox then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TComboBox(Controls[i]).Text);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if TDateTimePicker(Controls[i]).ShowCheckbox then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
          end
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
        end
        else if Controls[i] is TBtnEditA then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditA(Controls[i]).Text);
          if (TBtnEditA(Controls[i]).Hint <> '') then
            ADOQueryCmd.FieldByName(Trim(TBtnEditA(Controls[i]).Hint)).Value := Trim(TBtnEditA(Controls[i]).TxtCode);
        end
        else if Controls[i] is TBtnEditC then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditC(Controls[i]).Text);
          if (TBtnEditC(Controls[i]).Hint <> '') then
            ADOQueryCmd.FieldByName(Trim(TBtnEditC(Controls[i]).Hint)).Value := Trim(TBtnEditC(Controls[i]).TxtCode);
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TcxTimeEdit(Controls[i]).Text);
        end;
      end;
    end;
  end;
end;

procedure SSetsaveSql(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);
var
  i: Integer;
  MCode: string;
begin
  with Myparent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i].Tag = MyTag then
      begin
        if Controls[i] is TEdit then
        begin
          if Trim(TEdit(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TEdit(Controls[i]).Text)
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Null;
        end
        else if Controls[i] is TRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TcxRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TcxRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TMemo then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TMemo(Controls[i]).Text;
        end
        else if Controls[i] is TFTComboBox then
        begin
          if (TFTComboBox(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TFTComboBox(Controls[i]).Item2);
        end
        else if Controls[i] is TComboBox then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TComboBox(Controls[i]).Text);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if TDateTimePicker(Controls[i]).ShowCheckbox then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
          end
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
        end
        else if Controls[i] is TBtnEditA then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditA(Controls[i]).TxtCode);
          if (TBtnEditA(Controls[i]).Hint <> '') and (TBtnEditA(Controls[i]).ParentCtl3D = True) then
            ADOQueryCmd.FieldByName(Trim(TBtnEditA(Controls[i]).Hint)).Value := Trim(TBtnEditA(Controls[i]).Text);
        end
        else if Controls[i] is TBtnEditC then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditC(Controls[i]).TxtCode);
          //if (TBtnEditC(Controls[i]).Hint<>'') and (TBtnEditC(Controls[i]).ParentCtl3D=True)then
            //ADOQueryCmd.FieldByName(Trim(TBtnEditC(Controls[i]).Hint)).Value:=Trim(TBtnEditC(Controls[i]).Text);
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TcxTimeEdit(Controls[i]).Text);
        end
        else if Controls[i] is TcxButtonEdit then
        begin
          if (TcxButtonEdit(Controls[i]).BeepOnEnter = True) or (TcxButtonEdit(Controls[i]).ParentShowHint = True) then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TcxButtonEdit(Controls[i]).Text);
          if TcxButtonEdit(Controls[i]).ParentShowHint = False then
          begin
            MCode := Copy(Trim(Controls[i].Name), 1, Length(Trim(Controls[i].Name)) - 4);
            ADOQueryCmd.FieldByName(MCode).Value := Trim(TcxButtonEdit(Controls[i]).Hint);
          end;
        end;
      end;
    end;
  end;
end;

procedure SSetsaveSqlNew(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);
var
  i: Integer;
  MCode: string;
begin
  with Myparent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i].Tag = MyTag then
      begin
        if Controls[i] is TEdit then
        begin
          if Trim(TEdit(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TEdit(Controls[i]).Text)
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Null;
        end
        else if Controls[i] is TRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TCheckBox then
        begin
          if TCheckBox(Controls[i]).Checked = True then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := 1
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := 0;
        end
        else if Controls[i] is TcxRichEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TcxRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TMemo then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := TMemo(Controls[i]).Text;
        end
        else if Controls[i] is TFTComboBox then
        begin
          if (TFTComboBox(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TFTComboBox(Controls[i]).Item2);
        end
        else if Controls[i] is TComboBox then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TComboBox(Controls[i]).Text);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if TDateTimePicker(Controls[i]).ShowCheckbox then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime
            else
              ADOQueryCmd.FieldByName(Controls[i].Name).Value := null;
          end
          else
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := TDateTimePicker(Controls[i]).DateTime;
        end
        else if Controls[i] is TBtnEditA then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditA(Controls[i]).Text);
          if (TBtnEditA(Controls[i]).Hint <> '') then
            ADOQueryCmd.FieldByName(Trim(TBtnEditA(Controls[i]).Hint)).Value := Trim(TBtnEditA(Controls[i]).TxtCode);
        end
        else if Controls[i] is TBtnEditC then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TBtnEditC(Controls[i]).Text);
          if (TBtnEditC(Controls[i]).Hint <> '') then
          begin
            if Pos('/', TBtnEditC(Controls[i]).Hint) > 0 then
            begin

            end
            else
              ADOQueryCmd.FieldByName(Trim(TBtnEditC(Controls[i]).Hint)).Value := Trim(TBtnEditC(Controls[i]).TxtCode);
          end;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TcxTimeEdit(Controls[i]).Text);
        end
        else if Controls[i] is TcxButtonEdit then
        begin
          if (TcxButtonEdit(Controls[i]).BeepOnEnter = True) or (TcxButtonEdit(Controls[i]).ParentShowHint = True) then
            ADOQueryCmd.FieldByName(Controls[i].Name).Value := Trim(TcxButtonEdit(Controls[i]).Text);
          if TcxButtonEdit(Controls[i]).ParentShowHint = False then
          begin
            MCode := Copy(Trim(Controls[i].Name), 1, Length(Trim(Controls[i].Name)) - 4);
            ADOQueryCmd.FieldByName(MCode).Value := Trim(TcxButtonEdit(Controls[i]).Hint);
          end;
        end;
      end;
    end;
  end;
end;

procedure SSetsavedata10(ADOQueryCmd: TADOQuery; MyTable: string; Myparent: TWinControl; MyTag: integer);
var
  i: Integer;
  FFName: string;
begin
  with Myparent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      FFName := Trim(Copy(Controls[i].Name, 1, (Length(Controls[i].Name) - 1)));
      if Controls[i].Tag = MyTag then
      begin
        if Controls[i] is TEdit then
        begin
          if Trim(TEdit(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(FFName).Value := Trim(TEdit(Controls[i]).Text);
        end
        else if Controls[i] is TRichEdit then
        begin
          ADOQueryCmd.FieldByName(FFName).Value := TRichEdit(Controls[i]).Text;
        end
        else if Controls[i] is TMemo then
        begin
          ADOQueryCmd.FieldByName(FFName).Value := TMemo(Controls[i]).Text;
        end;
        if Controls[i] is TFTComboBox then
        begin
          if (TFTComboBox(Controls[i]).Text) <> '' then
            ADOQueryCmd.FieldByName(FFName).Value := Trim(TFTComboBox(Controls[i]).Item2);
        end
        else if Controls[i] is TComboBox then
        begin
          ADOQueryCmd.FieldByName(FFName).Value := Trim(TComboBox(Controls[i]).Text);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if TDateTimePicker(Controls[i]).ShowCheckbox then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              ADOQueryCmd.FieldByName(FFName).Value := TDateTimePicker(Controls[i]).DateTime;
          end
          else
            ADOQueryCmd.FieldByName(FFName).Value := TDateTimePicker(Controls[i]).DateTime;
        end
        else if Controls[i] is TBtnEditA then
        begin
          ADOQueryCmd.FieldByName(FFName).Value := Trim(TBtnEditA(Controls[i]).TxtCode);
        end
        else if Controls[i] is TBtnEditC then
        begin
          ADOQueryCmd.FieldByName(FFName).Value := Trim(TBtnEditC(Controls[i]).TxtCode);
        end;
      end;
    end;
  end;
end;
/////////////////////////////////////////////////////
  //��������:��ʼ����������
/////////////////////////////////////////////////////

procedure SSetWinData(ADOQueryTmp: TADOQuery; mParent: TWinControl);
var
  i, idx: integer;
  mfield: string;
  ma: TA;
begin
  with ADOQueryTmp do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        if Controls[i].Tag >= 999 then
          continue;
        mfield := Controls[i].Name;

        ///////////////////////////
        //EDIT
        if Controls[i] is TEdit then
        begin
         { if Trim(Controls[i].Hint)='��ֵ' then
            continue
          else }
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TRichEdit then
        begin
         { if Trim(Controls[i].Hint)='��ֵ' then
            continue
          else }
          if Trim(fieldByName(mfield).AsString) <> '' then
            TRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          if Controls[i].Tag = 99 then
          begin
            idx := TftComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
            TComboBox(Controls[i]).ItemIndex := idx;
          end
          else
          begin
            idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
            TComboBox(Controls[i]).ItemIndex := idx;
          end;
        end
        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            //idx:=getCombIdx(TComboBox(Controls[i]),i,trim(fieldByName(mfield).AsString));
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          if TBtnEditA(Controls[i]).Tag = 1 then
          begin
            TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
            TBtnEditA(Controls[i]).text := trim(fieldByName(mfield + 'Name').AsString);
          end
          else
          begin
            TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
            TBtnEditA(Controls[i]).text := trim(fieldByName(mfield).AsString);
          end;
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          TBtnEditC(Controls[i]).text := trim(fieldByName(mfield + 'Name').AsString);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if IsEmpty or fieldByName(mfield).IsNull then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              TDateTimePicker(Controls[i]).Date := strToDate('1990-01-01');
          end
          else
            TDateTimePicker(Controls[i]).Date := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxRichEdit then
        begin
          TcxRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end;
      end; // end for
    end; // end with
  end;  //end for with

end;

procedure SInitComBoxByTvColumns(cb: TComboBox; Tv1: TcxGridDBTableView; ColumnTag: Integer; TowFlag: Boolean; emptyFlag: Boolean);
var
  A: TA;
  i: Integer;
begin
  cb.Items.Clear;
  for i := 0 to Tv1.ColumnCount - 1 do
  begin
    if Tv1.Columns[i].Tag = ColumnTag then
    begin
      if TowFlag = False then
      begin
        cb.Items.Add(trim(Tv1.Columns[i].Caption));
      end
      else
      begin
        A := TA.Create(nil);
        A.s := Trim(Tv1.Columns[i].DataBinding.FieldName);
        cb.Items.AddObject(Trim(Tv1.Columns[i].Caption), TObject(A));
      end;
    end;
  end;
  if emptyFlag = False then
    cb.Items.Add('');
  if cb.Items.Count > 0 then
    cb.ItemIndex := 0;
end;

procedure SSetWinData30(ADOQueryTmp: TADOQuery; mParent: TWinControl; FTag: Integer);
var
  i, idx: integer;
  mfield: string;
  ma: TA;
begin
  with ADOQueryTmp do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        if Controls[i].Tag <> FTag then
          continue;
        mfield := Controls[i].Name;

        ///////////////////////////
        //EDIT
        if Controls[i] is TEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TcxRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditA(Controls[i]).Hint) <> '' then
            TBtnEditA(Controls[i]).text := trim(fieldByName(Trim(TBtnEditA(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditC(Controls[i]).Hint) <> '' then
            TBtnEditC(Controls[i]).text := trim(fieldByName(Trim(TBtnEditC(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if IsEmpty or fieldByName(mfield).IsNull then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              TDateTimePicker(Controls[i]).Date := strToDate('1990-01-01');
          end
          else
            TDateTimePicker(Controls[i]).DateTime := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end
        else if Controls[i] is TRichEdit then
        begin
          TRichEdit(Controls[i]).Text := fieldbyname(mfield).AsString;
        end;
      end; // end for
    end; // end with
  end;  //end for with

end;

procedure SClearData(mParent: TWinControl; FTag: Integer);
var
  i, idx: integer;
begin
  with mParent do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i] is TLabel then
        continue;
      if Controls[i].Tag <> FTag then
        continue;
      if Controls[i] is TEdit then
      begin
        TEdit(Controls[i]).Text := '';
      end
      else if Controls[i] is TRichEdit then
      begin
        TRichEdit(Controls[i]).Text := '';
      end
      else if Controls[i] is TcxRichEdit then
      begin
        TcxRichEdit(Controls[i]).Text := '';
      end
      else if Controls[i] is TBtnEditC then
      begin
        TBtnEditC(Controls[i]).Text := '';
        TBtnEditC(Controls[i]).TxtCode := '';
      end
      else if Controls[i] is TBtnEditA then
      begin
        TBtnEditA(Controls[i]).Text := '';
        TBtnEditA(Controls[i]).TxtCode := '';
      end
      else if Controls[i] is TComboBox then
      begin
        idx := -1;
        TComboBox(Controls[i]).ItemIndex := idx;
      end
    end;
  end;
end;

procedure SCSHData(ADOQueryTmp: TADOQuery; mParent: TWinControl; FTag: Integer);
var
  i, idx: integer;
  mfield, mfieldCode: string;
  ma: TA;
begin
  with ADOQueryTmp do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        if Controls[i].Tag <> FTag then
          continue;
        mfield := Controls[i].Name;

        ///////////////////////////
        //EDIT
        if Controls[i] is TEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TcxRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditA(Controls[i]).Hint) <> '' then
            TBtnEditA(Controls[i]).text := trim(fieldByName(Trim(TBtnEditA(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditC(Controls[i]).Hint) <> '' then
            TBtnEditC(Controls[i]).text := trim(fieldByName(Trim(TBtnEditC(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if Trim(fieldByName(mfield).AsString) = '' then
          begin
            TDateTimePicker(Controls[i]).Checked := False;
          end
          else
            TDateTimePicker(Controls[i]).DateTime := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end
        else if Controls[i] is TcxButtonEdit then
        begin
          TcxButtonEdit(Controls[i]).Text := Trim(fieldbyname(mfield).AsString);
          if TcxButtonEdit(Controls[i]).ParentShowHint = False then
          begin
            mfieldCode := Trim(Copy(mfield, 1, Length(mfield) - 4));
            TcxButtonEdit(Controls[i]).Hint := Trim(fieldbyname(mfieldCode).AsString);
          end;

        end;
      end; // end for
    end; // end with
  end;  //end for with

end;

procedure SCSHDataNew(ADOQueryTmp: TADOQuery; mParent: TWinControl; FTag: Integer);
var
  i, idx: integer;
  mfield, mfieldCode: string;
  ma: TA;
begin
  with ADOQueryTmp do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        if Controls[i].Tag <> FTag then
          continue;
        mfield := Controls[i].Name;

        ///////////////////////////
        //EDIT
        if Controls[i] is TEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString)
          else
            TEdit(Controls[i]).Text := '';
        end
        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TcxRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          TBtnEditA(Controls[i]).Text := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditA(Controls[i]).Hint) <> '' then
            TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(Trim(TBtnEditA(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).Text := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditC(Controls[i]).Hint) <> '' then
          begin
            if Pos('/', TBtnEditC(Controls[i]).Hint) > 0 then
            begin

            end
            else
              TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(Trim(TBtnEditC(Controls[i]).Hint)).AsString);
          end;
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if Trim(fieldByName(mfield).AsString) = '' then
          begin
            TDateTimePicker(Controls[i]).Checked := False;
          end
          else
            TDateTimePicker(Controls[i]).DateTime := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          if FieldByName(mfield).Value = null then
            TcheckBox(Controls[i]).Checked := False
          else
            TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end
        else if Controls[i] is TcxButtonEdit then
        begin
          TcxButtonEdit(Controls[i]).Text := Trim(fieldbyname(mfield).AsString);
          if TcxButtonEdit(Controls[i]).ParentShowHint = False then
          begin
            mfieldCode := Trim(Copy(mfield, 1, Length(mfield) - 4));
            TcxButtonEdit(Controls[i]).Hint := Trim(fieldbyname(mfieldCode).AsString);
          end;

        end;
      end; // end for
    end; // end with
  end;  //end for with

end;

procedure SCSHDataCDS(CDS_Main: TClientDataSet; mParent: TWinControl; FTag: Integer);
var
  i, idx: integer;
  mfield, mfieldCode: string;
  ma: TA;
begin
  with CDS_Main do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        if Controls[i].Tag <> FTag then
          continue;
        mfield := Controls[i].Name;

        ///////////////////////////
        //EDIT
        if Controls[i] is TEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TcxRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditA(Controls[i]).Hint) <> '' then
            TBtnEditA(Controls[i]).text := trim(fieldByName(Trim(TBtnEditA(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditC(Controls[i]).Hint) <> '' then
            TBtnEditC(Controls[i]).text := trim(fieldByName(Trim(TBtnEditC(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if Trim(fieldByName(mfield).AsString) = '' then
          begin
            TDateTimePicker(Controls[i]).Checked := False;
          end
          else
            TDateTimePicker(Controls[i]).DateTime := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end
        else if Controls[i] is TcxButtonEdit then
        begin
          TcxButtonEdit(Controls[i]).Text := Trim(fieldbyname(mfield).AsString);
          if TcxButtonEdit(Controls[i]).ParentShowHint = False then
          begin
            mfieldCode := Trim(Copy(mfield, 1, Length(mfield) - 4));
            TcxButtonEdit(Controls[i]).Hint := Trim(fieldbyname(mfieldCode).AsString);
          end;

        end;
      end; // end for
    end; // end with
  end;  //end for with

end;

procedure SCSHDataWTag(ADOQueryTmp: TADOQuery; mParent: TWinControl);
var
  i, idx: integer;
  mfield, mfieldCode: string;
  ma: TA;
begin
  with ADOQueryTmp do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        //if Controls[i].Tag<>FTag then  continue;
        mfield := Controls[i].Name;

        ///////////////////////////
        //EDIT
        if Controls[i] is TEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxRichEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TcxRichEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditA(Controls[i]).Hint) <> '' then
            TBtnEditA(Controls[i]).text := trim(fieldByName(Trim(TBtnEditA(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          if Trim(TBtnEditC(Controls[i]).Hint) <> '' then
            TBtnEditC(Controls[i]).text := trim(fieldByName(Trim(TBtnEditC(Controls[i]).Hint)).AsString);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if Trim(fieldByName(mfield).AsString) = '' then
          begin
            TDateTimePicker(Controls[i]).Checked := False;
          end
          else
            TDateTimePicker(Controls[i]).DateTime := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end
        else if Controls[i] is TcxButtonEdit then
        begin
          TcxButtonEdit(Controls[i]).Text := Trim(fieldbyname(mfield).AsString);
          if TcxButtonEdit(Controls[i]).ParentShowHint = False then
          begin
            mfieldCode := Trim(Copy(mfield, 1, Length(mfield) - 4));
            TcxButtonEdit(Controls[i]).Hint := Trim(fieldbyname(mfieldCode).AsString);
          end;

        end;
      end; // end for
    end; // end with
  end;  //end for with

end;

procedure SSetWinData10(ADOQueryTmp: TADOQuery; mParent: TWinControl);
var
  i, idx: integer;
  mfield: string;
  ma: TA;
begin
  with ADOQueryTmp do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        if Controls[i].Tag >= 999 then
          continue;
        //mfield:=Copy(Trim(Controls[i].Name),1,(Length(Trim(Controls[i].Name))-1));
        mfield := Trim(Controls[i].Name);
        if Controls[i] is TEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          if Controls[i].Tag = 99 then
          begin
            idx := TftComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
            TComboBox(Controls[i]).ItemIndex := idx;
          end
          else
          begin
            idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
            TComboBox(Controls[i]).ItemIndex := idx;
          end;
        end
        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          if TBtnEditA(Controls[i]).Tag = 1 then
          begin
            TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
            TBtnEditA(Controls[i]).text := trim(fieldByName(mfield + 'Name').AsString);
          end
          else
          begin
            TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
            TBtnEditA(Controls[i]).text := trim(fieldByName(mfield).AsString);
          end;
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          TBtnEditC(Controls[i]).text := trim(fieldByName(mfield + 'Name').AsString);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if IsEmpty or fieldByName(mfield).IsNull then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              TDateTimePicker(Controls[i]).Date := strToDate('1990-01-01');
          end
          else
            TDateTimePicker(Controls[i]).Date := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end
        {else if Controls[i] is TcxLookupComboBox then
        begin
          TcxLookupComboBox(Controls[i]).EditValue:=fieldByName(mfield).AsString;
          TcxLookupComboBox(Controls[i]).EditingText:=fieldByName(mfield+'name').AsString;
        end};
      end; // end for
    end; // end with
  end;  //end for with

end;

procedure SSetWinData20(ADOQueryTmp: TADOQuery; mParent: TWinControl);
var
  i, idx: integer;
  mfield: string;
  ma: TA;
begin
  with ADOQueryTmp do
  begin
    if isEmpty then
      exit;
    with mParent do
    begin
      for i := 0 to ControlCount - 1 do
      begin
        if Controls[i] is TLabel then
          continue;
        if Controls[i].Tag >= 999 then
          continue;
        mfield := Copy(Trim(Controls[i].Name), 1, (Length(Trim(Controls[i].Name)) - 1));
        //mfield:=Trim(Controls[i].Name);
        if Controls[i] is TEdit then
        begin
          if Trim(fieldByName(mfield).AsString) <> '' then
            TEdit(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        //ftcombobox
        else if Controls[i] is TFTComboBox then
        begin
          if Controls[i].Tag = 99 then
          begin
            idx := TftComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
            TComboBox(Controls[i]).ItemIndex := idx;
          end
          else
          begin
            idx := TftComboBox(Controls[i]).IndexOfItem2(trim(fieldByName(mfield).AsString));
            TComboBox(Controls[i]).ItemIndex := idx;
          end;
        end
        //combobox
        else if Controls[i] is TComboBox then
        begin
          if TComboBox(Controls[i]).Items.Count > 0 then
          begin
            idx := TComboBox(Controls[i]).Items.IndexOf(trim(fieldByName(mfield).AsString));
          end
          else
            idx := -1;
          TComboBox(Controls[i]).ItemIndex := idx;
        end
        else if Controls[i] is TBtnEditA then
        begin
          if TBtnEditA(Controls[i]).Tag = 1 then
          begin
            TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
            TBtnEditA(Controls[i]).text := trim(fieldByName(mfield + 'Name').AsString);
          end
          else
          begin
            TBtnEditA(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
            TBtnEditA(Controls[i]).text := trim(fieldByName(mfield).AsString);
          end;
        end
        else if Controls[i] is TBtnEditC then
        begin
          TBtnEditC(Controls[i]).TxtCode := trim(fieldByName(mfield).AsString);
          TBtnEditC(Controls[i]).text := trim(fieldByName(mfield + 'Name').AsString);
        end
        else if Controls[i] is TDateTimePicker then
        begin
          if IsEmpty or fieldByName(mfield).IsNull then
          begin
            if TDateTimePicker(Controls[i]).Checked then
              TDateTimePicker(Controls[i]).Date := strToDate('1990-01-01');
          end
          else
            TDateTimePicker(Controls[i]).Date := fieldByName(mfield).AsDateTime;
        end
        else if Controls[i] is Tmemo then
        begin
          Tmemo(Controls[i]).Text := trim(fieldByName(mfield).AsString);
        end
        else if Controls[i] is TcxDateEdit then
        begin
          if not IsEmpty and not fieldByName(mfield).IsNull then
            TcxDateEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxTimeEdit then
        begin
          if not IsEmpty and (fieldByName(mfield).AsString <> '') then
            TcxTimeEdit(Controls[i]).text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcxCurrencyEdit then
        begin
          TcxCurrencyEdit(Controls[i]).Text := fieldByName(mfield).AsString;
        end
        else if Controls[i] is TcheckBox then
        begin
          TcheckBox(Controls[i]).Checked := fieldByName(mfield).asBoolean;
        end
        {else if Controls[i] is TcxLookupComboBox then
        begin
          TcxLookupComboBox(Controls[i]).EditValue:=fieldByName(mfield).AsString;
          TcxLookupComboBox(Controls[i]).EditingText:=fieldByName(mfield+'name').AsString;
        end};
      end; // end for
    end; // end with
  end;  //end for with

end;

//////////////////////////////////////////////
//////�������ܣ�����SQL���ɾ������
//////////////////////////////////////////////
function SDelData(ADOQueryCmd: TADOQuery; mDelStr: string): Boolean;
begin
  try
    result := False;
    with ADOQueryCmd do
    begin
      Close;
      SQL.Clear;
      SQL.Add(mDelStr);
      ExecSQL;
    end;
    result := True;
  except
    result := False;
    Application.MessageBox('����ɾ��ʧ�ܣ�', '��ʾ', 0);
  end;
end;

  ////////////////////////////////////////////
 ////************��ȡ��������***********/////
////////////////////////////////////////////
function SGetFilters(TMPanel: TPanel; EquTag, LikeTag: Integer): string;
var
  i, j, k: Integer;
  fsj, fsj1: string;
begin
  Result := '';
  with TMPanel do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i] is TLabel then
        Continue;
      if Controls[i] is TEdit then
      begin
        if Trim(TEdit(Controls[i]).Text) <> '' then
        begin
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TEdit(Controls[i]).Text))
          else if Controls[i].Tag = LikeTag then
          begin
            j := Pos(' ', Trim(TEdit(Controls[i]).Text));
            if j > 0 then
            begin
              Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Copy(Trim(TEdit(Controls[i]).Text), 1, j - 1) + '%');
              fsj1 := Copy(Trim(TEdit(Controls[i]).Text), j + 1, Length(Trim(TEdit(Controls[i]).Text)));
              while Trim(fsj1) <> '' do
              begin
                j := Pos(' ', Trim(fsj1));
                if j > 0 then
                begin
                  Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Copy(Trim(fsj1), 1, j - 1) + '%');
                  fsj1 := Copy(Trim(fsj1), j + 1, Length(Trim(fsj1)));
                end
                else
                begin
                  Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(fsj1) + '%');
                  fsj1 := '';
                end;
              end;
            end
            else
              Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(TEdit(Controls[i]).Text) + '%');
          end;
        end;
      end
      else if Controls[i] is TBtnEditA then
      begin
        if Trim(TBtnEditA(Controls[i]).Text) <> '' then
        begin
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TBtnEditA(Controls[i]).TxtCode))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + 'Name' + ' like ' + QuotedStr('%' + Trim(TBtnEditA(Controls[i]).Text) + '%')
          else if Controls[i].Tag = 99 then
            Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr(Trim(TBtnEditA(Controls[i]).TxtCode) + '%')
          else if Controls[i].Tag = 88 then
            Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr(Trim(TBtnEditA(Controls[i]).Text) + '%');
        end;
      end
      else if Controls[i] is TBtnEditC then
      begin
        if Trim(TBtnEditC(Controls[i]).TxtCode) <> '' then
        begin
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TBtnEditC(Controls[i]).TxtCode))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + 'Name' + ' like ' + QuotedStr('%' + Trim(TBtnEditC(Controls[i]).Text) + '%');
        end;
      end
      else if Controls[i] is TFTComboBox then
      begin
        if Trim(TFTComboBox(Controls[i]).Text) <> '' then
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TFTComboBox(Controls[i]).Item2))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(TFTComboBox(Controls[i]).Item2) + '%');
      end
      else if Controls[i] is TComboBox then
      begin
        if Trim(TComboBox(Controls[i]).Text) <> '' then
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TComboBox(Controls[i]).Text))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(TComboBox(Controls[i]).Text) + '%');
      end;
    end;
  end;
  if Trim(Result) <> '' then
    Result := Trim(RightBStr(Result, Length(Result) - 4));
end;

function SGetFiltersHint(TMPanel: TPanel; EquTag, LikeTag: Integer): string;
var
  i, j, k: Integer;
  fsj, fsj1: string;
begin
  Result := '';
  with TMPanel do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i] is TLabel then
        Continue;
      if Controls[i] is TEdit then
      begin
        if Trim(TEdit(Controls[i]).Text) <> '' then
        begin
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Hint + '=' + QuotedStr(Trim(TEdit(Controls[i]).Text))
          else if Controls[i].Tag = LikeTag then
          begin
            j := Pos(' ', Trim(TEdit(Controls[i]).Text));
            if j > 0 then
            begin
              Result := Result + 'and ' + Controls[i].Hint + ' like ' + QuotedStr('%' + Copy(Trim(TEdit(Controls[i]).Text), 1, j - 1) + '%');
              fsj1 := Copy(Trim(TEdit(Controls[i]).Text), j + 1, Length(Trim(TEdit(Controls[i]).Text)));
              while Trim(fsj1) <> '' do
              begin
                j := Pos(' ', Trim(fsj1));
                if j > 0 then
                begin
                  Result := Result + 'and ' + Controls[i].Hint + ' like ' + QuotedStr('%' + Copy(Trim(fsj1), 1, j - 1) + '%');
                  fsj1 := Copy(Trim(fsj1), j + 1, Length(Trim(fsj1)));
                end
                else
                begin
                  Result := Result + 'and ' + Controls[i].Hint + ' like ' + QuotedStr('%' + Trim(fsj1) + '%');
                  fsj1 := '';
                end;
              end;
            end
            else
              Result := Result + 'and ' + Controls[i].Hint + ' like ' + QuotedStr('%' + Trim(TEdit(Controls[i]).Text) + '%');
          end;
        end;
      end;
    end;
  end;
  if Trim(Result) <> '' then
    Result := Trim(RightBStr(Result, Length(Result) - 4));
end;

function SGetFinds(TMPanel: TPanel; EquTag, LikeTag: Integer): string;
var
  i: Integer;
begin
  Result := '';
  with TMPanel do
  begin
    for i := 0 to ControlCount - 1 do
    begin
      if Controls[i] is TLabel then
        Continue;
      if Controls[i] is TEdit then
      begin
        if Trim(TEdit(Controls[i]).Text) <> '' then
        begin
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TEdit(Controls[i]).Text))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(TEdit(Controls[i]).Text) + '%');
        end;
      end
      else if Controls[i] is TBtnEditA then
      begin
        if Trim(TBtnEditA(Controls[i]).Text) <> '' then
        begin
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TBtnEditA(Controls[i]).TxtCode))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + 'Name' + ' like ' + QuotedStr('%' + Trim(TBtnEditA(Controls[i]).Text) + '%');
        end;
      end
      else if Controls[i] is TBtnEditC then
      begin
        if Trim(TBtnEditC(Controls[i]).TxtCode) <> '' then
        begin
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TBtnEditC(Controls[i]).TxtCode))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + 'Name' + ' like ' + QuotedStr('%' + Trim(TBtnEditC(Controls[i]).Text) + '%');
        end;
      end
      else if Controls[i] is TFTComboBox then
      begin
        if Trim(TFTComboBox(Controls[i]).Text) <> '' then
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TFTComboBox(Controls[i]).Item2))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(TFTComboBox(Controls[i]).Item2) + '%');
      end
      else if Controls[i] is TComboBox then
      begin
        if Trim(TComboBox(Controls[i]).Text) <> '' then
          if Controls[i].Tag = EquTag then
            Result := Result + 'and ' + Controls[i].Name + '=' + QuotedStr(Trim(TComboBox(Controls[i]).Text))
          else if Controls[i].Tag = LikeTag then
            Result := Result + 'and ' + Controls[i].Name + ' like ' + QuotedStr('%' + Trim(TComboBox(Controls[i]).Text) + '%');
      end;
    end;
  end;
end;

////////////////////////////////////////////////////////////
  //���ù��˺���
////////////////////////////////////////////////////////////
procedure SDofilter(ADOQry: TADOQuery; FilterStr: string);
begin
  try
    ADOQry.DisableControls;
    with ADOQry do
    begin
      if Trim(FilterStr) = '' then
      begin
        Filtered := False;
      end
      else
      begin
        Filtered := False;
        Filter := FilterStr;
        Filtered := True;
      end;
    end;
  finally
    ADOQry.EnableControls;
  end;
end;

procedure SDofilter10(cds_Main: TClientDataSet; FilterStr: string);
begin
  try
    cds_Main.DisableControls;
    with cds_Main do
    begin
      if Trim(FilterStr) = '' then
      begin
        Filtered := False;
      end
      else
      begin
        Filtered := False;
        Filter := FilterStr;
        Filtered := True;
      end;
    end;
  finally
    cds_Main.EnableControls;
  end;
end;

function SGetMaxNo(MyAdoQuery: TADOQuery; MyTable: string; MyField: string; MyFlag: string): string;
var
  fsj: string;
  i: Integer;
begin
  try
    result := '';
    fsj := Trim(Formatdatetime('yyyyMMdd', Now));
    i := Length(Trim(MyFlag));
    with MyAdoQuery do
    begin
      Close;
      SQL.Clear;
      sql.Add('select Max(' + MyField + ') MaxNo from ' + MyTable);
      SQL.Add('where ' + MyField + ' like ' + QuotedStr('%' + fsj + '%'));
      Open;
    end;
    with MyAdoQuery do
    begin
      if Trim(fieldbyname('MaxNo').AsString) = '' then
      begin
        Result := Trim(MyFlag) + Trim(Formatdatetime('yyyyMMdd', Now)) + '1001';
        Exit;
      end;
    end;
    {fsj:=Trim(MyAdoQuery.fieldbyname('MaxNo').AsString);


    with MyAdoQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('select Max('+MyField+') MaxNo from '+MyTable);
      SQL.Add('where '+MyField+' like '+QuotedStr('%'+copy(fsj,3,8)+'%'));
      Open;
      ShowMessage(copy(fsj,3,8));
      if Trim(fieldbyname('MaxNo').AsString)='' then
      begin
        Result:=Trim(MyFlag)+Trim(Formatdatetime('yyyyMMdd',Now))+'1001';
        Exit;
      end;
    end;}
    fsj := Trim(MyAdoQuery.fieldbyname('MaxNo').AsString);
    result := Trim(MyFlag) + Trim(Formatdatetime('yyyyMMdd', Now)) + IntToStr(StrtoInt(Copy(fsj, i + 9, Length(fsj) - i - 8)) + 1);

  except
    Result := '';
    Application.MessageBox(PChar('�ֶ�ȡֵMaxNo���󣬲鿴��<' + Trim(MyTable) + '>�����ֶ�<' + MyField + '>'), '��ʾ', 0);
  end;
end;

procedure SCreateCDS20(SADOQry: TADOQuery; mClientDataset: TclientDataSet);
var
  i: integer;
  mfieldName: string;
  mSize: integer;
begin
  mfieldName := '';
  mClientDataset.FieldDefs.Clear;
  with SADOQry do
  begin
    for i := 0 to fieldCount - 1 do     //
    begin
      if (Fields[i].DataType = ftString) and (Fields[i].Size = 0) then
      begin
        mSize := 1;
      end
      else
        mSize := Fields[i].Size;
      mfieldName := trim(fields[i].FieldName);
      mClientDataset.FieldDefs.Add(mfieldName, Fields[i].DataType, mSize);

    end;
  end;
  mClientDataset.FieldDefs.Add('Sflag', ftString, 1);
  mClientDataset.FieldDefs.Add('Sindex', ftInteger, 0);
  mClientDataset.FieldDefs.Add('Ssel', ftBoolean, 0);
  mClientDataset.FieldDefs.Add('SDefNote', ftString, 10);
  mClientDataset.Close;
  mClientDataset.CreateDataSet;
end;

procedure SCreateCDSYS(SADOQry: TADOQuery; mClientDataset: TclientDataSet);
var
  i: integer;
  mfieldName: string;
  mSize: integer;
begin
  mfieldName := '';
  mClientDataset.FieldDefs.Clear;
  with SADOQry do
  begin
    for i := 0 to fieldCount - 1 do     //
    begin
      if (Fields[i].DataType = ftString) and (Fields[i].Size = 0) then
      begin
        mSize := 1;
      end
      else
        mSize := Fields[i].Size;
      mfieldName := trim(fields[i].FieldName);
      mClientDataset.FieldDefs.Add(mfieldName, Fields[i].DataType, mSize);

    end;
  end;
  mClientDataset.Close;
  mClientDataset.CreateDataSet;
end;

procedure SCreateCDSOnly(SADOQry: TADOQuery; mClientDataset: TclientDataSet);
var
  i: integer;
  mfieldName: string;
  mSize: integer;
begin
  mfieldName := '';
  mClientDataset.FieldDefs.Clear;
  with SADOQry do
  begin
    for i := 0 to fieldCount - 1 do     //
    begin
      if (Fields[i].DataType = ftString) and (Fields[i].Size = 0) then
      begin
        mSize := 1;
      end
      else
        mSize := Fields[i].Size;
      mfieldName := trim(fields[i].FieldName);
      mClientDataset.FieldDefs.Add(mfieldName, Fields[i].DataType, mSize);

    end;
  end;
  mClientDataset.Close;
  mClientDataset.CreateDataSet;
end;

procedure SInitCDSData20(fromADO: TADOQuery; toCDS: TclientDataSet);
var
  i: integer;
  k: integer;
begin
  if fromADO.IsEmpty then
    exit;
  fromADO.first;
  k := 1;
  try
    toCDS.DisableControls;
    toCDS.Filtered := false;
    while not fromADO.Eof do
    begin
      with toCDS do
      begin
        Append;
        for i := 0 to fromADO.FieldCount - 1 do
        begin
          fields[i].value := fromADO.Fields[i].Value;
        end;
        fieldByName('Sflag').AsString := '1';
        fieldByName('Sindex').value := k;
        fieldByName('Ssel').value := false;
        fieldByName('SDefNote').value := '';
        inc(k);
        Post;
      end;
      fromADO.Next;
    end;
    if not toCDS.IsEmpty then
    begin
      toCDS.First;
    end;
  finally
    toCDS.EnableControls;
  end;
end;

procedure SInitCDSDataYS(fromADO: TADOQuery; toCDS: TclientDataSet);
var
  i: integer;
  k: integer;
begin
  if fromADO.IsEmpty then
    exit;
  fromADO.first;
  k := 1;
  try
    toCDS.DisableControls;
    toCDS.Filtered := false;

    while not fromADO.Eof do
    begin
      with toCDS do
      begin
        Append;
        for i := 0 to fromADO.FieldCount - 1 do
        begin
          fields[i].value := fromADO.Fields[i].Value;
        end;
        inc(k);
        Post;
      end;
      fromADO.Next;
    end;
    if not toCDS.IsEmpty then
    begin
      toCDS.First;
    end;
  finally
    toCDS.EnableControls;
  end;
end;

procedure SInitCDSDataOnly(fromADO: TADOQuery; toCDS: TclientDataSet);
var
  i: integer;
  k: integer;
begin
  if fromADO.IsEmpty then
    exit;
  fromADO.first;
  k := 1;
  try
    toCDS.DisableControls;
    toCDS.Filtered := false;

    while not fromADO.Eof do
    begin
      with toCDS do
      begin
        Append;
        for i := 0 to fromADO.FieldCount - 1 do
        begin
          fields[i].value := fromADO.Fields[i].Value;
        end;
        inc(k);
        Post;
      end;
      fromADO.Next;
    end;
    if not toCDS.IsEmpty then
    begin
      toCDS.First;
    end;
  finally
    toCDS.EnableControls;
  end;
end;

procedure SInitFtComBoxBySql(ADOQueryTmp: TADOQuery; cb: TFtComboBox; FlagType: string; Boxtype: integer; showMsg: string; emptyFlag: Boolean; mSql: string);
begin
  with ADOQueryTmp do
  begin
    close;
    sql.clear;
    sql.Add(mSql);
    Open;
    if isEmpty then
    begin
      application.MessageBox(pChar(showMsg), '', 0);
      exit;
    end;
    cb.Clear;
    while not EOF do
    begin
      if Boxtype = 0 then
      begin
        cb.Items.Add(trim(fieldByName('Name').AsString));
      end
      else
      begin
        cb.AddItem2(trim(fieldByName('Name').AsString), nil, trim(fieldByName('code').AsString));
      end;
      next;
    end;

    if not emptyFlag then
      cb.Items.Add('');

    if emptyFlag and (cb.Items.Count > 0) then
      cb.ItemIndex := 0;
  end;
end;

procedure SInitComBoxBySql(ADOQueryTmp: TADOQuery; cb: TComboBox; emptyFlag: Boolean; mSql: string);
begin
  cb.Clear;
  with ADOQueryTmp do
  begin
    close;
    sql.clear;
    sql.Add(mSql);
    Open;
    if isEmpty then
    begin
      exit;
    end;
    while not EOF do
    begin
      cb.Items.Add(trim(fieldByName('Name').AsString));
      next;
    end;

    if not emptyFlag then
      cb.Items.Add('');

    if emptyFlag and (cb.Items.Count > 0) then
      cb.ItemIndex := 0;
  end;
end;
//////////////////////////////////////////////
  //���������Ի�combox�е�����
  //��XC_CustCode����ȡ��������
  //Boxtype:0; ����ţ�1;
//////////////////////////////////////////////

procedure SInitComBoxByCustCode(ADOQueryTmp: TADOQuery; cb: TComboBox; FlagType: string; Boxtype: integer; showMsg: string; emptyFlag: Boolean);
var
  A: TA;
begin
  cb.Items.Clear;
  with ADOQueryTmp do
  begin
    close;
    sql.clear;
    sql.Add('exec P_Get_XC_Custcode');
    sql.Add(quotedStr(trim(FlagType)));
    Open;
    if isEmpty then
    begin
      application.MessageBox(pChar('�ͻ�������Ϣά��ģ����δ�ҵ���' + showMsg), '', 0);
      exit;
    end;

    while not EOF do
    begin
      if Boxtype = 0 then
      begin
        cb.Items.Add(trim(fieldByName('name').AsString));
      end
      else
      begin
        A := TA.Create(nil);
        A.s := trim(fieldByName('code').AsString);
        cb.Items.AddObject(trim(fieldByName('name').AsString), TObject(A));
      end;
      next;
    end;

    if not emptyFlag then
      cb.Items.Add('');

    if emptyFlag and (cb.Items.Count > 0) then
      cb.ItemIndex := 0;
  end;
end;

procedure SInitCxGridComboBoxByCustCode(ADOQueryTmp: TADOQuery; c3: TcxGriddbColumn; FlagType: string; PState: Integer; IsNull: Boolean; Shmeg: string);
var
  A: TA;
begin

  (c3.Properties as TcxComboBoxProperties).Items.Clear;
  with ADOQueryTmp do
  begin
    close;
    sql.clear;
    sql.Add(' select * from XC_CustCode  ' + ' where Flag=''' + trim(FlagType) + ''' ' + ' order by orderno ');
    Open;
    if isEmpty then
    begin
      Application.MessageBox(PChar('�ͻ�������Ϣά��ģ����δ�ҵ�:' + Shmeg), '', 0);
      exit;
    end;
    while not EOF do
    begin
      A := TA.Create(nil);
      A.s := trim(fieldByName('Code').AsString);
      if PState = 1 then
        (c3.Properties as TcxComboBoxProperties).Items.AddObject(trim(fieldByName('name').AsString), TObject(A))
      else if PState = 0 then
      begin
        (c3.Properties as TcxComboBoxProperties).Items.Add(trim(fieldByName('name').AsString));
      end;
      next;
    end;
    if not IsNull then
      (c3.Properties as TcxComboBoxProperties).Items.Add('');
  end;

end;

procedure SInitCxGridComboBoxBySql(ADOQueryTmp: TADOQuery; c3: TcxGriddbColumn; FSql: string; PState: Integer; IsNull: Boolean; Shmeg: string);
var
  A: TA;
begin

  (c3.Properties as TcxComboBoxProperties).Items.Clear;
  with ADOQueryTmp do
  begin
    close;
    sql.clear;
    sql.Add(FSql);
    Open;
    if isEmpty then
    begin
      //Application.MessageBox(PChar('δ�ҵ�:'+shmeg),'',0);
      exit;
    end;
    while not EOF do
    begin
      A := TA.Create(nil);
      A.s := trim(fieldByName('Code').AsString);
      if PState = 1 then
        (c3.Properties as TcxComboBoxProperties).Items.AddObject(trim(fieldByName('name').AsString), TObject(A))
      else if PState = 0 then
      begin
        (c3.Properties as TcxComboBoxProperties).Items.Add(trim(fieldByName('name').AsString));
      end;
      next;
    end;
    if not IsNull then
    begin
      (c3.Properties as TcxComboBoxProperties).Items.Add('');
    end;
  end;

end;

procedure SInitCxBandGridComboBoxBySql(ADOQueryTmp: TADOQuery; c3: TcxGridDBBandedColumn; FSql: string; PState: Integer; IsNull: Boolean; Shmeg: string);
var
  A: TA;
begin

  (c3.Properties as TcxComboBoxProperties).Items.Clear;
  with ADOQueryTmp do
  begin
    close;
    sql.clear;
    sql.Add(FSql);
    Open;
    if isEmpty then
    begin
      Application.MessageBox(PChar('δ�ҵ�:' + Shmeg), '', 0);
      exit;
    end;
    while not EOF do
    begin
      A := TA.Create(nil);
      A.s := trim(fieldByName('Code').AsString);
      if PState = 1 then
        (c3.Properties as TcxComboBoxProperties).Items.AddObject(trim(fieldByName('name').AsString), TObject(A))
      else if PState = 0 then
      begin
        (c3.Properties as TcxComboBoxProperties).Items.Add(trim(fieldByName('name').AsString));
      end;
      next;
    end;
    if not IsNull then
    begin
      (c3.Properties as TcxComboBoxProperties).Items.Add('');
    end;
  end;

end;


///////////////////////////////////////////////////
//*****�������� *****                           //
/////////////////////////////////////////////////
function SSWR(s: real): real;
var
  r1, r2: real;
  s1, s2: string;
begin
  r1 := int(s);
  r2 := frac(s);
  s1 := copy(floattostr(r1), 1, length(floattostr(r1)));
  if length(floattostr(r2)) >= 5 then
  begin
    if strtoint(copy((floattostr(r2)), 5, 1)) >= 5 then
      if strtoint(copy((floattostr(r2)), 4, 1)) = 9 then
        if strtoint(copy((floattostr(r2)), 3, 1)) = 9 then
        begin
          s1 := inttostr(strtoint(s1) + 1);
          s2 := '';
        end
        else
          s2 := inttostr(strtoint(copy((floattostr(r2)), 3, 1)) + 1)
      else if copy((floattostr(r2)), 3, 1) = '0' then
        s2 := '0' + inttostr(strtoint(copy(floattostr(r2), 3, 2)) + 1)
      else
        s2 := inttostr(strtoint(copy(floattostr(r2), 3, 2)) + 1)
    else
      s2 := copy(floattostr(r2), 3, 2);
  end
  else
    s2 := copy(floattostr(r2), 3, 2);
  result := strtofloat(s1 + '.' + s2);
end;

procedure SInitCDSDataSel(fromADO: TADOQuery; toCDS: TclientDataSet);
var
  i: integer;
  k: integer;
begin
  if fromADO.IsEmpty then
    exit;
  fromADO.first;
  k := 1;
  try
    toCDS.DisableControls;
    toCDS.Filtered := false;

    while not fromADO.Eof do
    begin
      with toCDS do
      begin
        Append;
        for i := 0 to fromADO.FieldCount - 1 do
        begin
          fields[i].value := fromADO.Fields[i].Value;
        end;
        //fieldByName('Sflag').AsString :='1';
        //fieldByName('Sindex').value :=k;
        fieldByName('Ssel').value := false;
        inc(k);
        Post;
      end;
      fromADO.Next;
    end;
    if not toCDS.IsEmpty then
    begin
      toCDS.First;
    end;
  finally
    toCDS.EnableControls;
  end;
end;

procedure SCreateCDSSel(SADOQry: TADOQuery; mClientDataset: TclientDataSet);
var
  i: integer;
  mfieldName: string;
  mSize: integer;
begin
  mfieldName := '';
  mClientDataset.FieldDefs.Clear;
  with SADOQry do
  begin
    for i := 0 to fieldCount - 1 do     //
    begin
      if (Fields[i].DataType = ftString) and (Fields[i].Size = 0) then
      begin
        mSize := 1;
      end
      else
        mSize := Fields[i].Size;
      mfieldName := trim(fields[i].FieldName);
      mClientDataset.FieldDefs.Add(mfieldName, Fields[i].DataType, mSize);

    end;
  end;
  mClientDataset.FieldDefs.Add('Sflag', ftString, 1);
  mClientDataset.FieldDefs.Add('Sindex', ftInteger, 0);
  mClientDataset.FieldDefs.Add('Ssel', ftBoolean, 0);
  mClientDataset.FieldDefs.Add('SDefNote', ftString, 10);
  mClientDataset.Close;
  mClientDataset.CreateDataSet;
end;
//��������

procedure CopyAddRow(Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet);
var
  AA: array[0..50] of string;
  i, j: Integer;
begin
  if CDS_Sub.IsEmpty then
  begin
    CDS_Sub.Append;
    CDS_Sub.Post;
    Exit;
  end;
  for i := 0 to Tv1.ColumnCount - 1 do
  begin
    AA[i] := Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString);
  end;
  with CDS_Sub do
  begin
    Append;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if AA[i] <> '' then
      begin
        CDS_Sub.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := AA[i];
      end;
    end;
    Post;
  end;
end;

procedure CopyAddRowBand(Tv1: TcxGridDBBandedTableView; CDS_Sub: TClientDataSet);
var
  AA: array[0..50] of string;
  i, j: Integer;
begin
  if CDS_Sub.IsEmpty then
  begin
    CDS_Sub.Append;
    CDS_Sub.Post;
    Exit;
  end;
  for i := 0 to Tv1.ColumnCount - 1 do
  begin
    AA[i] := Trim(CDS_Sub.fieldbyname(Tv1.Columns[i].DataBinding.FieldName).AsString);
  end;
  with CDS_Sub do
  begin
    Append;
    for i := 0 to Tv1.ColumnCount - 1 do
    begin
      if AA[i] <> '' then
      begin
        CDS_Sub.FieldByName(Tv1.Columns[i].DataBinding.FieldName).Value := AA[i];
      end;
    end;
    Post;
  end;
end;
//��������

procedure CopyAddRowCDS(CDS_Sub: TClientDataSet);
var
  AA: array[0..1000] of string;
  i, j: Integer;
begin

  if CDS_Sub.IsEmpty then
    Exit;
  for i := 0 to CDS_Sub.FieldCount - 1 do
  begin
    AA[i] := Trim(CDS_Sub.fieldbyname(CDS_Sub.Fields[i].FieldName).AsString);
  end;
  with CDS_Sub do
  begin
    Append;
    for i := 0 to CDS_Sub.FieldCount - 1 do
    begin
      if AA[i] <> '' then
      begin
        CDS_Sub.FieldByName(CDS_Sub.Fields[i].FieldName).Value := AA[i];
      end;
    end;
    Post;
  end;
end;

procedure OneKeyPost(Tv1: TcxGridDBTableView; CDS_Sub: TClientDataSet);
var
  FValue, FFValue, FColumn, FFColumn: string;
begin
  //FColumn:=tv1.Columns[Tv1.Controller.FocusedColumnIndex].DataBinding.FieldName;
  //FFColumn:=Tv1.Columns[Tv1.Controller.FocusedColumnIndex].Summary.GroupFormat;
  FColumn := Tv1.Controller.FocusedColumn.DataBinding.FilterFieldName;
  FFColumn := Tv1.Controller.FocusedColumn.Summary.GroupFormat;
  FValue := Trim(CDS_Sub.fieldbyname(FColumn).AsString);
  if Trim(FFColumn) <> '' then
  begin
    FFValue := Trim(CDS_Sub.fieldbyname(FFColumn).AsString);
  end;
  with CDS_Sub do
  begin
    DisableControls;
    First;
    while not Eof do
    begin
      Edit;
      if FValue = '' then
      begin
        CDS_Sub.FieldByName(FColumn).Value := null;
      end
      else
      begin
        CDS_Sub.FieldByName(FColumn).Value := FValue;
      end;
      if Trim(FFColumn) <> '' then
      begin
        if FFValue = '' then
        begin
          CDS_Sub.FieldByName(FFColumn).Value := null;
        end
        else
        begin
          CDS_Sub.FieldByName(FFColumn).Value := FFValue;
        end;
      end;

      Post;
      Next;
    end;
    EnableControls;
  end;
end;


///////////////////////////////////////////////////
//�������ܣ�ȡ��ˮ��
//mFlag:ǰ׺��mTable:����
//mlen:��ˮ�ų���; mtype:�Ƿ������  1���� 0 ����
///////////////////////////////////////////////////
function GetLSNo(ADOQueryTmp: TADOQuery; var mMaxNo: string; mFlag: string; mTable: string; mlen: integer; mtype: integer = 0): Boolean;
begin
  try
    with ADOQueryTmp do
    begin
      Close;
      sql.Clear;
      sql.Add('exec Get_SY_MaxBH ');
      sql.Add(' ' + quotedStr(mFlag));
      sql.Add(',' + quotedStr(mTable));
      sql.Add(',' + intTostr(mlen));
      sql.Add(',' + intTostr(mtype));
      //ShowMessage(SQL.Text);
      Open;

      if RecordCount > 0 then
      begin
        mMaxNo := trim(fieldByName('MaxBH').AsString);
        if mMaxNo <> '' then
          result := true
        else
          Result := false;
      end
      else
      begin
        result := false;
      end;

    end;
    if not Result then
      application.MessageBox(Pchar('�޷�������ˮ��(' + mFlag + ')'), '��ʾ��Ϣ', MB_ICONINFORMATION);

  except
    result := false;
    application.MessageBox(Pchar('�޷�������ˮ��(' + mFlag + ')'), '��ʾ��Ϣ', MB_ICONINFORMATION);

  end;
end;

procedure ReadCxGrid(fileName: string; cxgrid: TcxGridDBTableView; filePack: string = '����');
var
  mFileName: string;
begin
  mFileName := ExtractFilePath(Application.ExeName) + 'Layout\' + filePack + '\' + trim(fileName) + '.dbg';
  //�Ӳ����ļ��лָ�
  if FileExists(mFileName) then
    cxgrid.RestoreFromIniFile(mFileName);
  CreateGroupSummarry(cxgrid);
end;
///////////////////////////////////////////////////////////////
  //�������ܣ����ļ��ж�ȡcxGridCol����
  //fileName �Ƽ�Ϊ���ڵ�caption����caption����
///////////////////////////////////////////////////////////////

procedure ReadCxBandedGrid(fileName: string; cxgrid: TcxGridDBBandedTableView; filePack: string = '����');
var
  mFileName: string;
begin
  mFileName := ExtractFilePath(Application.ExeName) + 'Layout\' + filePack + '\' + trim(fileName) + '.dbg';
  //�Ӳ����ļ��лָ�
  if FileExists(mFileName) then
    cxgrid.RestoreFromIniFile(mFileName);
end;
///////////////////////////////////////////////////////////////
  //�������ܣ�дcxGridCol���õ�.dbg�ļ���
  //Ĭ���Ƽ�Ϊ���ڵ�caption����
///////////////////////////////////////////////////////////////

procedure WriteCxGrid(fileName: string; cxgrid: TcxGridDBTableView; filePack: string = '����');
var
  mFileName: string;
begin
  mFileName := ExtractFilePath(Application.ExeName) + 'Layout\' + filePack + '\' + trim(fileName) + '.dbg';
  if not DirectoryExists(ExtractFileDir(mFileName)) then
    CreateDir(ExtractFileDir(mFileName));
  //����Ϊ�����ļ�
  cxgrid.StoreToIniFile(mFileName);

end;
///////////////////////////////////////////////////////////////
  //�������ܣ�дcxGridCol���õ�.dbg�ļ���
  //Ĭ���Ƽ�Ϊ���ڵ�caption����
///////////////////////////////////////////////////////////////

procedure WriteCxBandedGrid(fileName: string; cxgrid: TcxGridDBBandedTableView; filePack: string = '����');
var
  mFileName: string;
begin
  mFileName := ExtractFilePath(Application.ExeName) + 'Layout\' + filePack + '\' + trim(fileName) + '.dbg';
  if not DirectoryExists(ExtractFileDir(mFileName)) then
    CreateDir(ExtractFileDir(mFileName));
   //����Ϊ�����ļ�
  cxgrid.StoreToIniFile(mFileName);
end;

procedure CreateGroupSummarry(tv1: TcxGridDBTableView);
var
  csg: TcxDataSummaryGroup;
  csglink: TcxDataSummaryGroupItemLink;
  csgItem: TcxDataSummaryItem;
  i: integer;
  mFieldName: string;
begin
    ///����������
  with tv1.DataController.Summary do
  begin
    try
      csg := DataController.Summary.SummaryGroups.Add;   //����������

      csg.Links.Clear;
      for i := 0 to tv1.ColumnCount - 1 do
      begin
        if not tv1.Columns[i].Visible then
          continue;
        mFieldName := tv1.Columns[i].DataBinding.FieldName;

        if tv1.Columns[i].Summary.FooterKind = skSum then
        begin
            // (tv1.DataController.DataSet.Fields[i] as TNumericField).DisplayFormat := '#,0.00;-#,0.00;#';
             //tv1.Columns[i].Summary.FooterFormat:='0.0';
             //tv1.Columns[i].Summary.FooterKind := skSum;

             //�����Group Row�ϵĻ���ͬʱʹ��ʱ����ֻ����һ����Ч
             //�����з������ϵĻ�����

          csgItem := csg.SummaryItems.Add;
          csgItem.ItemLink := tv1.Columns[i];   //�����ֶ�1
          csgItem.Position := spGroup;
          csgItem.Kind := skSum;
          csgItem.Format := trim(tv1.Columns[i].Caption) + '��=#,0.0';

          tv1.Columns[i].Summary.GroupFooterKind := skSum;
          tv1.Columns[i].Summary.GroupFooterFormat := '#,0.00';

        end
        else if tv1.Columns[i].Summary.FooterKind = skCount then
        begin
            // (tv1.DataController.DataSet.Fields[i] as TNumericField).DisplayFormat := '#,0.00;-#,0.00;#';
             //tv1.Columns[i].Summary.FooterFormat:='0.0';
          tv1.Columns[i].Summary.FooterKind := skCount;

          tv1.Columns[i].Summary.GroupFooterKind := skCount;

             //tv1.Columns[i].Summary.GroupFooterFormat := '#,0.00';
             //�����Group Row�ϵĻ���ͬʱʹ��ʱ����ֻ����һ����Ч
             //�����з������ϵĻ�����
          csgItem := csg.SummaryItems.Add;
          csgItem.ItemLink := tv1.Columns[i];   //�����ֶ�1
          csgItem.Kind := skCount;
             //csgItem.Format := '��=#,0.0';

        end
        else
        begin
          csglink := csg.Links.Add;
          csglink.ItemLink := tv1.Columns[i];  //�����ֶ�
              //���в�������ܵ��ж��п����������飬���뽫��Щ�м��뵽
              //SummaryGroupItemLink�У�û�м�������ӵ�����������ʱ
              //����ֵ������ʾ
        end;

      end;
    finally
    end;
  end;

end;

procedure TcxGridToExcel(mfileName: string; gridName: TcxGrid);
var
  saveDialog: TSaveDialog;
begin
  try
    saveDialog := TSaveDialog.Create(nil);
    saveDialog.Filter := 'xls(*.xls)|*.xls|ȫ��(*.*)|*.*';
    saveDialog.Options := [ofOverwritePrompt];
    saveDialog.FileName := mfileName;
    if saveDialog.Execute then
      if Assigned(gridName) then
      begin
        try

          ExportGridToExcel(saveDialog.FileName, gridName);
        except
          application.MessageBox('����ʧ��,Դ�ļ����ܴ��ڱ༭״̬!', '��ʾ��Ϣ', 0);
          exit;
        end;
        application.MessageBox('�ɹ�����!', '��ʾ��Ϣ', 0);
      end
      else
        application.MessageBox('����ʧ��!', '��ʾ��Ϣ', 0);
  finally
    saveDialog.Free;
  end;
end;

procedure TcxGridToExcelEng(mfileName: string; gridName: TcxGrid);
var
  saveDialog: TSaveDialog;
begin
  try
    saveDialog := TSaveDialog.Create(nil);
    saveDialog.Filter := 'xls(*.xls)|*.xls|ALL(*.*)|*.*';
    saveDialog.Options := [ofOverwritePrompt];
    saveDialog.FileName := mfileName;
    if saveDialog.Execute then
      if Assigned(gridName) then
      begin
        try

          ExportGridToExcel(saveDialog.FileName, gridName);
        except
          application.MessageBox('The source file may be in edit mode!', 'Prompt message', 0);
          exit;
        end;
        application.MessageBox('Export success!', 'Prompt message', 0);
      end
      else
        application.MessageBox('Export failure!', 'Prompt message', 0);
  finally
    saveDialog.Free;
  end;
end;

function ReadINIFileStr(ininame, TypeName: string; ValueName, ValueMR: string): string;
var
  programIni: Tinifile;  //�������
  FileName, ValueZS: string;
begin
  FileName := ExtractFilePath(Paramstr(0)) + ininame;
  programIni := Tinifile.create(FileName);
  ValueZS := programIni.ReadString(TypeName, ValueName, ValueMR);
  Result := ValueZS;
  programIni.Free;
end;

procedure SelExportData(FTv: TcxGridDBTableView; FAdoQry: TADOQuery; FTile: string);
var
  i, j: Integer;
  fsj: string;
begin
  if FAdoQry.IsEmpty then
    Exit;
  try
    frmSelExportField := TfrmSelExportField.Create(Application);
    with frmSelExportField do
    begin
      with frmSelExportField.ExpGrid do
      begin
       // ExpGrid.Columns.Clear;
        ExpGrid.ClearItems;
        frmSelExportField.IniName := FTile;
        {if FTv.OptionsView.Footer=true then
        begin
          ExpGrid.OptionsView.Footer:=True;
        end else
        begin
          ExpGrid.OptionsView.Footer:=False;
        end;    }
        ExpGrid.OptionsView.Footer := FTv.OptionsView.Footer;
        for i := 0 to FTv.ColumnCount - 1 do
        begin
          //if FTv.Columns[i].Visible=True then
          begin
            ExpGrid.CreateColumn;
            j := ExpGrid.ColumnCount - 1;
            ExpGrid.Columns[j].Caption := FTv.Columns[i].Caption;
            ExpGrid.Columns[i].Visible := FTv.Columns[i].Visible;
            ExpGrid.Columns[j].DataBinding.FieldName := FTv.Columns[i].DataBinding.FieldName;
            ExpGrid.Columns[j].Width := FTv.Columns[i].Width;
            ExpGrid.Columns[i].Summary.FooterKind := FTv.Columns[i].Summary.FooterKind;

          end;
        end;
      end;
      ExportDataSource.DataSet := FAdoQry;
      FAdoQry.Open;
      if ShowModal = 1 then
      begin

      end;
    end;
    frmSelExportField.Free;
  except

  end;
end;

procedure SelExportDataBand(FTv: TcxGridDBBandedTableView; FAdoQry: TADOQuery; FTile: string);
var
  i, j: Integer;
  fsj: string;
begin
  if FAdoQry.IsEmpty then
    Exit;
  try
    frmSelExportField := TfrmSelExportField.Create(Application);
    with frmSelExportField do
    begin
      with frmSelExportField.ExpGrid do
      begin
       // ExpGrid.Columns.Clear;
        ExpGrid.ClearItems;
        frmSelExportField.IniName := FTile;
        {if FTv.OptionsView.Footer=true then
        begin
          ExpGrid.OptionsView.Footer:=True;
        end else
        begin
          ExpGrid.OptionsView.Footer:=False;
        end;    }
        ExpGrid.OptionsView.Footer := FTv.OptionsView.Footer;
        for i := 0 to FTv.ColumnCount - 1 do
        begin
          if FTv.Columns[i].Visible = True then
          begin
            ExpGrid.CreateColumn;
            j := ExpGrid.ColumnCount - 1;
            ExpGrid.Columns[j].Caption := FTv.Columns[i].Caption;
            ExpGrid.Columns[j].DataBinding.FieldName := FTv.Columns[i].DataBinding.FieldName;
            ExpGrid.Columns[j].Width := FTv.Columns[i].Width;
            ExpGrid.Columns[i].Summary.FooterKind := FTv.Columns[i].Summary.FooterKind;

          end;
        end;
      end;
      ExportDataSource.DataSet := FAdoQry;
      FAdoQry.Open;
      if ShowModal = 1 then
      begin

      end;
    end;
    frmSelExportField.Free;
  except

  end;
end;

procedure ColumnView(AdoQueryTemp: TADOQuery; Tv1: TcxGridDBTableView; MKName10: string);
begin
  with AdoQueryTemp do
  begin
    Close;
    sql.Clear;
    sql.Add('select * from Table_Column where CxTabName=''' + Trim(MKName10) + ''' and Owner=''' + Trim(DCode) + '''');
    sql.Add(' and TCNotVisble=1 ');
    open;
  end;
  if AdoQueryTemp.IsEmpty = False then
  begin
    with AdoQueryTemp do
    begin
      First;
      while not eof do
      begin

        Tv1.GetColumnByFieldName(AdoQueryTemp.fieldbyname('ColName').AsString).Visible := False;
        Tv1.GetColumnByFieldName(AdoQueryTemp.fieldbyname('ColName').AsString).Hidden := True;
        Next;
      end;
    end;
  end;
end;

procedure ColumnBandView(AdoQueryTemp: TADOQuery; Tv1: TcxGridDBBandedTableView; MKName10: string);
var
  fsj: string;
begin
  with AdoQueryTemp do
  begin
    Close;
    sql.Clear;
    sql.Add('select * from Table_Column where CxTabName=''' + Trim(MKName10) + ''' and Owner=''' + Trim(DCode) + '''');
    sql.Add(' and TCNotVisble=1 ');
    open;
  end;
  if AdoQueryTemp.IsEmpty = False then
  begin
    with AdoQueryTemp do
    begin
      First;
      while not eof do
      begin
        fsj := Trim(AdoQueryTemp.fieldbyname('ColName').AsString);
       // Tv1.Controller.ge
        Tv1.GetColumnByFieldName(fsj).Visible := False;
        Tv1.GetColumnByFieldName(fsj).Hidden := True;
        Next;
      end;
    end;
  end;
end;

procedure ColumnSet(TV10: TcxGridDBTableView; MKName10: string);
var
  i: Integer;
begin
  try
    frmColumnSet := TfrmColumnSet.Create(Application);
    with frmColumnSet do
    begin
      ADOQuery2.DisableControls;
      with ADOQuery2 do
      begin
        Close;
        sql.Clear;
        sql.Add('select * from Table_Column where 1<>1');
        Open;
      end;
      SCreateCDS20(ADOQuery2, ClientDataSet2);
      SInitCDSData20(ADOQuery2, ClientDataSet2);
      ADOQuery2.EnableControls;
      MKName := MKName10;
      for i := 0 to TV10.ColumnCount - 1 do
      begin
        with ClientDataSet2 do
        begin
          Append;
          FieldByName('CxTabName').Value := MKName;
          FieldByName('CxColName').Value := Trim(TV10.Columns[i].Caption);
          FieldByName('ColName').Value := Trim(TV10.Columns[i].DataBinding.FieldName);
          Post;
        end;
      end;
      if ShowModal = 1 then
      begin

      end;
    end;
  finally
    frmColumnSet.Free;
  end;
end;

procedure ColumnBandSet(TV10: TcxGridDBBandedTableView; MKName10: string);
var
  i: Integer;
begin
  try
    frmColumnBandSet := TfrmColumnBandSet.Create(Application);
    with frmColumnBandSet do
    begin
      ADOQuery2.DisableControls;
      with ADOQuery2 do
      begin
        Close;
        sql.Clear;
        sql.Add('select * from Table_Column where 1<>1');
        Open;
      end;
      SCreateCDS20(ADOQuery2, ClientDataSet2);
      SInitCDSData20(ADOQuery2, ClientDataSet2);
      ADOQuery2.EnableControls;
      MKName := MKName10;
      for i := 0 to TV10.ColumnCount - 1 do
      begin
        with ClientDataSet2 do
        begin
          Append;
          FieldByName('CxTabName').Value := Trim(TV10.Bands[TV10.Columns[i].Position.BandIndex].Caption);
          FieldByName('CxColName').Value := Trim(TV10.Columns[i].Caption);
          FieldByName('ColName').Value := Trim(TV10.Columns[i].DataBinding.FieldName);
          FieldByName('OrderNo').Value := i;
          Post;
        end;
      end;
      ADOQuery5.DisableControls;
      with ADOQuery5 do
      begin
        Close;
        sql.Clear;
        sql.Add('select * from Table_Name where 1<>1');
        Open;
      end;
      SCreateCDS20(ADOQuery5, CDSName);
      SInitCDSData20(ADOQuery5, CDSName);
      ADOQuery2.EnableControls;
      MKName := MKName10;
      for i := 0 to TV10.Bands.Count - 1 do
      begin
        with CDSName do
        begin
          Append;
          FieldByName('CxTabName').Value := Trim(TV10.Bands[i].Caption);
          FieldByName('OrderNo').Value := i;
          Post;
        end;
      end;
      if ShowModal = 1 then
      begin

      end;
    end;
  finally
    frmColumnBandSet.Free;
  end;
end;

procedure GetSWLDZ(IPStr: string);
var
  myip: ulong;
  mymac: array[0..5] of byte;
  mymaclength: ulong;
  r: integer;
begin
  {myip:=inet_addr(PChar(Trim(IPStr)));
  mymaclength:=length(mymac);
  r:=sendarp(myip,0,@mymac,@mymaclength);
  IpCall:=r;      
  IpWLDZStr:=format('%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x',[mymac[0],mymac[1],mymac[2],mymac[3],mymac[4],mymac[5]]);}
end;

procedure SelOKNo(CDS_MainSel: TClientDataSet; FSel: Boolean);
begin
  if CDS_MainSel.IsEmpty then
    Exit;
  CDS_MainSel.DisableControls;
  with CDS_MainSel do
  begin
    First;
    while not Eof do
    begin
      if FieldByName('SSel').AsBoolean = not FSel then
      begin
        Edit;
        FieldByName('SSel').Value := FSel;
        Post;
      end;
      Next;
    end;
  end;
  CDS_MainSel.EnableControls;
end;

procedure SelOKNoAdo(CDS_MainSel: TADOQuery; FSel: Boolean);
begin
  if CDS_MainSel.IsEmpty then
    Exit;
  CDS_MainSel.DisableControls;
  with CDS_MainSel do
  begin
    First;
    while not Eof do
    begin
      if FieldByName('SSel').AsBoolean = not FSel then
      begin
        Edit;
        FieldByName('SSel').Value := FSel;
        Post;
      end;
      Next;
    end;
  end;
  CDS_MainSel.EnableControls;
end;

function num2ceng(strArabic: string): string;//����С��������ת��Ӣ��
const
  sw: array[2..9] of string = ('twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety');
  gw: array[1..19] of string = ('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen');
  exp: array[1..4] of string = ('', 'thousand', 'million', 'billion');
var
  t, j, glb, t1: integer;
  ts: string;

  function readu1000(ss: string): string;
  var
    t, code: integer;
  begin
    result := '';
    while ss[1] = '0' do
    begin
      delete(ss, 1, 1);
      if length(ss) = 0 then
        exit; //����ȫ��0���
    end;
    if length(ss) = 3 then
    begin
      appendstr(result, gw[ord(ss[1]) - ord('0')]);
      //appendstr(result,' hundred ');
      appendstr(result, ' hundred  ');
      delete(ss, 1, 1);
    end;
    while ss[1] = '0' do
    begin
      delete(ss, 1, 1);
      if length(ss) = 0 then
        exit;
    end;
    if length(ss) <> 0 then
      if result <> '' then
        appendstr(result, 'and ');
    if (glb = 1) and (t1 <> 1) then //������λʱ�������3λ
      if result = '' then
        appendstr(result, 'and ');
    begin
      val(ss, t, code);
      if t < 20 then
        result := result + gw[t]
      else if t mod 10 = 0 then
        result := result + sw[t div 10]
      else
      //result := result+sw[trunc(t/10)]+'-'+gw[t mod 10];
        result := result + sw[trunc(t / 10)] + ' ' + gw[t mod 10];
    end;
  end;

begin
  result := '';
  t := pos('.', strArabic);
  if t = 0 then
    t := length(strArabic) + 1;
  while (t mod 3 <> 1) do
  begin
    t := t + 1;
    strArabic := '0' + strArabic;
  end;
  t1 := (t - 1) div 3;
  for glb := t1 downto 1 do
  begin
    ts := '';
    for j := 1 to 3 do
    begin
      ts := ts + strArabic[1];
      delete(strArabic, 1, 1);
    end;
    result := result + readu1000(ts);
    if ts <> '000' then
      result := result + ' ' + exp[glb] + ' ';
  end;
  if length(strArabic) <> 0 then
  begin
    delete(strArabic, 1, 1);
    appendstr(result, 'and ');
    result := result + readu1000(strArabic);
  end;
end;

function num2cengnum(strArabic: string): string;
const
  gw: array[1..10] of string = ('0', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine');
var
  p, i, j, x: integer;
  s: string;
begin
  result := '';
  s := strArabic;
  p := pos('.', strArabic);
  if p = 0 then
  begin
    result := num2ceng(strArabic) + 'Only';
    exit;
  end
  else
  begin
    i := length(s) - p; //����С��������м�λ
    delete(strArabic, p, i + 1); //ɾ��С�����������
    result := num2ceng(strArabic) + 'Point';
  end;
  for x := 1 to i do //ת��С�����������
  begin
    j := strtoint(copy(s, p + x, 1));
    case j of
      0:
        result := result + ' ' + gw[1];
      1:
        result := result + ' ' + gw[2];
      2:
        result := result + ' ' + gw[3];
      3:
        result := result + ' ' + gw[4];
      4:
        result := result + ' ' + gw[5];
      5:
        result := result + ' ' + gw[6];
      6:
        result := result + ' ' + gw[7];
      7:
        result := result + ' ' + gw[8];
      8:
        result := result + ' ' + gw[9];
      9:
        result := result + ' ' + gw[10];
    end;
  end;
end;

procedure DelCDS(ClientDataSet1: TClientDataSet; ADOCmd: TADOQuery; DelSql: string);
begin
  if ClientDataSet1.IsEmpty then
    Exit;
  if Trim(ClientDataSet1.fieldbyname('ZSID').AsString) <> '' then
  begin
    if Application.MessageBox('ȷ��Ҫɾ��������', '��ʾ', 32 + 4) <> IDYES then
      Exit;
    with ADOCmd do
    begin
      Close;
      SQL.Clear;
      sql.Add(DelSql);
      ExecSQL;
    end;
  end;
  ClientDataSet1.Delete;
end;

end.