Foxtable(狐表)用户栏目专家坐堂 → 修改后的getvalues方法肯定有Bug


  共有2692人关注过本帖树形打印复制链接

主题:修改后的getvalues方法肯定有Bug

帅哥哟,离线,有人找我吗?
lgzhao
  11楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:302 积分:2069 威望:0 精华:0 注册:2017/11/19 9:46:00
  发帖心情 Post By:2021/6/25 8:30:00 [只看该作者]

我研究了一下,据说还是内置字典的查找算法更快,下面用字典做了一个自定义的代替datatable.getvalues的函数。
我测试了一下,结果是正确的,在需要保证可靠性胜过效率的场合建议采用这个函数代替getvalues方法,我的测试是几千行数据的级别,没感觉速度和foxtable getvalues方法有差距,具体耗时希望大家帮忙测试,结果反馈在这里。

函数代码如下,大家可以直接套用。
另外datatable.sqlgetvalues算法的在多列排序的情况下也有bug,上次反馈后还没有修正。
我准备把所有的这些算法都改成自定义函数,避免受到升级的干扰。 
' used to replace the datatable.getvalues method, because foxtable has bugs

Dim DT As DataTable = args(0)
Dim ColName As String = args(1)

Dim FilterStr As String =""
Dim SortStr As String=""

If args.count >2 Then
   FilterStr  =  args(2)
End If

If args.count>3 Then
    SortStr  = args(3)
End If


If DT Is Nothing OrElse ColName=Nothing Then
    Return Nothing
End If

If dt.DataRows.count = 0 Then Return Nothing
'***************************************************************************************************
If SortStr  = ""  Then SortStr = ColName & " asc"  ' default sort ascending
'***************************************************************************************************
'先排序datatable

Dim NDT As system.data.DataTable  = DT.basetable
 

Dim dv = ndt.DefaultView
dv.Rowfilter = filterStr
dv.Sort = sortstr
 
Dim dtCopy As system.data.DataTable = dv.ToTable
'***************************************************************************************************
try
    
    Dim dic As  new Dictionary (of String, Integer) (StringComparer.OrdinalIgnoreCase)  ' ignore case
    
    
    For i As Integer =0 To dtCopy.Rows.count-1
        
        Dim str As String = dtCopy.Rows(i)(ColName)
        If dic.ContainsKey(str) =False Then
            dic.add(str,i)
        End If
        
    Next
    
    Dim Ks As new List  (of String)
    
    For Each kk As String In dic.keys
        ks.add(kk)
    Next
    
    Return ks
    
catch ex As exception
    Return  False  '在上一层触发错误,以便上层catch可以捕捉到
    
End try

[此贴子已经被作者于2021/6/25 9:38:09编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
liutlk
  12楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:93 积分:1240 威望:0 精华:0 注册:2012/11/5 12:37:00
  发帖心情 Post By:2021/6/25 8:42:00 [只看该作者]

顶LZ...


 回到顶部
帅哥哟,离线,有人找我吗?
flashman
  13楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:81 积分:1043 威望:0 精华:0 注册:2014/4/6 20:26:00
  发帖心情 Post By:2021/6/25 8:44:00 [只看该作者]

可以同时测试一下 GetValues 和 GetComboListString ,如果输出的结果不一样,那说明新GetValues确实有bug。

 回到顶部
帅哥哟,离线,有人找我吗?
blackzhu
  14楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:狐仙 帖子:9875 积分:57596 威望:0 精华:15 注册:2008/9/1 9:45:00
  发帖心情 Post By:2021/6/25 8:52:00 [只看该作者]

如果区分大小写 的确不太应该

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  15楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107846 积分:548581 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/6/25 9:26:00 [只看该作者]

SqlServer可以直接使用sql,下面返回一行以逗号分隔的数据,区分大小写

SELECT  stuff((SELECT ',' + [CustomerID] FROM (select distinct [CustomerID] COLLATE Chinese_PRC_CS_AI as CustomerID from [AccountsReceivableTransc]) as a FOR XML path('')), 1, 1, '') as [CustomerID]

可以到数据库里设置一下,这样sql不要另外处理也能自动区分大小写了:https://www.cnblogs.com/sandunban/p/7272291.html

 回到顶部
帅哥哟,离线,有人找我吗?
chen37280600
  16楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1266 积分:7849 威望:0 精华:4 注册:2017/12/31 14:53:00
  发帖心情 Post By:2021/6/25 10:20:00 [只看该作者]

总结一下:这个问题,只从结果上知道偶然不对,无法精准定位问题、必然重现,官方将无法进一步修复。

至于后来提出的解决方法,都是业务处理方法,对狐表工具没有改进参考性

楼主要加把劲用精准定位出问题啊
[此贴子已经被作者于2021/6/25 10:20:17编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
wei0769
  17楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1816 积分:19334 威望:0 精华:0 注册:2013/4/10 14:38:00
  发帖心情 Post By:2021/6/25 10:28:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目2.table


Dim Products As List(Of String)
Products = DataTables("表A").GetValues("第一列")
For Each Product As String In Products 
    Output.Show(Product)
Next


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


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  18楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107846 积分:548581 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/6/25 10:34:00 [只看该作者]

之前使用foxtable哪个版本?可以区分大小写?上面项目我使用2019-12-01/2020-05-29版测试都是同样的结果。

您要上传一个测试项目,是证明以前是可以区分大小写的。

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  19楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107846 积分:548581 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/6/25 17:24:00 [只看该作者]

是排序列的问题,下个版本改进:Products = DataTables("表A").GetValues("第一列","","第一列 desc")

不指定排序列就没有问题

 回到顶部
总数 19 上一页 1 2