Сохранение значения поля даты в физический файл

У меня есть поле даты, которое принимает системную дату в AS400.

Файл отображения содержит поле даты по *DATE

У меня есть физический файл со столбцом даты. Когда я пытаюсь сохранить другие поля моего экрана в этот физический файл, я также хотел бы сохранить эту системную дату.

Но я не могу добавить имя поля к этой встроенной функции Date.

Как еще я могу иметь поле даты на моем экране дисплея, которое будет автоматически принимать системную дату и иметь формат в формате ДД/мм/гг для ввода, но внутри базы данных оно должно сохранять его как гг/мм/дд.

Для того, чтобы иметь это внутреннее преобразование в моей базе данных формата даты, я инициализировал поле даты с именем «дата» длиной 6, упакованное десятичное число, 0 десятичная позиция.

Пожалуйста, объясните, как сохранить системную дату с экрана в этом формате в физический файл.

Отредактировано: у меня есть дата получения оценки PF, которая определяется следующим образом (это DDS).

   0004.00      A            GRCVDT         6P 0  

Я воздерживаюсь от использования типа данных «L» для даты, так как хочу выполнить преобразование даты, как я объяснил выше.


person techie    schedule 02.08.2012    source источник
comment
Боюсь, здесь путаница. Использование типа данных L освобождает_вас_от необходимости конвертировать даты из одного формата в другой! Даты, которые хранятся как даты, могут быть представлены в любом формате (выход) и заполнены из любого формата (вход). например mydate = %date('31.07.2012', *EUR) или DUMMY = %Char(mydate, *USA) несмотря на то, что mydate по умолчанию определяется как формат *ISO (или любой другой). Система знает, что делать с потому что это поле даты.   -  person Dennis    schedule 02.08.2012
comment
@Dennis Я действительно хочу выполнить некоторые вычисления в поле даты, например, учитывая значение TO и FROM, оно должно возвращать записи этого периода. Отсюда и преобразование.   -  person techie    schedule 04.08.2012
comment
Вы можете сделать это с полями даты или с числовыми. Вы хотите продолжать преобразование в/из ГГГГММДД, это зависит от вас. Я просто говорю, что в этом не было необходимости более 18 лет. Поля даты существуют так долго ((!!!)). Единственная проблема — отсутствие усыновления (или, возможно, отсутствие образования). Скотт Клемент сказал (перефразируя), что легче вырастить нового программиста с нуля, чем заставить существующего использовать новые (имеется в виду последние 15 лет или около того) функции. Думаю, он был прав.   -  person Dennis    schedule 04.08.2012


Ответы (2)


В отображаемом файле *DATE предназначен только для вывода. Программа не может его прочитать.

Похоже, что в таблице базы данных есть десятичное поле с именем DATE; не поле даты с именем DATE. Использование типа данных даты значительно упростит манипулирование датами - см. ответ Денниса за советом по этому поводу. Если невозможно использовать тип данных даты, и вы должны использовать десятичный тип данных для хранения значения даты, посмотрите RPG TIME код операции. Это позволит вам извлечь текущую системную дату в программную переменную. Точный формат, в котором будет возвращена дата, зависит от настройки формата даты вашего задания. (WRKJOB, чтобы увидеть это). Вы можете использовать структуру данных и серию операторов EVAL, чтобы изменить порядок элементов даты, если вам это нужно.

РЕДАКТИРОВАТЬ образец кода для преобразования EUR в YYMMDD

 d eur             ds                  qualified
 d ddmmyy                         6s 0
 d  dd                            2s 0 overlay(ddmmyy: 1)
 d  mm                            2s 0 overlay(ddmmyy: 3)
 d  yy                            2s 0 overlay(ddmmyy: 5)

 d ymd             ds                  qualified
 d yymmdd                         6s 0
 d  yy                            2s 0 overlay(yymmdd: 1)
 d  mm                            2s 0 overlay(yymmdd: 3)
 d  dd                            2s 0 overlay(yymmdd: 5)

 c/free
   eur.ddmmyy = 020812;
   ymd.yy = eur.yy;
   ymd.mm = eur.mm;
   ymd.dd = eur.dd;
   dsply ymd.yymmdd;
   *inlr = *on;
  /end-free          
