请教:如何修改PF文件的CCSID值?
发表于:2007-05-26来源:作者:点击数:
标签:
【问题描述】 我这边的ERP系统由日本总部自行开发,所以PF的CCSID值几乎都为290(日文)[用DSPFFD查看],这样想使用Transfer下载EXCEL格式的数据时也只能在日语版本的CA/400、PCOM仿真软件使用,同时想通过Notes服务器的LEI功能访问PF时也出现“语言转换错误”
【问题描述】
我这边的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]
|
|
|
原文转自:http://www.ltesting.net
|