|
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]
|