如何防止用户在文本字段(字符类型)中输入特殊字符(如键盘中不可见的符号)?

时间:2013-04-17 09:38:32

标签: ibm-midrange rpgle rpg

如何防止用户在AS400的文本字段(字符类型)中输入特殊字符(如键盘中不可见的符号)? 显然,大多数时候iseries / as400在接受它并将其保存到文件中时没有问题,但有时当数据在下游报告系统中处理时,它会被系统中的不同错误拒绝。有没有办法防止进入点本身?

例如:在客户的地址字段中,最终用户复制粘贴(ctrl + c ctrl + v)来自网页或文档的详细信息导致输入垃圾字符或空值,这些存储没有问题但后来导致其他问题报告申请。

3 个答案:

答案 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);