最近客户有个需求,要求对单据列表里指定的单据进行批量审核,很自然的,我想到了在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;
---------------------

我在DBGridEh增加一栏复选框及对应操作的解决方案的更多相关文章

  1. android 中单选和复选框监听操作

    单选按钮RadioGroup.复选框CheckBox都有OnCheckedChangeListener事件,我们一起了解一下. package com.genwoxue.oncheckedchange ...

  2. Jquery对复选框CheckBox的操作

    checkbox: 多选框 //获取选中值  checkbox:$("#checkbox_id").attr("value"): 多选框checkbox,打勾: ...

  3. jquery对复选框(checkbox)的操作(精华)

    @{ Layout = null;} <!DOCTYPE html> <html><head> <meta name="viewport" ...

  4. 复选框批量删除操作-jquery方式

    1.首先在页面添加一个批量删除的按钮:<li class="btns"><input id="deleteSubmit" class=&quo ...

  5. 【Telerik】实现列表单元格中添加复选框,进行状态(是、否)判断

    前台界面: 需求:实现对每条细则是否必备进行判断,必备就勾选,否则不勾选. 首先:要保证列表GridView是可编辑的(IsReadOnly=false) 表格代码 其次:单元格的数据绑定要保证是双向 ...

  6. jQuery操作复选框的简单使用

    开发中为了实现一个小功能,就是复选框的相互影响事件,如下图: 就是通过复选框设置权限,权限是分等级的,这是一个web管理系统的应用,一个管理员具有三个权限赋予,权限也是有等级的,其中删除和编辑权限相当 ...

  7. QTreeView/QTableView中利用QStandardItem实现复选框三种形态变化

    https://www.techieliang.com/2017/12/729/ 原文地址 using_checkbox_item.h /** * @file using_checkbox_item. ...

  8. extjs 点击复选框在表格中增加相关信息行

    功能效果:点击复选框在表格中自动增加相关信息行,复选框取消则表格中内容自动删除 初始效果大概是这样~~~~~ // 定义初始 存放表格数据 var gridItems = []; //省份复选框 va ...

  9. EasyUi datagrid列表增加复选框

    本文为博主原创,未经允许不得转载 1.增加复选框列 {     field: 'oid',     title: '<input type=\"checkbox\" name ...

随机推荐

  1. Linux Shell交互式自动化运维程序

    Expect是Linux操作系统下的一个用来处理交互操作,系统默认是没有安装expect库,所以执行expect会提示找不到命令,需要手动安装,其它安装也比较简单,可以通过二进制源码包编译配置进行安装 ...

  2. Kubernetes集群详细介绍及部署

    kubernetes的介绍: kubernetes是谷歌在2014年6月的一个开源集群项目,使用go语言开发,因为除了ks后只有8个字母又被称为k8s. k8s的主要作用: 自动化部署 扩展容器的管理 ...

  3. Codeforces 989 P循环节01构造 ABCD连通块构造 思维对云遮月参考系坐标轴转换

    A 直接判存不存在连续的三个包含A,B,C就行 /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a ...

  4. 502 bad gateway nginx 的错误的解决方案

    总结 一般是php问题居多,也需要调整相应的nginx参数,最后也可能是mysql假死 nginx问题 查看日志中的报错error.log一般设置路径/usr/local/nginx/logs/ngi ...

  5. spring boot 2.0(三)使用docker部署springboot

    Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下. 首先构建一个简单的 Spring Boot 项目, ...

  6. mysql慢查询分析

    mysql慢查询分析 Posted: 29. 08. 2014 | Author: zdz | Category: mysql MySQL 慢查询日志分析 1. pt-query-digest分析慢查 ...

  7. Python 元组Ⅰ

    Python 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: 创建空元 ...

  8. 23.二叉搜索树的后序遍历(python)

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 这道题特别傻的地方: 当输入sequence为空时 ...

  9. 原生js数组排序(封装方法)

    //两值互换 function Sort(arr, index){ //参数arr代表数组,index代表数组元素下标 arr[index] += arr[index + 1];  //a+=b; a ...

  10. 拉链法解决hashtable冲突问题

    拉链法解决冲突.拉链法解决冲突的做法是将所有的相同Hash值的key放在一个链表中,比如key3和key14在hash之后都是0,那么在数组的键为0的地方存储这两个值,形式是链表.如果不能理解我的文字 ...