首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vba中带有递归函数的“堆栈外空间”用于访问

vba中带有递归函数的“堆栈外空间”用于访问
EN

Stack Overflow用户
提问于 2016-04-04 14:08:30
回答 1查看 819关注 0票数 1

我之所以联系你,是因为我在为访问程序编写模块时遇到了麻烦。

简介:

我有4张桌子:产品,接收器,命令和命令。命令和命令具有相同的结构,第二个结构是通过接收处理命令的结果。

VBA模块的目标:

我正在创建一个模块,通过通过接收处理命令来为Ordonnancement表创建记录。详细地说,我使用一个递归函数来处理接收深度的变量,这个变量允许我循环遍历receipes,并在所有产品中生成一个日期的需求。

备注:

-I通常在C#中使用EF来处理数据库。在几次尝试直接使用RecordSet访问的可能性之后,我决定为ReceipeLign和OrdoLign生成POCO类,存储这些对象集合中的表数据,处理这些对象,然后提交到Access表,向每个RecordSet添加记录。

-I用法语工作,所以我翻译了一些东西,这样每个人都能理解它。这可能不是完美的,如果不清楚的话请告诉我。

代码:

代码语言:javascript
复制
Option Compare Database
Option Explicit

Dim cnc As New ADODB.Connection
Dim CRecordSet As New ADODB.Recordset
Dim FTRecordSet As New ADODB.Recordset
Dim ORecordSet As New ADODB.Recordset

Public Sub GenerateOrdonnancement()

'Retrieving info from tables Commandes & FT in RecordSets.
Set cnc = CurrentProject.Connection
Set CRecordSet = cnc.Execute("SELECT * FROM Commandes")
Set FTRecordSet = cnc.Execute("SELECT * FROM FichesTechniques")
Set ORecordSet = cnc.Execute("SELECT * FROM Ordonnancement")

'Creation of the list to receive data from the tables
Dim Commandes As New Collection
Dim FicheTechniques As New Collection

'Retrieving commands and receipes
Dim Commande As ligneOrdo
Dim ordo As ligneOrdo
Dim FT As ligneFT

Do Until CRecordSet.EOF

    Set Commande = New ligneOrdo
    Commande.DateCommande = CRecordSet("dateCommande").Value
    Commande.Produit = CRecordSet("Produit").Value
    Commande.Quantite = CRecordSet("quantite").Value
    Commandes.Add Commande
    CRecordSet.MoveNext

Loop
CRecordSet.Close


Do Until FTRecordSet.EOF

    Set FT = New ligneFT
    FT.Nom = FTRecordSet("Nom").Value
    FT.Ingredient = FTRecordSet("Ingredient").Value
    FT.Quantite = FTRecordSet("quantité").Value
    FT.IsComposed = FTRecordSet("Composé").Value
    FicheTechniques.Add FT
    FTRecordSet.MoveNext

Loop
FTRecordSet.Close


'creation of the collection of ordo
'Later: versionning of the Ordonnancements
Dim AProduire As New Collection

Dim mr As ligneOrdo
For Each mr In Commandes
    Dim coll As Collection
    Set coll = CreateOrdoLigne(mr, FicheTechniques)
    Dim item As New ligneOrdo
    For Each item In coll
        AProduire.Add item
    Next item
Next mr

'Adding and saving the coll AProduire in the RecordSetO
cnc.BeginTrans
Dim item2 As ligneOrdo
For Each item2 In AProduire
    ORecordSet.AddNew
    ORecordSet("DateCommande").Value = item2.DateCommande
    ORecordSet("Produit").Value = item2.Produit
    ORecordSet("Quantite").Value = item2.Quantite
    ORecordSet.Update
Next item2

ORecordSet.Close

cnc.CommitTrans

End Sub

Function CreateOrdoLigne(ligne As ligneOrdo, FT As Collection) As Collection

Dim ordo As New Collection

Dim ligneFT As Variant
'Loop through the receipes
For Each ligneFT In FT
    If ligneFT.Nom = ligne.Produit Then
        Dim AProduire As New ligneOrdo
        AProduire.Produit = ligneFT.Ingredient
        AProduire.DateCommande = ligne.DateCommande
        AProduire.Quantite = ligne.Quantite * ligneFT.Quantite
        ordo.Add AProduire
        If ligneFT.IsComposed = True Then
            Dim ordoList2 As New Collection
            Set ordoList2 = CreateOrdoLigne(AProduire, FT)
            Dim recordOrdo As ligneOrdo
            For Each recordOrdo In ordoList2
                ordo.Add recordOrdo
            Next recordOrdo
            Set ordoList2 = Nothing
        End If
        Set AProduire = Nothing
    End If
Next ligneFT


Set CreateOrdoLigne = ordo

End Function

问题陈述:

在运行模块时,我得到了一个运行时错误28:“栈外空间”,这似乎是在这样紧凑的环境中使用递归函数的一个常见问题。问题是,我不能真正优化这个过程。我正在寻找直接的方法来绕过这一错误或想法,以另一种方式解决这个问题。

谢谢大家,

EN

回答 1

Stack Overflow用户

发布于 2016-04-10 16:15:16

因此,在@Andre的帮助下进行了一些调试之后,我发现递归性是无限的,因此在大小上出现了错误。即便如此,Access仍然无法生成这么多数据,并将其存储在数据库中的某个地方。

我找到了解决这个问题的方法,它包括:

  • 避免使用要存储在集合中的函数。因此,我将函数转换为子函数。
  • 在生成过程中执行对数据库的更改。
  • 当在可重复的过程中不再需要它时,obj =什么也不需要。

我所学到的,也许可以帮助别人

  • 分析递归过程,看看是什么使其无限,相应地定义错误处理程序。
  • Debug.Print是一种在vba访问中进行调试、生成数据和检查整个过程的有效方法。

谢谢你@安德烈和其他人给你的时间,希望它能帮助到别人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36404983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档