以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]第三方开发接口涉及的_SortKey问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=91492)

--  作者:chnfo
--  发布时间:2016/10/12 9:29:00
--  [求助]第三方开发接口涉及的_SortKey问题
1、使用外部数据表(ACCESS)
2、多个账套(就是多家店的管理)

表A各列:店名、时间、货名、数量、单价、金额

例如在命令窗口执行操作之后(当然是用其它的方式增加数据,说在命令窗口执行,只是为了思路),能在界面上直接将各店数据分别放到各店名下面(不是用排序,因为还有其它的用途)
dim r as row = tables("A").addnew
r("店名") = “店A”
r("时间") = date.now
…………

systemready = false
tables("A").sort = "店名,时间 DESC“
for each r as row in tables("A").rows
r.datarow.baserow("_SortKey") = r.index
next
tables("A").sort = "“
systemready = true


但这样可能会有问题,多人同时在各自的电脑上输入数据后,表A的_sortKey可能会相互影响(_Sortkey的值应当是不能重复的)

要如何做才好呢?

如果用帮助里的“第三方开发接口”的方法,就可能得这么干了

Dim drs As List(of DataRow) = DataTables("A").Select("","店名,时间 DESC")
For
i As Integer = 0 To drs.Count - 1
   
drs(i).BaseRow("_SortKey") = i
Next

但在表A数据量很大的时候(比如上万、十万行),如果每一次增加行,都这样执行,会不会有效率问题?尤其是并发数大的时候
当然,时间不用降序,用升序也行。
-----补充,用本地数据库测试,20000行数据,第三方开发接口方法用时2秒,还算可以接受,不知道到了十万级的数据会怎么样
[此贴子已经被作者于2016/10/12 10:02:35编辑过]

--  作者:有点蓝
--  发布时间:2016/10/12 10:07:00
--  
"_SortKey"排序的目的是为了什么?

每增加一行数据都重头排序,肯定有问题的。还不如就使用店名,时间动态排序好了



--  作者:chnfo
--  发布时间:2016/10/12 10:13:00
--  
主要是2个方面
1、这个表本身需要插入功能(但是在排序条件下没法插入,如果在插入之前取消排序,插入行后再加入排序,这样只是实现了功能,但是在插入的时候,新插入的行会跳到第一行,感觉不好),而且在输入店名的时候,新插入的行会改变position,在输了日期之后,这一行的position又会变一次,界面肯定会闪的。——————甚至是插入店名(因为店号并不是直接连续,可以有预留店编号备用,比如市里有5个区,现在还没有开发第3个区的业务,会把3开头的空出来)
2、这个表需要在其它的地方引用(这个倒还好办,在引用的界面上做排序即可)

----如果实在是没办法,那就只有变个方式了。
插入的时候,弹出一个窗口,用户增加完之后,在界面上排序图片点击可在新窗口打开查看
是不是挺有点怪怪的。
[此贴子已经被作者于2016/10/12 10:40:45编辑过]

--  作者:有点蓝
--  发布时间:2016/10/12 10:46:00
--  
插入行事件里直接给"_SortKey"赋值

找到插入位置原来行的 "_SortKey",新增行的"_SortKey"相应减小,"_SortKey"是高精度类型的,支持小数

--  作者:chnfo
--  发布时间:2016/10/12 10:59:00
--  
这个恐怕不行吧?本身的排序规则是“店名,时间”,在插入行的时候,就算给_SortKey赋值,也没有意义呀。
--  作者:有点蓝
--  发布时间:2016/10/12 11:07:00
--  
那就在“店名,时间”变化的时候,找到大于“店名,时间”排序的最小_SortKey值相应减小
--  作者:chnfo
--  发布时间:2016/10/12 11:15:00
--  
现实情况是这样的:
maintablechanged事件中,已经加了代码
maintable.sort = "店名,时间"

这时候,是不能插入行的,因为它本身在排序状态下。

如果要插入行,就要首先
currenttable.sort = ""    \'这时候,整个表的顺序可能已经乱掉了,准备在哪里插入行都可能找不到了

--  作者:有点蓝
--  发布时间:2016/10/12 11:31:00
--  
这个没有办法。其实这种情况就没有必要插入行了,新增行的时候,没有填写店名,时间,不管做什么顺序都是不对的
--  作者:chnfo
--  发布时间:2016/10/12 11:35:00
--  
晕,是要先插入行,再填写内容。
不是先确定内容,再确定要插入呀

--  作者:有点蓝
--  发布时间:2016/10/12 12:02:00
--  
所以说没有办法的。这就是为什么狐表限制了在排序的时候插入行,因为是没有意义的。没有内容又怎么排序呢。

不然就在窗口控件里编辑数据,等保存了再显示到表中