首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UniQuery -如何在文件中查找字段的最大长度

UniQuery -如何在文件中查找字段的最大长度
EN

Stack Overflow用户
提问于 2011-09-21 23:43:25
回答 2查看 2K关注 0票数 1

我正在研究如何在Manage2000 (M2k) MRP系统中的基于Unix的Unidata数据库中查找文件中某个字段的最大记录长度。我目前有v7.2的"Using Uniquery“和"Uniquery Command Reference”,我发现最接近的是使用" like“和”Uniquery“,但它并不完全像我希望的那样工作。

基本上,我们有一个带有"Part_Nbr“字典的QUOTES文件,我需要找到文件中最大的"Part_Nbr”记录的长度。字典字段最大长度为19个字符。在执行记录的随机列表时,我看到一些记录的数据长度为7个字符,一些记录的数据长度为13个字符,但我需要找到最大的数据长度。

提前感谢您的帮助和建议。

诚挚的问候,

--肯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-22 03:50:45

首先,我将澄清一些术语,以便我们使用相同的语言。您似乎正在互换使用字段和记录。

一个文件(也称为表,在本例中是'QUOTES‘)包含0个或多个记录。每条记录都由多个属性字段(也称为)组成。您可以使用字典项引用这些属性(也可以创建派生字段)

在这种情况下,您希望找到通过Part_Nbr字典访问的最长长度的数据,对吗?

假设这是正确的,你可以这样做

使用字典项

步骤1:创建一个i类型的字典项(派生字段)。让我们称其为Part_Nbr_Len。您可以在命令行中使用UNIENTRY DICT QUOTES Part_Nbr_Len执行此操作,如下图所示。

  • 类型= I (也称为派生字段)
  • LOC= Part_Nbr (该字段是5R中1字节的字符数(右对齐使其将此字段视为一个用于排序的数字)
  • SM= S (此字段是单个值)

第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‘,而不管您的帐户是什么,并在fly
  • 10000+LEN(Part_Nbr) -> ->上创建一个派生字段。这意味着当按降序排序时,9将列在15之前。+ 10000是一个技巧,它意味着ASCII顺序将与0到9999之间数字的数字顺序相同,这应该会覆盖case
  • EVAL "LEN(Part_Nbr)" ->中的可能范围,并为您显示实际字段长度。

编辑

通过MultiValued列表的代码解决

如果您具有MultiValued (和/或Sub-MultiValued)属性,则需要使用子例程来确定最大单个项的长度。幸运的是,您可以让I-type字典项调用子例程。

第一步是编写、编译和编目一个简单的UniBASIC子例程,以便为您执行处理:

代码语言:javascript
复制
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

  • GLOBAL -> ->

如果您在'BP‘文件中编译了该程序,则上面的目录命令将是:

  • CATALOG BP SR.MV.MAXLEN DIRECT
  • CATALOG BP SR.MV.MAXLEN LOCAL
  • CATALOG BP SR.MV.MAXLEN

对子例程进行编目后,您需要更新字典项Part_Nbr_Len (根据本答案的第一部分)的LOC字段(属性2),以调用子例程并将该字段传递给process:

SUBR("SR.MV.MAXLEN", Part_Nbr)

这为您提供了:

票数 4
EN

Stack Overflow用户

发布于 2011-10-11 06:58:57

这是一个很棒的答案。在Unidata的最新版本中,有一种稍微更简单、更有效的方法来检查最长的MV字段。

如果字典项变为:

代码语言:javascript
复制
SUBR('-LENS', Part_Nbr);SUBR('SR.MV.MAXLEN',@1)

basic程序可以变得更简单,只需找到多值长度列表的最大值:

代码语言:javascript
复制
SUBROUTINE SR.MV.MAXLEN(OUT.MAX.LEN, IN.DATA)
    OUT.MAX.LEN=MAXIMUM(IN.DATA)
RETURN

太糟糕了,没有'-MAXIMUMS‘内置函数来完全跳过基本程序!值得阅读UniQuery文档的5.9节,网址为:

Rocket Software Uniquery Docs

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

https://stackoverflow.com/questions/7502670

复制
相关文章

相似问题

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