• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

请教:如何修改PF文件的CCSID值?

发布: 2007-6-08 22:43 | 作者: seanhe | 来源: | 查看: 116次 | 进入软件测试论坛讨论

领测软件测试网
【问题描述】
我这边的ERP系统由日本总部自行开发,所以PF的CCSID值几乎都为290(日文)[用DSPFFD查看],这样想使用Transfer下载EXCEL格式的数据时也只能在日语版本的CA/400、PCOM仿真软件使用,同时想通过Notes服务器的LEI功能访问PF时也出现“语言转换错误”信息。
由于本地AS/400服务器没有安装SQL的License program,所以无法使用STRSQL对生成的PF进行修改CCSID值,进入Navigator去也只能查看,无法修改(权限足够的用户登陆)。

【当前环境】
AS/400e V5R2M0
ERP系统开发语言:RPGⅢ 、RPGLE 、CLP

【请教】
请教各位老程序专家:
如果修改整套生产系统后台的PF的CCSID值会造成什么影响吗?
可以通过什么命令修改PF的CCSID值呢?
谢谢!

 yangspring 回复于:2004-06-17 15:20:27
CHGPF-----FILE/LIBRARY----- F9 ----- F11 ----- PAGE DOWN ----- CCSID

 qingzhou 回复于:2004-06-17 15:26:38
[quote:0399c474f2="yangspring"]CHGPF-----FILE/LIBRARY----- F9 ----- F11 ----- PAGE DOWN ----- CCSID[/quote:0399c474f2]
谢了。。。
我已经将CCSID=290→1388,并测试通过可以通过中文版CA/400、PCOM下载!
我当时也说用CHGPF命令,然而可爱的IBM同志居然说:CHGPF不可以,晕~~~
另:
全部修改会对系统造成什么影响没?

 zzzddd 回复于:2004-06-17 15:40:44
LTER TABLE USRPRF ALTER COLUMN UPTEXT SET DATA TYPE
HARACTER ( 50) CCSID 935 NOT NULL WITH DEFAULT

 qingzhou 回复于:2004-06-17 15:54:49
[quote:9532047cf2="zzzddd"]LTER TABLE USRPRF ALTER COLUMN UPTEXT SET DATA TYPE
HARACTER ( 50) CCSID 935 NOT NULL WITH DEFAULT[/quote:9532047cf2]
Thanks!
But my English is very poor,Would you like to translate it into Chinese? :D

 xuguopeng 回复于:2004-06-17 16:09:10
[quote:cfeda50f05="zzzddd"]LTER TABLE USRPRF ALTER COLUMN UPTEXT SET DATA TYPE
HARACTER ( 50) CCSID 935 NOT NULL WITH DEFAULT[/quote:cfeda50f05]


这是SQL语句吧

 qingzhou 回复于:2004-06-17 16:19:59
[quote:855089ded1="xuguopeng"]
这是SQL语句吧[/quote:855089ded1]
应该是了,用SQL语句也是可以修改PF的CCSID值的!
另外:
我觉得PF的CCSID值的设定很关键,会造成Transfer传输时由于语言版本不同而带来的错误信息。
上次我一直在测试通过Notes服务器的LEI功能对AS/400的DB/2数据库进行访问,结果配置成功LEI后,一运行LEI的配置的“双向实时文档”,在DOMINO的Console台就显示错误信息,当时一直想不通怎么回事情,后来联想到这个事情,也就明白了。。。 :em02:

 xuguopeng 回复于:2004-06-17 16:22:52
还有系统值QCCSSID也要设定好

 qingzhou 回复于:2004-06-17 16:41:33
我本地400的QCCSID=65535,所以应该没有什么问题。
现在:
我想修改ERP系统后台所有PF的CCSID值,对程序有什么隐患没?
因为:
我目前要实施的SQL DTS功能、CA/400和PCOM中文版下载EXECTL格式数据、以及Notes通过LEI功能访问PF都存在同样问题。(日语CCSID=290,简体中文=1388)

 xuguopeng 回复于:2004-06-17 16:50:28
