最近客户有个需求,要求对单据列表里指定的单据进行批量审核,很自然的,我想到了在DBGridEh增加一栏复选框的列,审核时遍历所有单据,将打了勾的单据审核就可以了。查阅了网上很多文章,不外有2个方案,1是在数据表里增加字段,2是直接在DBGridEh增加一个没有字段的栏,也许是我笨吧,2种方案试过了都不行,于是只能自己想办法了。研究了半天结合前面的2个方案,我想到了一个解决的方法,分享给大家吧。

一、在sql语句里增加一个字段

原来:select * from tbPerson

修改为:select *,bSel=Name from tbPerson

这样就多了一个和Name相同的字段,这个bSel就是一会要做成复选框栏目对应的字段

二、DBGridEh增加一列,字段名就是SQL语句里增加的bSel,CheckBoxes设为True, KeyList第1行是1,第2行是0。

三、在DataSet打开后,要将这个字段的内容清空,设为默认值0,为未选中状态。我用的是ADOQuery,设LockType为ltBatchOptimistic,允许修改表格内容。

procedure TForm_PRW0.QueryListAfterOpen(DataSet: TDataSet);
begin
  with QueryList do
  begin
    First;
    try
      DisableControls;   //禁止滚屏
      while not Eof do
      begin
        if (FieldByName('bSel').AsString<>'1') and (FieldByName('bSel').AsString<>'0') then //设置默认值是0,就是未选中状态
        begin
          Edit;
          FieldByName('bSel').AsString:='0';
          Post;
        end;
        Next;
      end;
      First;
      EnableControls;  //允许滚屏
    except
    end;

end;
end;

四、在审核过程中使用这个字段

1、全选

procedure TForm_PRW0.ActionSelAllExecute(Sender: TObject);
var
  vMark:TBookmark;
begin
  with QueryList do
  begin
    if not Active then Exit;
    vMark:=GetBookmark;
    First;
    try
      DisableControls;
      while not Eof do
      begin
        Edit;
        FieldByName('bSel').AsString:='1';
        Next;
      end;
      GotoBookmark(vMark);
    except
    end;
    EnableControls;
  end;
end;

2、审核前遍历所有单据

procedure TForm_PRW0.ActionGroupCheckExecute(Sender: TObject);
var
  vMark:TBookmark;
  vState,BillList:string;
  bNoChange:Boolean;
begin
  if not QueryList.Active then Exit;
  if not ActionCheck.Visible then Exit;
  vMark:=QueryList.GetBookmark;
  vState:=QueryList.FieldByname('State').AsString;
  if vState='' then
    vState:=DupeString('0',GV_StateLength);
  if MessageDlg('确认要批量审核所选的单据吗?',mtConfirmation,mbOKCancel,0)<>mrOK then
      Exit;
  bNoChange:=False;PKList:='';BillList:='';

with QueryList do
  begin
    First;
    while not Eof do
    begin
      vState:=FieldByName('state').AsString;
      if (Copy(vState,1,1)<>'1') or (FieldByName('bSel').AsString<>'1') then     //车间未确认或未选中 不操作
      begin
        bNoChange:=True;
        Next;
        Continue;
      end;
      PKList:=PKList+ Format(',''%s''',[FieldByName('PKID').AsString]);
      BillList:=BillList+ Format(',%s',[FieldByName('BillNo').AsString]);
      Next;
    end;
    if PKList='' then
    begin
      MessageDlg('没有发现要审核的单据!',mtInformation,[mbOK],0);
      Exit;
    end else
    begin
      PKList:=Copy(PKList,2,Length(PKList));
      BillList:=Copy(BillList,2,Length(BillList));
    end;
  end;

end;
---------------------

最新文章

  1. C++Primer 第十五章
  2. JAVA 数组作业——动手动脑以及课后实验性问题
  3. 计算2的N次方
  4. 把数组转换成sql中能使用的字符串
  5. 【原】ComboBoxety用户输入自动匹配
  6. 解决SQL Server的TEXT、IMAGE类型字段的长度限制
  7. TaintDroid:智能手机监控实时隐私信息流跟踪系统(三)
  8. HDU 4381 Grid
  9. nyoj 寻找最大数
  10. selenium执行JavaScript语句:控制滚动条 聚焦元素 改变下拉选项
  11. Maven下载与环境变量配置
  12. IDEA修改module的名字
  13. 安装FreeIPA以及应用时报错汇总
  14. 使用pdfBox实现pdf转图片,解决中文方块乱码等问题
  15. 浏览器能正常访问的url,superagent不能正常访问
  16. 在C语言中除法运算为什么没有小数部分?
  17. Mybatis的cache
  18. An assembly specified in the application dependencies manifest
  19. Redis有序集内部实现原理分析
  20. GridEh Lookup

热门文章

  1. Qualcomm_Mobile_OpenCL.pdf 翻译-6-工作组尺寸的性能优化
  2. oracle高水位降低法
  3. exe 错误
  4. node模块管理
  5. &#39;gbk&#39; codec can&#39;t decode byte 0xad in position 12: illegal multibyte sequence
  6. Javascript高级程序设计第三版-笔记
  7. nginx typecho config
  8. week3 作业
  9. jdbcTemplate进行CRUD,查询结果转json
  10. npm安装源修改为淘宝源