带有单选按钮选项的 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_ID
和 QUESTION_CHOICE_ID
。每次迭代都会用这两列创建新记录。如果您查看了 APEX 文档,您可能想知道为什么我不使用 APEX_ITEM.RADIOGROUP
来构建单选按钮。诀窍是这个过程不适合这种情况,因为它的行为与开发人员期望的不同。因此,为了避免使用此过程,我手动构建了单选按钮。我还为每个 input
放置了简单的 onchange
事件,以保存每个问题中的选定选项。此事件在第二列中设置项目。
每一列都存储在集合 APEX_APPLICATION.G_Fxx
中,其中 xx
介于 01
和 50
之间。有 p_idx
参数确定存储列值的集合索引。页面提交后,APEX 提交这些集合中的值。您可以处理这个问题,创建新进程(Processing > Processes
或 Processing > 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.
我的代码生成的表单没有花哨的样式,因此您必须自己处理:)
我正在寻找有关在 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_ID
和 QUESTION_CHOICE_ID
。每次迭代都会用这两列创建新记录。如果您查看了 APEX 文档,您可能想知道为什么我不使用 APEX_ITEM.RADIOGROUP
来构建单选按钮。诀窍是这个过程不适合这种情况,因为它的行为与开发人员期望的不同。因此,为了避免使用此过程,我手动构建了单选按钮。我还为每个 input
放置了简单的 onchange
事件,以保存每个问题中的选定选项。此事件在第二列中设置项目。
每一列都存储在集合 APEX_APPLICATION.G_Fxx
中,其中 xx
介于 01
和 50
之间。有 p_idx
参数确定存储列值的集合索引。页面提交后,APEX 提交这些集合中的值。您可以处理这个问题,创建新进程(Processing > Processes
或 Processing > 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.
我的代码生成的表单没有花哨的样式,因此您必须自己处理:)