以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  跨表锁定  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=176416)

--  作者:采菊东篱下
--  发布时间:2022/4/12 17:14:00
--  跨表锁定
我希望在仓库表的进仓数量列下拉窗口的本次录入数量中录入数量后,如果仓库账上单号、名称、规格与采购订单上的单号、名称、规格相同,两者数量相等时锁定采购订单行,我这样写无法锁定。
采购订单表的DataColChanged事件:
Select Case e.DataCol.Name
    Case "勾选"
        If e.DataRow.Isnull("单号") = False And e.DataTable.SQLCompute("Sum(数量)","[单号] = \'" & e.DataRow("单号") & "\' And [名称] =\'" & e.DataRow("名称") & "\' And [规格]" & IIF(e.DataRow.IsNull("规格")," Is Null"," =\'" & e.DataRow("规格")  & "\'")) = DataTables("仓库账").SQLCompute("Sum(进仓数量)","[单号] = \'" & e.DataRow("单号") & "\' And [名称] =\'" & e.DataRow("名称") & "\' And [规格]" & IIF(e.DataRow.IsNull("规格")," Is Null"," =\'" & e.DataRow("规格")  & "\'")) Then
            e.DataRow("勾选") = True
            e.DataRow.Locked = True
        Else
            e.DataRow("勾选") = False
            e.DataRow.Locked = False
        End If
End Select
另我也希望在仓库账删除进仓数量时,其他列的数据同步删除,这样写能实现删除了,但在仓库账的进仓数量下拉窗口录入本次录入数量时,其他列的数据没有同步录入,注识下面代码后才能同步录入其他列数据,如何解决上面两个问题。
Dim dr As DataRow = e.DataRow
Select Case e.DataCol.name
    Case "进仓数量","进仓单价"
        If dr.IsNull("进仓数量") OrElse dr.IsNull("进仓单价") Then
            \'dr("名称") = Nothing
            \'dr("规格") = Nothing
            \'dr("计量单位") = Nothing
            \'dr("单号") = Nothing
            \'dr("进仓单价") = Nothing
            dr("进仓金额") = Nothing
        Else
            \'Dim ds As DataRow = DataTables("采购订单").SQLFind("[单号] =\'" & e.DataRow("单号") & "\' And [名称] =\'" & e.DataRow("名称") & "\' And [规格]" & IIF(e.DataRow.IsNull("规格")," Is Null"," =\'" & e.DataRow("规格")  & "\'") & "\'","",0)
            \'If ds IsNot Nothing Then
            \'dr("名称") = ds("名称")
            \'dr("规格") = ds("规格")
            \'dr("计量单位") = ds("计量单位")
            \'dr("单号") = ds("单号")
            \'dr("进仓单价") = ds("单价")
            dr("进仓金额") = dr("进仓数量") * dr("进仓单价")
            \'End If
        End If
End Select


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


[此贴子已经被作者于2022/4/12 21:13:20编辑过]

--  作者:有点蓝
--  发布时间:2022/4/12 17:34:00
--  
1、代码放在采购订单表的DataColChanged事件,判断的是【Case "勾选"】勾选这个列的数据变化才会触发事件。

而仓库账表使用的是【Dim dts As List(Of DataRow) = DataTables("采购订单").SQLSelect("[单号] =\'" & e.DataRow("单号") & "\'")】。SQLSelect查询后台数据库的,查询结果和界面的主表没有任何关系,SQLSelect查询结果是无法触发任何事件的,改为Select

2、在删除的时候,已经把名称删除了,下面还使用名称进行查询,肯定是无法查询到任何数据的

        If dr.IsNull("进仓数量") OrElse dr.IsNull("进仓单价") Then
            \'dr("名称") = Nothing 名称已经清空
            \'dr("规格") = Nothing
            \'dr("计量单位") = Nothing
            \'dr("单号") = Nothing
            \'dr("进仓单价") = Nothing
            dr("进仓金额") = Nothing
        Else
下面还使用名称进行条件查询肯定是无法查询到任何数据的
            \'Dim ds As DataRow = DataTables("采购订单").SQLFind("[单号] =\'" & e.DataRow("单号") & "\' And [名称] =\'" & e.DataRow("名称") & "\' And [规格]" & IIF(e.DataRow.IsNull("规格")," Is Null"," =\'" & e.DataRow("规格")  & "\'") & "\'","",0)
            \'If ds IsNot Nothing Then

