Smart Form跨系统传输与俄语多语言落地实操指南
前阵子公司做系统切换要把一条老的英文Smart Form从原系统原封不动搬到新的SAP环境最后还要求在目标系统上落地俄语版本。听上去就是“传个对象、再翻译一下”的事真做起来才知道Smart Form跨系统传输和多语言翻译这两件事凑在一起坑比想象中多得多。这篇就把我从对象盘点、传输请求打包、STMS导入到俄语文本维护、字体修改、调用语言参数这一整套流程的实操过程完整写出来给后面要干同样活的同事做个参考。Smart Form这个技术虽然不算新但在很多企业里仍然承担着发票、订单确认、交货单这些核心打印输出。只要涉及系统升级、分库、海外本地化基本都会碰到“把表单搬过去”和“把表单翻译成当地语言”这两个需求。这篇文章适合SAP顾问、ABAP开发、Basis运维以及负责海外上线表单支持的人看读完至少能把“英文表单搬到新系统”和“在目标系统维护俄语版本”这两件事的完整路径搞清楚少走几趟弯路。1. 项目概述与需求拆解1.1 Smart Form跨系统传输到底在传什么很多人以为Smart Form就是一个“文件”类似Word文档复制过去就行。实际完全不是这么回事。在SAP里Smart Form是一个由多个对象共同组成的复合对象表单主对象本身、表单依赖的样式Style、界面上用到的文本节点、文本符号、图形标志比如Logo、以及表单运行所需的函数模块等。传输的时候如果把Smart Form当成单一对象加进传输请求系统一般会自动把主对象打进去但是样式、图形这类附属对象不一定都会自动带上。尤其是Logo这类存在SE78里的图形它属于BDSBusiness Document Service对象很多时候需要手工单独加入传输请求漏一次就够你喝一壶的。打个不太严谨的比方Smart Form像是一个打包好的文件夹里面有正文、样式模板、素材图片、字体设置清单。你只把文件夹里的某个文件拷走了其余内容还留在原系统那到了新系统这个表单要么打不开要么打开之后样式全乱、图片显示成红叉。1.2 为什么英文表单还要另做俄语版本需求听起来也简单原系统里有一条现成的英文Smart Form新系统上线后用户主要用俄语业务方要求打印出来的单据是俄语版本。很多人第一反应是把英文文本翻译成俄语就行但实际要考虑的事情远不止“翻译”这一步。首先目标系统有没有安装俄语语言包如果没有界面上也许还能看但你在编辑器里输入俄语可能直接显示问号打印出来就更乱。其次Smart Form里的字体不一定支持西里尔字母Arial这类标准字体在非Unicode系统上对俄语支持并不好需要换成带Cyrillic扩展的字体。再次俄语单词普遍比英文长同样一句话翻译成俄语之后文本节点的高度、宽度可能就不够用了行高溢出、内容截断、换页问题都会跟着来。再加上一个最容易被忽略的点表单翻译好之后程序调用时如果不把语言参数传进去SAP还是会按照默认语言或者登录语言去取文本等于你翻译了半天打印出来还是英文。这些问题环环相扣少考虑一个线上就得多返工一次。2. 传输前准备与对象盘点2.1 先把表单的“户口”查清楚动手传之前我习惯先在源系统把表单的完整依赖关系盘一遍。用SMARTFORMS事务代码打开表单后不要急着改东西先看几个地方。第一是表单名称和描述确认你要传的是哪个版本最好顺带记一下当前激活的版本号。第二是文本节点的数量尤其是有多少内嵌在页面布局里的硬编码文本这些是后面翻译的工作量大头。第三是表单有没有挂样式如果挂了样式名称是什么样式里是否定义了特定语言的字符格式。第四是图形引用了哪些Logo去SE78里查一下这些Logo是否存在。第五是表单里有没有用子表单子表单对象也要一并纳入传输范围。这一步不用花太多时间但能避免后面导入目标系统之后才发现缺这缺那。我把这个检查项整理成了一个小清单每次跨系统搬表单都用这个套路。检查项查看方式是否影响传输表单主对象及版本SMARTFORMS打开后看属性必传样式引用表单属性里查看Style名称必传独立对象文本符号Text Symbols表单菜单栏的Text Symbols入口随主对象传输图形LogoSE78查询Name/ID常需单独加入请求子表单引用页面布局里检查Subform节点必传独立对象字体设置文本节点/段落格式里的Font属性不传输目标系统需本地支持调用函数模块名称SSF_FUNCTION_MODULE_NAME检查运行期动态获取这个表看起来琐碎但实际项目里十次传输至少有两次会因为漏了样式或者Logo出问题所以前期花十分钟盘一遍比上线后排查一小时强得多。2.2 图形、样式、字体这些“后勤”别漏了传输请求里加上Smart Form主对象之后很多人就认为完事了。实际上图形和样式才是最容易出问题的两个点。图形方面Smart Form里的Logo通常是通过SE78维护的这类对象属于BDS打包进传输请求的方式和普通表单对象不一样。在SE09创建传输请求之后可以通过“对象列表”手工加入图形对象或者在SE78里编辑图形时通过“放置到传输请求”的入口把它加进去。如果忽略这一步目标系统的表单即使能打开打印出来的里的位置也是一个空白框或者一个叉号。样式方面如果在SMARTFORMS里给表单指定了Style这个Style是一个独立对象需要单独加入传输请求。特别是样式里定义了不同语言的段落格式、字符格式时漏传样式会导致目标系统上的排版整个乱掉明明源系统看起来好好的到了新系统却对不齐。字体这块比较特殊Smart Form里的字体定义并不会随传输请求一起过去因为SAP的字体机制依赖的是目标系统本身的字体资源。所以如果俄语显示不正常你不能靠“传一个字体过去”来解决而是要在目标系统的表单文本节点里重新设置字体属性或者在操作系统/SAP GUI层面安装好支持西里尔字母的字体。3. 跨系统传输完整流程3.1 把表单装进传输请求的正确姿势老手都知道一个规律在SMARTFORMS里保存表单时如果系统弹出传输请求对话框那说明你把表单对象顺利放进了某个请求。但很多人不知道如果保存的时候没有输入请求号系统会把修改留在当前请求之外后续你想用SE10补加也不是不行但容易漏。我推荐的操作顺序是这样的打开SMARTFORMS输入表单名进入修改模式。不需要真的改动文本只要对表单做一次“保存激活”系统就会判断是否有变更需要传输。保存时在弹出的传输请求对话框中新建一个请求或者选择现有的开发请求。保存后立即用SE10查看该请求确认对象列表里出现了表单主对象。如果表单挂了样式、用了Logo用SE09/SE10把样式和图形对象也加进同一个请求。和Basis确认该请求已释放并且已安排STMS传输到目标系统。这里有一个很关键的习惯保存之后不要马上释放请求而是先自己检查一遍对象列表。尤其是当你同时维护了多个开发任务时很容易把不相干的对象混进同一个请求导致生产环境导入了一些不该导入的东西。表单类的请求对象越干净越好。3.2 目标系统导入与激活验证传输请求到了目标系统之后STMS导入日志通常只能告诉你“导入成功”还是“导入失败”。但“成功”并不代表表单就能用。我每次都会在导入完成后到目标系统用SMARTFORMS把表单打开一次看两个东西一是版本号是不是源系统最新版本二是表单检查Check是否通过。如果检查结果里有红色报错比如找不到样式、找不到图形、子表单位置异常那就说明传输不完整不要试图在目标系统里“补改”数据因为这样会让目标系统表单和源系统的版本分叉后面再传一次会更乱。正确做法是回源头检查请求对象补传缺失的部分再重新导入。还有一个细节实际跑打印任务的时候SAP会在应用服务器上对Smart Form做编译和缓存。如果导入后第一笔业务打印报错或者打印出来还是老版本的内容可以先在SMARTFORMS里手动执行一次激活让服务器重新生成运行版本。实在不行就让Basis清一下相关缓存不要一上来就改代码很多情况根本不是逻辑问题就是编译缓存没刷新。4. 目标系统俄语版本落地实操4.1 在SMARTFORMS里维护多语言文本节点进入表单的页面布局双击任一文本节点打开文本编辑器你会看到文本内容列表里有一列“语言”或者“原语言”的标识。默认情况下节点里的文本只存在于表单源语言下。要在目标系统维护俄语版需要为这个文本节点添加俄语语言行。具体操作时在文本编辑器的工具栏里找到“插入语言”或者直接在当前语言行后面增加翻译版本把语言键设为RSAP内部俄语语言键ISO代码是RU然后输入对应的俄语文案。保存之后SAP会把这条文本作为该节点的俄语翻译版本存起来。需要注意的是SAP的表单文本节点有一个“原语言锁定”机制。如果表单的开发语言是英文那么英文版本通常会被锁住不能随便改其他语言的翻译则可以自由维护。这个机制的本意是保护原始语言内容但实际操作中经常出现“为什么我翻译不了”的疑问其实就是因为当前登录语言恰好是原语言需要在语言列里手动选择别的语言或者切换登录语言后再维护。4.2 文本符号Text Symbols的翻译处理除了页面布局里的文本节点Smart Form里还有一种常见的多语言元素叫文本符号通常用于存一些短文本比如“日期”“数量”“总额”这类字段标签。文本符号的维护入口在Smart Form菜单栏的“转到”里打开后可以看到所有符号变量。文本符号的多语言处理有一个特点它在符号定义里可以维护多个语言的值。正常做法是在编辑页面把语言切换到俄语然后为每个符号输入对应的俄语值。如果符号比较多也可以通过SE63的事务把Smart Form的文本符号作为翻译对象一起导出翻译。这里要留个心眼有些开发为了省事会把固定文案写成ABAP代码里死字符串再用变量传给表单。这种文案不在Smart Form的翻译范围里在目标系统落地俄语版的时候程序里的字符串也得一并处理。这已经不是“表单翻译”的问题了而是“周边代码国际化”的问题不少人在这里栽跟头。4.3 俄语字体选择和打印验证翻译完成后先别急着发到生产一定要先做打印预览。俄语和英文在字符形状上差异很大如果字体不支持西里尔字母预览出来就是一片空白框或者问号。在非Unicode系统上最常见的处理方式是选择Arial Cyr、Times New Roman Cyr这类带Cyrillic扩展的字体。如果在Unicode系统上一般SAP标准字体组合也能支持但为了保险起见建议测试环境中先试打印几份确认预览和SP01里看到的输出都是正常的俄语字符。另一个常见问题是行高不够。俄语单词通常比英文长同样一句“Delivery Note”俄语可能是很长的一个词如果文本节点高度固定内容就会溢出到下一行甚至被截断。处理方法是把文本节点的“垂直对齐”和“自动高度”打开让节点随内容自动扩展。如果表单有严格的版面限制那就需要针对俄语版本微调字体大小或者节点宽度这部分只能一条一条节点调没有捷径。调用表单时如果要用俄语输出必须在运行时传入语言参数。以ABAP代码为例DATA: lv_fm_name TYPE rs38l_fnam, ls_control TYPE ssfctrlop. CALL FUNCTION SSF_FUNCTION_MODULE_NAME EXPORTING formname ZSMART_FORM_EN variant direct_call IMPORTING fm_name lv_fm_name EXCEPTIONS no_form 1 no_function_module 2 OTHERS 3. CHECK sy-subrc 0. ls_control-langu R. 俄语 ls_control-nodialog X. CALL FUNCTION lv_fm_name EXPORTING control_parameters ls_control * ... EXCEPTIONS formatting_error 1 internal_error 2 send_error 3 user_canceled 4 OTHERS 5.注意这里面最关键的就是ls_control-langu R如果这里不传表单就会按登录语言或者系统默认语言生成你维护好的俄语文本压根不会生效。5. 常见问题与排查技巧5.1 传输后表单打不开或版本不生效典型故障是STMS显示导入成功但目标系统SMARTFORMS里找不到这个表单或者打开之后内容还是老版本。排查思路要分成两步走。先检查SE10/SE09里请求是否已经释放很多时候开发顾问以为保存进请求就算完事实际上请求还在“可修改”状态根本没释放Basis自然无法传输。再看STMS导入日志重点看有没有对象报错有些对象在导入时会因为版本冲突或者系统间对象不一致被跳过。如果这些都正常那多半是服务器缓存问题。在SMARTFORMS里打开表单执行一次“激活”操作强制重新生成运行版本。还有一招是让Basis重启后台打印相关的Spool进程也能解决一部分“打印出来还是旧版”的诡异问题。5.2 俄语内容显示为方块或问号这个问题一旦出现用户会立刻认为是系统坏了。实际上原因通常是这几种之一SAP GUI字体设置不对、表单里指定字体不支持Cyrillic、目标系统语言包缺失。排查时先分清场景如果在编辑器里看俄语都是方块多半是SAP GUI字体问题修改SAP GUI选项里的字体设置选择支持西里尔字母的字体即可如果编辑器里看着正常打印预览却是方块问题出在Smart Form的字体属性上需要替换成Arial Cyr这类字体如果系统连俄语输入都无法保存那就是语言包/系统字符集的问题这个就不是改表单能解决的了需要Basis层面安装语言包。5.3 翻译不生效输出仍是英文翻译明明维护好了预览也正常但通过程序打印出来还是英文这种情况十有八九是调用程序没传语言参数。对照上一节ABAP示例检查一下control_parameters-langu的值确认传的是R而不是空值或者E。还有一种情况是同一个Smart Form被多个程序调用有的程序传了俄语有的程序没传。这时候不要只改一个程序先用“Where Used List”查一下这个表单被哪些程序调用把所有入口都评估一遍最好在程序里统一封装一个获取语言参数的逻辑避免每个调用点各写各的。5.4 俄语排版错乱、截断和跨页问题这是我在实际项目里踩得最深的一个坑。英文版表单页面排得整整齐齐到了俄语版几行字变长文本节点被撑大后续所有窗口的位置全往下移第二页甚至会多出大段空白。当时排查了很久最后发现根本原因有两个一是文本节点高度设成了固定值俄语内容一长就被截断或者溢出导致页面重排二是段落格式里的“行距”设置太死俄语字符带重音符号之后行与行之间互相压字。最后的解决方式是把所有涉及俄语的长文本节点全部设置为自动高度并且把段落格式中的行距从固定值改为多倍行距同时针对俄语版本微调了字号。这一步在源系统英文版上看不出区别但俄语输出就稳定了。所以翻译完了之后一定不要只看“有没有翻出来”还要逐页对照打印效果俄语内容尤其如此。5.5 一套顺手的验证路径做完上述所有修改之后我的习惯是先不走正式打印程序而是在SMARTFORMS里直接“预览”表单把输出设备设为本地PDF快速确认俄语内容、字体、排版都正常。接着再用实际业务程序跑一笔测试单据到SP01里看打印输出。这两步都通过之后才让顾问安排业务做最终验收。强烈建议在测试环境就把这套验证路径固定下来做成一个简单的测试清单。Smart Form多语言改造这类需求最怕的就是“翻译完截图看起来没问题生产上一打印全崩”提前把验证路径走一遍能避免很多上线后的救火。最后说一点个人体会Smart Form跨系统传输和俄语落地这件事真正难的不是某个单点技术而是“对象依赖”和“语言切换”这两条线串起来之后的系统性。传输漏一个对象翻译漏一个语言参数字体选错一种都会让最终效果很差。做之前把对象盘清楚、做之中把语言跑通、做之后把打印验证到位三步稳扎稳打基本就能把这类需求顺利拿下。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →