暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 针对交互式网格调用PL/SQL API

ASKTOM 2020-09-16
433

问题描述

Info on example apex.oracle.com example below.
我正在尝试解决IG的问题,在不同的论坛上搜索并发布都没有成功,希望您能指出正确的方向。如果没有,我理解,请告诉我。在我看来,这应该很简单,但我完全错过了它。

目标:
-调用PL/SQL函数或过程,该函数或过程可以引用主表中活动行中的当前值,或使用网格区域中的按钮在详细信息表中,“汉堡包菜单” 选项,操作菜单项,或带有按钮/图标的 “虚拟” 列 (尽管不调用另一个页面,但我看不到如何仅从虚拟列中调用一个过程)。
o示例 :( 不是真实的,只是试图说明所需的功能)
取消当前选择的订单: Pkg_Orders.Cancel_Order(:Order_ID,Current_Date),并刷新订单行中的值。
在主网格中添加当前选定客户的订单,但在详细网格区域中显示按钮或菜单项的  PL/SQL过程。Pkg_Orders.Add_Order(:Customer_ID,Current_date) Add_Order过程创建订单行,预填充值,即检查重复订单模板等,然后显示行值进行编辑。

场景:
Master-Detail交互式网格,使用apex。客户和订单的oracle演示表。

我尝试过的:
-在详细网格中添加行级菜单项 (在页面加载部分执行代码)
-将列添加到明细表中,以图标的形式显示,就像您进行编辑时会调用另一个页面一样。但是,我不想调用另一个页面,我只想触发一个过程,该过程使用他们单击的行中的值
-将按钮项添加到详细信息区域,但无法引用所选行中的当前值。

在APEX.ORACLE上创建的示例应用程序: 应用程序120269-IG Master详细信息示例
工作区: 值点
用户id: 问题
密码: Abc4321 *

任何想法、建议或参考将不胜感激。

回答时可以发布,但是请记住删除工作区,用户id和密码信息。

谢谢!
祝你有美好的一天!


专家解答

我从John Snyders (内部负责IG) 那里获得了此信息,非常感谢John。

它有3个主要部分。

1) 使用各种UI功能在当前详细信息行的上下文中进行自定义处理

2) 自定义处理是在对PL/SQL过程的ajax调用中完成的

3) 从细节行和主行中提取数据。

1-它们为UI提供了许多选项,并且所有选项都是可能的。在每种情况下,我都建议使用操作来实现行为。大多数IG示例都使用这种方法。(请参阅界面操作https://docs.oracle.com/en/database/oracle/application-express/20.1/aexjs/actions.html) 请记住,定义操作和定义用于调用操作的UI是两个不同的步骤。对于IG,通过将代码添加到高级: JavaScript初始化代码来定义操作。在initActions函数中添加操作。在第5页和第53页的示例交互式网格应用程序中有示例。IG食谱中也有很多例子 (在这里获取食谱:https://hardlikesoftware.com/weblog/2019/11/04/apex-ig-cookbook-update-for-19-2/)。

动作通常作用于选择或当前行。第53页的示例使用旧的 (不再推荐的方式来获取上下文行。最好使用getContextRecord方法 (https://docs.oracle.com/en/database/oracle/application-express/20.1/aexjs/interactiveGridView.html#getContextRecord)。 There are examples of using getContextRecord in IG cookbook pages 18, 25, 26. The general pattern is:

action: function(event, el) {
  ...
  rec = view.getContextRecord( el)[0];
  ...


要对选择采取行动,请使用view getSelectedRecords方法 (https://docs.oracle.com/en/database/oracle/application-express/20.1/aexjs/interactiveGridView.html#getSelectedRecords) 或同名的IG方法 (https://docs.oracle.com/en/database/oracle/application-express/20.1/aexjs/interactiveGrid.html#getSelectedRecords)

使用操作的一个好处是,你可以定义一个键盘快捷键。

UI选项

A) 列中的按钮。一个很好的例子可以在示例交互式网格第10页中找到。看看SRV专栏。它调用了一个内置的动作。在这种情况下,他们将调用他们定义的操作 (例如,它可能被称为 “取消订单”)。

B) 添加到行操作菜单。这是操作列行中的汉堡包菜单。我没有添加到行操作菜单的示例,但是添加到选择操作菜单非常相似。例如,请参阅IG食谱的第12页。一般的想法是这样的 (添加以在页面加载时执行):

var view = apex.region("emp").call("getViews", "grid"),
    menu$ = view.rowActionMenu$;

// add to the menu
menu$.menu("option").items.push({
    type:"action",
    action: "cancel-order"
});


C) 添加到选择操作菜单。这是 “行操作” 列的列标题中的那个。似乎客户想采取行动,因此这可能不是他们想要的。例如,参见IG烹饪书第12页。

D) 添加到工具栏或工具栏操作菜单。这是可能的,但不是理想的,如果你想要当前行的上下文。

2-如果仅使用JavaScript就可以完成所有自定义行为,那么此时大部分时间都可以完成,但是他们想调用服务器。有两种方法可以做到这一点。

1) 是使用DA执行Pl/SQL代码操作。对于大多数情况,这是最简单的选择,尤其是当所有输入和输出都可以放在页面或列项中时。问题是,这只能从DA事件中完成,而上述操作不是DA。

2) 使用apex.server.process API。这提供了更多的控制,可以很容易地从任何JavaScript代码中调用。如果他们愿意定义页面或应用程序进程并以这种方式调用,那么这是一个不错的选择。

如果他们想使用选项1,则必须使事件从操作中触发,并在该事件上定义DA。如果操作设置了隐藏页面项的值,则会发生他们可以使用的自然更改事件。否则他们可以组成自己的自定义事件。

3-从当前记录和父记录访问数据。如果DA事件来自列项,则可以仅在 “要提交的项目” 属性中指定来自同一IG区域的列项。一个很大的限制是您无法引用父IG区域中的列。而且,如果DA是从自定义事件或IG区域之外的任何元素上的事件触发的,则无法在要提交的项目中指定列。一种选择是将所需的数据从IG模型移动到页面项中。这是一个额外的步骤,它否定了使用更简单的DA Execute PL/SQL代码操作的一些好处。

通常,您真正需要的只是行主键来进行任何服务器处理。您可以从IG模型记录中获取其他数据,但您需要更加注意用户没有篡改数据。如果值可以编辑,并且您想接受编辑后的值,那么没问题,但是如果您需要确保值没有改变,那么首先将它们放在页面项目中就不安全了。

要绕过无法访问父IG中的数据的限制,可以将详细IG中的数据复制为隐藏列。这浪费了带宽和客户端内存,但在某些情况下可能被认为是值得的。

如果他们想使用DA并且只需要详细记录主键,那么我的建议与Jayson的建议相似,除了我将定义一个动作并将 $ s放入动作函数中,从模型记录中获取主键。我会使用列按钮 (UI选项a)

如果他们需要更多的数据从细节和主记录,那么我会定义一个使用apex.server.process调用页面或应用程序进程的操作。

请注意,与表格形式不同,IG当前没有提交选定行的选项 (它仅发送具有 * 更改 * 的行)。

一种类似于表格形式的工作方式是在IG区域 (例如 “取消顺序”) 之外定义一个按钮,该按钮将所选行的隐藏列设置为 “C” 以表示取消。这意味着该行现在已更改,将被提交。然后按钮提交页面。这一切都可以从动态动作中完成。(注意错误25891453,并使用其解决方法来设置隐藏列。)


文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论