¿CONVERSION_EXIT_ALPHA_OUTPUT?

¿CONVERSION_EXIT_ALPHA_OUTPUT?

La función CONVERSION_EXIT_ALPHA_OUTPUT es muy útil cuando queremos eliminar los ceros de una cadena…Por ejemplo si tenemos 0000012345, nos devuelve 12345…Pero…que pasa cuando tenemos 00000E12345, simple…el resultado va a seguir siendo 00000E12345.
Por lo tanto y puesto que ayer me ví en un problema muy similar, decidí crear un form muy simple -;)

*&———————————————————-*
*& Form quitar_ceros *
*&———————————————————-*
* Quitamos les ceros del inicio *
*———————————————————–*
FORM quitar_ceros CHANGING t_codigo.

DATA: long TYPE i,
char TYPE c,
cero TYPE c,
counter TYPE i,
new_text(18) TYPE c,
flag TYPE c.

cero = ‘0′.
long = STRLEN( t_codigo ).

DO long TIMES.
counter = counter + 1.
IF counter EQ long.
EXIT.
ENDIF.
char = t_codigo+counter(1).
IF char NE cero.
CONCATENATE new_text t_codigo+counter(1)
INTO new_text.
flag = ‘X’.
ELSE.
IF flag EQ space.
CONTINUE.
ELSE.
CONCATENATE new_text t_codigo+counter(1)
INTO new_text.
ENDIF.
ENDIF.
ENDDO.

t_codigo = new_text.

ENDFORM. “quitar_ceros

Lo que logramos con esto, es obtener el valor E12345

Saludos,

Blag.

3 comentarios »

  1. VLozano Said,

    Febrero 2, 2007 @ 2:13 am

    No sería más sencillo algo del tipo:

    *— sin garantía de funcionamiento, un esbozo
    DATA: l_len TYPE i,
    l_pos TYPE sy-index.

    l_len = STRLEN( texto ).
    DO l_len TIMES.
    l_pos = sy-index.
    IF texto+lpos(1) NE cero.
    EXIT.
    ELSE.
    texto+lpos(1) = space.
    ENDIF.
    ENDDO.
    CONDENSE texto.
    * —–hasta aquí el código

    El DO n TIMES ya controla que no nos salgamos del texto, y el IF inicial ya nos echa del bucle cuando la posición no es cero (podría incluirse el blanco por si acaso).
    Estamos sustituyendo los ceros iniciales por espacios, y el CONDENSE los eliminará, dejando ese E1234 que buscamos.

    ¿O la estoy cagando en alguna parte?

  2. Blag Said,

    Febrero 2, 2007 @ 4:42 am

    Hola VLozano:

    Tu idea es bastante bueno y un poco más corta que la mía -:) Le hice unos pequeños ajustes y aquí está….Gracias por la colaboración!!!

    REPORT ZPRUEBA.

    DATA: L_LEN TYPE I,
    LPOS TYPE SY-INDEX,
    CERO(1) TYPE C VALUE 0.
    DATA: TEXTO TYPE STRING.

    TEXTO = ‘00000E123450′.

    L_LEN = STRLEN( TEXTO ).
    DO L_LEN TIMES.
    LPOS = SY-INDEX - 1.
    IF TEXTO+LPOS(1) NE CERO.
    EXIT.
    ELSE.
    REPLACE ‘0′ WITH SPACE
    INTO TEXTO.
    ENDIF.
    ENDDO.
    CONDENSE TEXTO.

    WRITE:/ TEXTO.

    Saludos,

    Blag.

  3. vlozano Said,

    Febrero 12, 2007 @ 2:47 am

    estamos en el REPLACE… no estoy muy seguro de que esa sintaxis sea la mejor… primero pq es un método obsoleto (según la documentación de SAP en la 4.6), y segundo pq no tenemos control sobre las posiciones que reemplazará…

    el texto+posición(posiciones) es una cabronada de leer, pero te aseguras que a no ser que los chicos de walldorf cambien todo el sistema de sub-cadenas, siga funcionando ad aeternum…

    otra opción es utilizar el REPLACE SECTION para controlar las posiciones a reemplazar

    échale un vistazo a la documentación y me cuentas (que no pienso hacer pruebas en horarios de trabajo, y en casa el ordenador está para jugar)

RSS feed for comments on this post · URI para TrackBack.

Leave a Comment

Cerrar
E-mail It