《轻松学习 form开发》由会员分享,可在线阅读,更多相关《轻松学习 form开发(67页珍藏版)》请在金锄头文库上搜索。
1、 轻松学习 FORM 开发 Author: 王景远 Creation Date: January 1, 2015 Last Updated: Document Ref: Version: 1.0 1、 开发 带有 Master-Detail主从块 , Tab选项卡 , Folder文件夹 的 Form 这篇 文章向你展示如何 一步 一步按部就班的开发 如下 的 Form, 写文档 的经验不多,可能比较乱或不周全, 希望 感兴趣 的兄弟 提出建议,补充周全 , QQ: 754496613。 用到 的技术有 Master-Detail主从 块 , Tab画布,固定列画布,堆叠画布, Folder文
2、件夹 等。 1.1、 创建 数据库对象 头 : Table: CUX.TEST_HEADERS_ALL Sequence: CUX.TEST_HEADERS_S Synonym: TEST_HEADERS_ALL TEST_HEADERS_S View: TEST_HEADERS_V Package: TEST_HEADERS_PKG 行 : Table: CUX.TEST_LINES_ALL Sequence: CUX.TEST_LINES_S Synonym: TEST_LINES_ALL TEST_LINES_S View: TEST_LINES_V Package: TEST_LINE
3、S_PKG 1.2、 创建 程序单元 在 相应 触发器 中 调用 此程序: 1.3、 创建 头块、 行块 ,头行 关系 和 行 Prompt块 子类型都选为 block,选中之后会有箭头提示。 头块 : 创建 3个触发器 ON-INSERT,ON-LOCK,ON-DELETE,ON-UPDATE 调用程序单元 中的包 HEADERS_PRIVATE, 程序单元中的包再调用 数据库 中的表的 增删改锁API包 TEST_HEADERS_PKG进行增删改锁操作。 头行关系: 由于 是主从 块 ,还要创建一个头块和行块的 关系 : 创建完成后 ,后自动生成 1个 Form级触发器 ON-CLEAR-
4、DETAILS, 2个 Block级触发器 ON-POPULATE-DETAILS和 ON-CHECK-DELETE-MASTER, 1个程序单元 QUERY_MASTER_DETAILS 行 上 Item HEAD_ID的从项中复制属性 行块 : 行块 上 要 手动创建 18个触发器, 除了 ON-INSERT, ON-DELETE, ON-UPDATE, ON-LOCK 还有 14个 是针对 Folder功能 的 , PRE-QUERY, POST-QUERY, WHEN-NEW-BLOCK-INSTANCE, WHEN-NEW-RECORD-INSTANCE, KEY-PREV-ITEM
5、, KEY-NEXT-ITEM, KEY-PRVREC, KEY-NXTREC, KEY-CLRREC, KEY-EXEQRY, KEY-ENTQRY, PRE-BLOCK, POST-BLOCK, KEY-CLRBLK, 触发器内 只有一行代码, app_folder.event(KEY-CLRBLK);参数 是触发器名称。 块 上有 2个 项 是针对 Folder功能的, FOLDER_SWITCHER, CURRENT_RECORD_INDICATOR。 项 ROW_ID的 子 类 信息选 ROW_ID 行 Prompt块 : 提示 块字段的 名称 ,顺序,宽度要与行块中相应字段保持一致
6、,子类类型均为FOLDER_PROMPT_MULTIROW。 提示块 有 6个字段 是 针对 Folder功能的, FOLDER_OPEN是 文件夹图标 , FOLDER_TITLE是 图标旁边的 title, 当 新建一个文件夹是保存的名字。 放在 固定画布上。 FOLDER_DUMMY放在 tool_bar画布上。 ORDER_BY1,ORDER_BY2,ORDER_BY3放在堆叠画布上,文件夹的前面三列 点击 PROMPT可以排序 。 1.4、 创建 画布 MAIN是 内容画布 Line_Tab是 Tab画布, 有 三个页签,页签 类似 内容画布 , 可以放置堆叠画布和 Item, LI
7、NE_MAIN_FIX是固定列堆叠画布 , 只能放置在内容画布或页签上, LINE_MAIN_STK是堆叠画布 , 只能放置在 内容画布 或页签上, 1.5、 精确 布局 要进行 精确的布局,主要是靠计算而不是在布局编辑器中拖拽, x y 宽 高 主窗口 物理的 0 0 ? ? 内容主画布 物理的 0 0 ? ? Tab 画布 视窗 0.25 2 ? ? 固定列画布 视窗 0.5 2.5 ? ? 物理的 0 0 ? ? Folder_Open 物理的 0 0 0.25 0.25 Indicator 物理的 0 0.7 0.1 0.25 Line_Num Prompt 物理的 0.1 0.45
8、0.5 0.25 Line_Num 物料里的 0.1 0.7 0.5 0.25 垂直滚动条 ? 0.6 0.2 0.75 堆叠画布 视窗 1.2 2.95 ? ? 物理的 0 0 ? ? 字段 Prompt 物理的 0 0 1 0.25 字段 物理的 0 0.25 1 0.25 堆叠画布 视窗 1.2 2.95 6 1 物理的 0 0 6 1 固定列画布 视窗 0.5 2.5 6.9 1.65 物理的 0 0 6.9 1.65 Tab 画布 视窗 0.25 2 7.4 2.4 内容主画布 物理的 0 0 7.9 4.65 主窗口 物理的 0 0 8 4.75 我的 计算方法是,先计算内容 画布
9、 , Tab画布,固定列画布,堆叠画布的 x坐标和 y坐标,宽度和高度先 留 空 。 堆叠 画布中的元素决定了堆叠画布的宽度和高度 , 然后再确定固定列画布 , Tab画布的 宽和高, 在确定 内容画布,窗口的宽度和高度。 固定 画布和堆叠画布有 2套坐标,窗口和物理的, 窗口 是在窗口中的绝地坐标, 以 主窗口左上角为原点,物理的是画布本身要显示的区域,是相对坐标 , 以画布 本身 左上角为原点 。 Item项只有物理的一套坐标,是相对坐标,以所在画布的左上角为原点,所以在窗口中有 3个坐标系: 红色 是窗口坐标系,画布的坐标在这个坐标系里, 蓝色 是固定列画布的坐标系 , 固定画布上的 元
10、素 的坐标在这个坐标系里, 黄色是堆叠 画布的坐标系,堆叠画布上的元素的坐标在这个坐标系里。 1.6、 修改触发器代码 Form级 WHEN-NEW-FORM-INSTANCE添加 如下代码: app_folder.define_folder_block(object_name = TESTORDERS, folder_block_name = LINES, prompt_block_name = LINES_PROMPT, folder_canvas_name = LINE_MAIN_STK, folder_window_name = MAIN, disabled_functions = ,
11、 tab_canvas_name = LINE_TAB, fixed_canvas_name = LINE_MAIN_FIX); app_folder.event(INSTANTIATE); show_view(MAIN); show_view(LINE_TAB); show_view(LINE_MAIN_FIX); show_view(LINE_MAIN_STK); 新创建 Form级 WHEN-TAB-PAGE-CHANGED触发器, 添加如下 代码 : validate(block_scope); IF :system.mode = ENTER-QUERY OR NOT form_suc
12、cess THEN set_canvas_property(LINE_TAB, topmost_tab_page, :system.tab_previous_page); RETURN; END IF; IF :system.tab_new_page = MAIN THEN hide_view(LINE_OTHER_FIX); hide_view(LINE_PRICE_STK); show_view(LINE_MAIN_FIX); show_view(LINE_MAIN_STK); go_item(LINES.LINE_NUM); ELSIF :system.tab_new_page = PR
13、ICE THEN hide_view(LINE_OTHER_FIX); hide_view(LINE_MAIN_STK); show_view(LINE_MAIN_FIX); show_view(LINE_PRICE_STK); go_item(LINES.UNIT_PRICE); ELSIF :system.tab_new_page = OTHER THEN hide_view(LINE_PRICE_STK); hide_view(LINE_MAIN_FIX); hide_view(LINE_MAIN_STK); show_view(LINE_OTHER_FIX); go_item(ADDF
14、UN.MULTITEXT); -非常重要,不然当点击 OTHER页签时,会还停留 LINES.UNIT_PRICE项,把LINE_PRICE_STK画布激活在 top_most END IF; 1.7、上传 编译 cd $AU_TOP/forms/ZHS frmcmp_batch $CUX_TOP/forms/ZHS/TESTORDERS.fmb apps/apps output_file=$CUX_TOP/forms/ZHS/TESTORDERS.fmx 在 EBS中 定义好之后, 打开 就能看到 如下 的界面了: 1.8、 一些细节 固定 画布和 堆叠 画布是叠在一起 , hide_vie
15、w并不是 将 画布 隐藏了,而是放到了底层,被上 层 的画布 遮住了 ; 导航到 底层画布上的元素时会把位于底层的画布激化到 顶 层, 设置 导航 是必不可少的; 日历 用法: 编写 Item的 KEY-LISTVAL触发器: calendar.show, 设置 Item的 List of Values属性ENABLE_LIST_LAMP, 设置 Item的 Validate from List属性: No 环境 初始化: BEGIN mo_global.set_policy_context(S, 101); -org_id fnd_global.apps_initialize(user_id = 2190, resp_id = 21623, resp_appl_id = 660); END; 下拉 列表: 放在 WHEN-NEW-FORM-INSTANCE trigger中 PACKAGE BODY import_list IS P