我正在研究如何在Manage2000 (M2k) MRP系统中的基于Unix的Unidata数据库中查找文件中某个字段的最大记录长度。我目前有v7.2的"Using Uniquery“和"Uniquery Command Reference”,我发现最接近的是使用" like“和”Uniquery“,但它并不完全像我希望的那样工作。
基本上,我们有一个带有"Part_Nbr“字典的QUOTES文件,我需要找到文件中最大的"Part_Nbr”记录的长度。字典字段最大长度为19个字符。在执行记录的随机列表时,我看到一些记录的数据长度为7个字符,一些记录的数据长度为13个字符,但我需要找到最大的数据长度。
提前感谢您的帮助和建议。
诚挚的问候,
--肯
发布于 2011-09-22 03:50:45
首先,我将澄清一些术语,以便我们使用相同的语言。您似乎正在互换使用字段和记录。
一个文件(也称为表,在本例中是'QUOTES‘)包含0个或多个记录。每条记录都由多个属性字段(也称为)组成。您可以使用字典项引用这些属性(也可以创建派生字段)
在这种情况下,您希望找到通过Part_Nbr字典访问的最长长度的数据,对吗?
假设这是正确的,你可以这样做
使用字典项
步骤1:创建一个i类型的字典项(派生字段)。让我们称其为Part_Nbr_Len。您可以在命令行中使用UNIENTRY DICT QUOTES Part_Nbr_Len执行此操作,如下图所示。

第2步:按Part_Nbr_Len降序列出文件,也可以像我所做的那样列出实际的Part_Nbr字段。您可以通过以下命令来完成此操作。
LIST QUOTES BY.DSND Part_Nbr_Len Part_Nbr_Len Part_Nbr

临时命令行黑客攻击
或者,如果你不想要永久的东西,你可以在命令行做一点修改:
list QUOTES BY.DSND EVAL "10000+LEN(Part_Nbr)" EVAL "LEN(Part_Nbr)" Part_Nbr

好的,让我们来分析一下:
list ->是否为小写可能并不重要。这使您可以使用'EVAL‘,而不管您的帐户是什么,并在fly10000+LEN(Part_Nbr) -> ->上创建一个派生字段。这意味着当按降序排序时,9将列在15之前。+ 10000是一个技巧,它意味着ASCII顺序将与0到9999之间数字的数字顺序相同,这应该会覆盖caseEVAL "LEN(Part_Nbr)" ->中的可能范围,并为您显示实际字段长度。编辑
通过MultiValued列表的代码解决
如果您具有MultiValued (和/或Sub-MultiValued)属性,则需要使用子例程来确定最大单个项的长度。幸运的是,您可以让I-type字典项调用子例程。
第一步是编写、编译和编目一个简单的UniBASIC子例程,以便为您执行处理:
SUBROUTINE SR.MV.MAXLEN(OUT.MAX.LEN, IN.DATA)
* OUT.MAX.LEN : Returns the length of the longest MV/SMV value
* IN.ATTRIBUTE : The multivalued list to process
OUT.MAX.LEN = 0
IN.DATA = IN.DATA<1> ;* Sanity Check. Ensure only one attribute
IF NOT(LEN(IN.DATA)) THEN RETURN ;* No Data to check
LOOP
REMOVE ELEMENT FROM IN.DATA SETTING DELIM
IF LEN(ELEMENT) > OUT.MAX.LEN THEN OUT.MAX.LEN = LEN(ELEMENT)
WHILE DELIM
REPEAT
RETURN要编译程序,它必须在DIR类型的文件中。举个例子,如果你在'BP‘文件中有代码,你可以用这个命令编译它:
BASIC BP SR.MV.MAXLEN
如何对其进行分类取决于您的需求。他们有3种方法:
如果您只想在当前帐户中使用我的建议,请使用我的建议。如果您希望它在所有帐户中都有效,请参阅My account
。
如果您在'BP‘文件中编译了该程序,则上面的目录命令将是:
CATALOG BP SR.MV.MAXLEN DIRECTCATALOG BP SR.MV.MAXLEN LOCALCATALOG BP SR.MV.MAXLEN对子例程进行编目后,您需要更新字典项Part_Nbr_Len (根据本答案的第一部分)的LOC字段(属性2),以调用子例程并将该字段传递给process:
SUBR("SR.MV.MAXLEN", Part_Nbr)
这为您提供了:

发布于 2011-10-11 06:58:57
这是一个很棒的答案。在Unidata的最新版本中,有一种稍微更简单、更有效的方法来检查最长的MV字段。
如果字典项变为:
SUBR('-LENS', Part_Nbr);SUBR('SR.MV.MAXLEN',@1)basic程序可以变得更简单,只需找到多值长度列表的最大值:
SUBROUTINE SR.MV.MAXLEN(OUT.MAX.LEN, IN.DATA)
OUT.MAX.LEN=MAXIMUM(IN.DATA)
RETURN太糟糕了,没有'-MAXIMUMS‘内置函数来完全跳过基本程序!值得阅读UniQuery文档的5.9节,网址为:
Rocket Software Uniquery Docs
https://stackoverflow.com/questions/7502670
复制相似问题