Process changes in PIVOT (contexts as columns)

This commit is contained in:
Jan Kvetina 2021-12-30 19:06:28 +01:00
parent 6333047257
commit a284f61086
2 changed files with 204 additions and 0 deletions

View File

@ -163,6 +163,63 @@ CREATE OR REPLACE PACKAGE app_actions AS
in_is_date settings.is_date%TYPE := NULL,
in_description settings.description_%TYPE := NULL
);
--
-- Store/update settings for specific contexts (pivot), including default
--
PROCEDURE set_setting_bulk (
in_c001 settings.setting_value%TYPE,
in_c002 settings.setting_value%TYPE,
in_c003 settings.setting_value%TYPE := NULL,
in_c004 settings.setting_value%TYPE := NULL,
in_c005 settings.setting_value%TYPE := NULL,
in_c006 settings.setting_value%TYPE := NULL,
in_c007 settings.setting_value%TYPE := NULL,
in_c008 settings.setting_value%TYPE := NULL,
in_c009 settings.setting_value%TYPE := NULL,
in_c010 settings.setting_value%TYPE := NULL,
in_c011 settings.setting_value%TYPE := NULL,
in_c012 settings.setting_value%TYPE := NULL,
in_c013 settings.setting_value%TYPE := NULL,
in_c014 settings.setting_value%TYPE := NULL,
in_c015 settings.setting_value%TYPE := NULL,
in_c016 settings.setting_value%TYPE := NULL,
in_c017 settings.setting_value%TYPE := NULL,
in_c018 settings.setting_value%TYPE := NULL,
in_c019 settings.setting_value%TYPE := NULL,
in_c020 settings.setting_value%TYPE := NULL,
in_c021 settings.setting_value%TYPE := NULL,
in_c022 settings.setting_value%TYPE := NULL,
in_c023 settings.setting_value%TYPE := NULL,
in_c024 settings.setting_value%TYPE := NULL,
in_c025 settings.setting_value%TYPE := NULL,
in_c026 settings.setting_value%TYPE := NULL,
in_c027 settings.setting_value%TYPE := NULL,
in_c028 settings.setting_value%TYPE := NULL,
in_c029 settings.setting_value%TYPE := NULL,
in_c030 settings.setting_value%TYPE := NULL,
in_c031 settings.setting_value%TYPE := NULL,
in_c032 settings.setting_value%TYPE := NULL,
in_c033 settings.setting_value%TYPE := NULL,
in_c034 settings.setting_value%TYPE := NULL,
in_c035 settings.setting_value%TYPE := NULL,
in_c036 settings.setting_value%TYPE := NULL,
in_c037 settings.setting_value%TYPE := NULL,
in_c038 settings.setting_value%TYPE := NULL,
in_c039 settings.setting_value%TYPE := NULL,
in_c040 settings.setting_value%TYPE := NULL,
in_c041 settings.setting_value%TYPE := NULL,
in_c042 settings.setting_value%TYPE := NULL,
in_c043 settings.setting_value%TYPE := NULL,
in_c044 settings.setting_value%TYPE := NULL,
in_c045 settings.setting_value%TYPE := NULL,
in_c046 settings.setting_value%TYPE := NULL,
in_c047 settings.setting_value%TYPE := NULL,
in_c048 settings.setting_value%TYPE := NULL,
in_c049 settings.setting_value%TYPE := NULL,
in_c050 settings.setting_value%TYPE := NULL
);

View File

