# -*- 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 { } } /// 按真实ID表名建一张空元件表。''', ''' using (var cmd = new System.Data.SQLite.SQLiteCommand(sql, conn)) { cmd.ExecuteNonQuery(); } } // ★ 公式触发器兜底:重建项目库全部触发器(幂等,新表即刻具备自动计算能力) EnsureFormulaTriggersQuiet(projectId); } catch { } } /// 按真实ID表名建一张空元件表。'''), (''' 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, [ (''' /// 公式表缓存(管线建触发器时用;图号粘贴管线开头加载)。 private List<公式条目> _公式_元件, _公式_箱号, _公式_图号;''', ''' /// 公式表缓存(管线建触发器时用;图号粘贴管线开头加载)。 private List<公式条目> _公式_元件, _公式_箱号, _公式_图号; /// 进项目/建表/撤销删除后:按公式表重建项目库全部触发器(幂等,安静模式只记日志)。 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); } } /// 保存按钮(功能区"保存"):实时架构下数据已在库,只刷跨库项目汇总并提示。 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, "处")