CXGrid 控件

本文介绍了一段Delphi代码,用于构建基于用户输入条件的复杂SQL查询。代码涉及DateTimeToSql函数、SynchReadData过程以及SearchFieldNameValue函数的使用,主要在TBalanceStatWSJ_payForm组件上实现按支付时间、运单号码等多种条件的查询。在查询过程中,代码会检查并处理用户输入,确保查询的正确性和用户友好性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其中DateTimeToSql 需要引用gDateFunc单元  ShowWarning对话框需要引用,SynchReadData需要引用MTSCommon单元,SearchFieldNameValue需要引用
//查询:按支付时间查询,按运单号码查询
procedure TBalanceStatWSJ_payForm.RzBitBtnSearchSQLClick(Sender: TObject);
var
  StartTime:String;//开始时间
  EndTime:string;  //结束时间
  MSQLSTR:string;//SQL语句
  MSQLTerm:string;//拼接语句
  MErrorInfoStr:string;//错误语句
  i :Integer;
begin
  inherited;
  MSQLSTR := '';
  MSQLTerm:='';
  MErrorInfoStr := '查询MPOS支付结果查询出错,请重新查询!!!';

  //获取开始时间和结束时间,需要注意的是,转为浮点型是因为数据库有可能是繁体或者是简体的,
  //是因为他们的显示格式不一样,但是都是浮点型转换过来的,所以需要先将日期格式转换为datatime类型
  //再将datatime转换为浮点型进行运算,调用 gDateFunc单元的两个方法,MergeDataTime ,先合并时间,再用DATETIMETOSQL转成浮点型字符串
  //语句一定是字符串才能拼起来的,都是它已经转为546546.121这个格式的了,不是‘2013-02-06 05:55:00’,所以加入where条件是不需要加单引号了
  //命名的时候,注意命名规范如MSQLSTR是M开头   ,当我们通过对象点属性时,有时无法提示,如果编译通过说明这是正常的,直接用手敲就是了
  //写注释的时候要注意注释中有特殊字符,注释下面第一行的代码被当做注释使用了,所以无法取到值
   //获取开始时间
  StartTime:= DateTimeToSql(MergeDateTime(RzDateTimePickerDateStart.Date,RzDateTimePickerTimeStart.Time));
  //获取结束时间
  EndTime:=DateTimeToSql(MergeDateTime(RzDateTimePickerDateEnd.Date,RzDateTimePickerTimeEnd.Time));

  //拼接SQL语句
  MSQLSTR := MSQLSTR + 'select ti.BusinessTime, ti.BarCode, m.SDShipp, ti.CardNo, ti.TerminalDealID,' + #13
          +'ti.UnionpayDealID, ti.TotalPayment, bs.StateName, bu.UntreadReasonName,ti.Commoditys,' + #13
          +'ti.Remark  from tiInADCPOS_EX_Sign_Result ti  ' + #13;


  case  RzPageControlSearchTerm.ActivePageIndex of
    0:
    begin
      MSQLSTR := MSQLSTR
              +'left outer join mManifest m on ti.BarCode = m.Jobno ' + #13
              +'left outer join bState bs on ti.State = bs.statecode ' + #13
              +'left outer join bUntreadReasonCode bu on ti.UntreadReasoncode = bu.UntreadReasonCode where ' + #13
             //添加条件 开始时间和结束时间
              +' BusinessTime between ' + startTime + ' and '+EndTime ;
      //如果终端ID不为空
      if RzEditterminal_id.text <> ''  then
      begin
        MSQLSTR := MSQLSTR + ' and TerminalDealID  ='+quotedstr(RzEditterminal_id.text);
      end;
      // 如果客户不为空
      if RzButtonEditSearchSearchSDShipp.text <> ''  then
      begin
        MSQLSTR := MSQLSTR + ' and SDShipp  ='+quotedstr(RzButtonEditSearchSearchSDShipp.Text);
      end;
      // 如果银联ID不为空
      if edtUnionpayDealID.Text <> '' then
      begin
        MSQLSTR := MSQLSTR + ' and UnionpayDealID  ='+quotedstr(edtUnionpayDealID.Text);
      end;
    end;


    1:
    begin
      MSQLSTR := MSQLSTR
              +'left outer join mManifest m on ti.BarCode = m.Jobno ' + #13
              +'left outer join bState bs on ti.State = bs.statecode ' + #13
              +'left outer join bUntreadReasonCode bu on ti.UntreadReasoncode = ' + #13
              +'bu.UntreadReasonCode  ' + #13;


      for i:=0 to RzMemoNO.Lines.Count -1 do
      begin
        //如果运单号不为空,循环添加运单号进行查询
        if trim(RzMemoNO.Lines.Strings[i]) <> '' then
        begin
          if MSQLTerm = '' then
          begin
            MSQLTerm :='where ((ti.BarCode = ' + QuotedStr(trim(RzMemoNO.Lines.Strings[i])) + ') ' + #13;
          end else begin
            MSQLTerm := MSQLTerm + 'or (ti.BarCode = ' + QuotedStr(Trim(RzMemoNO.Lines.Strings[i])) + ')' + #13;
          end;
        end;
      end;


      if MSQLTerm = '' then
      begin 
        //MessageBox();舍弃掉,使用gFunction中的新方法
        ShowWarning('请输入运单号码!!!');
        RzMemoNO.SetFocus;
        exit;
      end;


      MSQLSTR :=MSQLSTR+ MSQLTerm + ')' + #13;
    end;


  end;


  //参数如下:当前句柄,SQL语句,DataSource中的数据集DataSet属性值,错误信息,SynchReadData需要引入单元文件 MTSCommon
  if SynchReadData(Handle, MSQLSTR, ClientDataSet, MErrorInfoStr) then
  begin
  end;
  //总结
