ws-var1
属于pic x(3)
。
ws-var2
也是pic x(3)
。
我在表ws-var1 = "1 "
中有一个字段,我想将其值移到另一个字段ws-var2
,该字段应包含" 1"
的值。 ws-var1
和ws-var2
都是字母数字字段。请提出合适的方法来实现这一目标。
答案 0 :(得分:1)
假设您通常要对字符串进行右对齐(不包含中间空格),可以使用:
INSPECT ws-var1 TALLYING num-chars FOR CHARACTERS BEFORE SPACE
MOVE ws-var1 (1:num-chars) TO ws-var2 (3 - num-chars + 1:)
其中num-chars
是初始值为0的数字数据项。
(或者,如果您有幸使用具有TRIM内在函数的编译器,则可以将ws-var2
声明为JUSTIFIED RIGHT并简单地MOVE FUNCTION TRIM(ws-var1) TO ws-var2
。)
答案 1 :(得分:0)
你当然可以用循环来做。问题是,你只有三个字节。对于三个字节长的东西,除了基本的东西之外做任何其他事情都是过度的,因为超出合理范围的资源被消耗掉了。如果没有支付资源,并且在每天使用的许多程序中传播效率低下的代码并不担心任何人,那么还有其他方法可以做到这一点。
01 A-MEANINGFUL-NAME.
88 AMN-NO-ACTUAL-DATA VALUE SPACE.
05 AMN-FIRST-TWO-BYTES-OF-DATA.
10 AMN-FIRST-BYTE PIC X.
10 FILLER PIC X.
88 AMN-ONE-BYTE-OF-DATA VALUE SPACE.
05 FILLER PIC X.
88 AMN-TWO-BYTES-OF-DATA VALUE SPACE.
01 B-MEANINGFUL-NAME.
05 BMN-FIRST-BYTE PIC X.
05 BMN-SECOND-TWO-BYTES.
10 FILLER PIC X.
10 BMN-THIRD-BYTE PIC X.
MOVE SPACE TO B-MEANINGFUL-NAME
EVALUATE TRUE
WHEN AMN-NO-ACTUAL-DATA
CONTINUE
WHEN AMN-ONE-BYTE-OF-DATA
MOVE AMN-FIRST-BYTE TO BMN-THIRD-BYTE
WHEN AMN-TWO-BYTES-OF-DATA
MOVE AMN-FIRST-TWO-BYTES-OF-DATA
TO BMN-SECOND-TWO-BYTES
WHEN OTHER
MOVE A-MEANINGFUL-NAME TO B-MEANINGFUL-NAME
END-EVALUATE
这是一种有效而清晰的方法。对于许多人来说可能打字太多了,但那些人并不认为需要一个容易理解和维护的程序。只需在目标中消隐需要它的那些字节,就可以提高效率,但你可以自己尝试一下。
赢得工作"原样"具有嵌入式空间,但可以轻松更改。
另外,因为你使用了编辑器的强大功能,所以打字并不多。
或者
01 A-MEANINGFUL-NAME PIC XXX.
01 B-MEANINGFUL-NAME PIC XXX.
01 FILLER
REDEFINES B-MEANINGFUL-NAME.
05 C-MEANINGFUL-NAME PIC XXX JUST RIGHT.
UNSTRING A-MEANINGFUL-NAME
DELIMITED BY SPACE
INTO C-MEANINGFUL-NAME
没有那么多打字。效率较低。还是很清楚。
无法使用嵌入式空间,但可以轻松地包含代码以使其完成(仅限条件使用)。
或者
01 A-MEANINGFUL-NAME PIC XXX.
01 B-MEANINGFUL-NAME PIC XXX.
01 C-MEANINGFUL-NAME
REDEFINES B-MEANINGFUL-NAME PIC ZZ9.
COMPUTE C-MEANINGFUL-NAME = FUNCTION NUMVAL
( A-MEANINGFUL-NAME )
不是那么多打字,可能效率更低,可能不太清楚,并且依赖于源是格式良好的数字。
不能使用嵌入式空间,因为这不是一个格式正确的数字。
正如Edward H的回答所示,可以使用参考修改。这是第一个重写的示例,作为通过引用修改可以丢失清晰度的示例:
MOVE SPACE TO B-MEANINGFUL-NAME
EVALUATE TRUE
WHEN A-MEANINGFUL-NAME = SPACES
CONTINUE
WHEN A-MEANINGFUL-NAME (2:1) = SPACES
MOVE A-MEANINGFUL-NAME (1:1)
TO B-MEANINGFUL-NAME (3:1)
WHEN A-MEANINGFUL-NAME (3:1) = SPACES
MOVE A-MEANINGFUL-NAME (1:2)
TO B-MEANINGFUL-NAME (2:)
WHEN OTHER
MOVE A-MEANINGFUL-NAME TO B-MEANINGFUL-NAME
END-EVALUATE
为此生成的可执行代码将(应该)与原始示例相同,因此效率很高,但有希望承认它更难以阅读。 (当然,如果我要对其进行编码,我会以不同的方式对其进行格式化,至少使其更容易阅读,但我怀疑" VAR1" -person甚至不会输入更多空白)。
答案 2 :(得分:0)
01 WS-VAR-1.
88 FL-VAR1-999 VALUE SPACES.
03 WS-VAR1-999 PIC 9(03).
01 FILLER
REDEFINES WS-VAR-1.
03 WS-VAR1-99 PIC 9(02).
03 FILLER PIC X(01).
88 FL-VAR1-99 VALUE SPACES.
01 FILLER
REDEFINES WS-VAR-1.
03 WS-VAR1-9 PIC 9(01).
03 FILLER PIC X(02).
88 FL-VAR1-9 VALUE SPACES.
01 WS-VAR-2.
03 WS-VAR1-ZZ9 PIC Z(02)9(01).
IF FL-VAR1-999 MOVE ZERO TO WS-VAR1-ZZ9
ELSE
IF FL-VAR1-9 MOVE WS-VAR1-99 TO WS-VAR1-ZZ9
ELSE
IF FL-VAR1-99 MOVE WS-VAR1-9 TO WS-VAR1-ZZ9
ELSE MOVE WS-VAR1 TO WS-VAR2.
这都是重新定义的问题......