Error CONVT_CODEPAGE con Excepcion CX_SY_CONVERSI

@abapers

Pues asi tal cual.

Cree un Z para obtener informacion urgente (de nuevo :wink:)
Es una extraccion de informacion que se inserta en un archivo txt.

Mi ERROR:

An exception has occurred which is explained in more detail below. The
exception is assigned to class ‘CX_SY_CONVERSION_CODEPAGE’ and was not caught
in procedure
“IMPRIME_DATOS” “(FORM)”, nor was it propagated by a RAISING clause.
Since the caller of the procedure could not have anticipated this
exception, the current program was terminated.
The reason for the exception is:
Characters are always displayed in a specific code page. Many code
pages only define a restricted set of characters. If you want to
convert text from one code page to another, and this text contains
characters that which are not defined in one of these code pages, a
conversion error occurs.

A conversion error like this can also occur if one of the code pages
required (‘4103’ or ‘1100’) is not known in the system.

If the conversion error occurred while reading or writing a file, the file are ****

Averiguando/surfeando in the deep web :joy:, dicen del tipo de codificación del servidor en lo creación de los archivos, que puede ser el problema, no lo descarto porque la misma cantaleta/lloriqueo con los consultores, traen un c…ga…ro…

Dado que lo ejecuto en Desarrollo, Calidad y todo bien cuando se extrae la info de Productivo es donde vale truena.
Segun los consultores es porque estaba uniondo un tipo currency a un texto.

CONCATENATE
                    <fs_s>-Valor1 tipo string
                    <fs_s>-Valor2 tipo currency
INTO v_l
              SEPARATED BY c_l.

The exception must either be prevented, caught in procedure “IMPRIME_DATOS”
“(FORM)”, or
the possibility of it occurring must be declared in the RAISING clause
in the procedure.
To prevent the exception, note the following:

If the error occurs in a non-modfied SAP program, you might be able to
find a solution in the SAP Notes system. If you have access to the SAP
Notes system, check there first using the following keywords:

“CONVT_CODEPAGE” CX_SY_CONVERSION_CODEPAGE
“IMPRIME_DATOS”

El codigo es tal cual, concatenar textos y al hacer el TRANSFER v_linea TO v_archivo., termina con el error, PERO despues de hacer mas de 600 mil registros :confused: :confused: :confused: “soooo weird”.

Leyendo este post Error 'CX_SY_REF_IS_INITIAL' y el comentario de @romaldyminaya
Tratare de implementar

TRY .
  TRANSFER v_linea TO v_archivo
CATCH CX_SY_REF_IS_INITIAL.
 v_linea = ''.
 TRANSFER v_linea TO v_archivo
ENDTRY.

Y también tendré que agregar mas caracteres especiales a la limpieza de informacion.

Esas son mis soluciones e ideas personales.

Pero tienen algo mas trabajado, estético o correcto para evitar estos errores?

Saludos. Amigos.

Un cosilla, y porque en lugar de concatenar un currency con un string no pasas el currency a un string y concatenas dos string?

Literal mente no tenia nada que ver, era un carácter especial el que tronaba el Z.

en mi union tengo “algunos” datos de este tipo, hay textos y otros mas.

valormoneda      TYPE TCURR_CURR,
valorperiodo        TYPE dfkkop-persl,
valor2             TYPE but000-bu_sort1,
Fecha         TYPE D

Todo esto entra al concatenate sin usar nada de transformaciones.

Mejor agregue todos los caracteres especiales que usaba en mi aplicativo anterior (SQL) y SAP para limpiar cualquiera de ellos y todo bien ya.

ahora tengo otro problema el cual es con la cantidad de espacios en un string para eliminar el signo # que se produce como salto de lineao final de linea para ser vaciado al TXT.
agregue el try para ver que era el error, pero no me sirve la solución implementada en el :sweat:

Codigo en cuestion:

FORM eliminar_saltodoble CHANGING p_cadena TYPE any.

  CLEAR: it_text[],
         it_text,
         v_cadena2,
         v_longitud,
         v_cadena.

  v_cadena = p_cadena.
  v_longitud = strlen( v_cadena ).

  IF v_longitud > 0.
    SUBTRACT 1 FROM v_longitud.

    IF v_cadena+v_longitud(1) = '#'.
      p_cadena = v_cadena+0(v_longitud).
    ELSE.

      it_text-text_field = p_cadena.
      APPEND it_text.

      CALL FUNCTION 'SCMS_TEXT_TO_XSTRING'
        EXPORTING
          first_line = 1
          last_line  = 1
          mimetype   = ' '
        IMPORTING
          buffer     = v_cadena2
        TABLES
          text_tab   = it_text
        EXCEPTIONS
          failed     = 1
          OTHERS     = 2.

      IF sy-subrc EQ 0.
        try.
          **IF v_cadena2+v_longitud(1) = c_gato. "aqui se produce el error la cadena es demasiado larga**
            p_cadena = v_cadena+0(v_longitud).
          ENDIF.
        CATCH CX_ROOT.
          p_cadena = v_cadena.
        ENDTRY.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.

