ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PowerBuilder DataWindow打印预览与HIS维护实践:从printpreview()到调用模型

PowerBuilder DataWindow打印预览与HIS维护实践:从printpreview()到调用模型 简介面向PowerBuilder开发与维护人员的PDF参考手册围绕PB变量类型命名规则、开发规范、变量访问权限与注释模板等核心知识点展开。内容细化到Boolean、String、Integer、UInt、Long、LongLong、Date、Time、DateTime、Decimal等类型的全局/共享/实例变量前缀约定并对窗口、数据窗口、结构体、菜单、全局函数、窗口函数、类函数、自定义类、标准类、可视化类等组件的命名规范逐一举例。手册进一步梳理了公共区域、私有区域、受保护区域以及只读/只写权限的使用差异给出了完整注释、简单注释和单行/多行注释的标准格式同时补充了字符串排版、链式操作、DLL注册与解除、DLL函数声明等实用章节既适合团队统一代码风格也可作为编码规范评审和新人培训的速查底稿。资源为单个PDF文件压缩包大小1.14MB页面轻量便携目前已有538人学习下载需要时可快速检索帮助PowerBuilder开发者减少命名冲突与权限误用问题。 早上刚到公司维护群就弹出一条消息“PB的数据窗口有printpreview()函数吗”我看了眼手边的PDF——PB手册【2022】.pdf——这问题我还真被问过不下十次。很多做系统维护、HIS二次开发的兄弟手上压着成堆的PowerBuilder老项目遇到函数细节拿不准的时候第一反应是上网搜一搜又搜出一堆过时答案。今天这篇我就结合手头这份PB手册【2022】.pdf把DataWindow打印预览、HIS维护里的高频改造点、以及被反复问到的“调用pb模型”到底怎么落地一次说清楚。不管你是刚接手PB老系统的开发还是已经在存量系统里摸爬滚打多年这篇应该都能派上用场。1. 存量系统的现实为什么一份PB手册【2022】还能当案头书1.1 PowerBuilder没有消失只是安静了很多新入行的同学看到“PB”第一反应是“都2022年了还有人用这个”事实上PowerBuilder在Windows企业客户端开发领域火了很多年尤其在国内的HIS医院信息系统、银行信贷、电力营销、制造ERP里存量PB应用相当庞大。你在医院收费窗口看到的那种老式灰底表单背后很可能就是一个PB客户端。这些系统不是说换就能换的业务逻辑复杂、接口众多、流程又不敢轻易动所以维护和二次开发的需求一直存在而且对稳定性的要求极高。也正因为这样PB开发者的工作方式和互联网后端开发完全不同不需要天天追新框架但要能在一堆老代码里快速定位问题能准确判断某个函数在目标版本里能不能用。这时候一本可靠的官方手册比任何百度出来的“大神答案”都值钱。我手头这本PB手册【2022】.pdf就是这么来的——项目要往新运行时升级我就把官方参考手册整个导成PDF放在屏幕旁边当字典用。1.2 手册才是维护工作中最靠谱的“外挂”PowerBuilder 2022手册的内容一般包含PowerScript语言参考、DataWindow对象参考、内置函数、系统属性、数据库接口、部署运行时等章节。我为什么推荐维护人员常备一份因为PB的中文技术资料很多停留在早期版本网上搜出来的答案经常对不上号。就拿printpreview()这个问题来说你去搜索引擎看前排全是互相抄的帖子有人说是属性有人说用Modify看着都头疼。而手册会直接告诉你Print.Preview是DataWindow对象的属性不是控件方法还附带适用范围和版本兼容说明。遇到类似问题先翻手册能省掉至少半小时的试错时间。这份手册不是给新手当教程通读的它是给维护人员在关键时刻“翻条文”用的。2. 数据窗口打印预览printpreview()函数到底有没有2.1 先说结论标准方法里没有printpreview()直接回答标题里的热搜问题在我维护过的PB 9、PB 11.5、PB 2022这些版本里直接在代码里写dw_1.printpreview()编译器会报“未知函数”错误。PowerBuilder标准DataWindow控件提供的打印相关方法主要是Print()、PrintCancel()、PrintSetup()并没有一个叫printpreview()的内置函数。那为什么网上有不少代码在调用printpreview()大概率是两种情况一是项目引入了PFCPowerBuilder Foundation ClassPFC在基类库里封装过类似名称的用户对象方法内部实现仍然是设置打印属性二是第三方控件或者同事自己封装的窗口函数。所以如果你在某个老项目里看到了dw_1.printpreview()别急着照抄先去翻这个工程的PBL源码看它是不是来自PFC或公共用户对象。2.2 正确的预览打开方式标准做法是设置DataWindow对象的Print.Preview属性。两种写法都常见。第一种是直接属性写法// 进入打印预览 dw_1.Object.DataWindow.Print.Preview True dw_1.Object.DataWindow.Print.Preview.Rulers False dw_1.Object.DataWindow.Print.Preview.Zoom 80 // 退出打印预览 dw_1.Object.DataWindow.Print.Preview False第二种是老项目里更常见的Modify字符串写法dw_1.Modify(DataWindow.Print.PreviewTrue) dw_1.Modify(DataWindow.Print.Preview.Zoom100)这两种写法本质一样都是把DataWindow切到预览态。设置成True之后数据窗口会按照打印页面的宽度重新排版并显示分页虚线屏幕上直观看到打印效果。设置成False就回到普通浏览态。如果是做报表窗口我通常会把工具栏上的“预览”按钮写成切换逻辑if dw_1.Object.DataWindow.Print.Preview False then dw_1.Object.DataWindow.Print.Preview True dw_1.Object.DataWindow.Print.Preview.Zoom 100 else dw_1.Object.DataWindow.Print.Preview False end if这样做的好处是按钮点击有明确反馈不会让用户按了一下没反应就重复点击。2.3 预览模式下的常见坑第一个坑预览模式下取数逻辑依然正常工作dw_1.RowCount()、GetItemDecimal()这些方法照常使用但界面重绘逻辑会选择简化渲染某些下拉DataWindow、图片列在预览里可能显示异常。这不是代码坏了只是预览状态下的表现打印出来反而正常。第二个坑如果预览模式只有一页内容但实际打印有十几页多半是数据窗口设置了自动高度的报表带区在预览状态下没展开。碰到这种情况先检查报表里的分组带、汇总带是否设置了Autosize Height再用dw_1.Describe(DataWindow.Print.Preview)能看到当前状态。第三个坑很多项目在DBError或RetrieveEnd事件里写了重绘逻辑如果在预览状态下触发了dw_1.SetRedraw(True)会发现预览界面闪烁甚至失真。建议切预览前先SetRedraw(False)切回正常态后再SetRedraw(True)。3. HIS维护PB我踩过的高频坑和顺手解法3.1 数据库连接与事务对象迁移HIS维护里最高频的操作就是“换库”。医院可能从SQL Server换到Oracle或者从Oracle换到达梦每次换库首先改的就是事务对象。PowerBuilder里默认的全局事务对象是SQLCA一堆老代码里都是靠它连接数据库。常见的连接初始化代码大概是这样的SQLCA.DBMS O10 // 以你实际安装的数据库接口为准 SQLCA.ServerName 192.168.1.10:1521/orcl SQLCA.LogID his_app SQLCA.LogPass your_password SQLCA.AutoCommit False SQLCA.DBParm CONNECT USING SQLCA; if SQLCA.SQLCode 0 then messagebox(提示, 数据库连接失败 SQLCA.SQLErrText) return end if这里最容易被忽视的是DBMS字符串。网上流传的资料经常贴一个老版本的O84 Oracle8/8i (8.x.4)如果你的机器装的是新版Oracle客户端用它去连接大概率报“不支持该DBMS”。正确做法是打开PB手册的“数据库接口”章节找到和你数据库版本匹配的DBMS字符串或者在开发环境里通过Database Profile配置好之后再复制SQLCA的赋值代码。另一个坑是Oracle客户端的NLS_LANG环境变量。HIS系统里如果中文乱码多半不是PowerBuilder代码问题而是客户端字符集和数据库字符集不一致。维护时先检查NLS_LANGAMERICAN_AMERICA.ZHS16GBK这类配置再回来看代码。3.2 数据窗口存成Excel/Csv医生和财务最爱的需求是把报表导出成Excel。很多PB老开发会随手写dw_1.SaveAs(D:\report.xls, Excel!, false)这段代码在新版Office环境里经常弹兼容性警告而且Excel!格式在老PB里本质上还是制表符分隔文本有复杂格式时列宽、表头都对不齐。我的建议是分两步能导CSV就先导CSV工整、体积小Excel也能打开如果一定要导出真正的.xlsx最好走OLE调Excel对象或者让后端服务生成文件PB只负责下载。3.3 老界面在高分屏下的适配HIS客户端从1080P升级到2K/4K显示器之后PB老界面的一个经典问题就是“字小得像蚂蚁”。Windows系统层面强行缩放又会导致界面模糊。比较实用的临时方案是在exe同目录放一个manifest文件关闭DPI缩放application xmlnsurn:schemas-microsoft-com:asm.v3 windowsSettings dpiAware xmlnshttp://schemas.microsoft.com/SMI/2005/WindowsSettingstrue/dpiAware /windowsSettings /application实测下来有的PB版本对DPI自适配支持不错有的反而更糊。我的习惯是先按上面方式试跑如果模糊就改成false让系统拉伸代价是界面整体变胖。这个问题没有完美解核心原则是别在维护阶段大规模重做布局那不是修Bug那是新项目。3.4 维护老项目一定要做的版本管理接手HIS项目第一步不是改代码而是先把PBL库纳入版本管理。很多医院项目还停留在“共享文件夹备份目录”的模式两个开发同时改一个PBL最后谁存盘谁赢极其痛苦。PowerBuilder的PBL是二进制的直接Git跟踪确实看不出差异但可以用导出SRD源码的方式做版本管理每次修改后把涉及的对象导出成文本文件提交到Git必要的时候再导回PBL。这套流程虽然土但真能救命。另外一个强烈的建议公共对象能不动就不动。某次医院要求改一个全局函数我图省事改了公共PBL结果影响了七八个窗口的打开逻辑。正确做法是把公共函数复制到应用层改名再改影响面只控制在当前业务模块里。4. “调用pb模型”落地老开发工具怎么接上新算法4.1 先想清楚“模型”在PB项目里指什么热搜里“调用pb模型”这个词在不同项目里指的东西完全不一样。有的兄弟是想在PB里调用机器学习评分卡模型有的是想连接外部AI算法服务还有的领导口中的“模型”可能只是一个数学计算公式。不管哪种老PB系统都不适合做复杂计算——它不是干这个的。最稳的思路永远是PB只负责传参和展示结果真正的算法放到DLL、Web服务或独立算法进程里PB做一个“客户端壳”。4.2 方案一REST接口最推荐如果算法团队已经把模型封装成了HTTP服务PB 2022可以用自带的JSON和HTTP能力去调用。大致流程是拼JSON请求、发送POST请求、解析JSON响应。下面是一段示意代码不同小版本的类名可能有差异具体以你这本PB手册【2022】.pdf里搜到的为准// 组装请求参数 JsonObject jo Create JsonObject jo.Set(age, 45) jo.Set(sex, 1) // 发送请求 string ls_url http://127.0.0.1:8080/score string ls_resp httpclient.SendRequest(POST, ls_url, jo, ls_resp) // 解析返回结果 JsonObject jo_resp Create JsonObject jo_resp.Load(ls_resp) dec ld_score jo_resp.GetDecimal(score)REST方案的优势是算法升级不影响PB客户端只要接口协议不变模型换成什么都不用改前端。这也是我在新项目里最推荐的方案工作量小、边界清晰。4.3 方案二本地DLL老环境里最稳有些医院的内网环境不允许跑额外服务模型算法只能用本地DLL。PowerBuilder调用C或者C语言编译的标准DLL相当顺手在窗口或全局函数的Declare区域声明外部函数FUNCTION double score_model(double x1, double x2) LIBRARY scoremodel.dll声明之后就能在PowerScript里直接调用ld_result score_model(1.23, 4.56)需要注意的是DLL位数必须和PB应用一致。如果PB客户端是32位就不能加载64位DLL这是踩得最多的大坑。另外DLL依赖的运行时库也要一起分发部署时要比REST方案更小心。4.4 方案三PBNI扩展大材小用的选择PBNI是PowerBuilder Native Interface允许你用C写一个对象然后像原生PB对象一样在脚本里使用。功能很强性能也高适合需要频繁调用、数据量大的场景。但开发门槛和维护成本都不低项目需要配套C团队上线后每次PB升级都要重新编译扩展。一般维护项目不建议上PBNI除非你手里有足够的资源并且确认REST和DLL方案都满足不了性能要求。4.5 怎么选一张表看明白方案适用场景开发量维护成本推荐度REST接口算法已服务化、内外网可通低低最推荐本地DLL内网隔离、无额外服务中中常用PBNI扩展高频调用、性能要求极高高高谨慎选5. 手头这本PB手册【2022】.pdf应该怎么查效率最高5.1 先定位版本再定位章节拿到PB手册【2022】.pdf的第一件事不是从头开始读而是先看目录重点找这几个章节PowerScript Reference语言参考、DataWindow Reference数据窗口参考、DataWindow Properties属性参考。这三个章节够用很久。如果你的PDF是官方导出的通常还会有“What‘s New”章节里面列了2022版本的新增函数和废弃项老代码升级前先翻这一段能提前避开不少坑。5.2 搜英文属性名别搜中文关键词查手册效率最高的方式是用PDF阅读器的全文搜索直接搜英文名。比如想知道printpreview有没有直接搜Print.Preview比搜“打印预览”准得多。再比如想知道某个DataWindow能不能设置自动换行搜AutoSizeHeight搜出来的条文会告诉你这个属性属于哪个对象、接受什么类型的值、适用范围是什么。我见过不少同事遇到问题先翻中文索引翻半天找不到然后开始怀疑手册不完整。中文只是翻译函数名和属性名才是真正的“主键”用主键搜索永远比用索引找快。5.3 容易被忽略但关键时刻救命的章节有几类内容平时没人看出问题时才重要我打赌你的PB手册【2022】.pdf里一定有第一是运行时库部署清单。项目升级后客户端启动报缺DLL照着手册里的运行时文件清单逐个核对比自己瞎猜靠谱得多。第二是PBNI接口文档如果你按上面的方案三做扩展这份文档才是唯一的权威。第三是数据库接口配置章节连接Oracle、SQL Server、达梦等数据库时DBMS参数、DBParm怎么写手册里都有表格。第四是DataWindow表达式语法复杂报表里会用到很多老教材讲得不清不楚但手册里的语法定义一定是最严谨的。还有一个小技巧把手册做成带书签的PDF并按照“语言-数据窗口-接口-部署”分好大类放到团队共享盘里。遇到新同事加入直接丢给他再让他对照一个老窗口的代码读一遍上手速度会快很多。我现在的习惯是凡是涉及DataWindow属性、系统函数、运行时库的问题第一反应永远是翻这本PB手册【2022】.pdf而不是搜索引擎。搜索引擎能给你一堆过时答案手册能给你准确的语法和适用范围。尤其做HIS维护系统跑在医院里每一次改动都可能影响挂号、收费、医嘱流程拿着手册把代码读仔细比什么“快捷技巧”都靠谱。如果你也守着一套PB老系统建议屏幕旁边常驻一份PDF再遇到“printpreview()有没有”这种问题翻一翻就踏实了。本文还有配套的精品资源点击获取
返回列表