如何防止用户在AS400的文本字段(字符类型)中输入特殊字符(如键盘中不可见的符号)? 显然,大多数时候iseries / as400在接受它并将其保存到文件中时没有问题,但有时当数据在下游报告系统中处理时,它会被系统中的不同错误拒绝。有没有办法防止进入点本身?
例如:在客户的地址字段中,最终用户复制粘贴(ctrl + c ctrl + v)来自网页或文档的详细信息导致输入垃圾字符或空值,这些存储没有问题但后来导致其他问题报告申请。
答案 0 :(得分:9)
使用%CHECK
功能验证屏幕字段,并在存在无效内容时显示错误。
D allow C 'ABCDEFGHIJKLMNOPQRSTUVWXYZ+
D abcdefghijklmnopqrstuvwxyz+
D 0123456789'
/free
if %check(allow:scrfld01) > 0;
error = 1;
endif;
/end-free
或者,您可以在保存记录之前遍历屏幕字段,删除允许字符集中不存在的任何字符。
答案 1 :(得分:1)
不确定您是否询问如何在程序中找到接受数据的字符,或者如何阻止所有程序写入此类数据。我会假设它是后者。
我知道这样做的唯一方法就是使用触发程序;系统没有字段中允许/不允许的黑名单(无论如何你都不希望这样)。
希望只有少数表(文件)以这种方式关注您,并且您可以编写一个触发器程序,为每个表附加BEFORE_UPDATE和BEFORE_INSERT,检查相关字段并且:或者: >
更改它看到的任何控制字符(这通常是不好的形式)
or
> Fails the write, allowing the entry program to re-prompt the user (most
programmers do not properly handle errors - especially write errors - so
this solution is iffy)
如果您有很多这样的文件,可以使用Retrieve Fields API设置一个通用触发器来确定相关表的布局(表名是触发器的参数)。警惕性能损失。
答案 2 :(得分:1)
此处列出了与无效字符相关的大多数问题。您可以在%XLATE操作码的任何字符字段上使用它。例如:
在您的“D”规格中使用此...
* Special Characters used for EBCDIC converision using CCSID 37 ----
* Invalid Control Characters not allowed in XML, including
* Plus CR and LF since ----
D RC C Const(x'000102030B0C0D0E0F1011121316-
D 18191C1D1E1F2526272D2E2F32373C3D3F')
* Blank characters to replace RC with in Xlate. 31 of them. ----
D BC C Const(
D ' ')
并且,在您的代码中......
MyText = %XLate(RC:BC,MyText);