Files
17168ERP/data/SQL/transform_tablet.sql
2025-08-29 01:27:25 +08:00

202 lines
6.4 KiB
Transact-SQL

/*
C# version of join_text:
public class TabletItem
{
public int num { get; set; }
public string fam_name { get; set; }
public object fam_gender { get; set; }
public object deceased { get; set; }
public bool option_break { get; set; }
}
public class TabletJson
{
public List<TabletItem> mid_items { get; set; }
public List<TabletItem> left_items { get; set; }
}
public string JoinText(List<TabletItem> items)
{
if (items == null || items.Count == 0)
return string.Empty;
StringBuilder result = new StringBuilder();
for (int i = 0; i < items.Count; i++)
{
result.Append(items[i].fam_name);
// Add break if option_break is true and not the last item
if (items[i].option_break && i < items.Count - 1)
{
result.Append("<br>");
}
// Add space between names if not the last item and no break
else if (i < items.Count - 1)
{
result.Append(" ");
}
}
return result.ToString();
}
// Usage example:
public string[] ProcessTabletJson(string jsonString)
{
string[] ret = new string[2];
// Deserialize JSON string to TabletJson object
TabletJson tabletJsonObj = JsonConvert.DeserializeObject<TabletJson>(jsonString);
// Process mid_items and left_items
ret[0] = JoinText(tabletJsonObj.mid_items);
ret[1] = JoinText(tabletJsonObj.left_items);
return ret;
}
*/
-- {"mid_items":[
-- {"num":0,"fam_name":" ","fam_gender":null,"deceased":null,"option_break":true},
-- {"num":0,"fam_name":"無始劫以來累世冤親債主1 ","fam_gender":null,"deceased":null,"option_break":true},
-- {"num":0,"fam_name":"無始劫以來累世冤親債主2 ","fam_gender":null,"deceased":null,"option_break":true},
-- {"num":0,"fam_name":" ","fam_gender":null,"deceased":null,"option_break":true}],
-- "left_items":[
-- {"num":0,"fam_name":" ","fam_gender":null,"deceased":null,"option_break":true},
-- {"num":0,"fam_name":"祁哲榮1 ","fam_gender":null,"deceased":null,"option_break":true},
-- {"num":0,"fam_name":"祁哲榮2","fam_gender":null,"deceased":null,"option_break":true}
-- ]}
-- 轉換牌位文本為 JSON 格式
DECLARE @InputText NVARCHAR(MAX)
DECLARE @Result NVARCHAR(MAX)
DECLARE @MidText NVARCHAR(MAX)
DECLARE @LeftText NVARCHAR(MAX)
DECLARE @StartPos INT
DECLARE @EndPos INT
DECLARE @Line NVARCHAR(1000)
DECLARE @First BIT
DECLARE @MidStart INT
DECLARE @LeftStart INT
-- 宣告游標變數
DECLARE @num INT
DECLARE @f_num_tablet NVARCHAR(MAX)
DECLARE @from_id_tablet NVARCHAR(MAX)
-- 宣告游標
DECLARE tablet_cursor CURSOR FOR
SELECT num, f_num_tablet, from_id_tablet
FROM pro_order_detail
-- 打開游標
OPEN tablet_cursor
-- 讀取第一筆資料
FETCH NEXT FROM tablet_cursor INTO @num, @f_num_tablet, @from_id_tablet
-- 開始處理每一筆資料
WHILE @@FETCH_STATUS = 0
BEGIN
-- 設置輸入文本
SET @InputText = @from_id_tablet
-- 找到 #牌位 和 #陽上 的位置
SET @MidStart = CHARINDEX('#牌位', @InputText) + 3
SET @LeftStart = CHARINDEX('#陽上', @InputText)
-- 如果找到正確的格式
IF @MidStart > 3 AND @LeftStart > 0
BEGIN
-- 取得兩段文字
SET @MidText = SUBSTRING(@InputText, @MidStart, @LeftStart - @MidStart)
SET @LeftText = SUBSTRING(@InputText, @LeftStart + 3, LEN(@InputText))
-- 建立 JSON
SET @Result = '{"mid_items":['
-- 處理 mid_items
SET @StartPos = 1
SET @EndPos = CHARINDEX(CHAR(10), @MidText, @StartPos)
SET @First = 1
WHILE @EndPos > 0
BEGIN
SET @Line = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(
SUBSTRING(@MidText, @StartPos, @EndPos - @StartPos),
CHAR(13), ''), CHAR(10), ''), CHAR(9), '')))
IF LEN(@Line) > 0
BEGIN
IF @First = 0
SET @Result = @Result + ','
SET @Result = @Result + '{"num":0,"fam_name":"' + @Line +
'","fam_gender":null,"deceased":null,"option_break":true}'
SET @First = 0
END
SET @StartPos = @EndPos + 1
SET @EndPos = CHARINDEX(CHAR(10), @MidText, @StartPos)
END
SET @Line = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(
SUBSTRING(@MidText, @StartPos, LEN(@MidText)),
CHAR(13), ''), CHAR(10), ''), CHAR(9), '')))
IF LEN(@Line) > 0
BEGIN
IF @First = 0
SET @Result = @Result + ','
SET @Result = @Result + '{"num":0,"fam_name":"' + @Line +
'","fam_gender":null,"deceased":null,"option_break":true}'
END
SET @Result = @Result + '],"left_items":['
-- 處理 left_items
SET @StartPos = 1
SET @EndPos = CHARINDEX(CHAR(10), @LeftText, @StartPos)
SET @First = 1
WHILE @EndPos > 0
BEGIN
SET @Line = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(
SUBSTRING(@LeftText, @StartPos, @EndPos - @StartPos),
CHAR(13), ''), CHAR(10), ''), CHAR(9), '')))
IF LEN(@Line) > 0
BEGIN
IF @First = 0
SET @Result = @Result + ','
SET @Result = @Result + '{"num":0,"fam_name":"' + @Line +
'","fam_gender":null,"deceased":null,"option_break":true}'
SET @First = 0
END
SET @StartPos = @EndPos + 1
SET @EndPos = CHARINDEX(CHAR(10), @LeftText, @StartPos)
END
SET @Line = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(
SUBSTRING(@LeftText, @StartPos, LEN(@LeftText)),
CHAR(13), ''), CHAR(10), ''), CHAR(9), '')))
IF LEN(@Line) > 0
BEGIN
IF @First = 0
SET @Result = @Result + ','
SET @Result = @Result + '{"num":0,"fam_name":"' + @Line +
'","fam_gender":null,"deceased":null,"option_break":true}'
END
SET @Result = @Result + ']}'
-- 更新資料庫
UPDATE pro_order_detail
SET f_num_tablet = @Result
WHERE num = @num
END
-- 讀取下一筆資料
FETCH NEXT FROM tablet_cursor INTO @num, @f_num_tablet, @from_id_tablet
END
-- 關閉並釋放游標
CLOSE tablet_cursor
DEALLOCATE tablet_cursor