@ -444,6 +444,61 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS
PROCEDURE rebuild_settings AS
q VARCHAR2(32767);
PROCEDURE set_setting_bulk (
in_c001 settings.setting_value%TYPE,
in_c002 settings.setting_value%TYPE,
in_c003 settings.setting_value%TYPE := NULL,
in_c004 settings.setting_value%TYPE := NULL,
in_c005 settings.setting_value%TYPE := NULL,
in_c006 settings.setting_value%TYPE := NULL,
in_c007 settings.setting_value%TYPE := NULL,
in_c008 settings.setting_value%TYPE := NULL,
in_c009 settings.setting_value%TYPE := NULL,
in_c010 settings.setting_value%TYPE := NULL,
in_c011 settings.setting_value%TYPE := NULL,
in_c012 settings.setting_value%TYPE := NULL,
in_c013 settings.setting_value%TYPE := NULL,
in_c014 settings.setting_value%TYPE := NULL,
in_c015 settings.setting_value%TYPE := NULL,
in_c016 settings.setting_value%TYPE := NULL,
in_c017 settings.setting_value%TYPE := NULL,
in_c018 settings.setting_value%TYPE := NULL,
in_c019 settings.setting_value%TYPE := NULL,
in_c020 settings.setting_value%TYPE := NULL,
in_c021 settings.setting_value%TYPE := NULL,
in_c022 settings.setting_value%TYPE := NULL,
in_c023 settings.setting_value%TYPE := NULL,
in_c024 settings.setting_value%TYPE := NULL,
in_c025 settings.setting_value%TYPE := NULL,
in_c026 settings.setting_value%TYPE := NULL,
in_c027 settings.setting_value%TYPE := NULL,
in_c028 settings.setting_value%TYPE := NULL,
in_c029 settings.setting_value%TYPE := NULL,
in_c030 settings.setting_value%TYPE := NULL,
in_c031 settings.setting_value%TYPE := NULL,
in_c032 settings.setting_value%TYPE := NULL,
in_c033 settings.setting_value%TYPE := NULL,
in_c034 settings.setting_value%TYPE := NULL,
in_c035 settings.setting_value%TYPE := NULL,
in_c036 settings.setting_value%TYPE := NULL,
in_c037 settings.setting_value%TYPE := NULL,
in_c038 settings.setting_value%TYPE := NULL,
in_c039 settings.setting_value%TYPE := NULL,
in_c040 settings.setting_value%TYPE := NULL,
in_c041 settings.setting_value%TYPE := NULL,
in_c042 settings.setting_value%TYPE := NULL,
in_c043 settings.setting_value%TYPE := NULL,
in_c044 settings.setting_value%TYPE := NULL,
in_c045 settings.setting_value%TYPE := NULL,
in_c046 settings.setting_value%TYPE := NULL,
in_c047 settings.setting_value%TYPE := NULL,
in_c048 settings.setting_value%TYPE := NULL,
in_c049 settings.setting_value%TYPE := NULL,
in_c050 settings.setting_value%TYPE := NULL
)
AS
rec settings%ROWTYPE;
v_offset CONSTANT PLS_INTEGER := 3; -- used columns (name, group, default)
BEGIN
app.log_module();
@ -472,13 +527,38 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS
END LOOP;
--
q := q || CHR(10) || 'END;';
app.log_module(in_args => app.get_json_list(
in_c001, in_c002, in_c003, in_c004, in_c005, in_c006
));
--
EXECUTE IMMEDIATE q;
rec.app_id := app.get_app_id();
rec.setting_name := in_c001;
rec.setting_value := in_c003; -- fill in the loop
rec.setting_context := NULL; -- fill in the loop
rec.setting_group := in_c002;
rec.updated_by := app.get_user_id();
rec.updated_at := SYSDATE;
-- cleanup setting
DELETE FROM settings s
WHERE s.app_id = rec.app_id
AND s.setting_name = rec.setting_name
AND s.setting_context IS NOT NULL;
-- update default value
UPDATE settings s
SET ROW = rec
WHERE s.app_id = rec.app_id
AND s.setting_name = rec.setting_name
AND s.setting_context IS NULL;
-- create package body
q := 'CREATE OR REPLACE PACKAGE BODY ' || LOWER(in_settings_package) || ' AS' || CHR(10);
--
FOR c IN (
-- match order with view on page
FOR r IN (
SELECT
s.setting_name,
MAX(s.is_numeric) AS is_numeric,
@ -487,6 +567,10 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS
WHERE s.app_id = app.get_app_id()
GROUP BY s.setting_name
ORDER BY s.setting_name
s.context_id,
'C' || SUBSTR(1000 + v_offset + ROW_NUMBER() OVER(ORDER BY s.order# NULLS LAST, s.context_id), 2, 3) AS arg
FROM setting_contexts s
WHERE s.app_id = rec.app_id
) LOOP
q := q || CHR(10);
q := q || ' FUNCTION ' || LOWER(in_settings_prefix) || LOWER(c.setting_name) || ' (' || CHR(10);
@ -511,6 +595,68 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS
q := q || ' WHEN NO_DATA_FOUND THEN' || CHR(10);
q := q || ' RETURN NULL;' || CHR(10);
q := q || ' END;' || CHR(10);
CONTINUE WHEN r.arg IN ('C001', 'C002', 'C003');
--
rec.setting_context := CASE
WHEN r.arg = 'C003' THEN r.context_id WHEN r.arg = 'C004' THEN r.context_id
WHEN r.arg = 'C005' THEN r.context_id WHEN r.arg = 'C006' THEN r.context_id
WHEN r.arg = 'C007' THEN r.context_id WHEN r.arg = 'C008' THEN r.context_id
WHEN r.arg = 'C009' THEN r.context_id WHEN r.arg = 'C010' THEN r.context_id
WHEN r.arg = 'C011' THEN r.context_id WHEN r.arg = 'C012' THEN r.context_id
WHEN r.arg = 'C013' THEN r.context_id WHEN r.arg = 'C014' THEN r.context_id
WHEN r.arg = 'C015' THEN r.context_id WHEN r.arg = 'C016' THEN r.context_id
WHEN r.arg = 'C017' THEN r.context_id WHEN r.arg = 'C018' THEN r.context_id
WHEN r.arg = 'C019' THEN r.context_id WHEN r.arg = 'C020' THEN r.context_id
WHEN r.arg = 'C021' THEN r.context_id WHEN r.arg = 'C022' THEN r.context_id
WHEN r.arg = 'C023' THEN r.context_id WHEN r.arg = 'C024' THEN r.context_id
WHEN r.arg = 'C025' THEN r.context_id WHEN r.arg = 'C026' THEN r.context_id
WHEN r.arg = 'C027' THEN r.context_id WHEN r.arg = 'C028' THEN r.context_id
WHEN r.arg = 'C029' THEN r.context_id WHEN r.arg = 'C030' THEN r.context_id
WHEN r.arg = 'C031' THEN r.context_id WHEN r.arg = 'C032' THEN r.context_id
WHEN r.arg = 'C033' THEN r.context_id WHEN r.arg = 'C034' THEN r.context_id
WHEN r.arg = 'C035' THEN r.context_id WHEN r.arg = 'C036' THEN r.context_id
WHEN r.arg = 'C037' THEN r.context_id WHEN r.arg = 'C038' THEN r.context_id
WHEN r.arg = 'C039' THEN r.context_id WHEN r.arg = 'C040' THEN r.context_id
WHEN r.arg = 'C041' THEN r.context_id WHEN r.arg = 'C042' THEN r.context_id
WHEN r.arg = 'C043' THEN r.context_id WHEN r.arg = 'C044' THEN r.context_id
WHEN r.arg = 'C045' THEN r.context_id WHEN r.arg = 'C046' THEN r.context_id
WHEN r.arg = 'C047' THEN r.context_id WHEN r.arg = 'C048' THEN r.context_id
WHEN r.arg = 'C049' THEN r.context_id WHEN r.arg = 'C050' THEN r.context_id
END;
--
rec.setting_value := CASE
WHEN r.arg = 'C003' THEN in_c003 WHEN r.arg = 'C004' THEN in_c004
WHEN r.arg = 'C005' THEN in_c005 WHEN r.arg = 'C006' THEN in_c006
WHEN r.arg = 'C007' THEN in_c007 WHEN r.arg = 'C008' THEN in_c008
WHEN r.arg = 'C009' THEN in_c009 WHEN r.arg = 'C010' THEN in_c010
WHEN r.arg = 'C011' THEN in_c011 WHEN r.arg = 'C012' THEN in_c012
WHEN r.arg = 'C013' THEN in_c013 WHEN r.arg = 'C014' THEN in_c014
WHEN r.arg = 'C015' THEN in_c015 WHEN r.arg = 'C016' THEN in_c016
WHEN r.arg = 'C017' THEN in_c017 WHEN r.arg = 'C018' THEN in_c018
WHEN r.arg = 'C019' THEN in_c019 WHEN r.arg = 'C020' THEN in_c020
WHEN r.arg = 'C021' THEN in_c021 WHEN r.arg = 'C022' THEN in_c022
WHEN r.arg = 'C023' THEN in_c023 WHEN r.arg = 'C024' THEN in_c024
WHEN r.arg = 'C025' THEN in_c025 WHEN r.arg = 'C026' THEN in_c026
WHEN r.arg = 'C027' THEN in_c027 WHEN r.arg = 'C028' THEN in_c028
WHEN r.arg = 'C029' THEN in_c029 WHEN r.arg = 'C030' THEN in_c030
WHEN r.arg = 'C031' THEN in_c031 WHEN r.arg = 'C032' THEN in_c032
WHEN r.arg = 'C033' THEN in_c033 WHEN r.arg = 'C034' THEN in_c034
WHEN r.arg = 'C035' THEN in_c035 WHEN r.arg = 'C036' THEN in_c036
WHEN r.arg = 'C037' THEN in_c037 WHEN r.arg = 'C038' THEN in_c038
WHEN r.arg = 'C039' THEN in_c039 WHEN r.arg = 'C040' THEN in_c040
WHEN r.arg = 'C041' THEN in_c041 WHEN r.arg = 'C042' THEN in_c042
WHEN r.arg = 'C043' THEN in_c043 WHEN r.arg = 'C044' THEN in_c044
WHEN r.arg = 'C045' THEN in_c045 WHEN r.arg = 'C046' THEN in_c046
WHEN r.arg = 'C047' THEN in_c047 WHEN r.arg = 'C048' THEN in_c048
WHEN r.arg = 'C049' THEN in_c049 WHEN r.arg = 'C050' THEN in_c050
END;
--
app.log_result(in_args => app.get_json_list(r.arg, rec.setting_name, rec.setting_context, rec.setting_value));
--
CONTINUE WHEN (rec.setting_context IS NULL OR rec.setting_value IS NULL);
--
INSERT INTO settings
VALUES rec;
END LOOP;
--
q := q || CHR(10) || 'END;';
@ -519,6 +665,7 @@ CREATE OR REPLACE PACKAGE BODY app_actions AS
EXECUTE IMMEDIATE q;
--
recompile();
app.log_success();
EXCEPTION
WHEN app.app_exception THEN
RAISE;