person Buck Calabro    schedule 02.08.2012
comment
Большое спасибо за эту информацию. Но не могли бы вы поделиться некоторыми идеями о том, как я могу на самом деле выполнить преобразование типа даты. Допустим, я принимаю форму даты в файле отображения в формате * EUR через объявление десятичного типа данных. Теперь я хочу преобразовать в формате гггг-мм-дд, так как я хочу получить данные, вычитая часть дней из этого значения (отсюда и преобразование типов). Благодарим вас за помощь - person techie; 02.08.2012
comment
@techie - См. также комментарий, который я добавил к вашему исходному сообщению. - person Dennis; 02.08.2012
comment
И если вы хотите пофантазировать, вы можете сказать EVAL-CORR ymd=eur;, что переместит 3 небольших поля в соответствии с совпадающими именами. - person WarrenT; 03.08.2012
comment
@BuckCalabro В моем файле дисплея, как я должен называть свое поле даты. Также это должно быть включено в PF, который содержит мою инициализацию для даты. Поскольку я очень наивен на этой платформе, был бы признателен за ваше руководство. - person techie; 04.08.2012
comment
Ответ на вопрос «как определить поле даты отображаемого файла» полностью зависит от того, как остальная часть вашей системы определяет поля даты. Представьте себе удивление вашего конечного пользователя, если он введет 6 цифр в каждое поле даты в системе, а затем дойдет до вашего и должен ввести 8 августа 2012 года или 2012-08-08? Сделайте поле даты таким же, как и остальная часть системы, возможно, таким же, как GRCVDT в вашем PF. - person Buck Calabro; 06.08.2012

Этот файл создан через DDS или SQL? Если DDS, добавьте поле по вашему выбору в спецификации DDS и укажите тип данных L:

     A            MYDATE          L

Затем используйте CHGPF, указав исходный файл и имя элемента; система добавит новый столбец.

CHGPF FILE(MYLIB/MYFILE)           
      SRCFILE(MYSRCLIB/MYSOURCE)      
      SRCMBR(MY_MBR)               

Даже если ваш файл описан в DDS, вы можете добавить столбец даты с помощью оператора SQL, например: изменить таблицу mytable добавить столбец mydate date not null по умолчанию

(Но, конечно, если вы это сделаете, вы больше не сможете воссоздать файл из DDS без потери нового столбца)

Затем в вашей программе, непосредственно перед ЗАПИСЬЮ данных, выполните: mydate = %date

Здесь много предположений: вы используете ILE, умеете модифицировать и перекомпилировать программу, используете свободную форму или можете перевести приведенный выше синтаксис "переменная = значение",...)

Есть и другие способы получить системную дату в файл, при этом ваша программа не должна делать ничего особенного; нам действительно нужно знать больше о приложении, чтобы помочь намного больше, чем этот совет высокого уровня.

person Dennis    schedule 02.08.2012
comment
Спасибо за ответ. Проблема заключается не в том, как я могу внести изменения или компиляцию, а в логике выполнения преобразования типа даты. Я определил свое поле даты в PF, как показано в Reedits, у меня есть файл отображения, где я дата определена как системная дата *DATE, поэтому я не могу получить это значение. Есть ли способ выполнить расчет с этой переменной? - person techie; 02.08.2012
comment
Хорошо, если вы пытаетесь получить системную дату, почему вы должны получать ее с дисплея? Системная дата сейчас, а не то, что случайно отображается на дисплее, что технически может быть несколько месяцев назад. %DATE (для истинного значения даты) или UDATE (или UMONTH, UDAY, UYEAR, используемые по вашему усмотрению) могут вам помочь. Или код операции TIME, как указал @buckcalabro в своем ответе ниже. - person Dennis; 02.08.2012