Algorithm 多级报表的递归算法

Algorithm 多级报表的递归算法,algorithm,recursion,reporting-services,x++,microsoft-dynamics,dynamics-ax-2012,Algorithm,Recursion,Reporting Services,X++,Microsoft Dynamics,Dynamics Ax 2012,我目前正在开发一个多层次的SSRS报告,我正在努力解决这个算法。我开发了一个递归类,如下所示,但是级别号不正确。我希望由a、b和c表示的父记录显示子记录,以便子记录的级别=parentRecLevel+1。现在,级别值仅增加1。有人有什么建议吗 protected BOMLevel getBomLevelItem(str itemId, int numLevel, boolean firstRec) while select tmpBOM { bomLevel =

我目前正在开发一个多层次的SSRS报告,我正在努力解决这个算法。我开发了一个递归类,如下所示,但是级别号不正确。我希望由a、b和c表示的父记录显示子记录,以便子记录的级别=parentRecLevel+1。现在,级别值仅增加1。有人有什么建议吗

protected BOMLevel getBomLevelItem(str itemId, int numLevel, boolean firstRec)
    while select tmpBOM
    {
        bomLevel = this.getBomLevelItem(bomLevel.ItemId, bomLevel.Level, false);
    }
当前结果,其中b1、c1和c2分别是b和c的子女:

1    a
2    b
2    b1
3    c
4    c1
5    c2
想要的结果:

1    a
2    b
3    b1
2    c
3    c1
3    c2
TLDR:不要重新发明轮子,使用现有的算法和框架

我想你的问题不是为了训练,而是现实世界的问题。如果这是一个练习,那么在回到x++之前,请尝试在一个大型社区中用您选择的易于使用的语言很好地掌握递归

您的递归方法看起来不完整,因为在每次递归中,您都会遍历tmpBom的所有记录,除非您在其他地方修改该表中的记录,否则这些记录没有意义,也永远不会终止。我也不明白这种方法是如何产生你所描述的结果的。我建议您阅读一些递归算法培训材料,以了解递归的基本部分

你标记了这个问题,语法看起来也很像。很遗憾,您没有添加您正在使用的版本的信息,但我将假设它是当前使用的最常见的版本

在这个版本中,已经有一个现成的SSRS报告,它将向您显示物料清单的结构。您可以在库存管理>报告>物料清单>行中调用该报告。修改此报告应该相当容易,以便在报告尚未满足您的要求时也显示级别

如果您仍然需要实现自己的解决方案,请查看类BOMSearch及其子类。它用于多个位置检查交叉引用,也可用于展开/分解BOM表


还请注意,有很多文章试图解释如何在x++代码中扩展或分解物料清单,但与internet上的所有内容一样,请小心:大多数内容都不完整或完全错误。

一般来说,请仅使用递归作为最后手段,它几乎总是低效的。看看是否有一个可行的替代递归的方法。@JosephDoggie递归通常是表达解决方案的最直观的方法。因此,这是找到问题的有效解决方案的好方法。一旦你得到了一个有效的解决方案,你就可以担心它的效率了。避免递归,因为解决方案可能效率低下,这是过早优化的一个练习。使程序工作起来;然后让它更有效率。