Folder Function and Find Window Step by Step - CHS
Folder Function and Find Window Step by Step - CHS
运行环境:
建议您的 Form Builder 至少升级到 Forms [32 Bit] Version 6.0.8.23.2 (Production)以上版本:
1
打开 Template,并且另存为目标程序
2
修改 Form Name:
3
修改 Form Level PRE-FORM Trigger,包括 Date & Author,
4
以及程序名称(Application Short Name 是否修改,视您是否创建 Help 而定):
5
增加 Number Data Type Parameters:ORG_ID,ORGANIZATION_ID,CHART_OF_ACCOUNTS_ID;
6
Char(Length = 3) Data Type Parameter:ORG_CODE;
Char(Length = 240) Data Type Parameter:ORG_NAME;
7
:parameter.organization_id := :parameter.org_id;
8
在同一次 Form Builder 运行之中,打开 APPSTAND.fmb:
9
在目标程序(ECSTP090)内新增一个 Object Group,并且重新命名为(STANDARD_FOLDER):
10
将刚才新增的 STANDARD_FOLDER 从 APPSTAND.fmb(STANDARD_OBJECTS)继承 STANDARD_FOLDE 属性:
11
可以确认,继承此属性后会得到哪些对象:
12
手动建立一个新的 Data Block,名称为 PROMPTS(名称可自定义),继承 BLOCK 属性类:
13
设定 PROMPTS Block 的 Database Data Block 属性为 No:
14
新增 Content 型 Canvas,并继承 CANVAS 属性类:
15
新增一个 Window(ECS_SERIAL),并继承 WINDOW 属性类:
16
设定刚新增 Window 的 Primary Canvas 为前述增加之 Content 型 Canvas:
17
返回设定新增之 Content 型 Canvas 的 Window 属性为刚新增之 Window:
18
修改 Program Unit:APP_CUSTOM Package Body,wnd name 为刚才新增的主 Window:
19
修改 Form Level WHEN_NEW_FORM_INSTANCE Trigger,增加一行:
APP_WINDOW.set_title('ECS_SERIAL',:parameter.org_code);
20
用 Layout Editor 打开新增的 Content 型 Canvas,在其上新建立 Stacked 型 Canvas:
21
自定义 Canvas Name,并继承属性类:CANVAS_STACKED:
22
使用 Data Block Wizard 新增 Base table or view Block:
23
Data Block Wizard 结束后,选择启动 Layout Wizard,Canvas 选择已经建立的 Stacked 型 Canvas:
24
选择 Displayed Items:
25
清除所有由 Layout Wizard 带来的默认 Prompt 域名:
26
选择 Layout Style 为 Tabular:
27
指定行数:
28
重新确认刚才新增之 Block Name & 属性类:
29
设定 Form First Navigation Data Block 为刚新增之 Base table or view Block:
30
返回修改 Form Level PRE-FORM Trigger:
31
新增 Number Data Type Parameter:<Data block>_ RECORD_COUNT(ECS_SERIAL_RECORD_COUNT),
32
Initial Value 设定为 2:
33
若您在 Stacked 型 Canvas 上呈现的 Items 有 N 个,则在 PROMPTS Block 内,新增 N 个 Items,并且:
1,每一 Item 的 Item Name 与呈现在 Stacked 型 Canvas 上的 Item 对应并相同;
2,每一 Item 的 Item Type 均设定为 Display Item;
3,每一 Item 的 Subclass 均继承为 FOLDER_PROMPT_MULTIROW;
4,每一 Item 的 Initial Value 均需设定,若没有宽度的问题,建议使用<Item Name>;
5,每一 Item 的 Canvas 值均设定为前述新增之 Stacked 型 Canvas;
34
35
36
在 PROMPTS Block 内新增 Order_by items,假设 3 个足够,则新增 ORDER_BY1, ORDER_BY2, ORDER_BY3,并且:
1,每一 Item 的 Item Type 均设定为 Push Button;
2,每一 Item 的 Subclass 均继承为 FOLDER_ORDERBY;
37
在 PROMPTS Block 内新增 FOLDER_OPEN Item,并且:
1,Item Type 设定为 Push Button;
2,Subclass 继承为 FOLDER_OPEN;
3,Canvas 值设定为 Content 型主 Canvas(ECS_SERIAL_MASTER);
38
1,Item Type 设定为 Display Item;
2,Subclass 继承为 DYNAMIC_TITLE;
3,Canvas 值设定为 Content 型主 Canvas(ECS_SERIAL_MASTER);
39
1, Item Type 设定为 Text Item;
2, Subclass 继承为 FOLDER_DUMMY;
3,Canvas 值设定为 TOOLBAR;
40
1, Item Type 设定为 Text Item;
2, Subclass 继承为 SWITCHER;
41
app_folder.event(:global.folder_action);
42
app_folder.define_folder_block('ECSTP090', -- 'Object Name'
'ECS_SERIAL', -- 'folder_block',
'PROMPTS', -- 'prompt_block',
'ITEM_STACKED', --'stacked_canvas',
'ECS_SERIAL', --'window',
NULL); --'disabled functions'
43
内容为: app_folder.event('WHEN-NEW-BLOCK-INSTANCE');
44
内容为:
if (:parameter.ecs_serial_record_count = 1) then
previous_item;
else
app_folder.event('KEY-PREV-ITEM');
end if;
45
if (:parameter.ecs_serial_record_count = 1) then
next_item;
else
app_folder.event('KEY-NEXT-ITEM');
end if;
46
在 Base table or view Block Level 创建 POST-BLOCK Trigger:
内容为: app_folder.event('POST-BLOCK');
47
在 Base table or view Block Level 创建 KEY-ENTQRY Trigger:
内容为: app_folder.event('KEY-ENTQRY');
48
在 Base table or view Block Level 创建 KEY-EXEQRY Trigger:
内容为: app_folder.event('KEY-EXEQRY');
49
在 Base table or view Block Level 创建 PRE-QUERY Trigger:
内容为: app_folder.event('PRE-QUERY');
50
在 Base table or view Block Level 创建 POST-QUERY Trigger:
内容为: app_folder.event('POST-QUERY');
51
为 PROMPTS Block 的 ORDER_BYx Items 增加 WHEN-BUTTON-PRESSED Trigger:
内容为: app_folder.event('TOGGLE-ORDER-BY');
52
OK,让我们来看一下实际运行的效果:
53
为了让程序好用一点,我们打算给它增加一个 Find Window:
54
从 APPSTAND.fmb(STANDARD_OBJECTS)复制(提示:请不要使用继承,因为稍后需要修改) QUERY_FIND Object Group 至目标程序
(ECSTP090);
这个群组包括一个 QUERY_FIND Data Block,一个 QUERY_FIND Canvas,一个 QUERY_FIND Window;
随即删除这个 object Group。
55
将 QUERY_FIND Canvas Name 修改为<MASTER_BLOCK>_QF_CANVAS(ECS_SERIAL_QF_CANVAS),并继承 CANVAS
56
属性类:
57
WINDOW 属性类:
58
修改 FIND 按钮,用<MASTER_BLOCK>(ECS_SERIAL)替代<your blockname here>:
59
设定 FIND_BLOCK(ECS_SERIAL_QF)的 Previous Navigation Data Block 属性为 MASTER_BLOCK(ECS_SERIAL):
60
修改 FIND_BLOCK(ECS_SERIAL_QF)的 KEY–NXTBLK Trigger,用<MASTER_BLOCK>(ECS_SERIAL)替代<your
61
blockname here>:
内容为:
:parameter.G_query_find := 'TRUE';
app_find.find('ECS_SERIAL');
:parameter.G_query_find := 'FALSE';
62
内容为:Find ECS Serial Details:
63
APP_WINDOW.set_title('ECS_SERIAL_QF_WINDOW',:parameter.org_code);
创建必要的查询条件,新增若干个 Items:
64
1,新增的 Items Type 属性设定 Text Item,Subclass 继承为 TEXT_ITEM:
65
3,新增的 Items Canvas 属性设定为<FIND_BLOCK>_QF_CANVAS(ECS_SERIAL_QF_CANVAS):
66
为相关查询条件增加辅助性 Item Level Trigger,例如 WHEN-VALIDATE-ITEM:
67
样例代码:
IF :ECS_SERIAL_QF.NB_SERIAL_FROM IS NOT NULL THEN
:ECS_SERIAL_QF.NB_SERIAL_TO := :ECS_SERIAL_QF.NB_SERIAL_FROM;
END IF;
以及 WHEN-NEW-ITEM-INSTANCE:
68
样例代码:
IF ((:ECS_SERIAL_QF.NB_SERIAL_FROM IS NOT NULL) AND (:ECS_SERIAL_QF.NB_SERIAL_TO IS NULL))
THEN
COPY(:ECS_SERIAL_QF.NB_SERIAL_FROM,'ECS_SERIAL_QF.NB_SERIAL_TO');
SET_ITEM_PROPERTY('ECS_SERIAL_QF.NB_SERIAL_TO',ITEM_IS_VALID,PROPERTY_TRUE);
END IF;
69
IF :PARAMETER.G_QUERY_FIND = 'TRUE' THEN
APP_FIND.QUERY_RANGE(:ECS_SERIAL_QF.NB_SERIAL_FROM,:ECS_SERIAL_QF.NB_SERIAL_TO,'ECS_SERI
AL.SERIAL_ID');
APP_FIND.QUERY_RANGE(:ECS_SERIAL_QF.NB_ITEM_FROM,:ECS_SERIAL_QF.NB_ITEM_TO,'ECS_SERIAL.I
TEM_NUMBER');
APP_FIND.QUERY_RANGE(:ECS_SERIAL_QF.NB_CARTON_FROM,:ECS_SERIAL_QF.NB_CARTON_TO,'ECS_S
ERIAL.CARTON_NAME');
APP_FIND.QUERY_RANGE(:ECS_SERIAL_QF.NB_WE_FROM,:ECS_SERIAL_QF.NB_WE_TO,'ECS_SERIAL.WIP_
ENTITY_NAME');
copy(:mdphdr_qf.nb_mdp_header_id, 'MDPHDR.MDP_HEADER_ID');
:PARAMETER.G_QUERY_FIND := 'FALSE';
END IF;
70
创建一个 MASTER_BLOCK(ECS_SERIAL) level 用户命名的 trigger QUERY_FIND:(该触发器 Execution Hierarchy:
Override)
内容格式为:
APP_FIND.QUERY_FIND('<Results block window>','<Find window>','<Find window block>');
例如:
APP_FIND.QUERY_FIND('ECS_SERIAL','ECS_SERIAL_QF_WINDOW','ECS_SERIAL_QF');
71
返回修改 Form Level WHEN_NEW_FORM_INSTANCE Trigger,增加一行:
EXECUTE_TRIGGER('QUERY_FIND');
该过程将 Find Window 放到整个 Form 的最前端显示。
72
最后,让我们一起来看一下运行效果:
73
自己动手做一次吧,祝您好运 !!!
74