1

Universe 动态数组相对操作(使用 -1)以一种奇怪的方式工作。

下面的操作不会像我预期的那样在位置 <1,1,5> 中添加新元素,而是将“1,1,5”添加到 DYNAMIC.ARRAY<1,1,1> 中。

DYNAMIC.ARRAY = '       '
DYNAMIC.ARRAY<1,-1,5> = '1,1,5'    ; *Adds to 1,1,1 not 1,1,5 when DYNAMIC.ARRAY contains only whitespaces before this operation

但是,如果动态数组包含非空值,则相同的操作会按预期工作。执行以下代码后的最终结果将是 DYNAMIC.ARRAY<1,1,1> = '1,1,1' 和 DYNAMIC.ARRAY<1,2,5> = '1,2,5'。

   DYNAMIC.ARRAY = '      '
   DYNAMIC.ARRAY<-1> = '1,1,1'
   DYNAMIC.ARRAY<1,-1,5> = '1,2,5'    ; *Adds to right position 1,2,5 when DYNAMIC.ARRAY is initialised to non empty value before this operation

这是宇宙中的预期行为吗?

4

3 回答 3

2

当您使用 -1 时,它应该位于嵌套值的最深级别。

多值字段的工作方式,你想要做什么并没有真正的意义。

假设您的记录反映了客户购买的东西,您的字典可能类似于

D1: CustomerName D2: OrderNumber D3: PartNumber

@ID 1234 0001:John Doe 0002:72832@VM83782@VM84783 0003:232-A@SVM2394-R@SVM3321-B@VM232-F@VM2342

CustomerName 是一个单值字段。这与整个记录相关联。

OrderNumber 是与客户关联的订单的值分隔列表。在 SQL 世界中,这将是一个子表。

PartNumber 是与每个订单关联的以 SubValue 分隔的部件列表。在 SQL 世界中,这将是 Order Child Table 的 Child 表。

像这样构建逻辑,说您想将客户购买的下一个订单上的第 5 件商品分配为“12345678”零件确实没有任何意义,因为您没有订单与零件相关联然而。

我相信有一些字典指令可以用来绕过它,但通常只知道在没有先建立关联值的情况下创建子值字段是不好的形式。当您开始忽略这一点时,您必须随时开始验证空字符串。沿着这条路走下去就是疯狂。

希望有帮助。

总而言之,您不能将特定的子值添加到未知值。您必须首先确定您希望子值标记所在的值,然后指定子值。

于 2015-05-05T17:13:57.393 回答
0

从您的代码段

DYNAMIC.ARRAY = '       '
DYNAMIC.ARRAY<1,-1,5> = '1,1,5'    ;* Adds to 1,1,1 not 1,1,5 when DYNAMIC.ARRAY contains only whitespaces before this operation

有很多事情需要注意

1) 空格与发生的情况无关,只要 ASCII 字符串中没有保留字符(@FM、@AM、@VM、@SVM 字符),结果将是相同的。

2) '-1' 选项应始终是最后一个选项,将其放在倒数第二个参数位置将不起作用。

您试图实现的目标可以通过多种不同的方式执行

DYNAMIC.ARRAY<1,-1> = @SVM:@SVM:@SVM:@SVM:"1,1,5" ;* appends subvalued string as last value

或者

DYNAMIC.ARRAY<1,-1> = STR(@SVM,4):"1,1,5" ;* appends subvalued string as last value

或者

TEMP = "" ;* needs to be initialised
TEMP<1,1,5> = "1,1,5" ;* puts string in 5th subvalue position
DYNAMIC.ARRAY<1,-1> = TEMP ;* appends TEMP string as last value

或者

VAL.POS = DCOUNT(DYNAMIC.ARRAY<1,1>,@VM) ;* find next value position
DYNAMIC.ARRAY<1,VAL.POS,5> = "1,1,5" ;* insert string into subvalue 5 of value
于 2015-06-08T00:54:07.457 回答
0

将数据插入动态数组时使用的“-1”是一种特殊符号,有自己的规则。使用 -1 本质上意味着“在最后一个属性、值或子值之后插入”(取决于表达式中 -1 的位置)。

在您的第一个示例中:

DYNAMIC.ARRAY = '       '
DYNAMIC.ARRAY<1,-1,5> = '1,1,5'

您是说将字符串“1,1,5”放在第一个属性中,在最后一个多值之后,作为第 5 个子值。我希望这会将字符串 '1,1,5' 放在 <1,2,5> 的位置,因为 'value' 位置的 -1 表示“放在最后一个值之后”,并且因为您的初始数组值是单个空格字符串,您已经在数组位置 <1,1,1> 中有一些东西,因此 -1 会导致添加新的值位置,而 5 定义子值位置。因此,结果是放入 <1,2,5> 的值

在您的第二个示例中:

DYNAMIC.ARRAY = '      '
DYNAMIC.ARRAY<-1> = '1,1,1'
DYNAMIC.ARRAY<1,-1,5> = '1,2,5'

您从第一行开始,将数组设置为包含一串空格的单个属性。下一行(带有 <-1>)是说“添加一个值为 '1,1,1' 的新属性”,这意味着您现在有一个具有 2 个属性的数组。第三行(带有 <1,-1,5>)表示在第一个属性中插入字符串 '1,2,5',在最后一个值之后,作为第 5 个子值,所以我再次期待结果成为字符串 '1,2,5' 在 <1,2,5>

我的评论基于我期望使用 R83 Pick 看到的内容,您没有说您正在使用 UniVerse 的哪个版本或“帐户风格”,所以这可能是这里问题的一部分。

可能是最初的空白数组被 UniVerse 视为“空/空属性”。我假设如果您将第一个示例中的空白值更改为“ABC”,那么一切都按预期工作吗?

于 2016-03-25T22:10:11.727 回答