盲人妻子的困惑——简道云子表排序问题
声明:本文由简道云用户-牛中伟老师原创提供。
在简道云这个应用搭建平台中,子表单是非常实用的功能之一,它适用于录入数据的格式一定、但次数不定的情况,如在进销存中录入采购明细:
但有时添加子表单信息时,我们希望能实现自动排序的功能(如下图所示),如何实现呢?
仔细观察上图,有没有感觉像是我们生活中常见的一种情景——排队?是的,可以把子表序号的问题转换成排队的问题,通过对排队这种我们平常比较熟悉的场景做分析,把子表排序中可能遇到的问题转换到排队中遇到的问题,或许对我们理解子表排序的问题有所帮助。
举一个具体排队的例子:男人在排队买票,队伍很长,此时男人的妻子打电话来说要来找他,男人告诉妻子他在这里排队买票,你过来吧。妻子到了之后电话里说队伍太长了,如果一个一个去找就太慢了,能告诉她位置吗,男人看了看队伍,大概数了一下,发现自己离卖票窗口大概还有100人,妻子根据这个位置很快就找到了男人。
在这个例子中,男人和妻子都有自己数“从窗口到男人之间人数”的能力,仔细想象一下,这个能力就相当于我们直接根据子表单里行数的先后顺序,依次手动输入序号的能力。很显然,这不是我们需要的,现在我们需要的是子表自动添加序号的能力,其实这也就相当于要求在没有直接数人数的能力下,同时又要求找出男子所处的人数。
如果没有直接数人数的能力,那在这个例子中,就相当于让男人和妻子都变成盲人,他们没法通过直接查看排队的队伍,数人数的方式来确定位置,他们只能通过别的方法来解决。
那接下来子表单序号的问题就转换成了一个盲人妻子如何在排队的队伍中查找自己丈夫所处位置的的问题。她不能借助他人,只能依靠自己。
想象一下,如果此时你是这位盲人妻子,面对这种困惑,你会通过什么方式来查找正在排队的丈夫?
很显然,解决这一问题,没法再通过常规方法查找,但没有要求不能用其他方法,回到查找位置最本源最直接的方法——拿尺子量。首先她可以去队伍中一个一个去触摸(盲人一般通过触摸来感知这个世界),当她摸到丈夫后,再用尺子(假设有盲人会用的通过触感感知距离的尺子)丈量丈夫离窗口的距离,比如用S代表,此时就知道丈夫的位置了。如果再想知道丈夫离窗口具体的人数,那他还需要依次丈量丈夫前面每一位排队人排队时所占的宽度,比如依次用S1、S2、S3、S4、S5、S6......SN代表,这里N代表丈夫所在的人数。那么会出现:
S=S1+S2+S3+S4+S5+S6+......+SN
显然这样的计算是看不出什么规律的,而此时如果发现有条件使得S1=S2=S3=S4=S5=S6=.....=SN,那丈夫所处行数N就等于N=S/S1。
分析上面的这个独特场景,可以发现,妻子可以找到丈夫所处位置,其实需要满足几个暗含的条件:
1、妻子记得丈夫的模样,即能从众多排队的人中识别出丈夫。
2、队伍中没有其他人和丈夫长的一样。
3、丈夫和队伍中其他人所占的宽度都一样。
如果翻译成函数语言,可能包含有以下几条:
● CONCATENATE()——队伍集合排队
● SEARCH()——记得、识别、丈量
● UUID()——随机码,每个人都长的不一样,每个人所占的宽度都一样。
通过上面分析可以发现,实现子表排序功能可能需要的控件,以及控件可能处于的位置也就比较好找了。在表单中实现的方法如下图:
表单添控件如上图,属性都是单行文本控件,其中控件写函数分别是:
随机码:CONCATENATE(UUID(),",")
随机码集合:CONCATENATE(随机码)
序号:(SEARCH(子表单.随机码,随机码集合)-1)/37+1
(注:其中UUID()是随机码,所占字符串数量为36,这里之所以用CONCATENATE(UUID(),","),而不是单纯的UUID(),是因为随机码集合中可能会出现随机码重复的情况,而由CONCATENATE(UUID(),",")组成的集合中确不会出现重复,具体证明这里就略过了)。
由此可见,子表单序号的问题,即是在由自己组成的队伍中查找自己的位置的问题。解决方法就一目了然了。
另,如果再添加其他合适的辅助控件,就可以实现当前子表单序号衔接上过往已提交子表单序号
此功能以及变形,可以解决的问题罗列如下:
1、子表排序问题;
2、子表重复值问题;
3、上次采购价问题;
4、ERP中常用的BOM表的问题。
................
子表排序测试表单外链:https://jiandaoyun.com/f/5a17d897a3489a603975f1a9