Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle Apex主详细信息报告和带有单选按钮选项的详细信息报告可供选择_Oracle_Oracle Apex - Fatal编程技术网

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

Oracle Apex主详细信息报告和带有单选按钮选项的详细信息报告可供选择,oracle,oracle-apex,Oracle,Oracle Apex,我正在寻找在Oracle Apex中构建简单测验类型应用程序的建议。 我不需要为基表构建任何创建/更新/删除屏幕,因为我将使用SQL语句用数据填充我的表 我有两张桌子 Create Table Question_Bank ( Question_Id Number (5) Primary Key , Question_Description Varchar2(1000) ) ; 问题_选项_Id类似于1,2,3,4(类似于没有测验选项选择) 因此,应用程序应

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

我有两张桌子

Create Table Question_Bank
(
Question_Id              Number (5)   Primary Key ,
Question_Description     Varchar2(1000)
)
;
问题_选项_Id类似于1,2,3,4(类似于没有测验选项选择)

因此,应用程序应该显示如下问题和选项。
我更喜欢一页上有一些数字的滚动页面

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
到目前为止,我已经创建了主/明细表,这是一种报告(不可编辑),我可以看到问题和可能的选择(我有选择的问题,选择显示在第二列),但这不是我想要的。
我正在使用免费的Oracle Apex在线帐户版本20.2。

请查看Survey Builder应用程序,它允许用户查看/预览/提交问题和答案。 这个应用程序可以解决您的需求,或者给您一个如何构建它的想法

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

您可以尝试动态构建包含问题和选项的页面。您必须在页面中添加一个新的
PL/SQL动态区域
Region。在
Source>PL/sqlcode
region属性中,将示例代码放在下面

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;
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;
还有另一个通过集合的迭代(两个集合都有相同数量的成员)并将值插入到某个表中


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

如果您需要sql文件来处理表和数据,页面的外观应该是
p\u idx
参数用于指定目标
APEX\u应用程序.g\u fxx
集合的索引。如果
p_idx=1
,则APEX将在
APEX_应用程序.g_f01
集合中创建新成员。如果
p_idx=2
则在
APEX_应用程序.g_f02
等中创建新成员。在这种情况下,您需要创建包含两列的“虚拟”表-quiestion_id和question_choice_id。为此,我在每次迭代中放置两个
APEX_ITEM
调用。一个
APEX\u项目
存储在第一个集合中,第二个
APEX\u项目
存储在第二个集合中。
p\u项目id
参数用于设置新项目的HTML
id
属性。我这样做是因为我需要为每个隐藏项设置特定的
id
,它将选定的选项存储在特定的问题中。我在每个
input
元素的
onchange
事件中的JavaScript代码中使用这个
id
。在此事件中,浏览器将设置目标隐藏项。作为选择器,我使用
id
属性的值。在第一个循环中,第一个项目存储
QUESTION\u id
,但第二个项目存储NULL(因为我没有设置
p\u value
参数)。如前所述,第二项用于存储所选选项。当APEX呈现您的测验时,用户尚未选择任何选项,因此这就是第二项默认为空的原因。要设置此项,我使用
onchange
事件。我认为将验证放在
Processing>validation
中会更好。在提交后的
Processing>中,您将在页面验证之前必须完成的过程放入
中。不要忘记投票给我的答案;)谢谢你,莫妮卡。我确实查看了调查应用程序,但不知何故,我无法使其满足我的要求。
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;