115 lines
7.5 KiB
Python
115 lines
7.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""触发器创建挪到数据写完后统一建。幂等(基于标记检查)。"""
|
|
import io
|
|
|
|
P = r"C:\Users\099978\Documents\SharpDevelop Projects\成套报价软件\成套报价软件\主窗口.菜单与库.cs"
|
|
ROOT = r"C:\Users\099978\Documents\SharpDevelop Projects\成套报价软件"
|
|
n = 0
|
|
|
|
s = io.open(P, encoding="utf-8-sig").read()
|
|
|
|
def rep(old, new, tag):
|
|
global s, n
|
|
if old not in s:
|
|
if new in s:
|
|
print(tag, "已有(跳过)")
|
|
return
|
|
raise AssertionError(tag + " 锚点缺失: " + old[:70])
|
|
s = s.replace(old, new, 1)
|
|
n += 1
|
|
print(tag, "ok")
|
|
|
|
# 1) 字段(编辑直写库.cs, tab 缩进)
|
|
p2 = ROOT + r"\编辑直写库.cs"
|
|
s2 = io.open(p2, encoding="utf-8-sig").read()
|
|
old_f = "\t\t/// <summary>当前 Reload 耗时测量(进 Reload 方法时重启)。</summary>"
|
|
new_f = ("\t\t/// <summary>待建触发器清单 [yj表, 箱号表, 箱号ID, 图号ID](数据写完后统一建,避免事务内 DDL 拖慢批量 INSERT)。</summary>\n"
|
|
"\t\tprivate readonly System.Collections.Generic.List<string[]> _待建yj触发器 = new System.Collections.Generic.List<string[]>();\n"
|
|
"\t\t/// <summary>待建箱号表触发器 [箱号表, 图号ID]。</summary>\n"
|
|
"\t\tprivate readonly System.Collections.Generic.List<string[]> _待建xh触发器 = new System.Collections.Generic.List<string[]>();\n\n"
|
|
"\t\t/// <summary>当前 Reload 耗时测量(进 Reload 方法时重启)。</summary>")
|
|
if old_f in s2 and "_待建yj触发器" not in s2:
|
|
s2 = s2.replace(old_f, new_f, 1)
|
|
io.open(p2, "w", encoding="utf-8-sig").write(s2)
|
|
n += 1
|
|
print("字段 ok")
|
|
else:
|
|
print("字段 已有(跳过)")
|
|
|
|
# 2) 图号管线循环内:建元件表触发器 → 收集
|
|
rep(''' // ★ 建元件表触发器:INSERT/UPDATE/DELETE 自动算派生价+刷新箱号/图号聚合
|
|
计算引擎.建元件表触发器(conn, tx, yjTbl, xhTbl, nx, nt, TuhaoTableName,
|
|
_公式_元件, _公式_箱号, _公式_图号);''',
|
|
''' // ★ 登记待建触发器(数据全部写完后统一建,避免事务内 DDL 拖慢 INSERT)
|
|
_待建yj触发器.Add(new[] { yjTbl, xhTbl, nx, nt });''', "图号管线yj收集")
|
|
|
|
# 3) 图号管线:建箱号表触发器 → 收集
|
|
rep(''' // ★ 建箱号表触发器:INSERT/UPDATE/DELETE 自动算行内公式+刷新图号聚合
|
|
计算引擎.建箱号表触发器(conn, tx, xhTbl, nt, TuhaoTableName, new List<string[]>(), _公式_箱号, _公式_图号);''',
|
|
''' // 箱号表触发器管尾统一建(行级依赖各行的元件表名)
|
|
if (!_待建xh触发器.Exists(x => x[0] == xhTbl)) _待建xh触发器.Add(new[] { xhTbl, nt });''', "图号管线xh收集")
|
|
|
|
# 4) 图号管线管尾:统一建(开关=0 前)
|
|
rep(''' // ★ 恢复触发器(编辑自动计算)
|
|
计算引擎.开关设(conn, tx, 0);''',
|
|
''' // ★ 数据全部写完,统一建触发器(此后无批量 DML)
|
|
foreach (var t in _待建yj触发器)
|
|
计算引擎.建元件表触发器(conn, tx, t[0], t[1], t[2], t[3], TuhaoTableName,
|
|
_公式_元件, _公式_箱号, _公式_图号);
|
|
foreach (var t in _待建xh触发器)
|
|
{
|
|
var rows = new System.Collections.Generic.List<string[]>();
|
|
foreach (var y in _待建yj触发器)
|
|
if (y[1] == t[0]) rows.Add(new[] { y[2], y[0] });
|
|
计算引擎.建箱号表触发器(conn, tx, t[0], t[1], TuhaoTableName, rows, _公式_箱号, _公式_图号);
|
|
}
|
|
_待建yj触发器.Clear();
|
|
_待建xh触发器.Clear();
|
|
// ★ 恢复触发器(编辑自动计算)
|
|
计算引擎.开关设(conn, tx, 0);''', "图号管线管尾")
|
|
|
|
# 5) PasteYuanjianRowsToDb 建新表:触发器 → 收集
|
|
rep(''' // ★ 新元件表:建公式触发器(INSERT/UPDATE/DELETE 自动算派生价+刷聚合)
|
|
string _xhTblReal = LookupTableByIndex("箱号", tuhao, "", conn);
|
|
if (!string.IsNullOrEmpty(_xhTblReal))
|
|
{
|
|
using (var fakConn = new System.Data.SQLite.SQLiteConnection(GetConnStringStatic(
|
|
System.IO.Path.Combine(System.IO.Path.GetDirectoryName(GetQuoteDbPath(projectId)), "fak.db"))))
|
|
{
|
|
fakConn.Open();
|
|
计算引擎.EnsureFormulaTable(fakConn);
|
|
计算引擎.建元件表触发器(conn, tx, tblName, _xhTblReal, xhId, tuhao, TuhaoTableName,
|
|
计算引擎.加载公式(fakConn, "元件"), 计算引擎.加载公式(fakConn, "箱号"),
|
|
计算引擎.加载公式(fakConn, "图号"));
|
|
}
|
|
}''',
|
|
''' // ★ 登记待建触发器(管尾统一建;行内派生值已随行写入,无需即时触发)
|
|
string _xhTblReal = LookupTableByIndex("箱号", tuhao, "", conn);
|
|
if (!string.IsNullOrEmpty(_xhTblReal))
|
|
{
|
|
bool exists = false;
|
|
foreach (var t in _待建yj触发器) if (t[2] == xhId && t[3] == tuhao) { exists = true; break; }
|
|
if (!exists) _待建yj触发器.Add(new[] { tblName, _xhTblReal, xhId, tuhao });
|
|
if (!_待建xh触发器.Exists(x => x[0] == _xhTblReal && x[1] == tuhao)) _待建xh触发器.Add(new[] { _xhTblReal, tuhao });
|
|
}''', "PasteYuanjian收集")
|
|
|
|
# 6) 箱号管线管尾:统一建(开关=0 前) —— 锚点用 刷新图号行聚合 调用行
|
|
rep(''' // 箱号行聚合抄源行已正确;仅图号行聚合(全箱号表 SUM)需刷新一次
|
|
计算引擎.刷新图号行聚合(conn, tx, dbPath, th, TuhaoTableName);''',
|
|
''' // 箱号行聚合抄源行已正确;统一建触发器 + 刷一次图号行聚合
|
|
foreach (var t in _待建yj触发器)
|
|
计算引擎.建元件表触发器(conn, tx, t[0], t[1], t[2], t[3], TuhaoTableName,
|
|
_公式_元件, _公式_箱号, _公式_图号);
|
|
foreach (var t in _待建xh触发器)
|
|
{
|
|
var rows = new System.Collections.Generic.List<string[]>();
|
|
foreach (var y in _待建yj触发器)
|
|
if (y[1] == t[0] && y[3] == t[1]) rows.Add(new[] { y[2], y[0] });
|
|
计算引擎.建箱号表触发器(conn, tx, t[0], t[1], TuhaoTableName, rows, _公式_箱号, _公式_图号);
|
|
}
|
|
_待建yj触发器.Clear();
|
|
_待建xh触发器.Clear();
|
|
计算引擎.刷新图号行聚合(conn, tx, dbPath, th, TuhaoTableName);''', "箱号管线管尾")
|
|
|
|
io.open(P, "w", encoding="utf-8-sig").write(s)
|
|
print("合计", n, "处") |