RPG - 传递DS作为参数传递给程序

问题描述:

我写了一个字帖(/ COPY)程序具有该接口:RPG - 传递DS作为参数传递给程序

DCL-PI *N VARCHAR(5000); 
    FILE_NAME CHAR(10) CONST; 
    DS_OLD VARCHAR(5000) CONST; 
    DS_NEW VARCHAR(5000) CONST; 
END-PI; 

此过程由本示例程序调用。 FILE_DS_ *是具有PFFILE定义的外部DS。

EXEC SQL SELECT * INTO :FILE_DS_OLD FROM PFFILE FETCH FIRST 1 ROW ONLY; 

FILE_DS_NEW = FILE_DS_OLD; 
FILE_DS_NEW.MYFIELD = 'MODIFIED'; 

RESULT = MYPROC('PFFILE':FILE_DS_OLD:FILE_DS_NEW); 

我修改字段定义为VARCHAR其原始值,例如:

'PEN IS ON THE TABLE'

奇怪的是,在我有程序的入口点在FILE_DS_NEW DS上获得此值:

'MODIFIEDN THE TABLE' 

我发疯了,但找不到原因!任何想法?

DS是如何定义的:

D FILE_DS_OLD E DS     EXTNAME(PFFILE) QUALIFIED INZ 
D FILE_DS_NEW E DS     EXTNAME(PFFILE) QUALIFIED INZ 
+0

显示DS的定义 – Charles

+0

@Charles他们刚刚关闭了系统。明天早上我会添加它!你有什么线索吗?有问题的字段应该用VARYING关键字定义为字符。这是一个DDS物理文件,不需要SQL: – LppEdd

+0

@Charles如果你的意思是本地数据结构,我添加了定义。 – LppEdd

FILE_DS_NEW = FILE_DS_OLD; (1) 
FILE_DS_NEW.MYFIELD = 'MODIFIED'; (2) 
  1. 你将所有DS-数据从旧到新的DS。
  2. 您正在设置新ds的子字段。我敢打赌,你的myfield是char(8),所以你只需要改变新ds的前8个字节。

我猜你对varchar感到困惑。 Varchar数据类型只是将数据保存到字段限制的一种方法。这意味着如果你有一个varchar(10)并且只有'DATA'这个字段只使用6个字节。如果您将其更改为varchar(1000),则该字段仍将只使用6个字节。

我希望这会有所帮助。

+0

DSPFFD显示MYFIELD长度是256字节,它是一个可变长度字段。 那么,如何用“修改”来更改字段的整个值? 我甚至尝试过清除场地。 – LppEdd

+0

为什么要清除VARCHAR字段的整个值? “整个值”只与当前长度一样多。清除任何不止这些都会浪费处理器时间,并有效地删除使字段VARCHAR而不是CHAR的任何值。 – user2338816