ejemplo de cadena
pedro|garcia|callejon|58|…|# — donde este # al sacar el archivo txt es como un soble salto de linea (no se si me explique)

Que lo solucione partiendo la cadena antes de concatenarla.

CONSTANTS: c_rc       TYPE c VALUE cl_abap_char_utilities=>cr_lf.

CONCATENATE v1 v2 v3 v4 into v_1  SEPARATED BY '|'.
CONCATENATE v5 v6 v7 v8 c_rc  into v_2  SEPARATED BY '|'.

PERFORM eliminar_saltodoble CHANGING v_2.

CONCATENATE v_1 v_2 INTO v_3.

hasta ahorita así pude salir con mis inconvenientes.

PD: lo de los caracteres y el txt “creo” se pude solucionar cambiando
OPEN DATASET v_archivo FOR OUTPUT IN TEXT MODE ENCODING NON-UNICODE.
por
OPEN DATASET v_archivo FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
Esto permitiria el vaciado de caracteres especiales y no tener que estar leyendo caracter por caracter para hacer limpiezas… CREO

Otra pregunta…

Como puedo tirar codigo en modo debug como en cualquier otro lenguaje XD… no se puede?

Tengo un problema de ordenamiento con esta consulta.

DATA: it_dfkkmop  TYPE STANDARD TABLE OF dfkkmop.

SELECT * FROM dfkkmop INTO TABLE it_dfkkmop 
    WHERE
      gpart = es_contrib-partner
      AND vkont = vl_vkont
      AND vtref = wa_salida-referencia
      AND augst EQ 9
      AND augrd EQ 70.

IF sy-subrc EQ 0.
        SORT it_dfkkmop by augdt PERSL DESCENDING.
.......

tecnicamente la fecha de 10 registros en 20160101 y persl tiene 2 valores 15M1 (7 registros) y 15M2 (3 registros).

Cuando entra el sort no hace mas que ordenar primero
15M1 | 20160101 (7 veces)
y hasta abajo
15M2 | 20160101 (3 veces)

que tengo mal? o en que estoy bien equivocado que segun yo, deberia quedar

15M2 | 20160101 (3 veces)
y hasta abajo
15M1 | 20160101 (7 veces)

Hola, para que sea como necesitas, tenes que ponerlo asi

SORT it_dfkkmop by AUGDT DESCENDING PERSL ASCENDING (el segundo campo como necesites)

Si no pones nada SAP por defecto pone ASCENDING

3 Me gusta

No he visto como se puede tirar código en modo debug, y me imagino que lo preguntas porque tienes un report en entorno de QAS o producción y quieres cambiar algo.
Si es así, es decir, que quieres cambiar código en un entorno que no es desarrollo y que no haga falta hacer una orden de transporte te recomiendo leer:

1 me gusta

No pude lograr lo que me comentas, no entro en ningun brakepoint de aquella funcion y me pone el mensaje Falta autorización para modificar (objeto autorización S_DEVELOP).

No quiero modificar el código directo en QA ni Productivo.
solo quiero poder aventar una linea de codigo que seria el sort o correr un selct en ese instante para vaciar lo a una it_algo.

Porque ya van demaciados transportes de prueba y error de desarrollo a calidad, esto dado que desarrollo no tiene materia gris con que hacer las pruebas ¬¬.

gracias por tu ayuda.

----Editado----
PD: Veo que el secreto esta en el permiso de sap_all, no pos asi si XD… no contamos con ese permiso ya ni los consultores cuentan con el.

Efectivamente, para poder modificar el código en QAS necesitas ese objeto de autorización. El basis con el que trabajais no te lo puede asignar aunque sea momentáneamente?
Si no es así, no veo otro remedio que estar modificando en desarrollo y transportando.

Bueno, bueno

Cuando la terquedad, sede a segunda instancia:

Efectivamente asigne el tipo moneda a un string; tuve que cambiar al tipo currency dfkkop-BETRW,para poder manejar signos ±, mas el * que aparecía en algunos importes… supongo por el uso del tipo ty_currency, no se ni de donde lo saque.

En fin, después de hacer los cambios a esa parte también en el sort

puedo decir que todo a salido a la perfección.
Solo falta ejecutar en productivo esperando no salga algo extraño en el camino, y poder entregar la informacion solicitada.

Gracias a @Salco y @sconoredhot.

1 me gusta

Este tema se cerró automáticamente 91 días después del último post. No se permiten nuevas respuestas.