Ibm midrange RPGLE数据结构数组查找

Ibm midrange RPGLE数据结构数组查找,ibm-midrange,rpgle,rpg,Ibm Midrange,Rpgle,Rpg,我已经创建了一个数据结构数组,我想基于键组合进行查看。i、 e.在下面的DS中,如果tblName、tblElement和tblDivision匹配,我想查找并获取索引,然后返回tblRes值 D TblAryDs DS qualified dim(9999) D tblName 3

我已经创建了一个数据结构数组,我想基于键组合进行查看。i、 e.在下面的DS中,如果tblName、tblElement和tblDivision匹配,我想查找并获取索引,然后返回tblRes值

    D TblAryDs        DS                  qualified dim(9999)                    
    D  tblName                       3                                           
    D  tblElement                   10                                           
    D  tblDivision                   5                                           
    D  tblRes                        2                                           

//Not Sure How to do the below lookup
      idx = %lookup(tblName:TblAryDs(*).tblName) && %lookup(tblElement:TblAryDs(*).tblElement) && %lookup(tblDivision:TblAryDs(*).tblDivision);                                
      if idx > *zeros;                                                                                   
         return TblAryDs(*).tblRes;
      endif; 
注意:如上所述,%LOOKUP将搜索所有9999个元素。如果必须重复搜索不同的值,请将ASCEND关键字添加到数组中,并在搜索之前使用SORTA对其进行排序。最后,跟踪数组中实际使用了多少元素

idx = %lookup(tblName + tblElement + tblDivision 
                  : TblAryDs(*).key : nbrElemUsed);
这样%LOOKUP%将只对活动元素执行更快的二进制搜索

注意:如上所述,%LOOKUP将搜索所有9999个元素。如果必须重复搜索不同的值,请将ASCEND关键字添加到数组中,并在搜索之前使用SORTA对其进行排序。最后,跟踪数组中实际使用了多少元素

idx = %lookup(tblName + tblElement + tblDivision 
                  : TblAryDs(*).key : nbrElemUsed);

这样,%LOOKUP%将只对活动元素执行更快的二进制搜索。

如果我的数组包含以下元素,即BIL-123-123-11和BIL-456-456-22,并且我需要查找发送行,则此代码将无法工作。因为查找总是返回第一行。@Sekar抱歉误解了您的需要。现在呢?这就解决了问题。谢谢但有一个问题,因为我将在运行时添加元素,所以在添加每个元素后对数组进行排序将非常耗时。实际情况是,我不希望每次都查看文件,而是希望尽可能多地缓存结果以减少IO。我很想知道你对此的看法。排序和查找会耗时还是文件IO?文件I/O成本更高,但由于单级存储的性质,成本可能没有您想象的那么高。实际上,您不会每次I/O都访问磁盘。setObjac甚至允许您将整个文件预加载到内存中。在数据库中仍然有一些开销…但是如果我从简单开始,只做文件I/O。然后告诉系统缓存它,在构建我自己的缓存之前。如果我构建我自己的缓存,我会考虑加载整个内容,然后对其进行排序。问题是,您是否需要担心文件中的数据更改会导致缓存失效?如果我的数组包含以下元素,BIL-123-123-11和BIL-456-456-22,我需要查找发送行,则此代码将无法工作。因为查找总是返回第一行。@Sekar抱歉误解了您的需要。现在呢?这就解决了问题。谢谢但有一个问题,因为我将在运行时添加元素,所以在添加每个元素后对数组进行排序将非常耗时。实际情况是,我不希望每次都查看文件,而是希望尽可能多地缓存结果以减少IO。我很想知道你对此的看法。排序和查找会耗时还是文件IO?文件I/O成本更高,但由于单级存储的性质,成本可能没有您想象的那么高。实际上,您不会每次I/O都访问磁盘。setObjac甚至允许您将整个文件预加载到内存中。在数据库中仍然有一些开销…但是如果我从简单开始,只做文件I/O。然后告诉系统缓存它,在构建我自己的缓存之前。如果我构建我自己的缓存,我会考虑加载整个内容,然后对其进行排序。问题是,您是否需要担心文件中的数据会发生更改,从而导致缓存过时?