400上的简体中文是935吧,我想如果都改为65535应该问题不大吧

不过你最好先测试一下 小心驶的万年船啊

 fzrxh 回复于:2004-06-17 16:53:02
如果不存在双字节还好说,如果有双字节可能就麻烦了

 xuguopeng 回复于:2004-06-17 16:59:28
既然是日本人用的肯定会有日文,双字节我估计肯定是有了

 qingzhou 回复于:2004-06-17 17:01:04
[quote:c8085395af="xuguopeng"]400上的简体中文是935吧,我想如果都改为65535应该问题不大吧
不过你最好先测试一下 小心驶的万年船啊[/quote:c8085395af]
CCSID跟主机代码页有什么不同么?
我刚才是看了CA/400中文版所配置的Display Session中查看的数值,所以直接将个人Library下的PF修改成1388了。。。
结果再重新用Transfer功能下载LIU/EXECTL(EXECTL)的PF,就解决了以前只能在日文版本使用Transfer下载PF成EXECTL格式的问题了。






 qingzhou 回复于:2004-06-17 17:02:10
[quote:35194628a3="fzrxh"]如果不存在双字节还好说,如果有双字节可能就麻烦了[/quote:35194628a3]
如果是,是不是不能修改PF的CCSID值呢?

 ANTENTER 回复于:2004-06-17 17:38:34
?好像有问题。
code page is 290
ccsid may be 5035
:)

 fzrxh 回复于:2004-06-17 17:40:44
其實,如果你要下載的數據不包含日文的話,可以建立邏輯檔,再下載
邏輯黨的數據

 qingzhou 回复于:2004-06-17 17:48:22
[quote:2a4d1d4a82="fzrxh"]其實,如果你要下載的數據不包含日文的話,可以建立邏輯檔,再下載邏輯黨的數據[/quote:2a4d1d4a82]
好深奥~~~

我现在有点个人想法:
为了避免修改生产系统PF的CCSID值给系统正常运行带来的负面影响,所以想采取如下措施:
1。编写一个CLP,含→实现CPYF相关业务数据的PF功能、并对CPYF后的PF进行修改其CCSID值的CL语句。
2。将该CLP通过ADDJOBSCDE进行提交到QBATCH里面,让它在指定的时间内自动运行。
3。然后通过SQL DTS功能对新CPYF来的PF进行从AS/400往SQL Server推数据。

老前辈觉得可行么? :D

 fzrxh 回复于:2004-06-18 08:03:33
可以试试,等待你的结果

 yhp 回复于:2004-06-18 08:50:40
[quote:c342629b81="qingzhou"]
好深奥~~~

我现在有点个人想法:
为了避免修改生产系统PF的CCSID值给系统正常运行带来的负面影响,所以想采取如下措施:
1。编写一个CLP,含→实现CPYF相关业务数据的PF功能、并对CPYF后的PF进行修改其CCSID值..........[/quote:c342629b81]

修改CCSID的话可能造成:
1、影响程序速度,可能增加了数据字段转换的时间以及数据的不稳定性
2、如果没有所有的PF文件修改的话,数据文件CCSID的不一致,可能造成程序的无法运行和数据的掉失。
3、CA中修改的CCSID不影响主机的应用,只是在转换的过程中增加了字符转换的功能(个人理解)
4、原来我们使用天刚的软件在下载的时候从繁体转换成简体,日文的就没有试过 不过你可以试试。

 qingzhou 回复于:2004-06-18 10:20:19
[quote:cdb6933d05="yhp"]

修改CCSID的话可能造成:
1、影响程序速度,可能增加了数据字段转换的时间以及数据的不稳定性
2、如果没有所有的PF文件修改的话,数据文件CCSID的不一致,可能造成程序的无法运行和数据的掉失。
3、CA中修改的..........[/quote:cdb6933d05]

是的,不能随意修改PF的CCSID值。 :em06:  :em06:  :em06: 
所以我还是采取我的个人思路去实施。。。

 qingzhou 回复于:2004-06-18 10:26:08
