带有单选按钮选项的 Oracle Apex 主详细信息报告和详细信息报告 select

Oracle Apex Master Detail Report and Detail report with Radio Button Option to select

我正在寻找有关在 Oracle Apex 中构建简单测验类型应用程序的建议。
我不需要为基表构建任何 Create/Update/Delete 屏幕,因为我将使用 SQL 语句用数据填充我的表。

我有两张桌子

Create Table Question_Bank
(
Question_Id              Number (5)   Primary Key ,
Question_Description     Varchar2(1000)
)
;

Question_Choice_Id 就像 1,2,3,4(就像没有测验选项一样)

Create Table  Question_Choices
(
Question_Choice_Pk            Number (5)   Primary Key,
Question_Id                   Number(5) References Question_Bank(Question_Id),
Question_Choice_Id            Number(1),
Question_Choice_Description   Varchar2(200),
Is_Correct                    Varchar(1) Default 'N',
Explanation                   Varchar2(500)
);

所以应用程序应该像这样显示问题和选项。
我希望在一页上有一些问题数字的可滚动页面。

This is Question No 1

Option 1
Option 2
Option 3
Option 4


This is Question No 2

Another Option 1
Another Option 2
Another Option 3
Another Option 4


This is Question No 3

Q No 3  Option 1
Q No 3  Option 2
Q No 3  Option 3
Q No 3  Option 4

到目前为止,我已经创建了 Master/Detail 表格,这是一种报告(不可编辑),我可以看到问题和可能的选择(我有 select 问题和选择显示在第二列中)但这不是我想要的。
我正在使用免费的 Oracle Apex 在线帐户版本 20.2。

请查看 Survey Builder 应用程序,它允许用户 review/preview/submit 问题和答案。 此应用程序可以解决您的需求或让您了解如何构建它。

您可以在 App Gallery 中找到此应用程序。

您可以尝试动态构建带有问题和选择的页面。您必须向页面添加一个新的 PL/SQL Dynamic Region 区域。在 Source > PL/SQL Code 区域属性中将示例代码放在下面。

FOR l_question IN (
    SELECT QUESTION_ID, QUESTION_DESCRIPTION
    FROM QUESTION_BANK
    order by QUESTION_ID
) LOOP
    HTP.P('<h3>' || APEX_ESCAPE.HTML(l_question.QUESTION_DESCRIPTION) || '</h3>');
    HTP.P(
        APEX_ITEM.HIDDEN(
            p_idx   => 1, -- Values stored in APEX_APPLICATION.g_f01 table.
            p_value => l_question.QUESTION_ID
        )
    );
    HTP.P('<fieldset id="qfs' || l_question.QUESTION_ID || '">');
    HTP.P(
        APEX_ITEM.TEXT(
            p_idx           => 2, -- Values stored in APEX_APPLICATION.g_f02 table.
            p_item_id       => 'qh' || l_question.QUESTION_ID,
            p_attributes    => 'style="display:none"'
        )
    );
    
    FOR l_choice IN (
        SELECT QUESTION_CHOICE_ID, QUESTION_CHOICE_DESCRIPTION
        FROM QUESTION_CHOICES
        WHERE QUESTION_ID = l_question.QUESTION_ID
    ) LOOP
        HTP.P('<input type="radio" value="' || l_choice.QUESTION_CHOICE_ID || '" name="' || l_question.QUESTION_ID || '" onchange="document.getElementById(''qh' || l_question.QUESTION_ID || ''').value = this.value">');
        HTP.P('<label for="' || l_question.QUESTION_ID || '">' || APEX_ESCAPE.HTML(l_choice.QUESTION_CHOICE_DESCRIPTION) || '</label>');
    END LOOP;
    
    HTP.P('</fieldset>');
END LOOP;

此 PL/SQL 块遍历所有问题,然后打印 HTML 带有问题描述的标记和带有单选按钮的字段集。如您所见,我使用 APEX_ITEM 包生成两列 - QUESTION_IDQUESTION_CHOICE_ID。每次迭代都会用这两列创建新记录。如果您查看了 APEX 文档,您可能想知道为什么我不使用 APEX_ITEM.RADIOGROUP 来构建单选按钮。诀窍是这个过程不适合这种情况,因为它的行为与开发人员期望的不同。因此,为了避免使用此过程,我手动构建了单选按钮。我还为每个 input 放置了简单的 onchange 事件,以保存每个问题中的选定选项。此事件在第二列中设置项目。

每一列都存储在集合 APEX_APPLICATION.G_Fxx 中,其中 xx 介于 0150 之间。有 p_idx 参数确定存储列值的集合索引。页面提交后,APEX 提交这些集合中的值。您可以处理这个问题,创建新进程(Processing > ProcessesProcessing > After Submit)并在下面粘贴代码。

DECLARE
    v_question_count    NUMBER := APEX_APPLICATION.g_f01.COUNT;
    v_question_answer_id QUESTION_ANSWERS.QUESTION_ANSWER_ID%TYPE := QUESTION_ANSWERS_SEQ.NEXTVAL;
BEGIN
    FOR i IN 1..v_question_count LOOP
        INSERT INTO QUESTION_ANSWERS (QUESTION_ANSWER_ID, QUESTION_ID, QUESTION_CHOICE_ID)
        VALUES (v_question_answer_id, APEX_APPLICATION.g_f01(i), APEX_APPLICATION.g_f02(i));
    END LOOP;
END;

通过集合进行另一次迭代(两者具有相同数量的成员)并将值插入到某些 table.

我的代码生成的表单没有花哨的样式,因此您必须自己处理:)