我正在调用从我的java应用程序使用COBOL创建的DB2存储过程。
输入宏(类型varchar
):
01 SP1-INPUTS.
05 FIELD-1 PIC X(03).
05 FIELD-2 PIC S9(09) COMP.
05 FIELD-3 PIC S9(15)V9(02) COMP-3.
05 FIELD-3X REDEFINES FIELD-3 PIC X(09)
要测试存储过程,我只知道FIELD-1
的值。对于其他领域,要填充打包部分,我应该放多少个零?请查看我编写的代码,并在传递虚拟值时感到困惑。
String field1="abc";
String field2="000000000"; // 9 zeroes, correct?
String field3="00...0" // should I give 18 zeroes or 9 zeroes?
输入宏完全有多少个字符?
答案 0 :(得分:4)
COBOL没有字符串,它有固定长度的字段,没有终结符。
因此对于FIELD-1,您有三个"字符"。 X的PIC可以允许256个可能的位值中的任何一个,但通常包含人类可读的值。
FIELD-2是二进制字段。你可以认为它是一个四字节整数。
然而,在那里定义它的方式,COMP,有一个S,它的最大值为999,999,999正,最小值为999,999,999负。
如果它被定义为COMP-5,它可以包含这四个字节中所有位的全部范围。请注意,编译器选项TRUNC(BIN)无论如何都会修改COMP到COMP-5的行为,因此您需要检查主机端是什么编译选项用于TRUNC(其他值是STD和OPT)。
在IBM Mainframe上,本机二进制字段是Big Endian。在本地计算机上,本机二进制值为Little Endian。例如,值16906090将存储为X< 01020304'。
FIELD-3是压缩十进制的。它是9个字节长,但每个字节包含两个十进制数字,除了低位(最右边)字节,其中包含一个数字后跟一个符号说明符(PICture使用S,因此符号应为C表示正数和D为负数,基数为16)。有一个隐含的小数点(V
)和两位小数。
FIELD-3X是另一个X字段。它可以再次包含每个字节中的任何位模式。你需要知道那个领域的用途是什么(这些名称甚至没有丝毫的线索,就像其他人一样,这是一种糟糕的做事方式)。
设计错了。将二进制和压缩十进制字段从大型机发送到其他地方或者反之亦然是完全不可靠的。如果全部这些字段被定义为X或9而没有COMP或COMP-3的USAGE(隐含),那么您就可以轻松驾驭。
最终定义中缺少一个必需的句号/句号,但这可能是一个糊涂。
01 SP1J-INPUTS.
05 a-meaningful-name PIC X(03).
05 another-meaningful-name PIC S9(09)
SIGN LEADING SEPARATE.
05 a-third-meaningful-name PIC +9(15).9(02).
05 yet-annother-meaningful-name
REDEFINES a-third-meaningful-name
PIC X(19).
这显示了使用SIGN子句或使用数字编辑定义处理符号的两种方法。数字编辑定义中的.
是V的实际小数点,而不是隐含的小数点。
所有数据现在都是" text"或"字符"数据,应该很容易处理。 EBCDIC(IBM大型机编码)到ASCII(可能是您的本地机器编码)很简单,可以在数据级别而不是字段级别完成。
对于您的往复式沟通,上述内容对您来说会更容易,更不容易出错,更容易审核。在内部,COBOL程序可以轻松地转换为/从内部使用它们。
如果您不让他们将您的界面更改为"字符"那么你将有各种额外的编码和测试,没有任何好处。
ABC,123456789(负面)和123456789012345.67(正面)布局的例子将是
ABC-123456789+123456789012345.67
请注意,除了没有字段分隔符之外,还没有数据/记录分隔符。不,#34; null" s。
实际小数点有一个替代方案,即提供缩放系数。此外,你可以"硬编码"程序中的缩放。
我认为上述数据对您来说都很容易接受和创建。请尝试更改您的界面。如果他们拒绝,请向您的老板记录额外代码的影响,并且额外的代码只是为了能够理解"在您考虑使用它之前的数据。这很愚蠢。
要为您创建简单格式数据,COBOL程序需要执行此操作:
MOVE FIELD-1 TO a-meaningful-name
MOVE FIELD-2 TO another-meaningful-name
MOVE FIELD-3 TO a-third-meaningful-name
要从您那里接收简单格式的数据,COBOL程序需要这样做:
MOVE a-meaningful-name TO FIELD-1
MOVE another-meaningful-name TO FIELD-2
MOVE a-third-meaningful-name TO FIELD-3
如果REDEFINES有目的,则需要第四个字段的特定代码,但这对我来说很难猜测,但一旦知道实际需要就不难编码。
没有任何繁重的东西,而且比你必须编码的东西简单得多。