转载: 如何处理BW抽数中invalid_characteristcs 错误?

本文探讨了BW中处理非法字符的策略与方法,包括如何使用T-CODE RSKC设置允许的字符集,以及通过特定例行程序处理非法字符错误。重点介绍了非法字符的定义、类型、触发错误的时机,并提供了解决策略。

(一)

BW运行“非法字符”抽取       

        分类:            SAP 115人阅读 评论(0) 收藏 举报

BW默认对“非常字符”从R/3抽取到BW中,做了设置,如“#”符号不能抽取,一旦出现这些字符抽取就会报错。但在实际业务中,有时候有些字符代表有实际意思,所以如何让BW允许这些字符出现?

设置如下:

1:T-CODE:RSKC

2:许可的提取字符:输入允许出现的字符(PS:ALL_CAPITAL表示所有字符都允许(二)

SJIS_DBC_TO_SBC(全角转半角)

 

如何处理BW抽数中

invalid_characteristcs错误?

非法字符错误,是BW抽数中很常见又很头疼的问题,下午群里刚好有人讨论这个问题,趁热打铁总结一下。

症状

典型的非法字符错误的出错信息是:

BRAIN070, BRAIN060,BRAIN 290

Value ‘…’ (hex.‘…’) of_characteristic … contains invalid_characters

No SID found forvalue ‘…’ of_characteristic …

等等。总之,这类错误的错误消息都比较清楚,很容易判断是因为非法字符引起的。

什么是invalid_characteristics?

默认情况下,BW只允许以下的字符以及空格:

!"%&'()*+,-/:;<=>?_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

除此之外的字符都会被视为非法字符。

以下列举一些比较典型的非法字符:

1. 小写字母:如果IO没有勾选Lowercase,则小写字母都是非法字符

2. 货币符号

3. #:这个是最特殊的非法字符。首先“#”本身默认是非法字符。同时,十六进制码00-1F对应的字符也是非法字符。这些字符通常是回车,后退,TAB等特殊按键,系统无法根据codepage来找到对应的符号显示,所以都用"#"来表示。因此,当出错信息里告诉你某十六进制值有错误时,你在PSA或原系统可以看到值里面包含 "#",但这不一定是用户输入的时候输入了#,也可能是其他系统无法显示的字符。

4. "!"开头的字符串:SAP!来标记被删除的记录。

5. 只有"#"的字符串:SAP#来表示not assigned 或空值

错误发生的时机

非法字符会在系统更新Character主数据的时候,进行数据校验时引起错误。这通常发生在两个时机:

1. 激活DSO的时候:如果DSO勾选了Generate SID,则系统会去更新主数据,这时如有非法字符,会引发非法字符错误。

2. Cube装数的时候:往Cube装数肯定更新主数据,非法字符同样会引发校验错误。

有时会出现数据加载到DSO正常,加载到CUBE报错。这是因为DSO没有勾选Generate SID.

如何解决?

1.RSKC

通过这个T-CODE,你可以把系统需要接受的字符补充在此。表RSALLOWEDCHAR记录了这个设置。

其中,有一个很特殊的设置: ALL_CAPITAL. 在多语言环境中,这个设置非常有用,它让系统接受所有各种语言的大写字母,同时也包含了大部分的特殊字符。因此,大部分情况下,在RSKC中设置为ALL_CAPITAL就是最佳的做法,但是以下数据仍然是非法的:

只有#

!开头

HEX 001F

2. 通过routine处理非法字符.

具体代码网上很多,我就不写了。关键逻辑是如果原始数据含有非法字符,则对原始数据做进一步处理。判断是否含有非法字符有两种方式:

使用CN(不仅包含...) 操作符。

使用Function RSKC_CHAVL_OF_IOBJ_CHECK (SE37搜索RSKC*你会发现几个有用同类function)

请参考网上的代码:

http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/d0afbb81-f219-2c10-4181-b20f6b10e373?QuickLink=index&overridelayout=true

http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/50db4398-2dea-2b10-1fab-e3195bb311dc?QuickLink=index&overridelayout=true

http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/20253?utm_source=twitterfeed&utm_medium=twitter&utm_campaign=Feed%3A%20SAPNetworkWeblogs%20%28SAP%20Network%20Weblogs%29

3. 直接在PSA修改数据。

4. 让用户修改原始数据。

具体采用何种方式,要具体情况具体分析。如果是个别的非法字符,建议让用户修改原始数据或直接修改PSA。如果是R3那端会有大量的非法字符,建议使用routine进行处理。至于RSKC的设置,建议保持ALL_CAPITAL

另外,特别说明一下,非法字符里有"#"时,很多人会想到最省事的方法,把"#" 加入到RSKC中,但如前文所述,出现#不代表非法字符就是#,这种做法只能解决原始数据中的非法字符确实就是#而不是不可显示的16进制值的情况。

 

 

源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函官网 选择服务-新建-自定义创建 函名称随意-地区随意-运行环境Python3....
PLS-00313 错误表明在当前作用域中未声明 `UPDATE_INVALID_A`。这通常意味着在调用 `update_invalid_a` 这个子程序(可能是存储过程或函)时,该子程序未在当前块、包或模式中进行声明。 以下是可能的解决方案: #### 1. 检查子程序是否存在 首先要确认 `update_invalid_a` 子程序是否确实存在于数据库中。可以通过以下 SQL 查询来检查: ```sql SELECT object_name, object_type FROM all_objects WHERE object_name = 'UPDATE_INVALID_A'; ``` 如果查询没有返回结果,说明该子程序可能未被创建。 #### 2. 确认子程序的声明和定义 如果子程序存在,要确保它在当前代码块的作用域内是可见的。 **情况一:如果 `update_invalid_a` 是一个独立的存储过程或函** 要确保当前用户有执行该子程序的权限。可以使用以下语句授予权限: ```sql GRANT EXECUTE ON update_invalid_a TO your_user; ``` 同时,在调用时要确保使用正确的模式名(如果子程序不在当前用户的模式下)。例如: ```plsql -- 如果子程序在另一个模式(例如 other_schema)下 other_schema.update_invalid_a(p_project_id => p_project_id); ``` **情况二:如果 `update_invalid_a` 是一个包内的子程序** 要确保已经正确声明和定义了该包。示例如下: ```plsql -- 包声明 CREATE OR REPLACE PACKAGE my_package IS PROCEDURE update_invalid_a(p_project_id NUMBER); END my_package; / -- 包体定义 CREATE OR REPLACE PACKAGE BODY my_package IS PROCEDURE update_invalid_a(p_project_id NUMBER) IS BEGIN -- 子程序的具体逻辑 NULL; END update_invalid_a; END my_package; / -- 调用包内的子程序 DECLARE p_project_id NUMBER := 1; BEGIN my_package.update_invalid_a(p_project_id => p_project_id); END; ``` #### 3. 检查拼写和大小写 要确保在调用时子程序名的拼写和大小写与声明时一致。PL/SQL 是区分大小写的,除非标识符用双引号括起来。 #### 4. 检查作用域 如果 `update_invalid_a` 是在某个包或匿名块中声明的,要确保当前调用位置在其作用域内。 ### 示例代码 以下是一个完整的示例,展示了如何定义和调用一个存储过程: ```plsql -- 创建存储过程 CREATE OR REPLACE PROCEDURE update_invalid_a(p_project_id NUMBER) IS BEGIN -- 存储过程的具体逻辑 DBMS_OUTPUT.PUT_LINE('Processing project ID: ' || p_project_id); END update_invalid_a; / -- 调用存储过程 DECLARE p_project_id NUMBER := 1; BEGIN update_invalid_a(p_project_id => p_project_id); END; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值