首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COBOL comp和comp-3字段的Java映射

COBOL comp和comp-3字段的Java映射
EN

Stack Overflow用户
提问于 2015-05-08 11:19:13
回答 1查看 2.1K关注 0票数 5

我正在从我的java应用程序调用使用COBOL创建的DB2存储过程。

输入宏(varchar类型):

代码语言:javascript
复制
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的值。对于其他字段,填充包装的部分,我应该放多少个零?请查看我在传递虚拟值时所编写和混淆的代码。

代码语言:javascript
复制
String field1="abc";
String field2="000000000"; // 9 zeroes, correct?
String field3="00...0" // should I give 18 zeroes or 9 zeroes?

输入宏的字符总数是多少?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,那么您将非常容易地使用。

在最终的定义中缺少一个必需的句号/句号,但这很可能是一种消遣。

代码语言:javascript
复制
   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 (正)将是

代码语言:javascript
复制
ABC-123456789+123456789012345.67

注意,除了没有字段分隔符之外,也没有数据/记录分隔符。没有“空”。

除了实际的小数点,还有一种替代方法,那就是提供一个缩放因子。此外,您可以“硬编码”在您的程序中的缩放。

我假设上述数据对您来说都很容易接受和创建。请尝试更改您的界面。如果他们拒绝,请向你的老板记录额外代码的影响,而额外的代码只是为了在你考虑使用它之前就能够“理解”这些数据。这太傻了。

为了为您创建轻松格式的数据,COBOL程序需要这样做:

代码语言:javascript
复制
MOVE FIELD-1                  TO a-meaningful-name 
MOVE FIELD-2                  TO another-meaningful-name
MOVE FIELD-3                  TO a-third-meaningful-name

要从您接收轻松格式的数据,COBOL程序需要这样做:

代码语言:javascript
复制
MOVE a-meaningful-name        TO FIELD-1 
MOVE another-meaningful-name  TO FIELD-2     
MOVE a-third-meaningful-name  TO FIELD-3

如果重新定义有目的,它将需要第四个字段的特定代码,但这对我来说很难猜测,但一旦知道实际需要,编写代码就不困难了。

没有什么比你必须编写的代码更繁琐、更简单的了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30122554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档