uniDac 更新多表记录

对于从多个表中获得数据的数据集,默认情况下只有一个表可更新。您应该在UpdatingTable属性中指定要更新的表名,否则将会更新字段列表中的第一个字段的表。如果SetFieldsReadOnly选项设置为True(默认情况下),则自动生成的update SQL语句中未使用的字段将被标记为只读。使用Oracle、PostgreSQL和基于odbcbased的复杂查询提供程序(使用多个表、同义词、DBLinks、聚合字段),我们建议保持ExtendedFieldsInfo选项。

如果Insert / Post、Update或RefreshRecord操作已影响多个记录,UniDAC将引发异常。为了抑制此类异常,您应该将StrictUpdate选项设置为False。

为了更灵活地控制数据修改,您可以填充update SQL语句。它们由SQLInsert、SQLUpdate、SQLDelete和SQLRefresh属性表示,并在Insert / Post、Edit / Post、Delete和Refresh操作中自动执行。在设计时,您可以在组件编辑器的SQL Generator选项卡中生成默认更新SQL语句。生成的语句可以根据您的需要进行修改。但是,如果为每个记录动态生成更新查询,则只会将更改的值发送到服务器。

对于某些特殊情况,此功能是不够的。可以使用TUniUpdateSQL组件进行扩展。TUniUpdateSQL允许将一个单独的TUniSQL / TUniQuery TUniStoredProc每个更新操作组件。

上面是uniDac帮助文件中的一段。

其应用场境是这样的:一个销售明细表,字段设计如下:单据编号:D11_1,这个字段是明细表的Primary Key,开单日期:D11_2,商品 编号:D11_3。注意这表里没有商品名称,但是在显示给操作人员看的时候,是需要将商品名称显示出来的,否则只看商品编号,怎么知道是 什么呢?这个商品名称是保存在商品档案表B12里,通过销售表的D11_3和商品档案表的字段B12_1用LEFT JOIN关联。

我自己在做这个DEMO的时候,发现有些问题。首先,我用一个uniQuery来执行多表查询,然后再插入新记录行的时候,发现只有多表中指定的表更新了,但其它表显示不出来。如下图:


可以看到,名称和规格等数据没有显示出来。

试了很久,后来还是沿用之前的思路和解决这个问题。
首先,用另一个uniQuery控件来做插入、更新的操作,该uniQuery控件连接另一个uniConnection。然后通过这个uniConnection来提交数据。(因为如果两个uniQuery连接同一个uniConnection,一个提交数据后,另一个就会关闭)。最后,再将第一个uniQuery关闭后重新打开。就可以实现目的了。
代码如下:
with A01F,D11F do
      begin
        try
          if not A01F.uniConn_Do.InTransaction then
            A01F.uniConn_Do.StartTransaction;
          UniQ_Do.Close;
          UniQ_Do.SQL.Text:='select * from D11 where D11_1=''''';
          UniQ_Do.Open;
          for i := 1 to StrToInt(D11F.eD11_22.Text) do
          begin
            UniQ_Do.Append;
            UniQ_Do.FieldByName('D11_1').AsString:=D11F.eD11_1.Text;            
            UniQ_Do.FieldByName('D11_6').AsDateTime:=Now;
            UniQ_Do.FieldByName('D11_8').AsString:=FieldByName('B12_1').AsString;
            UniQ_Do.FieldByName('D11_10').AsString:=D11F.eD11_10.Text;
            UniQ_Do.FieldByName('D11_22').AsInteger:=StrToInt(D11F.eD11_22.Text);
            UniQ_Do.Post;
          end;    
          A01F.uniConn_Do.Commit;
          uniQ_D11.Close;          
          uniQ_D11.Open;
        except
          on e: Exception do
          begin
            A01F.uniConn_Do.Rollback;
            ShowMessage('提交数据时出错!错误代码:'+#13+e.Message);
          end;
        end;
      end;

参考资料:
1、 解决ClientDataSet多表显示,单表更新的问题。爽呆了
https://www.rxyj.org/item-v2-30110-2.html
2、uniDac帮助文件

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页