Files
Omni_kernel.db/basecore/zen_fieldspec_best.txt
T
2026-02-06 15:09:39 +08:00

286 lines
8.2 KiB
Plaintext

DELIMITER //
CREATE OR REPLACE PROCEDURE `zen_fieldspec_best` (
IN p_functiontag VARCHAR(100)
)
/*
Function : 針對 zen_field 的內容, 根據 schema 給出最接近的預設值, 以簡化設定動作
Description:
Build Date : 2021/08/14
Call Sample:
CALL zen_fieldspec_best('abc01');
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2021-11-25 新增 fieldblock = 90 的判斷(detail)
2 Michael 2022-04-16 update zen_fields set fieldro = Y (Read Only 預設)
3 Michael 2022-10-02 加入對 Query 的支援(根據 tag 判斷)
4 Michael 2023-02-09 加入 flow_status 預設值=N
5 Michael 2023-09-01 加入 2個系統欄位的預設值 create_user/create_date
6 [改寫者] 2023-11-15 改寫為 MariaDB 版本並最佳化
*/
BEGIN
/*
根據下列內容設定
fieldobject 更換為最合理的物件
fieldcn ==> dd ? (date=日期, id=代號, Name=名稱, 描述 取已經存在的同名? 建立一個常用習慣的詞庫? 這可以和 dd 並存)
fieldwidth 根據 length 推算 width(Grid 顯示寬度)
--fielddefault 日期=today 等
--fieldchecknull
--fieldds,fieldsh
cellx,celly
*/
DECLARE v_imax INT;
DECLARE v_inow INT;
DECLARE v_cnt INT;
DECLARE v_x INT;
DECLARE v_y INT;
DECLARE v_row INT;
DECLARE v_line INT;
DECLARE v_block INT;
DECLARE v_tablename VARCHAR(100);
DECLARE v_fieldname VARCHAR(100);
DECLARE v_fieldcn VARCHAR(100);
DECLARE v_fld_type VARCHAR(100);
DECLARE v_fieldobject VARCHAR(100);
DECLARE v_fieldlength INT;
DECLARE v_fld_width VARCHAR(10);
DECLARE v_jump SMALLINT;
--
DECLARE v_report_type VARCHAR(100);
DECLARE v_type_f SMALLINT;
DECLARE v_type_q SMALLINT;
-- 創建臨時表
DROP TEMPORARY TABLE IF EXISTS tmp_fields;
DROP TEMPORARY TABLE IF EXISTS tmp_query_fields;
-- upgrade data(防錯)
UPDATE zen_fields SET datatype = fieldobject WHERE functiontag = p_functiontag AND datatype IS NULL;
/*
根據 p_functiontag 識別是 Form or Query
*/
SELECT COUNT(*) INTO v_type_f FROM zen_fields WHERE functiontag = p_functiontag;
SELECT COUNT(*) INTO v_type_q FROM zen_report_fields WHERE functiontag = p_functiontag;
IF v_type_f > 0 THEN
-- 創建臨時表並插入數據
CREATE TEMPORARY TABLE tmp_fields AS
SELECT * FROM zen_fields WHERE functiontag = p_functiontag;
SELECT MAX(fieldid), MIN(fieldid), COUNT(*)
INTO v_imax, v_y, v_cnt
FROM tmp_fields;
SET v_row = 1;
IF v_cnt > 10 AND v_cnt <= 30 THEN
SET v_row = 2;
ELSEIF v_cnt > 30 THEN
SET v_row = 2;
END IF;
SET v_x = 1;
SET v_line = 1;
WHILE v_y <= v_imax DO
SELECT tablename, fieldname, fieldcn, datatype, fieldlength, fieldblock
INTO v_tablename, v_fieldname, v_fieldcn, v_fieldobject, v_fieldlength, v_block
FROM tmp_fields WHERE fieldid = v_y;
/* step 1: 設定 object */
-- varchar, char, nvarchar ...
SET v_fld_type = v_fieldobject;
IF LOCATE('char', v_fieldobject) > 0 THEN
IF v_fieldlength >= 200 THEN
SET v_fld_type = 'textarea';
ELSEIF v_fieldlength = 1 THEN
SET v_fld_type = 'switch';
ELSE
SET v_fld_type = 'input-text';
END IF;
END IF;
IF LOCATE('int', v_fieldobject) > 0 OR LOCATE('decimal', v_fieldobject) > 0 THEN
SET v_fld_type = 'input-number';
END IF;
IF LOCATE('date', v_fieldobject) > 0 THEN
SET v_fld_type = 'input-date';
END IF;
-- 防錯
IF v_fld_type = '' THEN
SET v_fld_type = 'input-text';
END IF;
/*
step 2: 推估 width(暫時保留, 但在 amis 中, width 已經幾乎不必設定)
*/
IF v_fld_type = 'input-date' OR v_fld_type = 'input-number' THEN
SET v_fld_width = 80;
ELSE
IF v_fieldlength <= 10 THEN
SET v_fld_width = 80;
ELSEIF v_fieldlength <= 20 THEN
SET v_fld_width = 120;
ELSE
SET v_fld_width = 200;
END IF;
END IF;
-- 判斷如果是 detail, fieldblock = 90
SELECT COUNT(*) INTO v_cnt FROM zen_function WHERE detail_table = v_tablename;
IF v_cnt > 0 THEN
SET v_block = 90;
END IF;
/*
step3: 推算 x/y
*/
SET v_jump = 0;
IF v_row = 2 AND v_fieldlength >= 50 THEN
IF v_x = 1 THEN
SET v_jump = 1;
ELSE
SET v_x = 1;
SET v_line = v_line + 1;
END IF;
END IF;
IF v_row = 3 AND v_fieldlength >= 50 THEN
IF v_x = 1 THEN
SET v_jump = 1;
ELSE
SET v_x = 1;
SET v_line = v_line + 1;
END IF;
END IF;
/*
step 4: update & cname(dd)
*/
UPDATE zen_fields
SET fieldobject = v_fld_type,
fieldwidth = v_fld_width,
cellx = v_x,
celly = v_line,
fieldblock = v_block,
fieldcn = trans_cname(v_fieldname, v_fieldcn)
WHERE fieldid = v_y;
IF v_row = 1 THEN
SET v_line = v_line + 1;
ELSEIF v_row = 2 THEN
SET v_x = v_x + 1;
IF v_x > 2 OR (v_jump = 1) THEN
SET v_x = 1;
SET v_line = v_line + 1;
END IF;
ELSEIF v_row = 3 THEN
SET v_x = v_x + 1;
IF v_x > 3 OR (v_jump = 1) THEN
SET v_x = 1;
SET v_line = v_line + 1;
END IF;
END IF;
SELECT MIN(fieldid) INTO v_y FROM tmp_fields WHERE fieldid > v_y;
END WHILE;
/*
批次更新(不需逐筆寫入)
step 5: setup read only(create_user ..)
step 6: flow_status 的預設值為 N
*/
UPDATE zen_fields
SET fieldro = 'Y'
WHERE functiontag = p_functiontag
AND fieldname IN ('create_user','create_date','update_user','update_date')
AND IFNULL(fieldro, '') = '';
UPDATE zen_fields
SET fielddefault = '$ls:userid'
WHERE functiontag = p_functiontag
AND fieldname = 'create_user'
AND IFNULL(fielddefault, '') = '';
UPDATE zen_fields
SET fielddefault = 'today'
WHERE functiontag = p_functiontag
AND fieldname = 'create_date'
AND IFNULL(fielddefault, '') = '';
UPDATE zen_fields
SET fielddefault = '自動編碼'
WHERE functiontag = p_functiontag
AND fieldname = 'billno'
AND IFNULL(fielddefault, '') = '';
UPDATE zen_fields
SET fielddefault = 'today'
WHERE functiontag = p_functiontag
AND fieldname = 'billdate'
AND IFNULL(fielddefault, '') = '';
UPDATE zen_fields
SET fielddefault = 'N'
WHERE functiontag = p_functiontag
AND fieldname = 'flow_status'
AND IFNULL(fielddefault, '') = '';
-- hidden 的 ds 和 sh 都應該設為 Y ,20230926
UPDATE zen_fields
SET fieldds = 'Y', fieldsh = 'Y'
WHERE functiontag = p_functiontag
AND fieldobject = 'hidden';
SELECT 0 AS code, 'OK' AS msg;
ELSEIF v_type_q > 0 THEN
-- 處理查詢字段
CREATE TEMPORARY TABLE tmp_query_fields AS
SELECT * FROM zen_report_fields WHERE functiontag = p_functiontag;
SELECT MAX(fieldid), MIN(fieldid)
INTO v_imax, v_y
FROM tmp_query_fields;
SELECT COUNT(*) INTO v_cnt FROM tmp_query_fields;
SET v_x = 1;
SET v_line = 1;
WHILE v_y <= v_imax DO
SELECT fieldname, fieldcn, fieldobject, report_type
INTO v_fieldname, v_fieldcn, v_fieldobject, v_report_type
FROM tmp_query_fields WHERE fieldid = v_y;
/*
step 1: update cname(dd)
*/
UPDATE zen_report_fields
SET fieldcn = trans_cname(v_fieldname, v_fieldcn)
WHERE fieldid = v_y AND fieldname = fieldcn;
/*
step 2: setup display
*/
UPDATE zen_report_fields
SET fieldds = 'Y'
WHERE fieldid = v_y;
SELECT MIN(fieldid) INTO v_y FROM tmp_query_fields WHERE fieldid > v_y;
END WHILE;
SELECT 0 AS code, 'OK' AS msg;
END IF;
-- 清理臨時表
DROP TEMPORARY TABLE IF EXISTS tmp_fields;
DROP TEMPORARY TABLE IF EXISTS tmp_query_fields;
END //
DELIMITER ;