【原来思路】
1。编写一个CLP,含→实现CPYF相关业务数据的PF功能、并对CPYF后的PF进行修改其CCSID值的CL语句。 
2。将该CLP通过ADDJOBSCDE进行提交到QBATCH里面,让它在指定的时间内自动运行。 
3。然后通过SQL DTS功能对新CPYF来的PF进行从AS/400往SQL Server推数据。 

【改进思路】
1。编写一个CLP,含→实现CPYF相关业务数据的PF功能、并对CPYF后的PF进行修改其CCSID值的CL语句。[color=red:31a398aea2]同时在CLP中定义一个变量(0=pass,1=stop),并设定循环,定时去正规库中CPYF PF到个人库下,须终止执行时将该变量值设定为1,从而将第2步骤节省。[/color:31a398aea2]
2。然后通过SQL DTS功能对个人库下的PF操作,从AS/400往SQL Server推数据。

各位前辈们觉得可行么?

 红像 回复于:2004-06-18 13:34:48
顺便问一下:只修改CCSID, 不修改LANG ID有用么? 偶COPY了一个数据库,原来是意大利文的。

 qingzhou 回复于:2004-06-18 13:45:56
[quote:7d78f4063f="红像"]顺便问一下:只修改CCSID, 不修改LANG ID有用么? 偶COPY了一个数据库,原来是意大利文的。[/quote:7d78f4063f]
如果是通过CA/400、PCOM的Transfer下载数据是可以解决语言版本问题,前提是PF中的字段不含:外国语言,否则下载下来的字段可能无法正常显示。
按照前辈们的意思,最好不宜去修改整套系统PF的CCSID值,对系统运行有影响的。

 qingzhou 回复于:2004-06-21 09:34:15
从IBM网站找来的资料,看后感觉对ODBC转换问题有些大致了解,转贴出来大家也好看看。

【转载IBM】《ClientAccess/400 ODBC 多国语言支持》
 
内容提要:   
 术语定义
 影响转换的OS/400参数
 影响转换的PC参数
 DB2/400 SQL考虑事项
 如何进行CCSID转换  
  
说明:
     本文旨在说明ODBC如何处理NLS(多国语言支持)相关参数和数据转换。    

适用操作系统:

OS/400 V3R2M0 以上。

术语定义:

Language (语言):程序生成的各类信息所使用的语言。它同时也适用于排序的顺序(sort sequence)。ODBC和数据库文件本身并不关心数据的字符集/代码页所的语言属性。
CCSD:代表一个编码方案、代码页和字符集的双字节标识符。
Code Page (代码页):一个字符集及相关的十六进制值。

影响转换的OS/400参数:

Job CCSID (作业CCSID) 
-数据库服务器读取由调用QWTSETP API切换的连接用户(User Profile)的用户信息。这个用户的CCSID就成为作业的CCSID。如果ODBC用户不同于当前的Client Access作业用户,则ODBC应使用ODBC作业连接用户的CCSID。 
   
File CCSID (文件CCSID) 
-系统中没有文件或表CCSID。字段(field)名称和表名称被看作是一个十六进制值(带有允许的十六进制字符值,如037 CCSID中所定义)。DSPFD命令中显示 的值为字段的CCSID。如果表格中有混合的CCSID字段,则该值也是混合的。请参见下面关于字段和表格名称的例子。 
   
Field CCSID (字段CCSID)
- 字段中包含的字符或二进制数据的CCSID。
Job LANGID (作业LANGID)  

-与CCSID的确定方法相同,如ENU。
-不用于确定分类顺序。在R312之前始终使用HEX。R312及以后的版本允许ODBC数据源根据数据源中规定的LANGID规定分类顺序。
-不用于确定多语种环境( 由下面的客户机设置)中主机错误消息文本的语言。
-如果作业CCSID为65535,则DFTCCSID则基于这一数值。作业不能用数值为65535的CCSID运行。作业CNTRYID。
-与CCSID的确定方法相同,如US。
-不使用 
   
影响转换的PC参数:

-己安装Windows版本的ANSI代码页,cwbNL-GetANSICodePage API确定。而这又来自Windows GetACP API,具体设置取决于Windows的版本和Windows的本地设置。该值可以通过以下2种方法之一修改:呼叫相应的Windows API;或通过客户机接入属性的语言标记(tab)(R313及以后的版本)。
-己安装的客户机接入语言(如由cwbnl-GetLang()API返回的2924)。客户机接入语言ID只会影响用于显示对话框、帮助文本、客户机错误消息等的语言。我们可以在一个具体版本的Windows中为客户机接入设置多种语言。然后,您可以通过调整客户机属性中的设置来在它们之间转换。NT中的多用户支持应允许不同的NT档案(profile)在同一台PC机上运行使用不同语言的客户机接入。
-ODBC数据源
分类顺序由语言标记中的设置决定。这些设置还会影响字符串的对比方法。
用户可以注册一个ODBC转换DLL(见下面部分)。 
   
DB2/400 SQL考虑事项:

ClientAccess ODBC允许采用一些属于OS/400 DB2/400SQL字符集但不属于ODBC规程的字符。用于AS/400 SQL参考手册的DB2建议您不要使用这些字符,因为它们是常变字符集的一部分(它们可以代表不同字符,具体取决于CCSID)。可变字符为#(x7B)、@(x7C)、$(x5B)、非符号(x5f)和垂直线“|”(x4F),正如037字符集中所定义。DB2/400不将包含有SQL陈述语句的字符串转换为037。例如,如果一个设置为英国英语(CCSID 285)的作业输入一个带有“$”的字段名,则SQL陈述语句将显示SQL0113错误消息,因为CCSID 2855中的“$”符号为x4A。

如何进行CCSID转换:

SQL命令字符串、表名、字段名和数据使用相同的转换程序。我们一直假设SQL命令字符串、表格名和字段名根据ODBC作业的CCSID。而字符数据总是根据字段的CCSID中转换。向PC CCSID的转换流程便是一例。向OS/400 CCSID转换时步骤刚好相反。
第一步:
-设置主机服务器属性
Client Access ODBC与服务器相连时,它设置以下服务器属性:
- 缺省Client CCSID
ODBC不设置该项内容,因此采用缺省设置。缺省设置是上面确定的作业CCSID。
- 语言特性代码
设置为Client Access语言(如2924)。这与某一种语言(如英语)相关,它决定多语种设置中主机错误消息和PC错误消息的语言。如果主机中未设置语言,系统便生成告警消息并采用缺省语言。
- NLSS(分类顺序)识别符
R311和R310 ODBC不设置这项内容。它们采用缺省值。R312及以后版本允许在ODBC数据源中设置这项内容。缺省值为HEX。
- 转换指示器
ODBC将该项内容设置为1。运行结果设置数据被转换为客户机CCSID(缺省为作业CCSID)。
- 转换表的ASCII CCSID设置为0 - 缺省值
AS/400 主机响应:
- 服务器CCSID值
设置为用户(USER Profile)中的值(见上面内容)
- 服务器NLSS值 上面ODBC设定的值。
- 服务器语言ID
上面ODBC设定的语言值。
- 服务器语言表(EX:*HEX)
返回ODBC设定的值。

第二步 从字段CCSID向作业的CCSID转换:
服务器平台在文件/字符数据和作业CCSID之间进行任何必要的转换作业。表名称、字段名称和发往主机的SQL语句不需要这一步。  

-如果字段的CCSID为65535,则不进行任何转换。
-如果数据的CCSID与作业CCSID相同,则不进行任何转换。
-如果文件和作业的CCSID不同,服务器便会试图转换数据。转换过程中可能会生成告警消息,如在往返转换中进行的替代不允许,或在转换不允许时生成错误消息。
-图形数据在相关的作业CCSID图形CCSID中返回。    

第三步 从作业CCSID向PC CCSID的转换:

