退货单:每一张退货单有一个日期,厂家,多件货品的代号,数量,库位.
采购单:每一张采购单有一个日期,厂家,多件货品的代号,数量,库位,实际单价.我现在要显示的是根据退货单为基础,把每件货品的实际单价加进去显示出来,其中我把实际单价作为一个计算字段.
因为退货单的东西总是采购单上的东西,而且是先有采购才有退货.如果同一厂家,同一货品代号,同一库位则认为是完全一样的东西,对这种完全一样的东西,有可能采购了很多次,而这次退货可能退以前这很多次的采购物,而每次采购,一样的货品实际单价不一样,这样要显示的实际单价应该是加权平均价.
而退货数量是这样的,如果这次退货了,这些东西认为是最近采购的,如果最近采购的数量没有退货数量多,则认为是次近的,依次类推,而每次采购时都有一个对应实际单价,这样加权平均以后,我就作为要显示的实际单价.
我要显示的一张表的结构如图:
query1:
    日期     供货单位     材料编号     数量     实际单价      库位
1
2我现在已经把除实际单价以外的所有字段的对应记录都找到了,而实际单价是我添加的计算字段,暂时还没有赋值,要求的实际单价在另外一张表中,表结构为:
Table1:
     日期   供货单位    材料编号     数量     实际单价     库位     实际金额
1
2思路是这样的:
在query1查询出来的每条记录,都根据日期,供货单位,材料编号,库位生成一个动态query,这个query找的是Table1表中满足如下条件的记录:
                Table1中的日期<query1中的日期,
                and 供货单位=供货单位
                    材料编号=材料编号
                    库位=库位
                并按日期的降序排列
这样query1中的每一条记录都要动态生成一个临时表.要显示出来的实际单价这样确定:
     先记住query1中对应记录的数量,在生成的临时表中,从第一条记录找起,如果query1的数量比第一条记录的数量字段的字段值小或相等,则query1实际单价:=Table1单价(第一条记录),如果比起大,则j:=实际金额(第一条),此时的数量为query1的数量减去Table1中第一条记录的数量,再找Table1中下一条记录,执行同样的比较操作,把j累加,要显示的实际单价:=j/query1中对应的数量.

解决方案 »

  1.   

    双击query控件,进入编辑计算子段的界面,在里面设置好需要计算的字段。
    然后在query的oncalcfields事件中赋值
      

  2.   

    这么长,不想看了,给你一个例子:
    procedure TForm1.ADOTableCalcFields(DataSet: TDataSet);
    var
      YY1,YY2,MM,DD:Word;
      TmpDate:TDate;
    begin//OnCalcFields事件中写的代码
      DecodeDate(Date,YY1,MM,DD);
      TmpDate:=DataSet.FieldByName('Birth').AsDateTime;
      DecodeDate(TmpDate,YY2,MM,DD);
      DataSet.FieldByName('Age').AsString:=IntToStr(YY1-YY2)+'岁';
    end;
      

  3.   

    其中DataSet.FieldByName('Age')为计算字段