2012-08-02 61 views
0

我有接受在AS400系统日期保存日期字段值插入物理文件

显示文件包含由* DATE

日期字段我有有一个日期栏的物理文件日期字段。当我尝试将我的屏幕的其他字段保存到此物理文件上时,我还想保存此系统日期。

但我无法为此内置Date函数添加字段名称。

我还有什么可以在我的显示屏中有一个日期字段,它将自动接受系统日期并具有DD/mm/yy格式的输入格式,但在内部数据库中必须将其保存为yy/mm/dd。

为了在日期格式的数据库中进行此内部转换,我初始化了一个名为“date”的长度为6的小数字段,小数点后十位,小数点位置为0。

请指导如何将屏幕上的系统日期以这种格式保存到物理文件中。

重新编辑: 我有级接收日期的PF定义如下(其DDS)

0004.00  A   GRCVDT   6P 0 

我避免使用日期“L”数据类型作为我想执行日期转换,因为我有上面的解释。

+0

恐怕是这里的混乱。使用L数据类型frees_you_from必须将_convert_从一种格式转换为另一种格式!作为日期存储的日期可以以任何格式(输出)表示,并可以从任何格式(输入)填充。例如即使mydate默认定义为* ISO(或任何其他)格式,mydate =%date('31 .07.2012',* EUR)或DUMMY =%Char(mydate,* USA)。系统知道这是什么,因为这是一个日期字段。 – Dennis 2012-08-02 18:56:43

+0

@ Dennis我实际上想对日期字段执行一些计算,就像给定TO和FROM值一样,它必须返回那个Period的记录。 – techie 2012-08-04 06:34:17

+0

你可以用日期字段或数字字段来做到这一点。你想继续转换/从YYYYMMDD,这取决于你。我只是说18年来没有必要这样做。日期字段已经存在很长时间((!!!))。唯一的问题是缺乏采用(或者可能缺乏教育)。 Scott Klement说(解释)从头开始培养新程序员要比现有人更容易使用“更新”(即过去15年左右)功能。猜猜他是对的。 – Dennis 2012-08-04 19:49:22

回答

1

该文件是通过DDS或SQL创建的?如果DDS,那么请你选择的字段添加到DDS规范,并指定L的数据类型:

 A   MYDATE   L 

然后用CHGPF,指定源文件和成员姓名;系统将添加新列。

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

即使您的文件DDS描述,您可以通过使用像SQL语句添加日期列: ALTER TABLE MYTABLE添加列指明MyDate日期不为空默认

(当然,如果你做到这一点,你不能重新从DDS文件不再不失新列)

然后在你的程序,只是在写数据之前,这样做: 指明MyDate =%日期

有AR这里有很多假设:你正在使用ILE,你知道如何修改和重新编译程序,你使用的是自由格式还是可以翻译上面的“variable = value”语法,...)

还有其他的方法将系统日期放入一个文件中,而程序不必做任何特殊的事情;我们实际上需要了解更多有关该应用程序的内容,以帮助您远远超出此高层建议。

+0

谢谢你的回应。问题不在于我如何去做更改或编译,而是与执行日期类型转换的逻辑有关。我已经在PF中定义了我的日期字段,如Reedits所示,我有d显示文件我通过* DATE将日期定义为系统日期,因此我无法获取该值。是否有任何使用该变量执行计算的方法? – techie 2012-08-02 17:11:54

+0

那么,如果你想获取系统日期,为什么你必须从显示屏上“获取”它?现在的系统日期并不是偶然出现在显示屏上,这在技术上可能是几个月前的事。 %DATE(对于真实的日期值)或UDATE(或UMONTH,UDAY,UYEAR,不管你喜欢)可以帮助你。或者@操作代码,正如@buckcalabro在他的回答中所指出的那样。 – Dennis 2012-08-02 18:58:40

3

在显示文件上,* DATE仅为输出。它不能被程序读取。

听起来像数据库表有一个名为DATE的小数字段;不是称为DATE的日期字段。使用日期数据类型会使日期操作变得更加简单 - 请参阅Dennis的回答以获取相关建议。如果不可能使用日期数据类型,并且您必须使用十进制数据类型来保存日期值,请查看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   
+0

非常感谢那些信息。但是你是否仍然可以分享一些想法,我如何能够实际执行日期的类型转换。我说我通过十进制数据类型声明接受日期格式为* EUR格式的显示文件。现在我想将其转换为yyyy-mm-dd格式,因为我想通过减去此值的天数部分(因此转换类型)来获取数据。赞赏您的帮助 – techie 2012-08-02 17:19:02

+0

@techie - 请参阅我添加到原始文章中的评论。 – Dennis 2012-08-02 19:07:14

+0

如果你想得到“花哨”,你可以说'EVAL-CORR ymd = eur;'这将根据匹配的名称移动3个小字段。 – WarrenT 2012-08-03 14:06:46

相关问题