Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 从表中删除记录实际上并不是删除VBA访问_Ms Access_Vba - Fatal编程技术网

Ms access 从表中删除记录实际上并不是删除VBA访问

Ms access 从表中删除记录实际上并不是删除VBA访问,ms-access,vba,Ms Access,Vba,我有一个名为Scenarios的表,它与ESDNodes有1对多的关系。可以有多个ESDNodes引用单个场景 对于每个场景,必须至少有一个ESDNode,这意味着在删除场景时,必须删除其所有相关ESDNode 因此,当用户选择一个场景并试图删除它时,此函数被调用: Private Sub Form_Delete(Cancel As Integer) Dim scenID As Long Dim ESDHeadNodeID As Long Dim response As Long

我有一个名为Scenarios的表,它与ESDNodes有1对多的关系。可以有多个ESDNodes引用单个场景

对于每个场景,必须至少有一个ESDNode,这意味着在删除场景时,必须删除其所有相关ESDNode

因此,当用户选择一个场景并试图删除它时,此函数被调用:

Private Sub Form_Delete(Cancel As Integer)
  Dim scenID As Long
  Dim ESDHeadNodeID As Long
  Dim response As Long
  Dim style As Long

  scenID = Forms!Main!Scenarios!ScenarioID
  ESDHeadNodeID = DLookup("ESDNodeID", "ESDNodes", "((ESDNodes.ESDNodeType)=1) AND ((ESDNodes.ScenarioID) = " & scenID & ")")

  style = vbYesNoCancel + vbQuestion
  response = MsgBox("Are you sure you wish to delete all selected nodes and their children?", style)
  If response = vbYes Then
     DeleteESDChildren (ESDHeadNodeID)
     loadESDTreeView
  End If
End Sub
在DeleteESDChildren中,我负责删除所有相关的ESDNodes。我删除了所有与此函数中的错误无关的代码。 以下是该函数:

Public Function DeleteESDChildren(lngID As Long)
  Dim rst_Del As Recordset
  Set rst_Del = CurrentDb.OpenRecordset("SELECT * FROM ESDNodes WHERE ESDNodeID = " & lngID)

  rst_Del.MoveFirst

  'Delete the head node
  If Not rst_Del.EOF Then
     rst_Del.Delete 
  End If
End Function
我用一个最简单的例子测试了这段代码,其中一个场景只有一个ESDNode,而这个ESDNode没有子节点。调用rst_Del.Delete的行,我希望删除这个单一的ESDNode。但是,当表单_Delete试图结束Sub声明“由于表'ESDNodes'包含相关记录,因此无法删除或更改记录”时,我得到了一个错误。因此,这个单一的ESDNode不会被删除

显示我的表之间关系的屏幕截图

看起来你陷入了困境

Public Function DeleteESDChildren(lngID As Long)
    Dim rst As Recordset
    'find the children of the node
    Set rst = CurrentDb.OpenRecordset("SELECT * FROM ESDNodes WHERE ParentID = " & lngID)

    'call deletechildren on each child in turn
    While Not rst.EOF
        DeleteESDChildren (rst!ESDNodeID) '<-- goes back to the beginning.
        rst.MoveNext
    Wend
    etc.
公共函数DeleteESDChildren(lngID尽可能长)
将rst设置为记录集
'查找节点的子节点
Set rst=CurrentDb.OpenRecordset(“从ESDNodes中选择*,其中ParentID=“&lngID”)
'依次调用每个孩子的deletechildren
而不是rst.EOF

DeleteESDChildren(rst!ESDNodeID)这可以使用SQL实现

CurrentDb.Execute "DELETE * FROM ESDNodes WHERE ESDNodeID = " & lngID

你怎么走到那条线?看起来您在DeletesDChildren的前5行中处于循环中。否?是否有任何理由不使用SQL
delete
查询而不是
select
查询来删除相关的ESDnodes。。。。然后运行另一个删除查询以删除场景记录。请发布关系图的屏幕截图(功能区>数据库工具>关系),重点放在ESDnodes上。有趣的是,您有很多指向ESINodes的链接,看起来是相同的表引用完整性。看起来FTNodes是一个子表,所以在从节点中删除之前,必须先删除所有对应的行。但是ESINode_1也可能是一个问题。另外,仅供参考,如果“1”表位于左侧,而“多”表位于右侧,则更容易阅读关系图,因此您可以在左侧看到父节点,在父节点右侧看到相关子节点。该行用于删除该ESDNode的子节点。换句话说,ESD节点与其他ESD节点之间存在1对多关系。但我正在用最简单的测试用例测试代码,其中只有一个ESDNode没有子节点,这样记录集将为空,循环将不会进入。我想我可以注释掉代码,以免混淆任何人。啊,我知道你在那里做了什么。