2016-11-11 10 views
0

я написал тетрадку процедуру (/ 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_ * - внешние DS с определением PFFILE.

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

ответ

0
FILE_DS_NEW = FILE_DS_OLD; (1) 
FILE_DS_NEW.MYFIELD = 'MODIFIED'; (2) 
  1. Вы двигаетесь все DS-данные от старого к новому DS.
  2. Вы устанавливаете подполе нового ds. Уверен, что myfield - char (8), поэтому вы просто меняете первые 8 байтов новых ds.

Я предполагаю, что вы смущены о варчаре. Тип данных Varchar - это всего лишь способ сохранить данные только до предела поля. Это означает, что если у вас есть varchar (10) и просто «DATA», это поле использует только 6 байтов. Если вы измените его на varchar (1000), поле будет по-прежнему использовать всего 6 байтов.

Надеюсь, это поможет.

+0

DSPFFD показывает, что длина MYFIELD составляет 256 байтов, и это поле переменной длины. Итак, как мне изменить все значение поля с помощью «MODIFIED»? Я даже попробовал очистить поле раньше. – LppEdd

+0

Зачем очищать 'целое значение 'поля VARCHAR? Значение 'whole value 'равно только текущей длине. Очистка больше, чем просто отнимает процессорное время и эффективно удаляет любую ценность создания поля VARCHAR вместо CHAR. – user2338816

 Смежные вопросы

  • Нет связанных вопросов^_^