首页 / 资讯中心 / 文章详情

SAP Smart Forms 英文环境打印中文重叠与压缩问题排查指南

SAP Smart Forms 英文环境打印中文重叠与压缩问题排查指南 ★ FEATURED ARTICLE
简介这份文档面向SAP ABAP开发与报表运维人员聚焦Smart forms在英文登录环境下打印中文时出现的字体重叠、乱码与字符压缩问题提供从成因定位到代码修正的完整排错思路。资源为单个doc文件压缩包约28KB内容围绕语言环境设置展开涵盖FM SSFRT_SET_LANGUAGES的赋值逻辑、control_parameters-langu与%header-langu的关系以及SAP Note 808326、908442、1007575的适用场景与验证方法。作者结合ECC6.4实际调试过程记录了在FORM routine中补充control_parameters-langu 1并传参后问题消除的经过同时说明超过31字符时亚洲字符被压缩的触发条件与补丁处理方式。目前已有1085人学习下载适合需要快速排查Smart forms中文打印异常、理解SAPscript与Smart forms语言版本控制差异的开发者参考。1. 英文环境打印中文就叠字一个被 SAP Note 带偏的排查经历登录语言是 E 的 SAP 系统里跑 Smart forms 打印预览只要业务数据里带中文字符就挤成一团超出预留宽度的部分还会跟后面字段的内容搅在一起。这个故障在 Unicode 系统里相当常见尤其是那些在中文环境开发、却要在英文环境打印的场景。我当初第一反应是系统 bug跑去 service.sap.com 翻 Notes找到 808326 和 908442 两个看起来完全对得上的条目结果一比对 Corrections Instructions发现系统 ECC6.4 早就打过了。也就是说Note 不是根因问题出在自己的 form 程序里。如果你也正被 Smart forms 中文字体重叠卡住并且确认相关 Note 已经打过那接下来的排查路径应该能帮你省掉重新翻一遍 Notes 的时间。2. 根因不在 NoteSSFRT_SET_LANGUAGES 把语言版本带偏了2.1 从打印预览叠字到 %header-langu 的赋值链路Smart forms 打印预览时中文重叠表面看是字符渲染问题实际是语言版本选错了。在 Unicode 系统里打印预览会根据 form 的语言版本去决定字符的排版规则。如果系统拿到的语言版本跟你实际要打印的内容语言不匹配中文这种双字节字符就会按单字节逻辑去排结果就是挤在一起。我当时的排查方式是在 Smart form 对应的 Function Module 里 Debug一般在 350 行之后能看到这样一段代码call function SSFRT_SET_LANGUAGES exporting i_control_parameters control_parameters i_masterlanguage 1 i_thrulang i_install_lang importing o_languages %languages. %header-langu %languages-langu1.这段代码里%header-langu是关键它决定了要打印的 form 用哪个语言版本。而SSFRT_SET_LANGUAGES对它的赋值逻辑是control_parameters is initial ? sy-langu : control_parameters-langu翻译成白话就是如果control_parameters-langu是初始值那就用当前登录语言sy-langu如果已经赋了值就用你传进去的那个语言。我的 FORM routine 程序里压根没给control_parameters-langu赋值所以在英文环境打印时%header-langu就等于sy-langu也就是 E。系统找不到 E 版的中文 Smart form就把中文版本的 form 当成 E 版来处理中文数据内容自然就重叠了。2.2 改一行赋值代码让打印语言锁定为中文定位到根因之后解决方式很直接在调用 Smart form 的 FM 之前给control_parameters-langu显式赋值为1然后把这个参数传进去。 在调用 Smart form 的 FM 之前显式指定打印语言版本为中文 control_parameters-langu 1. 将 control_parameters 传入 Smart form 对应的 FM call function SSF_FUNCTION_MODULE_NAME exporting formname Z_SMARTFORM_NAME importing fm_name lv_fm_name. call function lv_fm_name exporting control_parameters control_parameters 其他业务数据参数... exceptions formatting_error 1 internal_error 2 send_error 3 user_canceled 4 others 5.这里control_parameters的类型是SSFCTRLOPlangu字段就是用来指定打印语言版本的。赋值为1表示中文赋值为E表示英文。关键点在于这个赋值必须发生在调用 Smart form 的 FM 之前否则 FM 内部执行SSFRT_SET_LANGUAGES时拿到的还是初始值又会回退到sy-langu。改完这一处之后英文环境下的打印预览中文不再重叠按预留空间自动换行也正常了。如果你在中文环境打印本来就没问题只在英文环境出问题那基本可以锁定就是这个参数没赋值。注意control_parameters-langu的赋值要放在SSF_FUNCTION_MODULE_NAME之后、实际调用 form FM 之前顺序反了不生效。3. 超过 31 个字符就压缩Note 1007575 的触发条件与补丁确认3.1 压缩现象和重叠是两回事别混在一起排查语言版本的问题解决之后我又发现另一个现象当取出的数据字符比较长时文字会压缩在一起。一开始以为是同一个问题的残留后来测试发现触发条件不一样——重叠是只要中文就出现压缩是超过一定长度才出现。重新上 service.sap.com 查找找到 Note 1007575 - Compressed Asian characters in the print preview。Symptom 写得很明确在 Unicode 系统中显示 Asian Smart Form某一行表格有足够空间显示内容但系统会压缩超过 31 个字符的文本。一测试果然是超过 31 字符时才压缩31 以内正常。这两个问题的表现都是“字挤在一起”但根因完全不同。重叠是语言版本选错压缩是 Unicode 系统下 Asian 字符的排版逻辑有缺陷。如果只解决了语言版本问题长文本压缩依然会出现所以需要分开确认。3.2 确认 Note 是否已打没打就申请打上Note 1007575 的解决方式就是打补丁。但在打之前先确认系统当前状态 通过 SNOTE 事务码查看 Note 1007575 的当前状态 如果显示“已实施”说明补丁已打压缩问题应该已修复 如果显示“未实施”或“可实施”需要申请传输后打上实际操作路径是事务码 SNOTE → 输入 Note 编号 1007575 → 查看状态。如果状态是“已实施”但压缩仍然存在那就要检查是不是有其他 Note 依赖没打全。如果状态是“未实施”走正常的 Note 申请和传输流程打上即可。我当时的系统是 Note 没打申请打上之后超过 31 字符的压缩问题也消失了。这里有个容易翻车的地方有些人看到 Note 编号对得上就直接打没确认系统版本和依赖关系打完发现没效果。常见做法是先看 Note 的 Valid Releases 和 Support Packages 要求确认当前系统版本在支持范围内再走传输。提示Note 1007575 和 808326、908442 不是替代关系。808326 和 908442 针对的是 Unicode 打印预览的通用排版问题1007575 专门针对 Asian 字符超过 31 字符的压缩。三个 Note 的触发条件不同需要分别确认。4. 避坑记录这几个操作最容易让问题反复4.1 在英文环境编辑中文 Smart form打印出来全是乱码现象在 login language 为 E 的环境里编辑 Smart form里面写的中文描述打印预览时变成乱码。原因Smart form 的文本元素在保存时会跟当前编辑语言绑定。在英文环境编辑中文内容系统可能把中文字符按英文编码存储打印时按英文版本去渲染自然出乱码。解决编辑中文 Smart form 时把登录语言切到中文环境再操作。如果已经编辑错了重新在中文环境下修改并保存文本元素。我现在的习惯是只要 form 里包含中文一律在中文环境编辑不图省事在英文环境直接改。4.2 只改了主程序没改 FORM routine参数传不进去现象在调用 Smart form 的主程序里给control_parameters-langu赋了值但打印预览还是重叠。原因Smart form 对应的 FM 是在 FORM routine 里被调用的如果赋值只写在主程序、没有通过参数传递到 FORM routine 里的 FM 调用处SSFRT_SET_LANGUAGES拿到的仍然是初始值。解决确认control_parameters作为参数传入了 Smart form 的 FM。检查路径是主程序 → FORM routine → Smart form FM每一层都要把control_parameters传下去。我一般会在 FM 调用前加一个断点看control_parameters-langu的值是不是1不是就往上追哪一层没传。4.3 打了 Note 没重启服务补丁没生效现象Note 1007575 显示已实施但压缩问题还在。原因某些 Note 的补丁需要重启应用服务器才能生效尤其是涉及打印排版逻辑的修改。只打 Note 不重启运行时加载的还是旧逻辑。解决打完 Note 后确认是否需要重启。常见做法是看 Note 的 Correction Instructions 里有没有提到需要重启服务或者直接问 Basis 同事。如果不确定打完 Note 后重启一次应用服务器再测试。4.4 用 sy-langu 判断打印语言忽略了 form 的语言版本现象代码里用sy-langu来判断当前应该打印什么语言的内容结果在英文环境打印中文 form 时逻辑走错分支。原因sy-langu是当前登录语言不是 form 要打印的语言版本。在英文环境登录但打印中文 form 时sy-langu是 E但 form 实际需要的是中文版本。解决判断打印语言时用control_parameters-langu而不是sy-langu。如果业务逻辑需要根据打印语言做分支显式读取control_parameters-langu的值来判断。4.5 忽略 SAPscript 的 OPEN_FORM 也有同样问题现象Smart form 的问题解决了但 SAPscript 打印时中文也重叠。原因SAPscript 的OPEN_FORM里也有language参数逻辑跟 Smart form 的control_parameters-langu类似。如果没设置同样会回退到sy-langu。解决在调用OPEN_FORM时显式指定language参数为1。代码示例如下call function OPEN_FORM exporting form Z_SCRIPT_FORM language 1 显式指定中文语言版本 其他参数... exceptions canceled 1 device 2 others 3.不管是 Smart form 还是 SAPscript打印时限制 form 的语言版本都是关键。我现在的习惯是只要 form 里有中文不管当前登录语言是什么都在调用前显式指定语言版本。5. 快速定位这类问题的排查顺序与验证方法遇到 Smart forms 中文打印异常先别急着翻 Notes。按下面的顺序走一遍大部分情况能在十分钟内定位到根因。第一步确认问题现象是重叠还是压缩。重叠是只要中文就出现压缩是超过 31 字符才出现。两者根因不同排查方向也不同。第二步检查control_parameters-langu是否赋值。在 Smart form 对应的 FM 里找到SSFRT_SET_LANGUAGES调用处看control_parameters-langu的值。如果是初始值说明没赋值系统会用sy-langu这就是重叠的根因。解决方式是在调用 FM 前赋值为1。第三步确认相关 Note 是否已打。用 SNOTE 查看 808326、908442、1007575 的状态。808326 和 908442 针对 Unicode 打印预览的通用排版问题1007575 针对超过 31 字符的压缩。如果状态是“未实施”走传输流程打上如果已实施但问题还在检查是否需要重启服务。第四步验证语言版本是否生效。在 FM 调用前加断点看control_parameters-langu的值是不是1。如果是1但打印还是异常检查%header-langu的值确认SSFRT_SET_LANGUAGES返回的语言版本是否正确。下面这张表可以帮你快速对照现象和根因现象触发条件根因解决方式中文重叠英文环境打印只要中文就出现control_parameters-langu未赋值回退到sy-langu调用 FM 前赋值control_parameters-langu 1中文压缩超过 31 字符才出现Unicode 系统 Asian 字符排版缺陷打 Note 1007575中文乱码英文环境编辑中文 form文本元素与编辑语言绑定在中文环境编辑并保存SAPscript 重叠英文环境打印中文OPEN_FORM的language参数未设置调用时指定language 1第五步如果以上都确认无误但问题还在检查 FORM routine 里是否有其他逻辑覆盖了control_parameters-langu。常见做法是在 FM 调用前打印一次control_parameters-langu的值确认没有被后续代码改掉。从那以后我每次写 Smart form 或 SAPscript只要涉及中文打印都会在调用前强制走一遍语言版本赋值的检查不管当前登录语言是什么。这个习惯帮我省掉了至少三次重新翻 Notes 的时间。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站