end;
  //总结
  (*
  只要是带金额的列都需要统计还有统计记录数  ,双击网格,显示所有列的信息
  每一列都需要设置类型 ,像时间列的属性设置  ckDateTime显示日期和时间
  货币类型的列设置,需要格式化成货币类型
  *)
end;

//inherited 在前说明先调用父类的方法,在执行父类之后的方法,反之亦然
procedure TBalanceStatWSJ_payForm.RzButtonEditSearchSearchSDShippButtonClick(
  Sender: TObject);
begin
  inherited;
  //RzButtonEditSearchSearchSDShipp,这个是控件名,'bCust'是表名  通过下载数据库表的数据转换为xml文件,在  E:\SOS\IntelinkGroup\Datas目录
  SearchFieldNameValue(Self,
                       RzButtonEditSearchSearchSDShipp,
                       'bCust',
                       True);
end;

procedure TBalanceStatWSJ_payForm.RzButtonEditSearchSearchSDShippExit(
  Sender: TObject);
begin
  RzButtonEditSearchSearchSDShipp.IsError := not SearchFieldNameValue(Self,
                       RzButtonEditSearchSearchSDShipp,
                       'bCust',
                       False);
  inherited;
end;
//inherited 在前说明先调用父类的方法,在执行父类之后的方法,反之亦然
//RzButtonEditSearch控件中的事件,实现选择客户等信息
procedure TBalanceStatWSJ_payForm.RzButtonEditSearchSearchSDShippButtonClick(
  Sender: TObject);
begin
  inherited;
  //RzButtonEditSearchSearchSDShipp,这个是控件名,'bCust'是本地表名,这种控件是可以复制的,包括里面的事件,不过这种控件一般是用改列对应的代号查询,只需要修改本地表名和控件名称就可以了,当然还有个需要修改的,当我们输入错误时要提示,所以得设置EditContent属性的值为该列显示的值,像交易状态的本地表名就是bstate  通过下载数据库表的数据转换为xml文件,在  E:\SOS\IntelinkGroup\Datas目录
  SearchFieldNameValue(Self,
                       RzButtonEditSearchSearchSDShipp,
                       'bCust',
                       True);
end;


procedure TBalanceStatWSJ_payForm.RzButtonEditSearchSearchSDShippExit(
  Sender: TObject);
begin
  RzButtonEditSearchSearchSDShipp.IsError := not SearchFieldNameValue(Self,
                       RzButtonEditSearchSearchSDShipp,
                       'bCust',
                       False);
  inherited;
end;

总结

1、 当我们需要禁止CSGrid自动通过数据集修改数据时,将关联的ADOQuery中的LockType属性改为 ltBatchoptimistic,加一个确定按钮,确定提交修改数据

 2、 DB类型的控件必须设置数据集DataSource属性,因为它是根据数据集进行呈现数据的

3、 如果显示在表格中的数据一般是一个ADOQuery对应一个DataSource

 4、当我们点击某列需要显示下拉框是 点击该列,将Properties设置ComboBox

 5、当需要用到单元格的点击事件或双击事件是,需要先将单元格设置为不可编辑,将两个属性设置为false

          一个是OptionsBehavior下的ImmediateEditor设置为false

          一个是OptionsData下的Editing设置为false

6、当我们在代码中需要激活单元格编辑时,CXGrid 下有两个属性中的cxGrid1DBTableView进行设置,设置方法如下

//单元格设置为可编辑
         cxGrid1DBTableView1.OptionsBehavior.ImmediateEditor:=True
         cxGrid1DBTableView1.OptionsData.Editing:=true

代码

//总结
    只要是带金额的列都需要统计还有统计记录数 
     每一列都需要设置类型 ,像时间列的属性设置
     货币类型的列设置,需要格式化成货币类型  

   先设置网格中的列的属性,fieldname与数据库字段名相同

     每一列都需要设置类型 ,像时间列的属性设置  ckDateTime显示日期和时间

货币类型的列设置,需要格式化成货币类型

   

    只要是带金额的列都需要统计还有统计记录数  ,双击网格,显示所有列的信息

    

  

最后
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值