自己考虑使用什么条件进行查询合适,或者不要清空名称和规格

--  作者:采菊东篱下
--  发布时间:2022/4/12 18:01:00
--  
触发仓库账上的数据,判断单号、名称、规格相同,数量相等才锁定采购订单表上的行,一张订单上常有多个品种,现在要锁定的是品种一定要带上名称、规格,我就是不知如何实现跨表锁定。
--  作者:采菊东篱下
--  发布时间:2022/4/12 18:10:00
--  
仓库账、采购订单表都会分页加载,所以用SQL查找,如果找不到相同单号、名称、规格的数据,采购订单表上的行都不打勾、不锁定,锁定的是采购订单上符合条件的行。
--  作者:有点蓝
--  发布时间:2022/4/12 20:28:00
--  
如果要触发表事件,在表事件里处理,就必须操作已加载的数据。

如果是直接改后台数据的,需要重新加载,前台表格才能刷新

--  作者:采菊东篱下
--  发布时间:2022/4/13 0:57:00
--  
已经可以同步更新了,但勾选和锁定还不行。
Dim dr As DataRow = e.DataRow
Dim dss As List(Of DataRow) = DataTables("采购订单").SQLSelect("[单号] =\'" & e.DataRow("单号") & "\' And [名称] =\'" & e.DataRow("名称") & "\' And [规格]" & IIF(e.DataRow.IsNull("规格")," Is Null"," =\'" & e.DataRow("规格")  & "\'") & "\'")
Select Case e.DataCol.name
    Case "进仓数量"
        If e.OldValue IsNot Nothing AndAlso e.NewValue Is Nothing Then
            dr("名称") = Nothing
            dr("规格") = Nothing
            dr("计量单位") = Nothing
            dr("单号") = Nothing
            dr("进仓单价") = Nothing
        Else
            For Each ds As DataRow In dss
                If ds IsNot Nothing Then
                    dr("名称") = ds("名称")
                    dr("规格") = ds("规格")
                    dr("计量单位") = ds("计量单位")
                    dr("单号") = ds("单号")
                    dr("进仓单价") = ds("单价")
                End If
            Next
        End If
End Select
dr("进仓金额") = dr("进仓数量") * dr("进仓单价")
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:按条件锁定1.foxdb


[此贴子已经被作者于2022/4/13 9:33:47编辑过]

--  作者:有点蓝
--  发布时间:2022/4/13 8:49:00
--  
勾选和锁定使用的是SQLSelect,更改数据后没有保存
--  作者:采菊东篱下
--  发布时间:2022/4/13 9:39:00
--  

Dim dts As List(Of DataRow) = DataTables("采购订单").SQLSelect("[单号] Is Not Null And [单号] =\'" & e.DataRow("单号") & "\'")
For Each dt As DataRow In dts
    If dt IsNot Nothing Then
        If e.DataTable.Compute("Sum([进仓数量])","[单号] =\'" & e.DataRow("单号") & "\' And [名称] =\'" & e.DataRow("名称") & "\' And [规格]" & IIF(e.DataRow.IsNull("规格")," Is Null"," =\'" & e.DataRow("规格")  & "\'")) = _
            DataTables("采购订单").Compute("Sum([数量])","[单号] =\'" & e.DataRow("单号") & "\'And [名称] =\'" & e.DataRow("名称") & "\' And [规格]" & IIF(e.DataRow.IsNull("规格")," Is Null"," =\'" & e.DataRow("规格")  & "\'")) Then
            dt("勾选") = True
            dt.Locked = True
        Else
            dt("勾选") = False
            dt.Locked = False
        End If
    End If
    dt.save
Next
DataTables("采购订单").Load()
能勾选了,但不能取消勾选

--  作者:采菊东篱下
--  发布时间:2022/4/13 9:40:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:按条件锁定2.foxdb


--  作者:有点蓝
--  发布时间:2022/4/13 9:59:00
--  
http://www.foxtable.com/webhelp/topics/2901.htm