FTP_R3_TO_SERVER me concatena filas en el .txt

sap-abap
Etiquetas: #<Tag:0x00007f65228fdcc8>

#1

Buenas estimados, un gusto saludarles.

Les comento que estoy utilizando está función FTP_R3_TO_SERVER, para crear archivos a un FTP.
El proceso es el siguiente, tengo unta tabla interna con la información a enviar, y está información la envío en una tabla tipo CHAR definida de la siguiente forma.
image

Tengo aproximadamente 2161 registros en mi tabla origen y cuando se procesan en mi tabla de datos CHAR, hay tambien 2161 registros.

Al momento de crear el archivo aparecen de la siguiente forma.

CAMPO1;CAMPO2;CAMPO3;CAMPO4
CAMPO1;CAMPO2;CAMPO3;CAMPO4
CAMPO1;CAMPO2;CAMPO3;CAMPO4
CAMPO1;CAMPO2;CAMPO3;CAMPO4
CAMPO1;CAMPO2;CAMPO3;CAMPO4

Así deben aparecer pero en varias línea sucede lo siguiente

CAMPO1;CAMPO2;CAMPO3;CAMPO4
CAMPO1;CAMPO2;CAMPO3;CAMPO4CAMPO1;CAMPO2;CAMPO3;CAMPO4
CAMPO1;CAMPO2;CAMPO3;CAMPO4
CAMPO1;CAMPO2;CAMPO3;CAMPO4
CAMPO1;CAMPO2;CAMPO3;CAMPO4CAMPO1;CAMPO2;CAMPO3;CAMPO4

Concatena filas, he revisado el ancho de las lineas de la tabla y no debe inferir, al menos por el tamaño, ya que es suficiente grande para el ancho que abarcan la sumatoria de todos los campos que estoy procesando.

Adicional, me he asegurado que si se concatene como se debe, y que se limpie el work area.
**He revisado las lineas que les pasa eso y todas tienen acentos, letras ñ, en sí caracteres especiales. Quizás sea un tema de Encoding. **
En la función el código está así. Character_mode = 'X'.

image

Envío el código.

LOOP AT pt_alv INTO wa_alv.

    CLEAR: wa_datos, lv_sldo_fin, lv_sldo_ini, lv_mvmnto_crdto, lv_mvmnto_dbto, wa_bg.
    MOVE-CORRESPONDING wa_alv TO wa_bg.
    wa_bg-fecha_inicio = so_budat-low.

    WRITE wa_bg-sldo_ini TO lv_sldo_ini CURRENCY wa_alv-rtcur.
    WRITE wa_bg-mvmnto_crdto TO lv_mvmnto_crdto CURRENCY wa_alv-rtcur.
    WRITE wa_bg-mvmnto_dbto TO lv_mvmnto_dbto CURRENCY wa_alv-rtcur.
    WRITE wa_bg-sldo_fin TO lv_sldo_fin CURRENCY wa_alv-rtcur.

    CONDENSE: lv_sldo_ini,
              lv_mvmnto_crdto,
              lv_mvmnto_dbto,
              lv_sldo_fin NO-GAPS.


    CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
      CHANGING
        value = lv_sldo_ini.
    CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
      CHANGING
        value = lv_mvmnto_crdto.
    CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
      CHANGING
        value = lv_mvmnto_dbto.
    CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
      CHANGING
        value = lv_sldo_fin.

    CONCATENATE
                wa_alv-bukrs
                wa_alv-fecha_bg
                wa_alv-fecha_gen
                wa_alv-hora_gen
                wa_alv-cnta_mayor
                wa_alv-nombre
                lv_sldo_ini
                lv_mvmnto_dbto
                lv_mvmnto_crdto
                lv_sldo_fin
    INTO wa_datos SEPARATED BY ';'.

    APPEND wa_datos TO it_datos.
    APPEND wa_bg TO it_bg.
  ENDLOOP.

Estimados, agradezco de antemano la ayuda que me puedan facilitar.


#2

Hola,
hace poco estuve trabajando en algo similar solo que el separador para mi caso eran tabuladores
Te comparto como lo hice espero te ayude.

Primero tengo mi tabla interna con N campos it_tabla
image

Tabla interna que sera el archivo que se creara en el FTP
image

Lleno la taba it_tabla con mis datos, después, con la ayuda de la Función image indico como quiero que sean separados los campos en el archivo que creare al FTP, (En mi caso los campos deberían estar separados por tabuladores), esta estructura se graba en la tabla it_file

Paso a modo pasivo y envío la tabla interna it_file al FTP

image

y con eso mi archivo se genera en el FTP sin problemas.
Espero te sea de ayuda
Te dejo el codigo.

TYPES: 
 BEGIN OF st_tabla,
   llave1(39) TYPE c,
   importe(16) TYPE c,
   llave2(10) TYPE c,
   restante(20) TYPE c,
 END OF st_tabla.
