问题:
是否使用MOVEL函数从RPG中的文本中获取子串n个字符,该函数采用长度为x的文本并将其存储到容量为n的变量中?
或者获取前n个字符的唯一保存方法是使用SUBST?
问题的背景是我的同事从数据库中获取前3个字符,其中30个字符长度是使用MOVEL到一个长度只有3个字符的变量(比如截断其余部分)。奇怪的方式,有时接收变量显示减去字符(' - '),有时不显示。所以我假设使用MOVEL不是一种安全的方法。我想C中的字符串总是以'\ 0'结尾,你需要使用strcpy函数来获取复制保存,而不是使用=运算符分配。
谁知道RPG熟悉这个问题?
答案 0 :(得分:3)
编辑:MOVEL如何处理标志的示例。
dcl-s long char(20) inz('CORPORATION');
dcl-s short char(3) inz('COR');
dcl-s numb packed(3: 0);
// 369
c movel long numb
dsply numb;
// -369
c movel short numb
dsply numb;
*inlr = *on;
答案 1 :(得分:1)
对于RPG中的带符号数字字段,符号保存在字段的最后一个字节的区域中。所以123是X' F1F2F3'但-123是X' F1F2D3'。如果您将这些字段视为字符串,则它们将包含123和12L。
在您的计划中,您正在转移类似于" 123 AAAAAL"到3位数字字段,这样你就得到了X' F1F2F3'但因为最后一个角色是X' D3'将结果更改为具有D区域,即X' F1F2D3' 您的异常取决于第30个字符包含的内容。如果它是}或任何大写字母J到R那么你会得到一个负面结果。 [前三个字符是数字还是字母并不重要,因为它只是字节的后半部分,数字,在你的例子中很重要。]
IBM手册说: 如果因子2是字符且结果字段是数字,则如果从因子2的最右侧位置开始的区域是十六进制D(减去区域),则减号区域将移动到结果字段的最右侧位置。但是,如果从因子2的最右侧位置开始的区域不是十六进制D,则将正区域移动到结果字段的最右侧位置。其他结果字段位置仅包含数字字符。
唐