以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  修改后的getvalues方法肯定有Bug  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=169640)

--  作者:lgzhao
--  发布时间:2021/6/24 6:13:00
--  修改后的getvalues方法肯定有Bug

图片点击可在新窗口打开查看此主题相关图片如下:新版foxtable之结果.jpg
图片点击可在新窗口打开查看


图片点击可在新窗口打开查看此主题相关图片如下:旧版foxtable结果.jpg
图片点击可在新窗口打开查看

偶然的原因发现2021.5.29版本当中datatable.getvalues方法有bug,有时候不能区分大小写,导致提取的值有重复的,以至于据此生成的报表也产生了错误。
我比较了旧的2020.5.1版本的计算结果,用同样的代码,链接同样的数据库(sql server),报表结果是不一样的。旧版的结果是对的。

诡异之处似乎并不是所有的大小写单词都不能区分,只有个别情况有问题。请仔细查查吧,估计你们不会很容易复现的,但请不要轻易放过了。这个bug带来的后果挺严重,会计年报都给做错了。
我把我的报表结果源代码附上,问题肯定出在Dim CustomerIDs  As List (of String) = DTB.GetValues("CustomerID", , "CustomerID asc") 的代码上。

另外我手工读了数据库,把customerID="Wyatt"名下的记录都看了个遍,并没有发现有小写字母开头的记录。所以这个报表结果就更诡异了一些。

 
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:02.txt


[此贴子已经被作者于2021/6/24 6:15:45编辑过]

--  作者:chen37280600
--  发布时间:2021/6/24 8:41:00
--  
官方确实在5月1号后重写过getValues的方法,这个问题值得关注
--  作者:有点蓝
--  发布时间:2021/6/24 9:48:00
--  
请导出这个表数据做测试,不方便的可以发给客服测试
--  作者:wei0769
--  发布时间:2021/6/24 12:39:00
--  

图片点击可在新窗口打开查看此主题相关图片如下:624.png
图片点击可在新窗口打开查看

--  作者:chen37280600
--  发布时间:2021/6/24 14:36:00
--  
如果按照都转换小写,这里确实有bug,不应该是这个,谜之重复判定规则

按照sql的语法,distinct是不区分大小写,然后遇到同名但大小写不同的行时,取遇到的第一个

--  作者:有点蓝
--  发布时间:2021/6/24 15:16:00
--  
我测试2019/2020/2021版getvalues都是不区分大小写的,也是取遇到的第一个
--  作者:lgzhao
--  发布时间:2021/6/24 17:07:00
--  
你们要是实在测不出来,能不能求求你们改成老版的算法, 我们不要求性能了行不行啊? 最近升版的几次大bug实在让我心力憔悴, 感觉这次升级引进的bug负面作用远远超过改进的这点性能. 再这么搞下去都不知道怎么办了, 整天提心吊胆的.
--  作者:有点蓝
--  发布时间:2021/6/24 17:41:00
--  
功能是只能改进,无法回头的。最好是做个例子发过来我们测试一下
--  作者:chen37280600
--  发布时间:2021/6/24 20:52:00
--  
但是就上面的图片,也解释不通为什么取的是第二个
--  作者:lgzhao
--  发布时间:2021/6/25 5:36:00
--  
我打算自己研究一个算法试试。 
按Foxtable这个趋势,还是尽量把算法多掌握在自己手里更踏实一些。

两个思路,具体效率可能需要大量的测试才能知道:

1. 利用List集合,(前提是.net内置的list查找算法效率够高,姑且信任他们), 依次从datatable的指定列取值,每个值转换大写(这个地方可能损失效率),存入List2, 判断List2.contains,false的话则把没转换大小写的值存入List1,一直遍历到最后一行,之后取出List1的值就是唯一值了。

这个或许用字典更快些?还没仔细研究二者区别。


2. 这个纯粹是自己玩了,效率不好说。先建立一维数组arr1 ,数组维度等于datatable的行数,将该列所有行的值全部写入数组,对数组进行排序,之后对每个数组元素循环,利用二分法在其中查找(数组下标不同作为约束条件),用“="号进行比较运算(这个可以自动忽略大小写),找到重复则跳过该值,找不到重复则保存该值到一个集合。最后得到的集合就是不重复值集合了。

这些算法只用于代替前台的getvalues方法,后台的getvalues方法可以用sql语句的distinct代替,那个是数据库内置的算法,效率肯定没得说。
前台加载数据量一般不会很大,所以也许效率上损失点,但换来了更好的稳定性,估计可以接受. 

我对算法不精通,这个两个思路肯定比较low,哪位同道若有更好的算法欢迎指导
[此贴子已经被作者于2021/6/25 6:38:44编辑过]