Skip to content

打印快照管理 ​

  • 文档更新日期:2026-10-25

一、功能概述 ​

image.png

"打印快照管理"用于查询系统历次报表打印时保存下来的快照,并支持:

  1. 按条件检索打印记录(列表页)。
  2. 内嵌预览某条快照当时打印出来的报表版面(预览页)。
  3. 对属于"单据打印"的快照,一键只读打开对应的业务单据(查看单据)。

窗体顶部为工具条(含"条件""查看单据"等按钮),主体是一个两页签的标签控件:

页签标题作用
Tab_Grid报表打印记录快照列表,供检索、排序、过滤、选中记录
Tab_Snap打印快照内嵌报表预览器,显示当前选中记录的快照版面

二、报表打印记录(列表页) ​

报表打印记录列表页

2.1 列说明 ​

列标题字段含义
相关单据fRelateNo快照主键编号
生成日期fMakeDay快照产生(打印)时间
上传人员fMakeMan打印/上传该快照的人员
快照编号fPhotoNo快照业务编号,"查看单据"依据此编号解析(见第四章)
工作机器fWorkMachine产生快照的机器

列表查询不含 fContent(IMAGE 大字段),以保证列表打开速度;预览时才按需单独取当前记录的快照内容。

2.2 检索能力 ​

  • 搜索框:表格顶部即时搜索(SearchPanel),对当前结果集内文本做快速定位。
  • 列排序:点击列标题排序(本地排序)。
  • 列过滤(STFilter):列标题下方的过滤输入框,可对已取回的记录做即时筛选。
  • 默认展示:首次打开窗体时,不加任何条件,直接展示最近 30 条快照(按 fMakeDay 倒序)。

2.3 "条件"按钮(动态查询) ​

点击工具条上的**"条件"**按钮,弹出查询条件确认窗口,可按以下字段组织条件后重新查询:

  • 相关单据(fRelateNo)
  • 快照编号(fPhotoNo)
  • 上传人员(fMakeMan)
  • 工作机器(fWorkMachine)
  • 生成日期(fMakeDay)— 必备条件:为避免一次取回全部快照内容,日期条件被强制要求填写。

带条件查询时最多返回最近 100 条记录(同样按 fMakeDay 倒序)。


三、打印快照(预览页) ​

打印快照预览页

3.1 触发时机与缓存 ​

  • 预览不在切换记录时立即触发,而是当你切换到"打印快照"页签时才加载。
  • 加载时按当前记录的 fRelateNo 只取该一条记录的 fContent,落地为临时文件 Report\Tem_Snap_Prev.rep 后交给内嵌预览器显示。
  • 缓存机制:系统记住已预览记录的主键;在同一条记录之间来回切页不会重复打开数据集与重复加载文件。重新执行查询(列表刷新)后缓存自动失效。

3.2 预览工具条 ​

预览页顶部工具条提供报表预览的常规操作:

按钮功能
单页 / 100% / 页宽缩放模式切换
首页 / 上一页 / 下一页 / 末页多页翻页
查找在预览内容中查找文本
页面设置打印页面参数设置

预览为内嵌显示(报表绑定到窗体内的预览控件),不会弹出独立预览窗口。


四、查看单据(核心功能) ​

4.1 用途 ​

很多快照是"业务单据打印"时产生的。对这类快照,点击工具条上的**"查看单据"按钮,即可定位并只读打开**当时打印的那张业务单据,便于对照快照与原始单据。

4.2 快照编号的构成规则 ​

"查看单据"依据快照编号(fPhotoNo**)**的格式判断是否为单据打印:

  • 单据打印快照编号形如:数字_单据号

  • 下划线前的纯数字 = 单据类型(BillType)

  • 下划线后的部分 = 单据号(fBillNo)

  • 例:100_Po260129000001 → 单据类型 100,单据号 Po260129000001

  • 例:220_No250331000011 → 单据类型 220,单据号 No250331000011

  • 非单据打印快照:下划线前不是纯数字(例如 SPP_InvDistrDetail_4606544),此类快照无法"查看单据"。

  • 尾部 # 说明:同一张单据多次打印时,为避免编号重复,快照编号会以 #、## 结尾做区分(例如 104_No250331000008#)。定位单据时系统会自动去掉尾部的 #,用真实单据号去查询。

