Retek中Form怎么实现日历功能:calend45

刚刚才开始接触retek系统,对它提供的一些form模版也不熟悉,为了实现一个日历选择日期的功能,着实让我下了一点心思,这会弄了一个简易版的发在这里,希望为以后的开发提供一些借鉴和便利,先看图:

日历效果展示

图1:日历效果展示图

form结构图

图2:form结构图

日历的实现思想:

两个Windows:主窗口(w_main)、日历窗口(w_date)

两个canvas:主画布(c_main)、日历画布(c_date)

两个block:主数据块(b_main)、日历块(b_date)

需要注意的是日历块(b_date)中有非常多的item,注意item级上的trigger,在做日历的时候,b_date数据块可以不用管,直接复制模版就好。主数据块(b_main)中为了方便介绍,我就放了两个item,一个text item,一个bottom,其中务必将text item设置为date类型,之前我就是由于忘了设置类型,结果老是报错。

block块

图3:block块

最关键的一步,给日历选择item(pb_select)、日历容器item(ti_date_item)定义触发器trigger(2014-10-23备注:为了使代码更完整,后来修改了代码,但是图示和form暂时未改,以下代码可能跟图示有所不符,但是建议参考以下代码,以下代码均可直接复制,使用的时候修改下item名就好了):

(1)pb_select

when-button-pressed实现代码如下:

BEGIN
   Go_Item('B_HEADER.START_TRANSIT_TIME');
   if FORM_SUCCESS then
      Do_Key('List_Values');
   end if;

EXCEPTION
   when FORM_TRIGGER_FAILURE then
      raise;
   when OTHERS then
      emessage(SQLERRM);
      raise FORM_TRIGGER_FAILURE;
END;

(2)ti_date_item

when-new-item-instant实现代码如下:

BEGIN
   Validate (item_scope);
   if (P_CALENDAR.LP_date_ok is NOT NULL) then
      if (P_CALENDAR.LP_date_ok = 'Y') then

         :B_HEADER.START_TRANSIT_TIME := P_CALENDAR.LP_current_date;

         P_CALENDAR.LP_date_ok := NULL;
         DO_KEY('NEXT_ITEM');
      else
         P_CALENDAR.LP_date_ok := NULL;
      end if;
   end if;
EXCEPTION
   when FORM_TRIGGER_FAILURE then
      Raise;
   when OTHERS then
      Emessage(SQLERRM);
      Raise FORM_TRIGGER_FAILURE;
END;

pre-text-item实现代码如下:

DECLARE
   L_display_date		VARCHAR2(12);
   L_entry_date		VARCHAR2(12);
BEGIN
   if :GLOBAL.DATE_ENTRY_FORMAT is NULL then
	emessage ('DATE_ENTRY_FORMAT_REQ');
   else
	L_entry_date := :GLOBAL.DATE_ENTRY_FORMAT;
   end if;
   ---
   TOOL_ENV.GETVAR ('NLS_DATE_FORMAT', L_display_date);
   ---
   if (L_display_date is null) then
	emessage ('NLS_DATE_FORMAT_REQUIRED');
	L_display_date := 'DD-MON-RR';
   end if;
   ---
   if (L_entry_date is null) then
	L_entry_date := 'DD-MON-RR';
   end if;
   ---
   if Get_Item_Property(:system.trigger_item, UPDATEABLE) = 'FALSE' then
	set_item_property (:system.trigger_item, FORMAT_MASK, L_display_date);
   else
	set_item_property (:system.trigger_item, FORMAT_MASK, L_entry_date);
   end if;
EXCEPTION
  when FORM_TRIGGER_FAILURE then
     Raise;
  when OTHERS then
     emessage(SQLERRM);
     Raise FORM_TRIGGER_FAILURE;
END;

post-text-item实现代码如下:

DECLARE
   L_display_date		VARCHAR2(12);
BEGIN
   TOOL_ENV.GETVAR ('NLS_DATE_FORMAT', L_display_date);
   ---
   if (L_display_date is null) then
      emessage ('NLS_DATE_FORMAT_REQUIRED');
      L_display_date := 'DD-MON-RR';
   end if;
   ---
   set_item_property (:system.trigger_item, FORMAT_MASK, L_display_date);
EXCEPTION
  when FORM_TRIGGER_FAILURE then
     Raise;
  when OTHERS then
     emessage(SQLERRM);
     Raise FORM_TRIGGER_FAILURE;
END;

key-listval实现代码如下:

DECLARE
   L_return_to       VARCHAR(256) := 'B_HEADER.START_TRANSIT_TIME';
   L_default_date    DATE := NULL;
   L_min_date        DATE := NULL;
   L_max_date        DATE := NULL;
   L_error_message   RTK_ERRORS.RTK_TEXT%TYPE;

BEGIN
   L_min_date := TRUNC(SYSDATE);
   P_CALENDAR.SHOW_CALENDAR (L_return_to => L_return_to,
                             L_default_date => L_default_date,
                             L_min_date => L_min_date,
                             L_max_date => L_max_date);

EXCEPTION
   when FORM_TRIGGER_FAILURE then
      Raise;
   when OTHERS then
      emessage(SQLERRM);
      raise FORM_TRIGGER_FAILURE;
END;

下面附上该功能实现的基本源代码:retek日历功能实现.zip

一定要注意,以上几个trigger都是不可少的,我在实现该功能以后,在网上查阅一些资料,又发现了下面这段话,觉得非常好(因没有找到过fm_date.fmb这个form,所以从来没试过),收藏在这里:

创建弹出日期的Lov过程:

step1. 打开我们自己写的form的同时,打开fm_date.fmb(这个文件是标准程式)。

step2. 将fm_date下Object Group下的OG_DATE,拖动到自己的Object Group下,回弹出提示,这时选择“复制”。

step3. 将calend45.pll添加进来。

step4. 添加显示日期的text Item的when-new-item-instance事件。

本文标题:Retek中Form怎么实现日历功能:calend45

本文链接:http://yedward.net/?id=58

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章