1

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

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

4

3 回答 3

9

使用该函数验证屏幕字段,%CHECK并在存在无效内容时显示错误。

D allow           C                   'ABCDEFGHIJKLMNOPQRSTUVWXYZ+
D                                      abcdefghijklmnopqrstuvwxyz+
D                                      0123456789'

/free
    if %check(allow:scrfld01) > 0;
        error = 1;
    endif; 
/end-free

或者,您可以遍历屏幕字段,在保存记录之前删除允许的字符集中不存在的任何字符。

于 2013-04-17T10:27:43.450 回答
1

Most issues related to invalid characters are listed here. You could use it on any character field with the %XLATE opcode. Example:

In your "D" specs use this...

     * 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                                     '                               ')                   

And, in your code...

    MyText = %XLate(RC:BC,MyText);
于 2013-09-14T01:45:07.303 回答
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)

如果您有很多这样的文件,可以设置一个通用触发器,该触发器将使用检索字段 API 确定相关表的布局(表名是触发器的参数)。警惕性能下降。

于 2013-04-17T10:30:42.180 回答