4.3 定位与打开流程 ​

点击"查看单据"后,系统按以下链路处理:

  1. 解析当前记录的快照编号,取出"单据类型"与"单据号"(并去掉尾部 #)。
  2. 找单据服务取主表名:以单据类型调用单据服务 GetBillInfo,取得该类单据主表的表名称(MasterTblName)。
  3. 按单据号定位 ID:所有单据主表都继承统一祖先结构(含 fBillNo、fDBID、fBillID),用 Where fBillNo = 单据号 到主表查出该单据的数据库ID(fDBID)与单据ID(fBillID)。
  4. 只读打开:以(单据类型、数据库ID、单据ID)调用单据服务,只读方式打开对应业务单据。

4.4 提示信息 ​

以下情况会给出提示而不打开单据:

提示触发条件
当前快照不是单据打印快照 无法查看单据快照编号无下划线,或下划线前缀含非数字字符
快照编号中的单据类型无效前缀数字解析结果 ≤ 0
快照编号中缺少单据号 无法查看单据下划线后(去 #)为空
未找到单据类型[N]对应的单据服务该单据类型未在单据服务注册
单据类型[N]未登记主表名称单据服务未提供该类单据的主表名
未在[表名]找到单据号为 X 的单据主表中按单据号查不到记录

非单据打印快照点击"查看单据"时的提示


五、常见问题(FAQ) ​

Q1:为什么列表里看不到快照的实际内容?
A:列表为提升性能不加载 IMAGE 大字段。要看内容请切换到"打印快照"页签,系统才按当前记录单独取回并预览。

Q2:切换记录后预览页还是上一张的内容?
A:预览只在"切换到打印快照页签"时刷新。请切到列表页选中目标记录,再切回预览页。

Q3:某些快照点"查看单据"提示"不是单据打印快照"?
A:该快照编号不符合"数字_单据号"格式(如以字母开头的业务快照),本身就不是某张单据的打印件,属正常情况。

Q4:单据明明存在,却提示"未找到单据号为 X 的单据"?
A:请核对快照编号下划线后的单据号是否与单据主表 fBillNo 一致;跨数据库补传等场景下,单据可能位于其它数据库ID,需人工确认。


六、技术附录(维护人员参考) ​

  • 双数据集设计:

  • Qry_printSnapshot:列表数据源,SELECT 不含 fContent,无 soFetchBlobs。

  • Qry_SnapBlob:单记录预览数据集,含 TBlobField,SQLOptions=[soFetchBlobs],按 fRelateNo 只取当前记录。

  • 预览绑定:RMReport1.Preview = FViewer;RMReport1.ShowReport 仅在 FormShow 调用一次做初始化,切换记录只做 FViewer.LoadFromFile(tempfile)。

  • 触发与缓存:Page_View.OnChange(TUIPageControl 继承 TRzPageControl)→ 仅当 ActivePage = Tab_Snap 调 ShowCurSnapPreview;fCachedKey 记录已预览主键,ExecQry 后失效。

  • 条数上限:RecentTopCount = 30(无条件)、CondTopCount = 100(有条件)。

  • 动态按钮:FormCreate 中 TAction.Create(actlst) 创建"条件""查看单据"动作,经基类 AddToolButton(btnName, AAction) 挂到顶部工具条。

  • 查看单据依赖接口(lib\接口\Bill_Intf.pas,接口已具备、无需扩展):

  • Plat.BillServer.GetBillInfo(BillType, out RBillInfo): Boolean → RBillInfo.MasterTblName

  • Plat.BillServer.OpenBill(BillType, DBID, BillID, WishReadOnly)(WishReadOnly=True 只读)

  • 主表定位用动态 TAstaClientDataSet(AstaClientSocket := DBLink.ClientSocket)。

  • 源码编码:.pas 为 GBK(代码页936),修改须走 GBK↔UTF-8 回转校验;.dfm 为纯 ASCII(中文以 #nnnn 转义、报表流以 {hex} 存储)。

  • 编译验证:命令行 dcc32 因既有 Indy9/indy10 混编不可用,须在 IDE 中 Build SrvReport.dpk。