ODBC驱动程序在作业CCSID和PC ANSI代码页之间转换数据。

转换过程中采取以下步骤: 
-如果数据为65535,则不进行任何转换。
-如果数据CCSID等于作业CCSID,则将EBCDIC CCSID转换为与PC当前的特定本地识别符或语言识别符相关的ANSI代码页。
-如果数据CCSID与作业CCSID不相等,它则寻找合适的转换表,将EBCDIC CCSID转换为ANSI代码页。 
   
第四步 ODBC转换DLL(可选) 
在R311或以后的版本中,您还可以提供您自己的转换DLL。ODBC会定义一个可选的转换DLL,从而实现驱动程序和数据源之间传输的所有数据的转换。Client Access ODBC驱动程序将传送所有CHARACTER数据。该DLL可以用于字符集转换。Client Access不提供该DLL,但R311和以后的版本允许您注册自己的转换DLL。详细信息请参见ODBC规程。

 qingzhou 回复于:2004-06-21 09:41:58
[quote:a4fc7e7a8f="qingzhou"]
【改进思路】 
1。编写一个CLP,含→实现CPYF相关业务数据的PF功能、并对CPYF后的PF进行修改其CCSID值的CL语句。同时在CLP中定义一个变量(0=pass,1=stop),并设定循环,定时去正规库中CPYF PF到个人库下,须终止执行时将该变量值设定为1,从而将第2步骤节省。 
[/quote:a4fc7e7a8f]

细化了一下,昨天回家粗粗写了CODE,请大家看看这样的CLP运行后会不会存在什么隐患没?
请不吝赐教!

[code:1:a4fc7e7a8f]
 /****************************************************/
 /**  TOHOKU RICOH (FUZHOU) CO,LTD.                                       **/
 /**                                                                                               **/
 /**  PROGRAM ID        : CPYFSCDE                                               **/
 /**  DESCRIPTION       : Copy Phylics File Schedule                      **/
 /**                                                                                               **/
 /**  PROGRAMMER NAME   : Liu yuanyao                                      **/
 /**  CREATION DATE     : 2004/06/20                                           **/
 /**  MODIFICATION DATE :                                                           **/
 /****************************************************/

             PGM        PARM(&FLAG)

             DCL        VAR(&FLAG) TYPE(*DEC) LEN(1)
          
             CHGVAR     VAR(&FLAG) VALUE('0')

/*--------- CHANGE JOB ENVIRONMENT ---------------------------------*/

             CHGJOB     OUTQ(LIU)

             CHGLIBL    LIBL(QTEMP BKUPTST R21AMLBE QGPL) +
                          CURLIB(*CRTDFT)

/*--------- INITIALIZE *LDA ----------------------------------------*/

             CALL       PGM(AAILDA)

/*--------- BATCH PROCESS DATE SET ---------------------------------*/

             CALL       PGM(ASDSET)

/*--------- COPY PF AND CHANGE CCSID -------------------------------*/

        LOOP:
             IF         COND(&FLAG *EQ '0')  THEN(DO)

             CPYF       FROMFILE(BKUPTST/EXECTLT) TOFILE(LIU/EXECTL) +
                          MBROPT(*REPLACE)

             CHGPF      FILE(LIU/EXECTL)  CCSID(935)

/*--------- MONITOR ERROR INFORMATION ------------------------------*/

             MONMSG     MSGID(CPF0000) EXEC(GOTO ERROR)

/*--------- STOP CPYF LOOP -----------------------------------------*/
       
             IF         COND(&FLAG *EQ '1')  THEN(RETURN)           

             ENDDO

/*--------- DELAY 1 MINUTE LOOP -----------------------------------*/

             DLYJOB     DLY(60)
               
             GOTO       CMDLBL(LOOP)

       ERROR:
             SNDPGMMSG  MSG("Is the pf really exist? Please check!")  +
                          MSGTYPE(*ESCAPE)
             RETURN

             ENDPGM

[/code:1:a4fc7e7a8f]

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网