首页 > 其他 > 详细

让kbmMWClientQuery更新视图

时间:2020-09-18 22:51:58      阅读:48      评论:0      收藏:0      [点我收藏+]

先说下问题,有一个物理表t1,基于t1,建立一个视图v1,然后用ClientQuery查询视图:
ClientQuery.Query.Text:=‘Select f1,f2 from v1‘
查询到结果后,增删改记录,然后:
ClientQuery.Resolve提交修改结果,问题出现:

当ClientQuery.TableName=‘t1‘时,可以提交,等于‘v1‘时,无法提交,生成一个无字段的sql
Insert into v1 ( ) values ( )

解决方法:在运行期修改Field.Origin值
ClientQuery.FieldByName(‘f1‘).Origin:=‘v1.f1‘;
ClientQuery.FieldByName(‘f2‘).Origin:=‘v1.f2‘;
或者:
ClientQuery.FieldByName(‘f1‘).Origin:=‘.f1‘;
ClientQuery.FieldByName(‘f2‘).Origin:=‘.f2‘;
或者:
ClientQuery.FieldByName(‘f1‘).Origin:=‘‘;
ClientQuery.FieldByName(‘f2‘).Origin:=‘‘;

视图能正常更新了!注意,必须在运行期用代码来修改Origin,设计期不行的。

进一步分析原因,在ClientQuery.Open后,ClientQuery.FieldByName(‘f1‘).Origin等于‘t1.f1‘,也就是查询视图,这里返回实际物理表名,在服务端解析时,如果ClientQuery.TableName=v1,与字段的Origin中的物理表名t1不一致,造成无法生成正确的sql语句。

具体的逻辑在TkbmMWCustomTableFieldResolver.BuildFieldFilter方法中实现,感兴趣可以去看看。

通过查看这个方法,得知,当设置Origin为空时,还受kbmMWUNIDACResolver.SkipFieldsWithoutOrigin属性控制,当为True时,则不处理这个字段,默认值为False,即处理Origin为空的字段。

写到这里,也许你已经想到,不仅对于View的更新操作,我们完全可以通过设置ClientQuery.TableName及Field.Origin属性,实现ClientQuery.Resolve的更新行为。这必须为kbmMW赞一个!

最后,感谢Q友不会呼吸274001335,帮我跟踪了好几天,最终搞清这块的逻辑,同时感谢作者kim在news group 上的支持与回复!

下面按不会呼吸的想法,利用Class Helper来修改ClientQuery.Open的行为:

//声明kbmMWClientQuery的Helper类:
  TkbmMWClientQueryHelper=class helper for TkbmMWClientQuery
    procedure Open;
  end;

//重新实现kbmMWClientQuery.Open方法
{ TkbmMWClientQueryHelper }

procedure TkbmMWClientQueryHelper.Open;
var
  i:Integer;
begin
  inherited Open;
  for I := 0 to Self.FieldCount-1 do
  begin
    if Self.Fields[i].Origin.Substring(0,1)<>. then //如果是虚字段则设置为一个不存在的表名,保证不生成到sql里去更新
//      Self.Fields[i].Origin:=Self.TableName+‘.‘+Self.Fields[i].FieldName
      Self.Fields[i].Origin:=.+Self.Fields[i].FieldName
//      Self.Fields[i].Origin:=‘‘
    else
      //如果是sql中的虚字段则设置为一个不存在的表名,保证不生成到sql里去更新,避免出错.
      Self.Fields[i].Origin:=xxxxxxxxxx.+Self.Fields[i].FieldName;

  end;

end;

对于Helper Class,执行ClientQuery.Open的单元,必须引用这个Helper类所在的单元,否则不会执行上面的代码!


最后,想说的是:选择kbmMW做你的多层框架,没错的!

 

让kbmMWClientQuery更新视图

原文:https://www.cnblogs.com/kinglandsoft/p/13692824.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!