DATA: it_tabla TYPE STANDARD TABLE OF st_tabla,
      wa_tabla TYPE st_tabla.

DATA: it_file TYPE truxs_t_text_data,
      wa_file LIKE LINE OF it_file.

CALL FUNCTION 'SAP_CONVERT_TO_TEX_FORMAT'
  EXPORTING
      i_field_seperator = cl_abap_char_utilities=&gt;horizontal_tab &quot;Aqui deberias poner ';'
  TABLES
      i_tab_sap_data = it_tabla[] &quot;Tabla interna con N campos
  CHANGING
      i_tab_converted_data = it_file &quot;Tabla que se convertira en el archivo a enviar al FTP
  EXCEPTIONS
      conversion_failed = 1
  OTHERS = 2.

*Paso a modo pasivo
CALL FUNCTION 'FTP_COMMAND'
  EXPORTING
    handle = gv_hdl
    command = 'set passive on'
  TABLES
    data = mtab_data
  EXCEPTIONS
    command_error = 1
    tcpip_error = 2.
IF sy-subrc EQ 0.
***creo el txt en el ftp
    CALL FUNCTION 'FTP_R3_TO_SERVER'
      EXPORTING
          handle = gv_hdl
          fname = pa_archivo
          character_mode = 'X'
     TABLES
          text = it_file
      EXCEPTIONS
          tcpip_error = 1
          command_error = 2
          data_error = 3
      OTHERS = 4.
    
  IF sy-subrc &lt;&gt; 0.
    WRITE: / 'Error en cargar el archivo al directorio FTP'. 
  ENDIF.
ELSE.
    WRITE: 'Error comando FTP, Modo pasivo'.
ENDIF.

Saludos.


#3

Buenas @Sekond,

Muchas gracias por tu tiempo y dedicacion. Haré la prueba con tu cogido. De hecho me he fijado que en un tutorial miré que usaban una tabla con sus respectivos campos y no un CHAR de X longitud como yo lo hice.
Dejaré estos links por si alguien pasara por algo igual, también pueden servir de referencia.

h_tp://saptechnical.com/Tutorials/ABAP/FTP/Index.htm
h_tps://archive.sap.com/discussions/thread/1655037

@Sekond gracias nuevamente, probaré tu código.


#4

Hola,

He probado tu solución y me ha dado el mismo problema. Sin embargo con lo que si me funcionó parcialmente es usando cl_abap_char_utilities=>cr_lf " Line Break al final de cada linea.
Esto me funcionó, ya que el error era para las lineas que tienen dos acentos en el string, entonces me dejaba un archivo así.
LINEA1

LINEA2

LINEA3

Me dejaba ese espacio por todas las lineas, pero ahora una linea tiene 3 acentos y me genera el mismo error que antes. Parece ser que según cada cantidad de acentos es cantidad de LINE BREAK que debo concatenar.

Sinceramente esto me tiene muy incomodo, me parece que es algo en el servidor.

Gracias.


#5

Hola,

Pudieras quitar los acentos y probar sin ellos, hay una función que te quita el acento y te regresa el carácter sin el acento (me parece que también funciona con caracteres especiales), la función se llama SCP_REPLACE_STRANGE_CHARS

DATA: lc_strin TYPE string,
        lc_strout TYPE string.
  lc_strin = 'eliminación, acentos, extraños, Güero, á,é,í,ó,ú'.


  CALL FUNCTION 'SCP_REPLACE_STRANGE_CHARS'
    EXPORTING
      intext  = lc_strin
    IMPORTING
      outtext = lc_strout.

  WRITE lc_strout.

Salida:
image

Y para las lineas en blancos si siguen surgiendo, tal vez no sea la mejor forma pero pudieras hacer una “limpieza” con un loop a la tabla que se enviara al FTP valida si el registro es inicial (IS INITIAL) eliminarlo de la tabla con el SY-TABIX

Saludos.


#6

Buenas tardes estimado @Sekond,

Estoy evaluando esta solución, ya que cuando lo hice lo primero que me dijeron fue que si se iba a perder los acentos, y de hecho es para todos los caracteres especiales, las ñ te las quita y pone n.

Creo que esta será la solución al problema.
Gracias por tu valiosa ayuda amigo.


#7

Buenas tardes amigo,

Sí, se perderían caracteres como la ñ, pensando en que no quisieras borrar los caracteres especiales, podrías solo hacer LOOP de “limpieza”, y eliminar las lineas en blanco que te generan los acentos, y olvidarte de usar la función SCP_REPLACE_STRANGE_CHARS

Saludos.


#8

Hola @Sekond,

Cuando reviso la variable no muestra esos espacios.
Será que tengo que revisarlo de alguna forma en especifico.

Gracias de antemano.