我使用 Oracle 和 Oracle Forms 构建器(中间件)均为 11gR2。我正在创建一个采购记录系统。我有以下2张桌子。
(a) product (master) : prodid(PK), prodname ...... etc.
(b) purchase (detail) : prodid(FK), quantity, ...... etc.
我的计划:所有产品详细信息都将在产品表中。购买表仅用于输入购买信息。该表不能输入任何新产品。如果有任何新名称,则必须首先将该信息输入到产品表中。这样我可以减少重复的名称。 现在我在表格中的 prodname(产品名称)列方面遇到困难。
我仅使用购买表创建表单。该表没有 prodname (因为我将此字段放在产品表中)列。但在数据输入时,他们需要看到产品名称! 所以我创建了文本项(表格,数据库 - 否)。然后我创建了 LOV,附加到文本项,在表单的 prodid 字段中输入 prodid。 LOV部分很好。
我运行表格。单击文本项,出现 LOV,选择名称,单击确定。产品名称、产品 ID 等按其应有的方式出现在其字段中。 LOV 运行良好。现在我只能输入数据但更新有困难。我的意思是,如果我在文本项中输入名称(LOV),按执行查询,显示数据库中的记录,但文本项中的名称消失。由于名字不在这里,所以不方便更新。
我认为 LOV 在这里不是个好主意。可能我需要在某个地方的触发器中使用 PL/SQL。 但我无法弄清楚。我搜索了谷歌但没有运气。有谁可以给我任何想法或一些示例代码/触发器吗?
由于产品名称是非数据库项,因此当执行查询运行时,该字段将被清除,并且由于没有为该字段分配列,因此不会重新填充。
填充此字段的常用方法是使用一个函数,该函数根据按下的 id 返回产品名称,并在 POST-QUERY 触发器中调用该函数。
基本上这是一个非常简单的任务,但由于缺乏经验,我遇到了困难。然而,我所做的是-
开始 SELECT 产品名称 INTO :purchase.product_name 来自产品,其中 Product.prodid = :purchase.prodid ; 结束;
就是这样,当在表单中执行execute_query时,它将从另一个表中获取产品名称。 - 查询问题已解决。
现在使用产品表创建一个 LOV,其中包含产品名称和产品 id。
这样我的两个问题(查询和数据输入)都得到了解决。 我根据 Sathya 给出的建议和 YouTube https://www.youtube.com/watch?v=0nqldnGt8KA.
的视频(6 分钟)进行了此操作。感谢 Sathya 和 youtube。