Cobol 值为null时填充的空格

Cobol 值为null时填充的空格,cobol,Cobol,我正在用cobol写一个平面文件。 但是当变量为null时,它将不会填充空格。请帮忙 下面是平面文件结构声明的一些部分 01 Fs-IL494-REC. 03 FX-IL494-TRXN-1-10 PIC X(410) VALUE SPACES. 01 Wx-TRXN-INFO-BUF PIC X(410) VALUE SPACES. 01 Ws-TRXN-INFO REDEFINES Wx-TRXN-INFO-BUF

我正在用cobol写一个平面文件。 但是当变量为null时,它将不会填充空格。请帮忙

下面是平面文件结构声明的一些部分

01 Fs-IL494-REC.
   03 FX-IL494-TRXN-1-10                     PIC X(410) VALUE SPACES.

01 Wx-TRXN-INFO-BUF                PIC X(410) VALUE SPACES.
01 Ws-TRXN-INFO REDEFINES Wx-TRXN-INFO-BUF OCCURS 10 TIMES.
03 Wx-TRXN-DT                   PIC X(8).
03 Wx-TRXN-CDE                  PIC X(3).
03 W9-TRXN-AMT                  PIC S9(13)V9(2)
                                    SIGN LEADING SEPARATE.
03 Wx-TRXN-DESC                 PIC X(14).

Doing some query to retrive the records from database.

INITIALIZE Wx-TRXN-INFO-BUF.
INITIALIZE FX-IL494-TRXN-1-10.

ADD 1 TO W9-ARR-CNT
MOVE F9-IRC-TXN-DT TO Wx-TRXN-DT(W9-ARR-CNT)
MOVE F9-IRC-TXN-CDE TO Wx-TRXN-CDE(W9-ARR-CNT)
MOVE F9-IRC-TXN-AMT TO W9-TRXN-AMT(W9-ARR-CNT)
MOVE FX-IRC-TXN-DESC TO Wx-TRXN-DESC(W9-ARR-CNT)

MOVE Wx-TRXN-INFO-BUF TO FX-IL494-TRXN-1-10
我的假设:

  • 这是SQL(可能是DB/2)
  • 您正在执行一个
    选择进入:主机变量
  • 当相应的数据库表列包含
    NULL
    值时,
    主机变量
    就是您希望设置为
    空格
如果上述情况正确,则问题在于当从数据库中选择
NULL
值时,相应的
主机变量
不会更新。它将保留执行查询之前的任何值

您可能需要在查询中添加一个
空值指示符
。当空值指示器设置为小于零(通常为-1)的值时,相应的主机变量不变。这是您应该使用的模式:

EXEC SQL
   SELECT column-name-1,
          column-name-2
   INTO :host-var-1 :null-ind-1,
        :host-var-2 :null-ind-2
   FROM some-table
   WHERE bla bla bla...
END-EXEC
“额外”变量
null-ind-1
null-ind-2
应声明为
S9(4)用法COMP
。请注意,主机变量和null指示符之间的逗号“丢失”。当相应的
column-name-1
column-name-2
包含空值时,将为空指示符变量分配一个小于零的值。如果是这种情况,则
host-var-1
host-var-2
将保持不变(即保留
EXEC SQL
之前的任何值)

EXEC SQL
之后的代码中,您应该执行以下操作:

IF null-ind-1 < ZERO
   MOVE SPACES TO host-var-1
END-IF
IF null-ind-2 < ZERO
   MOVE SPACES to host-var-2
END-IF
如果null-ind-1<0
将空格移动到host-var-1
端到端IF
如果null-ind-2<零
将空格移动到host-var-2
端到端IF

我还看到程序员在执行
EXEC SQL
之前,只需初始化所有主机变量,在出现空列值的情况下,不必为查询中的空指示符操心(一旦知道DB2不会在出现空值的情况下更新主机变量,就不难理解为什么会这样做)..

Initialize与value子句绑定,它的行为可能古怪而烦人


简单的“将空间移动到我的记录”要好得多在您阅读之前…

这里没有任何问题。我通常不使用INITIALIZE,但我怀疑这是您遇到问题的原因。我们讨论的是哪个变量?请填写您的查询-SELECT语句等。这应该可以验证NealB下面的答案。@davidgorline-我想知道为什么您通常不使用INITIALIZE?@Buggabill:Joe Zitzelberger的回答抓住了我的想法。在我工作过的大多数商店里,如果一个老掉牙的buggy编译器做了一些不愉快的事情,这通常是民间传说的一部分,它与初始化有关。@DavidGorsline-我部分同意,但你最终遇到的问题是你可能会失败我猜动词的简洁和“魔力”吸引了我…:-)你觉得INITIALIZE与value子句有什么联系?你有“古怪”的例子吗?是的,如果需要,在本例中,移动空间更好。