在com+数据对象中,有adsmaster(master表), adscalmaster(calmaster表),adsdetail(detail表),adscaldetail(caldetail表)四个数据控件;
master表中的Calculated字段calfieldmaster取自calmaster表;
detail表中的Calculated字段calfielddetail取自caldetail表;
adsmaster和adsdetail已设定成巢状数据表,adscalmaster及adscaldetail都有相关设定;
adsmaster之oncalcfields编写以下程序以取值:
try
adscalmaster.parameters.parambyname(‘calfieldmastid’).value := dataset.fieldbyname(‘masterid’).value;
adscalmaster.active:=true;
dataset.fieldbyname(‘calfieldmaster’).value:=adscalmaster.fieldbyname(‘calfield’).value;
finally
  adscalmaster.active:=false;
end;adsdetail之oncalcfields编写以下程序以取值:
try
adscaldetail.parameters.parambyname(‘calfielddetailid’).value := dataset.fieldbyname(‘detailid’).value;
adscaldetail.active:=true;
dataset.fieldbyname(‘calfielddetail’).value:=adscaldetail.fieldbyname(‘calfield’).value;
finally
  adscaldetail.active:=false;
end;前端用clientdataset连接时产生”非法参数”的错误,如何解决?

解决方案 »

  1.   

    在ClientDataSet里加个字段是计算类型的,然后
    /CdsCont_Appbill_List_goods:cilentDataSet的计算事件里
    procedure TContAppFrm.CdsCont_Appbill_List_goodsCalcFields(
      DataSet: TDataSet);
    var
      sql, SQL_BASE: string;
      dest_id:Integer;
      A: Array [0..0] of string;
      b: boolean;
    begin
      inherited;
      if (DataSet.FieldByName('GOOD_ID').IsNull) then
        Exit;
      dest_id:=DataSet.FieldByName('GOOD_ID').AsInteger;
      if (dest_id=0) then
        Exit;
      begin
        cdsLookUp.Active := False;//cdsLookUp:临时的ClientDataSet
        SQL_BASE := 'select GOOD_ID, GOOD_NAME FROM GOODS';
        sql := SQL_BASE + ' where GOOD_ID = '+ IntToStr(dest_id);
        cdsLookUp.Data := MyDBPool.QueryRecord(sql);
        if cdsLookUp.RecordCount <> 0 then
        begin
          cdsLookUp.First;
          DataSet['GOOD_NAME']:=cdsLookUp['GOOD_NAME'];
        end;
      end;
    end;