我有一个需求:计算产品的成本
成本包括很多费用之和,比如直接人工,原材料费用,制造费用,其它费用(进出口费用,营销费用,折旧费用,薪资等一大堆,15项),成本就等于=直接人工+原材料费用+制造费用+其它费用之和
其中,前面三个:直接人工,原材料费用,制造费用必加,
但15项其它费用项目是选择性的计入成本:比如有时成本不需要考虑‘进出口费用‘,有时需要考虑,不考虑就不加上去
所有的其他费用我都放在t_overhead表中,每项费用的值都有
所以我在界面里的放了很多复选框,选中表示计入成本,不选中就表示不计入成本
请问怎么根据这些复选框的状态写SQL语句,点击按钮进时只合计我需要的那几项例如:
进出口费用   选择
营销费       不选择
折旧费用     选择
薪资         选择,
那我的其他费用总和=进出口费用+折旧费用+薪资而总成本=直接人工+原材料费用+制造费用+其它费用总和请问这样的需求该怎么实现?在此也借这个问题谢谢‘押宝新人’路飞,帮我解决了很多问题.
先谢谢大家了

解决方案 »

  1.   

    var tmpstr: string;
    打勾 tmpstr = '+' + 打勾对应的字段名称  ;
    //当tmpstr 是空时 tmpstr =  打勾对应的字段名称
    sql = select tmpstr as '合计' from table 
      

  2.   

    var
      sqlstr: string;
    begin
      if AA.checked = true then
        sqlstr := sqlstr + '+' +strtoint('AA对应的值');
      if BB.checked = true then
        sqlstr := sqlstr + '+' +strtoint('BB对应的值')
      .....  adoquery.sql.text := 'select '+sqlstr + 'from table';
      open;
    end;
      

  3.   

    感谢大家热心回复,
    不知道这样是不是最好的办法,因我有45个checkbox需要判断,这样要判断45次,请问能不能用数组,循环之类的实现
      

  4.   

    我目前数据表t_overhead的表结构是这样的:
    费用代码   费用名称       费用金额
    01        进出口费用     10000
    02        营销费          10000
    03        折旧费用        10000
    ……
    45        薪资            1000045个费用项目对应这个有45条记录,根据checkbox的状态决定是否要算入成本合计中,
    请大家给建议, 我现在是想借鉴moshao6的建议:Delphi(Pascal) codevar
      sqlstr: string;
    begin
      if AA.checked = true then
        sqlstr := sqlstr + 'or (费用代码=AA的代码)' ;
      if BB.checked = true then
        sqlstr := sqlstr + 'or (费用代码=AA的代码)';
      .....      //判断完45个费用项目的选定状态  adoquery.sql.text := 'select sum(费用金额) as 合计 from t_overhead where (1=0) ';
      open;
    end;
     
    请问不知道这样会不会存在什么问题,或者还有没有什么更简便的方法
      

  5.   

    简单点,你直接把checkbox 的name 设置成和字段名称一样 
    if checked then str :=  str + '+' + checkbox.name;
    界面中你只要循环组件 如果是chexkbox 就做判断, 循环组件你会的吧?
     
      

  6.   

    使用TcheckListBox,就可以利用下标来判断了
      

  7.   

    for i:=0 to listview.items.count-1 do begin
      if listview.checked[i] then
       .....
    end;
      

  8.   

    把所有成本项目放表里,绑定到listview,三列,一列复选框,一列名称,一列字段,选中的就加上,拼成SQL
      

  9.   

    循环组件是这样的:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
    begin
      for i:=0 to self.ComponentCount-1 do
      if self.Components[i] is Tcheckbox then
      if Tcheckbox(self.Components[i]).Checked then
      begin
         ...
      end;
    end;不想循环也可以这样:
    1.定义一个全局变量strsql;
    2.把所有的CheckBox的caption命名为对应的费用名称(应该是唯一的吧);
    3.只写其中一个checkbox的onclick事件,比如只写CheckBox1的,其它的onclick就指向这个
    procedure TForm1.CheckBox1Click(Sender: TObject);
    var
      s:string;
    begin
      s:=Quotedstr(TCheckBox(Sender).Caption)+',';
      IF TCheckBox(Sender).Checked Then
         strsql:=strsql+s
      else
         strsql:=stringreplace(strsql,s,'',[rfIgnoreCase]);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      ss:string;
    begin
      if Length(strsql)>0 Then
         ss:=' 費用名稱 in ('+Copy(strsql,1,Length(strsql)-1)+')';
    ...
    end;
      

  10.   

    根据shuihan20e的方法,不用listview,用dbgirdeh,直接在表格中自动统计出总额,再写sql
      

  11.   


    感谢大家的热心帮助,讲得很详细谢谢kaikai_kk
    (KAIKAI(开开一心))的详细说明
    我马上去实践一下
    结帖,鞠躬……