打印快照管理
- 文档更新日期:2026-10-25
一、功能概述

"打印快照管理"用于查询系统历次报表打印时保存下来的快照,并支持:
- 按条件检索打印记录(列表页)。
- 内嵌预览某条快照当时打印出来的报表版面(预览页)。
- 对属于"单据打印"的快照,一键只读打开对应的业务单据(查看单据)。
窗体顶部为工具条(含"条件""查看单据"等按钮),主体是一个两页签的标签控件:
| 页签 | 标题 | 作用 |
|---|---|---|
| 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 定位与打开流程
点击"查看单据"后,系统按以下链路处理:
- 解析当前记录的快照编号,取出"单据类型"与"单据号"(并去掉尾部
#)。 - 找单据服务取主表名:以单据类型调用单据服务
GetBillInfo,取得该类单据主表的表名称(MasterTblName)。 - 按单据号定位 ID:所有单据主表都继承统一祖先结构(含
fBillNo、fDBID、fBillID),用Where fBillNo = 单据号到主表查出该单据的数据库ID(fDBID)与单据ID(fBillID)。 - 只读打开:以(单据类型、数据库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.MasterTblNamePlat.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。
