以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  科目末级判断  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=179052)

--  作者:wukangppbb
--  发布时间:2022/8/4 15:50:00
--  科目末级判断
老师,这个判断末级的好像有点问题。没有实现真正的末级判断。

If e.DataCol.Name = "科目代码" Then 
    If e.DataRow.IsNull("科目代码") Then
        e.DataRow("是否末级科目") = Nothing 
    Else 
        If e.DataTable.Find("科目代码 like \'" & e.DataRow("科目代码") & "%\' and 科目代码 <> \'" & e.DataRow("科目代码") & "\'") Is Nothing Then   
            e.DataRow("是否末级科目") = "末级"    
        Else  
            e.DataRow("是否末级科目") = "非末级"
        End If
    End If
End If


还有一种情况就是,现在的科目是“末级”属性,当我新增一条下级科目的时候,那么原先的“末级”科目应该变化为“非末级”,这个用“重置”按钮就可以了吗?

图片点击可在新窗口打开查看

--  作者:有点蓝
--  发布时间:2022/8/4 16:26:00
--  
我测试没有问题, 请上传实例说明
--  作者:wukangppbb
--  发布时间:2022/8/4 21:30:00
--  回复:(有点蓝)我测试没有问题, 请上传实例说明
有点像递归函数判断的问题,不是很懂。

效果如下:

1012 其他货币资金 非末级
101201 银行汇票 末级
101202 银行本票 末级
101203 信用卡 末级
101204 信用证保证金 末级
101205 外埠存款 末级

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



--  作者:有点蓝
--  发布时间:2022/8/4 21:46:00
--  
测试没有问题。添加datacolchanged事件代码有,已有数据要重置一下列:

选中科目代码列,“日常工作”功能区“数据”功能组,单击下面的“重置列”按钮即可:


--  作者:wukangppbb
--  发布时间:2022/8/4 22:56:00
--  回复:(有点蓝)测试没有问题。添加datacolchanged事...
可以了,需要重置,每次新增一个科目层级都需要重置一下才能准确,这个在切换表的时候自动刷新的话,是不是要写在项目事件里面?
--  作者:有点蓝
--  发布时间:2022/8/4 23:25:00
--  
如果更改代码后对原有的上级自动刷新的话,参考:
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:会计科目1.zip


--  作者:wukangppbb
--  发布时间:2022/8/5 15:22:00
--  回复:(有点蓝)如果更改代码后对原有的上级自动刷新...
太难了这个。


 If e.DataTable.Find("科目代码 like \'" & e.DataRow("科目代码") & "%\' and 科目代码 <> \'" & e.DataRow("科目代码") & "\'") Is Nothing Then 


 Dim s As String = Left(e.NewValue, e.NewValue.length - 2)


这两句代码怎么理解的?

--  作者:有点蓝
--  发布时间:2022/8/5 16:33:00
--  
If e.DataTable.Find("科目代码 like \'" & e.DataRow("科目代码") & "%\' and 科目代码 <> \'" & e.DataRow("科目代码") & "\'") Is Nothing Then 
查找有没有以编辑数据的行(e.DataRow("科目代码"))的科目代码开头的科目代码,比如录入“01”。这句就是查询有没有“0101”,"010201"这种以01开头的编码。Is Nothing表示找不到,也就是没有以01开头的其它编码

Dim s As String = Left(e.NewValue, e.NewValue.length - 2)表示取单元格更改的数据去掉右边2个字符后的数据,比如,单元格输入“010203”,s变量就等于“0102”

--  作者:811233895
--  发布时间:2022/8/5 19:42:00
--  
这种判断 会出Bug的!
第一个Bug:  比如 1012101 找到的上级科目是 10121 
第二个Bug:  比如  如果科目表中存在101210 ,不能处理101210 1012101 之间的上下级关系
[此贴子已经被作者于2022/8/5 19:46:55编辑过]

--  作者:有点蓝
--  发布时间:2022/8/6 8:57:00
--  
要保证代码的长度是一致的,子码比父码多2位。不然就改为使用like判断,