No tengo experiencia con esta UDTF. Tampoco la tengo instalada en el sistema, así que no puedo probarla.
Pero me llama la curiosidad del CCSID del trabajo, el 65535. Hace ya mucho tiempo, yo lo tenía igual y empecé a observar problemas con determinadas "utilidades" (por ejemplo, CGI, e-mail, etc.), alguien me recomendó que lo cambiara a uno válido. Realmente el CCSID 65535 no representa a un mapa de caracteres concreto de un país, sino que esl algo más genérico (lo siento, no sé explicarlo de otra manera). Por ejemplo, en mi caso tengo [image: imagen.png] Antes de cambiarlo para todo el sistema es posible hacer pruebas asignando el CCSID a un trabajo. Te envío unos apuntes (inacabados) sobre este asunto que podría ayudarte a resolver el problema (o no). Javier El mar., 26 may. 2020 a las 8:57, estela retes (<[email protected]>) escribió: > Buenas Alex, > > El CCSID 1200 da error de compilación, tanto si lo pongo en la variable > host como si lo meto en la propia select. > > > Sobre el STRSEQ, al compilar no estamos estableciendo ningún valor, así > que entiendo que va por defecto, *HEX. > > Así está definido el objeto compilado: > [image: image.png] > > Así están definidos los trabajos: > [image: image.png] > Deberíamos cambiar algo? > > Muchas gracias!!! > > > On Tue, May 26, 2020 at 7:32 AM Alex Martínez <[email protected]> wrote: > >> Hola >> >> ¿que valor utilizas al compilar para el parámetro SRTSEQ ? >> >> Prueba también a almacenar el valor devuelto por el SELECT en una >> variable definida con ccsid(1200) >> >> >> >> El lun., 25 may. 2020 a las 18:37, estela retes (<[email protected]>) >> escribió: >> >>> Buenas a todos, >>> >>> Estamos intentando utilizar QSYS2.IFS_OBJECT_STATISTICS para acceder al >>> contenido de una carpeta en el IFS y tratarlo después de una manera >>> sencilla. >>> >>> El código de lo que intentamos hacer es este: >>> >>> SELECT CAST(PATH_NAME AS CHAR(500)) >>> FROM TABLE (QSYS2.IFS_OBJECT_STATISTICS(START_PATH_NAME => '/home')) >>> >>> El problema es que pongamos lo que pongamos, desde los scripts del >>> rational funciona bien, pero en cuanto lo metemos en un RPG nos da el error >>> 57017. >>> "Se ha intentado la conversión de caracteres o gráficos para datos >>> incompatibles. No hay ninguna conversión definida entre CCSID 65535 y CCSID >>> 1200." >>> >>> Sabemos que el error es por conversión de objetos, ya que hemos leído >>> que con el CCSID 65535 la conversión no funciona bien y por tanto hemos >>> intentado cambiar el CCSID del trabajo con un CHGJOB en el CL previo al RPG >>> poniéndolo a 284, pero sigue saltando el error. >>> >>> Hemos intentado definir la variable de retorno en el RPG con el CCSID >>> 284, pero sigue dando el mismo error. >>> También hemos intentado poner SELECT CAST(PATH_NAME AS CHAR(500) CCSID >>> 284), pero sigue sin gustarle y da el error 57017. >>> >>> No tenemos grandes conocimientos sobre los CCSID, pero hemos leído de >>> todo en Google y estamos atascadas. >>> >>> ¿Alguien sabe porqué no nos funciona y cómo solucionarlo? >>> >>> Muchas gracias a todos por vuestra ayuda. >>> >>> Un saludo, >>> >>> >>> -- >>> Estela >>> ____________________________________________________ >>> Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd ) >>> Forum.Help400 © Publicaciones Help400, S.L. >> >> ____________________________________________________ >> Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd ) >> Forum.Help400 © Publicaciones Help400, S.L. > > > > -- > Estela > ____________________________________________________ > Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd ) > Forum.Help400 © Publicaciones Help400, S.L.
Establecer el CCSID de un trabajo
Un CCSID define la correspondencia entre los valores hexadecimales internos de los datos de tipo carácter y los símbolos del carácter que representan. Como en un CCSID sólo puede haber 256 valores hexadecimales y puede que haya que representar más de 256 caracteres de un solo byte, no todos los CCSID pueden incluir todos los valores. Todos los CCSID contienen las 26 letras mayúsculas y minúsculas estándar, los números y los símbolos de puntuación estándar; no obstante, los valores hexadecimales para esos caracteres no necesariamente son los mismos en todos los CCSID. Por ejemplo, los caracteres alfabéticos en minúsculas tienen distintos valores hexadecimales en el CCSID 37 (habitual para el inglés americano) y el CCSID 290 (un CCSID japonés). Algunos caracteres (por ejemplo, las vocales con acentos y otros signos diacríticos) no existen en algunos CCSID.
Un CCSID 65535 significa que el campo contiene valores hexadecimales sin codificación.
Estos son algunos de los términos utilizados para describir conceptos relacionados con los identificadores de juegos de caracteres (CCSID):
- ASCII: esquema de codificación nativo utilizado en los PC
- EBCDIC: esquema de codificación nativo utilizado por el IBM i
- juego de caracteres: grupo de caracteres, como el inglés o el hebreo, que se utilizan conjuntamente
- elemento de código: patrón de bits que representa un carácter
- página de códigos: juego de caracteres al que se ha asignado un elemento de código exclusivo para cada carácter
- esquema de codificación: conjunto de reglas utilizadas para representar datos de tipo carácter; cada página de códigos se define utilizando reglas de un esquema de codificación
- codificación de un solo byte: admite idiomas de un solo byte, como el español o el inglés
- codificación de doble byte: admite idiomas de doble byte, como el chino o el coreano, utilizando dos bytes para representar todos los caracteres.
- codificación Unicode: esquema de codificación universal que puede representar todos los caracteres, tanto de un solo byte como de dos bytes
- UTF-8: codificación Unicode que representa la mayoría de los caracteres de un solo byte con caracteres de un byte y los de dos bytes con dos o más bytes; se base en ASCII y se asocia on datos de tipo carácter
- UTF-16: codificación Unicode que requiere por lo menos dos bytes para representar cara carácter; de uno o de dos bytes; se asocia con datos de tipo graphic
- UCS-2: subconjunto de UTF-16 que necesita exactamente dos bytes para cada carácter; se asocia con datos de tipo graphic
El CCSID 65535
No debería utilizar el CCSID 65535 para una columna a menos que ésta contenga datos que representen seres de caracteres ilegibles. Cuando se utiliza el CCSID 65535 para la definición de una columna, los datos de ésta nunca se convierten del valor hexadecimal almacenado para llevar a cabo asignaciones o comparaciones. Si estos datos se utilizan sólo en un sistema y nunca interactúan con datos de un CCSID que no sea hexadecimal, esto no será un problema. Pero, si los datos interactúan con datos codificados en otros CCSID, las comparaciones y asignaciones no funcionarán como sería de esperar debido a que no se realiza ninguna conversión entre los CCSID.
Por ejemplo, supongamos que definimos tres columnas así:
C1 CHAR(1) CCSID 65535, C2 CHAR(1) CCSID 37, C3 CHAR(1) CCSID 290
Entonces, con el CCSID del trabajo establecido en 37 (inglés americano), se insertará una "a" minúscula en las tres columnas. El valor hexadecimal X'81' se interta en C1 y C2. Puesto que el CCSID del trabajo es 37, el valor hexadecimal para "a" del CCSID 37 (X'81') se inserta directamente en C1 sin realizar ninguna conversión. El valor insertado en C3 se convierte en X'62', el valor del CCSID 290 para la "a" minúscula. Si se compara C2 y C3 utilizando SQL, serán iguales (aunque los valores almacenados son diferentes). Como cada columna tiene definido un CCSID, los datos pueden convertirse correctamente cuando se hace la comparación. Si se compara C1 y C2, los valores también serán iguales porque el CCSID del trabajo era 37 cuando se produjo la operación de inserción. No obstante, no se lleva a cabo ninguna conversión. Simplemente hemos tenido la suerte de que los datos coinciden. Una comparación entre C1 y C3 descubrirá que los valores no son iguales; el valor de C1 tiene el CCSID hexadecimal, de manera que no se realizará ninguna conversión durante la comparación. Si la operación de inserción se hizo utilizando el CCSID 290 del trabajo, el resultado de comparar C1 y C3 sería que son iguales, pero C1 y C2 ya no coincidirán. De modo que, utilizar un CCSID no hexadecimal para los datos de tipo carácter pede dar problemas.
En aplicaciones CGI si el valor del sistema QCCSID = 65535, se recomienda cambiarlo a uno apropiado para el país (por ejemplo, 37 para Estados Unidos o 280 para Italia). Este cambio no debe tener ningún impacto en sus aplicaciones actuales, a menos que alguna de ellas requiera explicitamente el CCSID 65535.
Si el valor del sistema QCCSID = 65535, CGIDEV2 prodría encontrarse con algunos de estos problemas:
- conversiones de caracteres incorrectas en la salida HTML (por ejemplo, las funciones de _javascript_ no funcionará).
- conversiones de caracteres incorrectas para los datos introducidos desde un cliente (caracteres como | ! £ & @ § # se convertirán incorrectamente).
¿Qué ocurre si mi sistema se ejecuta con el valor del sistema QCCSID 65535?
A: Sistema de valor QCCSID 65535 inhibe la conversión automática de caracteres a partir de un CCSID a otro CCSID. Eso es en general un gran problema con los programas CGI. Por ejemplo, el código HTML externo de un programa CGI no está traducido al CCSID del trabajo de CGI cuando se carga en la memoria de ella. Si este código HTML contiene caracteres especiales, estos personajes están praticamente dañados y cuando la salida-ted al navegador que pueden causar problemas, como alguna pieza de _javascript_ ya no se ejecuta.
Afortunadamente, el programa de servicio CGIDEV2 se preocupa por este problema. El programa de servicio comprueba el CCSID del trabajo y, si se encuentra que es 65535, se cambia a su valor predeterminado.
Sin embargo, esto puede no ser suficiente. El servidor HTTP se supone que el CGI se ejecuta con el CCSID del valor del sistema QCCSID, y esto también puede causar problemas en la conversión de caracteres.
Con el fin de que sus puestos de trabajo instancia HTTP que se ejecuta con un CCSID distinto del especificado en el valor del sistema QCCSID, usted tiene que (re) iniciar la instancia HTTP especificando el valor CCSID deseado a través de la fsccsid "valor de inicio Instancia". Ejemplo:
STRTCPSVR SERVER(*HTTP) HTTPSVR(instance_name '-fsccsid nnn')
donde nnn es el valor CCSID deseada.
FAQ : Frequently Asked Questions
Valores y parámetros que intervienen
Valores del sistema:
- QCCSID
- QCHRID
- QLANGID
- QLOCALE
- QCNTRYID
- QCHRIDCTL
Atributos del perfil de usuario:
- CCSID
- LANGID
Valores aconsejados para Euro
| Valor del sistema | Valor establecido | Valor por defecto |
|---|---|---|
| QCCSID | 1145 | 65535 |
| QCHRID | 695 01145 | |
| QLANGID | ESP | |
| QLOCALE | ES_ES | |
| QCNTRYID | ES | |
| QCHRIDCTL | *DEVD |
CCSID por defecto de un trabajo
El CCSID por defecto de un trabajo (DFTCCSID) se calcula cuando el CCSID es 65535. El valor DFTCCSID es utilizado también cuando el CCSID es distinto de 65535 y el sistema lo necesita.
El atributo DFTCCSID sólo se puede recuperar o visualizar, nunca cambiar. El valor del atributo se determina como sigue:
- Si el CCSID no es 65535, DFTCCSID el igual al CCSID del trabajo.
- Si el CCSID es 65535, el valor DFTCCSID se calcula en función de identificador de idioma (LANGID).
Cuando se ejecuta el trabajo, el sistema determina el CCSID por omisión para un trabajo utilizando la lógica siguiente (se puede encontrar el CCSID correspondiente en el cuadro LANGID CCSID por omisión):
- Si el CCSID del trabajo se establece a un valor, se utiliza ese valor.
- Si el CCSID del trabajo se establece en *USRPRF, el sistema busca el valor en el perfil de usuario.
- Si el perfil de usuario tiene establecido un valor, se utiliza ese valor.
- Si el perfil de usuario tiene establecido *SYSVAL, el sistema comprueba el valor del sistema.
- Si el valor del sistema para QCCSID se establece en un valor, se utiliza ese valor.
- Si el valor del sistema está establecido en 65535, el sistema verifica el identificador de idioma del trabajo (LANGID).
- Si el atributo LANGID del trabajo está establecido a un valor, la variable de entorno QTQ_DEFAULT_CCSID se compara que el valor LANGID. Si la variable de entorno contiene un valor para ese LANGID, se utliza el CCSID especificado en la variable. Si QTQ_DEFAULT_CCSID no contiene un valor para LANGID, el sistema convierte el atributo LANGID a un CCSID.
- Si atributo LANGID del trabajo se establece a *USRPRF, el sistema busca el valor en el perfil del usuario.
- Si LANGID el perfil de usuario se establece en un valor, la variable de entorno QTQ_DEFAULT_CCSID se comprueba que el valor LANGID. Si la variable de entorno QTQ_DEFAULT_CCSID contiene un valor para ese LANGID, el CCSID especificado en la variable de entorno QTQ_DEFAULT_CCSID se utiliza. Si la variable de entorno QTQ_DEFAULT_CCSID no contiene un valor para el LANGID, el sistema convierte que LANGID a un CCSID.
- Si el LANGID del perfil del usuario está establecido en *SYSVAL, se compara la variable de entorno QTQ_DEFAULT_CCSID con el valor LANGID. Si se encuentra un valor para ese LANGID, se utiliza el CCSID especificado en la variable de entorno. Si QTQ_DEFAULT_CCSID no contiene un valor para el LANGID, el sistema transforma el LANGID a un CCSID.
Anotaciones para tener en cuenta
El CCSID 65535 (*HEX) está desaconsejado utilizarlo. Indica que no se conoce el el idioma de los datos ni hay conversión de página de códigos. Puede dar problemas de acceso por JDB, ODBC, transferencias de datos, servidores HTTP, incluso en la programación RPG donde hay añadir apaños para ordenar la Ñ, etc.
Al crear archivos el CCSID por defecto que se toma es el asignado al trabajo, a menos que se indique directamente en las DDS. En un entorno con ficheros con diferentes CCSIDs (284 y 1145) podrín producirse conversiones entre páginas de código al utilizar SQL.
Recomendable cambiar los CCSID de todos los archivos de datos al nuevo 1145.
Cuidado con las transformaciones realizadas durante una sesión FTP.
Algunos CCSID de interés
| CCSID | Descripción | Símbolo Euro |
|---|---|---|
| 850 | Latin-1 PC-DATA (IBM-PC) *STDASCII | SIN |
| 858 | Latin-1e PC-DATA (IBM-PC) | CON |
| 819 | ISO 8859-1 ASCII (FTP) | SIN |
| 1252 | Ms-Windows *PCASCII | CON |
| 1145 | Español Euro EBCDIC | CON |
| 284 | Español EBCDIC | SIN |
| 923 | ISO 8859-15 Latin | CON |
Ficha
Autor:
Publicado el:
Última revisión:
Traducido y adaptado por Javier Mora
Publicado el:
Última revisión:
____________________________________________________ �nete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd ) Forum.Help400 � Publicaciones Help400, S.L.
