大家在写数据库软件时都会用到这二个模块,如:   
  万能查询:   
          字段名         操作符           值           or/and   
    
  不同的表就会有不同的字段名,将要查询表中的所有字段名全部用一个下拉框显示出来,如果选择了or/and,则多条件查询,方法如前一样。   
    
  权限控制:   
            不同用户有不同防问某窗体的权限,还有查询\删除\报表\增加等基本操作的权限。   
    
  所要求是《通用》!   
  不知哪里有有优秀的例子可参考或建议,谢谢!!!

解决方案 »

  1.   

    你在www.2ccc.com看看,有相关例子的
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var str,fen:string;
    begin
     fen:='';
     str:='';
     str:='select * from ygzl where ';
     if combobox1.text<>'' then
       begin
          if combobox2.text='like'  then
          str:=str+combobox1.Text+' '+combobox2.Text+' '+edit5.Text+'%'+edit1.Text+'%'+edit5.text;
          if combobox2.text<>'like'  then
          str:=str+combobox1.Text+' '+combobox2.Text+' '''+edit1.Text+'''';
       end;
     if combobox4.text<>''  then
       begin
         if combobox5.text='like' then
          str:=str+' '+combobox3.Text+' '+combobox4.Text+' '+combobox5.text+' '+edit5.Text+'%'+edit2.Text+'%'+edit5.text;
         if combobox5.text<>'like' then
          str:=str+' '+combobox3.Text+' '+combobox4.Text+' '+combobox5.Text+' '''+edit2.Text+'''';
     if combobox7.text<>''  then
         begin
          if combobox8.text='like' then
          str:=str+ ' '+combobox6.Text+' '+combobox7.Text+' '+combobox8.text+' '+edit5.Text+'%'+edit3.Text+'%'+edit5.text;
          if combobox8.text<>'like' then
          str:=str+' '+combobox6.Text+' '+combobox7.Text+' '+combobox8.Text+' '''+edit3.Text+'''';
         end;
       end; edit4.Text:=str;
    with ADOQuery1 do
        begin
         close;
         sql.clear;
         sql.add(edit4.text);
         open;
        end;
    end;
      

  3.   

    不要再误导大家乐,不要相信所谓的万能查询或者通用xxx模块业务逻辑都是复杂的,而且在不同的业务背景下,不同后台db下实现的方法都不一样。oracle,sqlserver,access甚至到原始的
    paradox很多sql语句都有很大区别。
    别说你用简单的select,update和delete就能搞定一切,也别说你为了兼容所有数据库,把代码都写在程序里面。
    让你用delphi,vb或者c#实现一个sql的case when或者oracle的decode函数就能简单完成的行列转换功能,代码写死你也只能写出效率拙劣的应用。万能查询,说白了就是生成标准而且简单的sql语句的工具。不具备任何复杂应用的条件下可用用,如果一切都能这么简单搞定,著名的zjcxc的sqlserver分页存储过程也不用写下成百上千行sql语句。如果你还不知道这个存储过程就上网去查查,估计你看完之后会把一切万能,通用的东西都扔到垃圾桶里去的。模块,在没有业务背景的情况下只能是个构想,最多有个框架代码。比如很多人宣称的通用crm系统,其实说白了就是一个通讯录。
    我打个不恰当的比喻,你的宠物栏里面有鸡狗和马,鸡可以吃虫子,可以吃面粉,狗可以吃肉也可以吃面粉,马需要吃草也可以吃面粉。你来一个所谓的通用宠物粮食..说白了就是每顿饭吧面粉端上去,最后的结果是所有宠物营养不良。-------最后提醒lz一下,做mis的,业务逻辑为重,业务逻辑千变万化。mis系统中的通用框架仅仅限于程序结构上的,比如在.net中可以用反射来管理模块之间的调用,可以用固定的webservice格式来管理自动升级..但这些都是局限在程序上的,也就是和其他非mis系统相同的地方。至于业务模块,每封装一块就是对应一个固定的需求,这些业务对象甚至很少在同一系统中的其他地方能用的到。我一般的做法是把一个固定的需求尽量写成sql存储过程,客户端简单的调用一下。永远不要忽视后台数据库的数据处理能力,他们不光是用来保存数据的。这样还有一个好处,当业务逻辑发生变化的时候,可以轻易的做出调整。不要整天考虑所谓的数据库移植之类的问题。我觉得这类问题一般都很无聊,谁会吃饱了撑的花一年时间做套系统然后换个后台的操作系统和dbms来运行。一般的开发和应用环境都应该是一致的。不一致的,我敢肯定的说都存在一堆bug。如果这种事情发生了,说明在当初做需求分析的时候就有问题,属于先天不良的系统。mis中的通用,只是所有业务逻辑千变万化的共同部分,这部分在每个业务对象中的比重,小的可以忽略。
      

  4.   

    就以"将要查询表中的所有字段名全部用一个下拉框显示出来"来说,如果一个表有五十个字段,你设置查询就能累死操作者. 
    ------------------------
    就不能用listbox之类的吗?比较赞同jinjazz 的说法
      

  5.   

    非常感谢 Jinjazz我想只是针对SQL的查询吧,其它oracle,access就不用了我现在写了一个组件,可以实现万能查询,不过有bug  另外请教一个问题,怎样给自己开发的组件添加一个类似parameters属性??
      

  6.   


    首先强调一点:以下所有的说明均以完成功能为前提通用、效率是一个相互矛盾的东西,MIS类软件通用的效率一般不好,否则就是功能相当的简陋
    功能强大、维护方便是一个相互矛盾的东西MIS类软件最重要的东西是数据库,不同数据库玩法不同。万能查询有一个,几乎我做的所有软件都用这个模板,有C++Builder、Delphi、C#三个版本,可以支持SQLServer、Oracle10g、DB2三种数据库,这么多年来功能只能说能保证95%左右的功能,但是依然有种种限制。1、太复杂的查询还是不行的,否则效率太差
    2、多表联合查询效率上比较差,尤其是多表里面又嵌套的时候,几乎没办法转了
    为什么说数据库不同就不同呢,很简单的一个例子,SQLServer中有Boolean型字段,Oracle中没有,多数使用NUMBER(1)代替,输入1/0,这玩法可有本质的不同。可以看一个版本的  http://www.starfarmsoft.com/Aoitine/index.htm
    其中员工资料查询和权限部分就是你要看的,当然不要试图问我要代码。
      

  7.   

    其实大家想的太复杂了,我想要的查询是只是在一个表中查询数据,不必几个表联合查询只是针对SQLServer的
      

  8.   

    通用权限控制思路:
    c++中通过 模板方法模式 实现通用的权限控制,此C++只是示例,非完整可运行的代码。可按此思路public class CRightBase

     protected  Bool bAdd,bEdit,bDel,bPrint,bFind; public  CRightBase(string UserID,string FunName)
      { 
         //构造函数中,从数据库中读取当前用户相应功能的权限数据
          //rs.open("select Add,Edit,Del,Print,Find from tb_Right where           //UserID='" & UserID & "AND Function ='" & FunName &"'",Connection)
         //bAdd=rs.Fields("Add")
         //bEdit=rs.Fields("Edit")
         //bDel=rs.Fields("Del")
         //bPrint=rs.Fields("Print")
          //bFind=rs.Fields("Find")      }
      Protected void Add()
       { 
          if (bAdd) 
            DoAdd(); 
          else
            AfxMessageBox("你没有" & FunName & "的增加权限");     }
      virtual void DoAdd() //可被子类重载
       {
         
       }  Protected void Edit()
         {
              if(bEdit)
                DoAdd();
              else
               AfxMessageBox("你没有" & FunName & "的编辑权限");     }
      Virtual void DoEdit()//可被子类重载
        {
        }}//多个功能窗口或对话框继承此类,重载虚函数public class MyForm:public CRithgBas: public CDialog
    {
       public void MyForm ()
        { 
          InitButton();//初始货按纽过程
        }
        protected void InitButton()
         {
            //以基类的权限变量bAdd,bEdit,bDel,bPrint等,初始化按纽
           btnAdd.WindowEnable(bAdd);
          btnEdit.WindowEnable(bEdit);
          btnDel.WindowEnable(bDel);
           //.....     }
       public void Override DoAdd()
       {  
         //进行实际新增操作,增加用户自己的代码。
       }    Public void Override DoEdit()
       {
          //进行实际的编辑操作   }
        btnAdd_Click()//增加菜单或按纽事件过程
        { 
           Add();//调用基类的ADD方法。进面调用DoAdd().    }
        
        btnEdit_Click()//增加事件过程
         {       Edit();//调用基类方法,进面调用DoEdit().     }
    }