首页 > 其他分享 >如何判断kbmMWClientQuery是否修改过?

如何判断kbmMWClientQuery是否修改过?

时间:2024-03-23 13:11:06浏览次数:17  
标签:begin kbmMWClientQuery end pRec st 修改 判断 else pOrigRec

TkbmMWClientQuery有一个属性:IsDataModified,表示记录是否被修改过,实测的结果,当为一个字段赋值一个相同的值时,IsDataModified也会变为True。  

q.Edit;
q.FieldByName('FName').AsString:='test';
q.Post;

象上面的代码,当q.FieldByName('FName').AsString已经等于test时,IsDataMoodified也会由False变为True,这不是我想要的。 

试图修改源码,解决这个问题,无奈太复杂,搞不定,按Q友竹子的提示,修改他提取Delta的代码,改写了一个方法,测试通过:
function TDbCache.DataSetIsDataModified(
  akbmMemTable: TkbmCustomMemTable): Boolean;
var
  i: TkbmNativeInt;
  j: TkbmNativeInt;
  pRec, pOrigRec, pOldRec: PkbmRecord;
  aRecords: TkbmList;
  st: TUpdateStatus;
  aOldV, aNewV: Variant;
begin
  if akbmMemTable.State in [dsInsert, dsEdit] then
    akbmMemTable.Post;
  Result := False;
    with akbmMemTable do
    begin
     aRecords := Common.Records;
      for i := 0 to aRecords.Count - 1 do
     begin
       pRec := PkbmRecord(aRecords.Items[i]);
       if pRec = nil then
       begin
         Continue;
       end;
       // Find oldest version.
       pOrigRec := pRec;
       while pOrigRec^.PrevRecordVersion <> nil do
       begin
         pOrigRec := pOrigRec^.PrevRecordVersion;
       end;
 
       // Check what status to react on.
       if pRec^.UpdateStatus = usDeleted then
       begin
         // Dont resolve inserts that were deleted again.
         if pOrigRec^.UpdateStatus = usInserted then
           st := usUnmodified
         else
           st := usDeleted;
       end
       else if pOrigRec^.UpdateStatus = usInserted then
         st := usInserted
       else
         st := pRec^.UpdateStatus;
       pOldRec := OverrideActiveRecordBuffer;
       try
         if st = usModified then
         begin
          OverrideActiveRecordBuffer := pRec; // 指向修改后的数据
           for j := 0 to FieldCount - 1 do
          begin
            OverrideActiveRecordBuffer := pRec; // 指向修改后的数据
            aNewV := FieldByName(Fields[j].FieldName).Value;
            OverrideActiveRecordBuffer := pOrigRec; // 指向修改前的数据
            aOldV := FieldByName(Fields[j].FieldName).Value;
            if aNewV <> aOldV then
            begin
              Result:=True;
              Break;
            end;
           end;
         end
         else if st = usInserted then
         begin
          Result:=True;
         end
         else if st = usDeleted then
         begin
          Result:=True;
         end
         else if pRec.UpdateStatus = usUnmodified then
         begin
 
         end;
       finally
         OverrideActiveRecordBuffer := pOldRec;
       end;
 
       if Result then
         Break;
     end;
    end;
end;
用这个方法,在q.Resolve前,可以判断是否修改了。 再一次感谢清幽傲竹!  

标签:begin,kbmMWClientQuery,end,pRec,st,修改,判断,else,pOrigRec
From: https://www.cnblogs.com/kinglandsoft/p/18091004

相关文章

  • 如何判断某个发票扫描OCR软件好不好?
    发票扫描OCR(OpticalCharacterRecognition)是一种将纸质发票上的文字、数字等信息转化为可编辑的文本格式的技术。在现代企业中,随着数字化转型的推进,发票扫描OCR技术变得越来越重要。然而,面对市场上众多的发票扫描OCR产品,如何判断其好用不好用呢?本文将从以下几个方面进行探讨。......
  • Mysql默认字符集修改
    0.查看自己的字符集配置mysql-uroot-p123456-e"showcharacterset\G;"查看所有的字符集查看常用的字符集:mysql-uroot-p123456-e"showcharacterset\G;"|egrep"gbk|utf8|latin1"|awk'{print$0}'查看MySQL当前的字符集mysql>showvariables......
  • 代码随想录算法训练营第day54|392.判断子序列 、 115.不同的子序列
    目录392.判断子序列115.不同的子序列392.判断子序列力扣题目链接(opensnewwindow)给定字符串s和t,判断s是否为t的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而......
  • 代码随想录算法训练营第五十四天| ● 392.判断子序列 ● 115.不同的子序列
    判断子序列 题目链接:392.判断子序列-力扣(LeetCode)思路:从子串s开始遍历,查找t中是否存在,因为全程不需要回溯,因此两个for循环就解决了。只是要注意return的时机。(只要不想写的很简洁,逻辑挺简单的其实)classSolution{public:boolisSubsequence(strings,stringt){......
  • 如何使用极狐GitLab Runner 修改日志大小限制
    本文作者:徐晓伟GitLab是一个全球知名的一体化DevOps平台,很多人都通过私有化部署GitLab来进行源代码托管。极狐GitLab是GitLab在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。本文讲述了如何调整极狐GitlabRunner日志大小限制问题测试项目:https......
  • Ant Design Vue 修改表格头部样式
    在网上搜了好多修改表格头部样式的,最后自己摸索出来,分享给大家,最后附上完整代码。首先用到的是customHeaderRow这个API,类型是一个函数1.HTML部分<a-tablesize='small'//样式大小:columns="columns":data-source="data"bordered:pagination="false"//不显示页数:c......
  • 麒麟系统修改网卡名步骤和网卡占用故障处理
    第1章 单网卡环境修改网卡名■修改网卡配置。•检查当前网卡名称和MAC地址,网卡名称ens33,MAC地址00:0c:29:ab:3a:40。[root@localhost~]#ipa1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWNgroupdefaultqlen1000link/loopback00:00:......
  • ruoyi-nbcio-plus基于vue3的flowable增加开始节点的表单绑定修改
    更多ruoyi-nbcio功能请看演示系统gitee源代码地址前后端代码:https://gitee.com/nbacheng/ruoyi-nbcio演示地址:RuoYi-Nbcio后台管理系统http://122.227.135.243:9666/更多nbcio-boot功能请看演示系统 gitee源代码地址后端代码:https://gitee.com/nbacheng/nbcio-boot......
  • 代码随想录算法训练营第五十四天 | 115.不同的子序列,392.判断子序列
    392.判断子序列 已解答简单 相关标签相关企业 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不......
  • 深入解析Java中Integer类型的相等判断
    在Java编程中,Integer类型是我们经常用到的一种基本数据类型,用于表示整数。然而,对于Integer类型的相等性判断,我们可能会遇到一些意料之外的情况。本文将深入探讨Java中Integer类型的相等性判断,并解释其中的一些特殊行为。首先,我们需要理解Java中的包装类(WrapperClasses)。Java......