我正在从我的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?输入宏的字符总数是多少?
发布于 2015-05-08 13:00:17
COBOL没有字符串,它有固定长度的字段,没有终止符.
所以对于字段-1你有三个“字符”。X的PICture可以允许256个可能的位值中的任何一个,但通常包含人类可读的值。
字段-2是一个二进制字段。你可以认为它是一个四字节的整数。
然而,在那里定义它的方式,COMP,对于一个S,它的最大值是999,999,999正,最小值是999,999,999负值。
如果它被定义为COMP-5,它可以包含这四个字节中所有位的全部范围。注意,编译器选项TRUNC(BIN)无论如何都会将COMP的行为修改为COMP-5,因此您需要与主机端检查TRUNC使用了什么编译选项(其他值是STD和OPT)。
在IBM大型机上,本机二进制字段是binary。在您的本地机器上,本地二进制值将是Little。例如,值16906090存储为X'01020304‘。
字段-3是小数点.它有9个字节长,但每个字节包含两个十进制数字,但低阶(最右边)字节除外,该字节包含一个数字,后面跟着一个符号说明符( PICture使用S,因此符号为C表示正,D表示负值,基数为16)。有一个隐含的小数点( V)和两个小数点。
字段-3X是另一个X字段。它可以在每个字节中再次包含任何位模式。您需要知道该字段的预期用途是什么(与其他字段一样,从名称中甚至没有任何线索,这是一种不好的方法)。
设计是错误的。将二进制和填充十进制字段从大型机发送到其他地方是完全愚蠢的,反之亦然。如果所有字段定义为X或9,而不使用COMP或COMP-3,那么您将非常容易地使用。
在最终的定义中缺少一个必需的句号/句号,但这很可能是一种消遣。
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). 这显示了两种处理符号的方法,一种是使用符号子句,另一种是使用经过数值编辑的定义。数值编辑定义中的.是一个实际的小数点,而不是一个隐含的小数点。
现在所有的数据都是“文本”或“字符”数据,这些数据应该很容易处理。EBCDIC (IBM大型机编码)到ASCII (可能是您的本地机器编码)很容易,并且可以在数据级别(而不是字段级别)完成。
对于您的来回通信来说,上面的内容对您来说要容易得多,更容易出错和更容易被审计。在内部,COBOL程序可以很容易地转换到/从这些程序内部使用。
如果您不让他们将您的界面更改为“字符”,那么您将需要进行各种额外的编码和测试,这是没有好处的。
使用ABC的布局示例,123456789 (负)和123456789012345.67 (正)将是
ABC-123456789+123456789012345.67注意,除了没有字段分隔符之外,也没有数据/记录分隔符。没有“空”。
除了实际的小数点,还有一种替代方法,那就是提供一个缩放因子。此外,您可以“硬编码”在您的程序中的缩放。
我假设上述数据对您来说都很容易接受和创建。请尝试更改您的界面。如果他们拒绝,请向你的老板记录额外代码的影响,而额外的代码只是为了在你考虑使用它之前就能够“理解”这些数据。这太傻了。
为了为您创建轻松格式的数据,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如果重新定义有目的,它将需要第四个字段的特定代码,但这对我来说很难猜测,但一旦知道实际需要,编写代码就不困难了。
没有什么比你必须编写的代码更繁琐、更简单的了。
https://stackoverflow.com/questions/30122554
复制相似问题