Universe基本动态数组相对运算

时间:2015-05-03 23:51:47

标签: universe

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

下面的操作不会在位置< 1,1,5>中添加新元素。正如我所预料的那样,将“1,1,5”添加到DYNAMIC.ARRAY< 1,1,1&gt ;.

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&lt; 1,1,1&gt; ='1,1,1'和DYNAMIC.ARRAY&lt; 1,2,5&gt; ='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

这是Universe中的预期行为吗?

3 个答案:

答案 0 :(得分: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个项目并且#34; 12345678&#34;那么它真的没有任何意义。因为你还没有订购与零件相关的订单。

我相信你可以使用一些字典指令来绕过它,但通常只知道创建一个子值字段而不首先建立一个关联值是不好的形式。当你开始忽略这个时,你必须在转弯时开始验证空字符串。走这条路是疯狂的。

希望有所帮助。

总而言之,您无法将特定的子值添加到未知值。您必须首先确定要将子值标记放在哪个值,然后指定子值。

答案 1 :(得分: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

答案 2 :(得分:0)

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

在你的第一个例子中:

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

你说的是把字符串'1,1,5'放在第一个属性中,在最后的多项式之后,作为第5个子值。 我希望这将字符串'1,1,5'放在位置&lt; 1,2,5&gt;因为'value'位置的-1表示“put after last value”,并且因为你的初始数组值是一个单独的空格字符串,所以你已经在数组位置&lt; 1,1,1&gt;中有了一些东西。所以-1导致添加新的值位置,5定义子值位置。因此,结果是放在&lt; 1,2,5&gt;

中的值

在你的第二个例子中:

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

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

我的评论是基于我期望看到的使用R83 Pick,你没有说你正在使用的UniVerse的版本或'帐户风味',所以也许这就是问题的一部分。

可能是UniVerse将初始的空格数组视为'empty / null属性'。我假设如果你改变你的第一个例子中的空格值来说'ABC'然后它按预期工作?