如何从弹出的LOV项中插入选定的数据?

问题描述 投票:0回答:1

我对 Oracle APEX 比较陌生,目前使用版本 22.2.1。我的数据库设置中有三个表:

  • INVENTAIRE(idInventaire 编号、Inv_Date 时间戳、...)
  • ARTICLE(idArticle NUMBER,Code_Article VARCHAR2,...)
  • ARTICLE_HAS_INVENTAIRE(Inventaire_idInventaire 编号,Article_id 文章编号,...)

我的目标是为操作员创建一个表格来计划他们的定期库存。该过程涉及操作员指定下一次库存的日期并选择与该库存相关的商品。

为了实现此目的,我使用以下 SQL 查询基于上述表格创建了一个表单:

SELECT
    i.idInventaire,
    i.Inv_date,
    idArticle,
    ar.code_article
FROM
    Inventaire i
JOIN
    Article_has_Inventaire ai ON i.idInventaire = ai.Inventaire_idInventaire
JOIN
    Article ar ON ai.Article_idArticle = ar.idArticle;

idInventaire
idArticle
列被隐藏,因为我设置了一个触发器来自动增加它们。
Inv_date
配置为日期选择器,
Code_Article
配置为弹出 LOV,显示 ARTICLE 表中的所有
Code_Article
选项。

我还添加了一个“保存”按钮。单击时,应将一条新记录插入到具有指定

INV_DATE
的 INVENTAIRE 表中,并且对于每个选定的
Code_Article
,应将新记录插入到 ARTICLE_HAS_INVENTAIRE 表中。

这是我在按钮的动态操作中使用的服务器端代码:

BEGIN
  -- Insert a new inventory with the specified date
  INSERT INTO Inventaire (Inv_Date)
  VALUES (:P_DATE_PICKER);

  -- Retrieve the ID of the newly inserted inventory
  DECLARE
    v_idInventaire NUMBER;
  BEGIN
    SELECT MAX(idInventaire) INTO v_idInventaire FROM Inventaire;
    
    -- Insert selected articles into Article_has_Inventaire
    FOR rec IN (SELECT Code_Article FROM ARTICLE WHERE Code_Article IN (:P_POPUP_LOV))
    LOOP
      INSERT INTO Article_has_Inventaire (Article_idArticle, Inventaire_idInventaire)
      VALUES (rec.Code_Article, v_idInventaire);
    END LOOP;
  END;
END;

当我检查我的表时,新记录添加到我的表 INVENTAIRE 中,但没有记录插入到 ARTICLE_HAS_INVENTAIRE 表中,有人能找出原因吗?

如果您能提供有关改进此设置或解决我的方法中任何潜在问题的指导或建议,我将不胜感激。谢谢!

oracle-apex
1个回答
0
投票

“Article_has_Inventaire”中未插入任何内容的原因是语句

WHERE Code_Article IN (:P_POPUP_LOV)
不返回任何行。假设所选值为 1,2 和 3,则 :P_POPUP_LOV 的值为 1:2:3,where 子句将被解析为
WHERE Code_Article IN ('1:2:3')
。你不想要这样,你需要
WHERE Code_Article IN ('1','2','3')
来代替。 解决方案:使用
APEX_STRING
api 将冒号分隔的字符串转换为包含各个选定值的嵌套表

SELECT Code_Article 
  FROM ARTICLE 
 WHERE Code_Article IN (SELECT column_value FROM table(apex_string.split(: P_POPUP_LOV,':'))

既然您说您是 APEX 新手,请注意几点。

  • 处理表单数据时,模式不是使用动态动作,而是使用页面处理。新的 APEX 开发人员通常尝试使用动态操作来完成所有事情,但这不是最好的方法。在 APEX 中,表单由获取数据的预渲染进程和将数据保存在数据库中的本机页面处理进程组成。不需要动态操作。通过向导创建一个简单的报告和表单来尝试一下,并检查 APEX 生成的内容。如果表单位于像您的问题一样的 SQL 查询上,那么仍然使用页面处理,而不是动态操作。
  • 这里是一个类似问题的答案 - 这可能是一个很好的参考
  • 强烈建议将所有页面项目命名为P_ITEM_NAME。这是因为页面项名称在整个应用程序中是唯一的,并且属于一个页面(用于维护会话状态、清除缓存等时)。不遵循这一最佳实践肯定会让您头疼。
© www.soinside.com 2019 - 2024. All rights reserved.