153 lines
6.8 KiB
Python
153 lines
6.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""第三批接线:①CreateXianghaoTable/CreateYuanjianTable 尾部重建全部触发器(兜底所有建表路径)
|
|
②EnterProjectCore 进项目时公式触发器自检 ③红绿"未保存"退役 ④保存按钮改实时保存提示
|
|
⑤撤销删除(项目库)后重建触发器 ⑥EnsureFormulaTriggers/保存提示 方法体"""
|
|
import io
|
|
|
|
ROOT = r"C:\Users\099978\Documents\SharpDevelop Projects\成套报价软件\成套报价软件"
|
|
n = 0
|
|
|
|
def edit(path, pairs, tag):
|
|
global n
|
|
s = io.open(path, encoding="utf-8-sig").read()
|
|
for old, new in pairs:
|
|
if old not in s:
|
|
if new in s:
|
|
print(tag, "已有(跳过):", old[:40].replace("\n", " "))
|
|
continue
|
|
raise AssertionError(tag + " 锚点缺失: " + old[:80])
|
|
s = s.replace(old, new, 1)
|
|
n += 1
|
|
io.open(path, "w", encoding="utf-8-sig").write(s)
|
|
print(tag, "ok")
|
|
|
|
# ① 两个建表函数尾部:重建全部触发器(幂等兜底,覆盖一切建表路径)
|
|
p1 = ROOT + r"\主窗口.菜单与库.cs"
|
|
edit(p1, [
|
|
(''' using (var cmd = new System.Data.SQLite.SQLiteCommand(sql, conn))
|
|
{
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
}
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
/// <summary>按真实ID表名建一张空元件表。</summary>''',
|
|
''' using (var cmd = new System.Data.SQLite.SQLiteCommand(sql, conn))
|
|
{
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
}
|
|
// ★ 公式触发器兜底:重建项目库全部触发器(幂等,新表即刻具备自动计算能力)
|
|
EnsureFormulaTriggersQuiet(projectId);
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
/// <summary>按真实ID表名建一张空元件表。</summary>'''),
|
|
(''' using (var cmd = new System.Data.SQLite.SQLiteCommand(sql, conn))
|
|
{
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
}
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
private void DeleteXianghao(string projectId, string tuhao, string xianghao)''',
|
|
''' using (var cmd = new System.Data.SQLite.SQLiteCommand(sql, conn))
|
|
{
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
}
|
|
// ★ 公式触发器兜底:重建项目库全部触发器(幂等)
|
|
EnsureFormulaTriggersQuiet(projectId);
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
private void DeleteXianghao(string projectId, string tuhao, string xianghao)'''),
|
|
# ⑤ 撤销删除(项目库快照还原)后重建触发器(快照库里的触发器可能是旧公式)
|
|
(''' // 快照 → 目标库
|
|
BackupSQLiteDb(snapPath, _undoTargetDbPath);''',
|
|
''' // 快照 → 目标库
|
|
BackupSQLiteDb(snapPath, _undoTargetDbPath);
|
|
// ★ 快照库的触发器可能是旧公式版本,还原后按当前公式表重建
|
|
if (!wasFak) EnsureFormulaTriggersQuiet(_undoProjectId);'''),
|
|
], "菜单与库.cs")
|
|
|
|
# ②⑥ 编辑直写库.cs:EnsureFormulaTriggers + 保存提示方法
|
|
p2 = ROOT + r"\编辑直写库.cs"
|
|
edit(p2, [
|
|
(''' /// <summary>公式表缓存(管线建触发器时用;图号粘贴管线开头加载)。</summary>
|
|
private List<公式条目> _公式_元件, _公式_箱号, _公式_图号;''',
|
|
''' /// <summary>公式表缓存(管线建触发器时用;图号粘贴管线开头加载)。</summary>
|
|
private List<公式条目> _公式_元件, _公式_箱号, _公式_图号;
|
|
|
|
/// <summary>进项目/建表/撤销删除后:按公式表重建项目库全部触发器(幂等,安静模式只记日志)。</summary>
|
|
private void EnsureFormulaTriggersQuiet(string projectId)
|
|
{
|
|
try
|
|
{
|
|
if (string.IsNullOrWhiteSpace(projectId)) return;
|
|
string dbPath = GetQuoteDbPath(projectId);
|
|
if (!System.IO.File.Exists(dbPath)) return;
|
|
string fak = System.IO.Path.Combine(
|
|
System.IO.Path.GetDirectoryName(dbPath), "fak.db");
|
|
using (var conn = new System.Data.SQLite.SQLiteConnection(GetConnStringStatic(dbPath)))
|
|
using (var fakConn = new System.Data.SQLite.SQLiteConnection(GetConnStringStatic(fak)))
|
|
{
|
|
conn.Open();
|
|
fakConn.Open();
|
|
计算引擎.EnsureFormulaTable(fakConn);
|
|
计算引擎.重建项目全部触发器(conn, null, TuhaoTableName, fakConn);
|
|
}
|
|
Log("[公式触发器] 已按公式表重建 [" + projectId + "] 全部触发器");
|
|
}
|
|
catch (Exception ex) { Log("[公式触发器] 重建失败(不影响编辑,但派生列不会自动算): " + ex.Message); }
|
|
}
|
|
|
|
/// <summary>保存按钮(功能区"保存"):实时架构下数据已在库,只刷跨库项目汇总并提示。</summary>
|
|
private void 保存按钮_实时保存提示()
|
|
{
|
|
try { 计算引擎.刷新项目汇总(GetQuoteDbPath(_currentProjectId), _currentProjectId, TuhaoTableName); }
|
|
catch (Exception ex) { Log("[保存] 刷新项目汇总异常: " + ex.Message); }
|
|
SetStatus("数据已实时保存在数据库");
|
|
MessageBox.Show(this, "数据已实时保存在数据库:\\n编辑即写库,价格由数据库触发器自动计算,无需手动保存。",
|
|
"保存", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
}'''),
|
|
], "编辑直写库.cs")
|
|
|
|
# ②③④ 主窗口.cs + 公式重算.cs
|
|
p3 = ROOT + r"\主窗口.cs"
|
|
edit(p3, [
|
|
# EnterProjectCore:进项目自检(幂等重建)
|
|
(''' private void EnterProjectCore(string pid)
|
|
{
|
|
Log("[EnterProjectCore] 开始进入项目 [" + pid + "], _isTabSyncing=" + _isTabSyncing);''',
|
|
''' private void EnterProjectCore(string pid)
|
|
{
|
|
Log("[EnterProjectCore] 开始进入项目 [" + pid + "], _isTabSyncing=" + _isTabSyncing);
|
|
// ★ 公式触发器自检:按公式表重建该项目库全部触发器(幂等;老库补装/公式变更生效)
|
|
EnsureFormulaTriggersQuiet(pid);'''),
|
|
], "主窗口.cs")
|
|
|
|
p4 = ROOT + r"\主窗口.公式重算.cs"
|
|
edit(p4, [
|
|
# 红绿"未保存"退役(实时架构库里永远最新)
|
|
(''' dgv.CommitEdit(DataGridViewDataErrorContexts.Commit);
|
|
标记未保存(); // 状态栏:保存状态置"未保存"''',
|
|
''' dgv.CommitEdit(DataGridViewDataErrorContexts.Commit);
|
|
// ★ 直写库架构:编辑即写库,不再有"未保存"状态'''),
|
|
], "公式重算.cs")
|
|
|
|
p5 = ROOT + r"\MainForm.cs"
|
|
edit(p5, [
|
|
# 保存按钮 → 实时保存提示
|
|
(''' case "button17": SaveAllToDatabase(); break; // 保存''',
|
|
''' case "button17": 保存按钮_实时保存提示(); break; // 保存(实时架构:提示+刷项目汇总)'''),
|
|
], "MainForm.cs")
|
|
|
|
print("合计", n, "处")
|