DELIMITER //

CREATE OR REPLACE PROCEDURE zen_create_json_detail(
  IN p_uuid VARCHAR(100),
  IN p_uuid_m VARCHAR(100),
  IN p_FunctionTag VARCHAR(100),
  IN p_code_id VARCHAR(100),  -- Wizard Template Id
  IN p_pk VARCHAR(100)
)
/*
  功能   : 針對 Master-Detail 的 Detail, 原本是呼叫 dbo.zen_get_detail_data, 重構後就不必呼叫該 udf, 改為本 sp 下方的寫法
  描述: 主要是由 zen_create_json_prepare_detaildata 呼叫使用
        主要是計算並替換下面3個變數的內容(寫入暫存檔)
        @Detail_By_add@
        @Detail_By_view@
        @Detail_By_Edit@
  建立日期 : 2024/1/8
  
  修改歷史
    項目 誰         日期       修改說明
    ==== ========== ========== ================================================
    1    Michael    2024/1/8   根據 v1.0 重構
*/
BEGIN
  -- 跟 fields define 相關的部分要專門處理(核心程式)
  DECLARE v_code_insert TEXT;
  DECLARE v_code_update TEXT;
  DECLARE v_code_view TEXT;
  DECLARE v_code_gridview TEXT;
  DECLARE v_code_quickedit TEXT;
  DECLARE v_code_edit_insert TEXT;  -- 修改模式下的 insert
  
  DECLARE v_json_bh VARCHAR(600);
  DECLARE v_json_gh VARCHAR(600);
  DECLARE v_json_insert TEXT;       -- input-table 的 in-line editor
  DECLARE v_json_update TEXT;
  DECLARE v_json_quickedit TEXT;
  DECLARE v_json_gridview TEXT;
  DECLARE v_json_view TEXT;
  DECLARE v_json_gf VARCHAR(600);
  DECLARE v_json_bf VARCHAR(600);
  DECLARE v_crlf VARCHAR(2);
  DECLARE v_sep VARCHAR(1);
  DECLARE v_FieldDS VARCHAR(1);
  DECLARE v_FieldSH VARCHAR(1);
  DECLARE v_imax INT;
  DECLARE v_imin INT;
  DECLARE v_inow INT;
  DECLARE v_pos INT;
  
  DECLARE v_zen_key VARCHAR(100);
  DECLARE v_zen_value TEXT;
  
  SET v_crlf = CONCAT(CHAR(13), CHAR(10));
  
  /*
    將 zen_wizard_jsondata 相關的欄位定義組好並更新相關變數
  */
  SET v_code_insert = '';
  SET v_code_update = '';
  SET v_code_view = '';
  SET v_code_gridview = '';
  SET v_code_quickedit = '';
  SET v_code_edit_insert = '';
    
  -- FieldSH = 'Y' 的處理
  SELECT MAX(rowid) INTO v_imax FROM zen_wizard_jsondata WHERE uuid = p_uuid AND FieldSH = 'Y';
  SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND FieldSH = 'Y';
  
  WHILE v_imin <= v_imax DO
    SELECT 
      IFNULL(json_bh,''), IFNULL(json_gh,''),
      IFNULL(json_insert,''), IFNULL(json_update,''), IFNULL(json_quickedit,''),
      IFNULL(json_gridview,''), IFNULL(json_view,''),
      IFNULL(json_gf,''), IFNULL(json_bf,'')
    INTO 
      v_json_bh, v_json_gh,
      v_json_insert, v_json_update, v_json_quickedit,
      v_json_gridview, v_json_view,
      v_json_gf, v_json_bf
    FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid = v_imin;
    
    IF (v_imin = v_imax) THEN 
      SET v_sep = ''; 
    ELSE 
      SET v_sep = ','; 
    END IF;
    
    IF v_json_insert <> '' THEN
      SET v_code_insert = CONCAT(v_code_insert, v_json_insert, v_sep, v_crlf);
      SET v_code_edit_insert = CONCAT(v_code_edit_insert, v_json_bh, v_json_gh, v_json_insert, v_json_gf, v_json_bf, v_sep, v_crlf);
    END IF;
    
    IF v_json_update <> '' THEN 
      SET v_code_update = CONCAT(v_code_update, v_json_bh, v_json_gh, v_json_update, v_json_gf, v_json_bf, v_sep, v_crlf);
    END IF;
    
    IF v_json_view <> '' THEN 
      SET v_code_view = CONCAT(v_code_view, v_json_bh, v_json_gh, v_json_view, v_json_gf, v_json_bf, v_sep, v_crlf);
    END IF;

    SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid > v_imin;
  END WHILE;
  
  -- FieldDS = 'Y' 的處理
  SELECT MAX(rowid) INTO v_imax FROM zen_wizard_jsondata WHERE uuid = p_uuid AND FieldDS = 'Y';
  SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND FieldDS = 'Y';
  
  WHILE v_imin <= v_imax DO
    SELECT 
      IFNULL(json_bh,''), IFNULL(json_gh,''),
      IFNULL(json_insert,''), IFNULL(json_update,''), IFNULL(json_quickedit,''),
      IFNULL(json_gridview,''), IFNULL(json_view,''),
      IFNULL(json_gf,''), IFNULL(json_bf,'')
    INTO 
      v_json_bh, v_json_gh,
      v_json_insert, v_json_update, v_json_quickedit,
      v_json_gridview, v_json_view,
      v_json_gf, v_json_bf
    FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid = v_imin;
    
    IF (v_imin = v_imax) THEN 
      SET v_sep = ''; 
    ELSE 
      SET v_sep = ','; 
    END IF;
      
    IF v_json_gridview <> '' THEN 
      SET v_code_gridview = CONCAT(v_code_gridview, v_json_gridview, v_sep, v_crlf);
    END IF;
    
    IF v_json_quickedit <> '' THEN 
      SET v_code_quickedit = CONCAT(v_code_quickedit, v_json_quickedit, ',', v_crlf);
    END IF;
    
    SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid > v_imin;
  END WHILE;
  
  -- 寫入暫存表
  INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid_m,'Detail_By_View',v_code_gridview,NOW());
  INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid_m,'Detail_By_Insert',v_code_insert,NOW());
  INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid_m,'Detail_By_Edit',v_code_update,NOW());
  -- input-table 的 insert
  INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid_m,'Detail_By_Edit_Insert',v_code_edit_insert,NOW());
END //

DELIMITER ;