Problema con conexión FTP

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • poketina
    Senior Member
    • jul
    • 105

    #1

    Problema con conexión FTP

    Hola,

    Tengo un problema con el que llevo ya un montón de tiempo..
    Me pidieron que coja unos ficheros de un directorio en concreto (por el que puedo navegar sin problemas desde la AL11) y dejarlos a través de una conexión FTP en un directorio del cliente.

    Esto es lo que he hecho yo en mi programa:

    Primero obtengo los ficheros a descargar del directorio que me han dado:

    FORM obtener_ficheros .

    * Obtengo la lista de ficheros de la AL11
    w_dirnam = '\\172.24.140.21\Overlim\idoc\salida\'.

    CALL FUNCTION 'EPS_GET_DIRECTORY_LISTING'
    EXPORTING
    dir_name = w_dirnam
    TABLES
    dir_list = w_itab
    EXCEPTIONS
    invalid_eps_subdir = 1
    sapgparam_failed = 2
    build_directory_failed = 3
    no_authorization = 4
    read_directory_failed = 5
    too_many_read_errors = 6
    empty_directory_list = 7
    OTHERS = 8.

    ENDFORM. " OBTENER_FICHEROS

    ---------

    Luego ya hago la conexión y descargo (o eso intento jeje) los ficheros:

    FORM conectar_ftp .

    DATA: file TYPE string,
    blob_length TYPE i,
    lin TYPE i,
    bin TYPE c VALUE 'X',
    cnt(8) TYPE n,
    lines TYPE i VALUE 1000,
    docid LIKE sysuuid-c,
    bline(80) TYPE x,
    texto TYPE string.
    DATA: BEGIN OF itab OCCURS 0,
    linea(400),
    END OF itab.
    TYPES: BEGIN OF text,
    line(400) TYPE c,
    END OF text.

    TYPES: BEGIN OF blob,
    line(80) TYPE x,
    END OF blob.

    DATA: bindata TYPE TABLE OF blob WITH HEADER LINE,
    result TYPE TABLE OF text WITH HEADER LINE,
    chardata TYPE TABLE OF text WITH HEADER LINE.

    DATA: fname(150).

    * pwd = 'xxxxx'.
    * user = 'xxxx'.
    * host = '80.35.132.67'.

    slen = STRLEN( pwd ) .
    * SAP Application Server -> FTP Server
    * dest = 'SAPFTPA'.
    * Gui Frontend Machine -> FTP Server
    dest = 'SAPFTP'.

    * La contraseña hay que formatearla
    CALL FUNCTION 'HTTP_SCRAMBLE'
    EXPORTING
    SOURCE = pwd
    sourcelen = slen
    key = key
    IMPORTING
    destination = pwd.

    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
    text = 'Connect to FTP Server'.

    * Conectamos al directorio FTP
    CALL FUNCTION 'FTP_CONNECT'
    EXPORTING
    user = user
    password = pwd
    host = host
    rfc_destination = dest
    IMPORTING
    handle = hdl
    EXCEPTIONS
    not_connected = 1
    OTHERS = 2.

    IF sy-subrc = 0.

    * Ponemos modo pasivo
    CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
    handle = hdl
    command = 'set passive off'
    TABLES
    data = result
    EXCEPTIONS
    OTHERS = 1.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
    text = 'Create file on FTP Server'.

    REFRESH result.

    CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
    handle = hdl
    command = 'ascii'
    TABLES
    data = result
    EXCEPTIONS
    tcpip_error = 1
    command_error = 2
    data_error = 3.

    * Nos movemos a la carpeta PILSA
    CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
    handle = hdl
    * command = 'cd pilsa'
    command = 'cd 1111'
    TABLES
    data = result
    EXCEPTIONS
    tcpip_error = 1
    command_error = 2
    data_error = 3.

    * Cada fichero que obtenga en el directorio indicado se descarga vía FTP
    LOOP AT w_itab WHERE name(6) = 'ORDERS'.
    CLEAR itab.
    REFRESH itab.

    * Ruta del fichero que se coge del directorio
    CONCATENATE '\\172.24.140.21\Overlim\idoc\salida\' w_itab-name INTO file.
    * Nombre del fichero que se descargará.
    CONCATENATE w_itab-name '.txt' INTO fname.

    * Se sube el fichero a una tabla interna
    OPEN DATASET file FOR INPUT IN TEXT MODE ENCODING DEFAULT.

    READ DATASET file INTO itab.
    IF sy-subrc IS INITIAL.
    APPEND itab.
    CLEAR itab.
    READ DATASET file INTO itab-linea.
    IF sy-subrc IS INITIAL.
    APPEND itab.
    CLEAR itab.
    DO.
    READ DATASET file INTO itab-linea.
    IF sy-subrc IS INITIAL.
    APPEND itab.
    CLEAR itab.
    ELSE.
    EXIT.
    ENDIF.
    ENDDO.
    ENDIF.
    ENDIF.

    CLOSE DATASET file.

    DESCRIBE TABLE itab LINES lin.
    blob_length = lin * 80.

    * Se descarga el archivo al servidor
    CALL FUNCTION 'FTP_R3_TO_SERVER'
    EXPORTING
    handle = hdl
    fname = fname
    blob_length = blob_length
    character_mode = 'X'
    TABLES
    text = itab
    EXCEPTIONS
    tcpip_error = 1
    command_error = 2
    data_error = 3
    OTHERS = 4.
    IF sy-subrc = 0.
    * Borramos del directorio local cada uno de los ficheros
    * DELETE DATASET file.
    CLEAR texto.
    CONCATENATE 'Se descarga el archivo' fname INTO texto SEPARATED BY space.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
    text = 'Descargando fichero'.
    IF sy-subrc EQ 0.
    WRITE: / texto, 'al servidor'.
    SKIP 1.
    ENDIF.

    CLEAR texto.
    CONCATENATE 'Se borra el archivo' fname INTO texto SEPARATED BY space.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
    text = 'Eliminando fichero del servidor'.
    IF sy-subrc EQ 0.
    WRITE: / texto, 'del servidor'.
    SKIP 1.
    ENDIF.

    ENDIF.
    ENDLOOP.
    ELSE.
    WRITE: / 'Error al conectar al servidor FTP'.
    SKIP 1.

    ENDIF.

    CALL FUNCTION 'FTP_DISCONNECT'
    EXPORTING
    handle = hdl.
    IF sy-subrc EQ 0.
    WRITE: / 'Desconectado del servidor FTP'.
    SKIP 1.
    ENDIF.

    ENDFORM. " CONECTAR_FTP

    Vale, por otro lado me he descargado el Filezilla server y Filezilla Cliente para probar con mi máquina. Si ejecuto el programa online funciona correctamente poniendo el host SAPFTP pero si pongo SAPFTPA no funciona (por lo que he leido SAPFTPA es para procesos en fondo). La cuestión es que me creo un job que lance mi programa (conectándome a mi máquina) y ya no funciona.

    Pongo la dirección del cliente (la que viene ahí de 80...) y no me funciona. Hoy en concreto se les ha caido el servicio FTP pero bueno, yo nunca he conseguido conectar con ello. Desde sistemas me dicen que está todo ok, que ellos hacen un ftp 80.... desde una ventana de msdos y que se conectaba (hoy no), pero yo desde el report nunca lo he conseguido.

    Algiuen ha tenido alguna vez un problema similar o se le ocurre qué puede ser ???

    Muchas gracias !!!

    María
  • ayaxrojo
    Junior Member
    • feb
    • 14

    #2
    Originalmente publicado por poketina
    Hola,

    Tengo un problema con el que llevo ya un montón de tiempo..
    Me pidieron que coja unos ficheros de un directorio en concreto (por el que puedo navegar sin problemas desde la AL11) y dejarlos a través de una conexión FTP en un directorio del cliente.

    Esto es lo que he hecho yo en mi programa:

    Primero obtengo los ficheros a descargar del directorio que me han dado:

    FORM obtener_ficheros .

    * Obtengo la lista de ficheros de la AL11
    w_dirnam = '\\172.24.140.21\Overlim\idoc\salida\'.

    CALL FUNCTION 'EPS_GET_DIRECTORY_LISTING'
    EXPORTING
    dir_name = w_dirnam
    TABLES
    dir_list = w_itab
    EXCEPTIONS
    invalid_eps_subdir = 1
    sapgparam_failed = 2
    build_directory_failed = 3
    no_authorization = 4
    read_directory_failed = 5
    too_many_read_errors = 6
    empty_directory_list = 7
    OTHERS = 8.

    ENDFORM. " OBTENER_FICHEROS

    ---------

    Luego ya hago la conexión y descargo (o eso intento jeje) los ficheros:

    FORM conectar_ftp .

    DATA: file TYPE string,
    blob_length TYPE i,
    lin TYPE i,
    bin TYPE c VALUE 'X',
    cnt(8) TYPE n,
    lines TYPE i VALUE 1000,
    docid LIKE sysuuid-c,
    bline(80) TYPE x,
    texto TYPE string.
    DATA: BEGIN OF itab OCCURS 0,
    linea(400),
    END OF itab.
    TYPES: BEGIN OF text,
    line(400) TYPE c,
    END OF text.

    TYPES: BEGIN OF blob,
    line(80) TYPE x,
    END OF blob.

    DATA: bindata TYPE TABLE OF blob WITH HEADER LINE,
    result TYPE TABLE OF text WITH HEADER LINE,
    chardata TYPE TABLE OF text WITH HEADER LINE.

    DATA: fname(150).

    * pwd = 'xxxxx'.
    * user = 'xxxx'.
    * host = '80.35.132.67'.

    slen = STRLEN( pwd ) .
    * SAP Application Server -> FTP Server
    * dest = 'SAPFTPA'.
    * Gui Frontend Machine -> FTP Server
    dest = 'SAPFTP'.

    * La contraseña hay que formatearla
    CALL FUNCTION 'HTTP_SCRAMBLE'
    EXPORTING
    SOURCE = pwd
    sourcelen = slen
    key = key
    IMPORTING
    destination = pwd.

    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
    text = 'Connect to FTP Server'.

    * Conectamos al directorio FTP
    CALL FUNCTION 'FTP_CONNECT'
    EXPORTING
    user = user
    password = pwd
    host = host
    rfc_destination = dest
    IMPORTING
    handle = hdl
    EXCEPTIONS
    not_connected = 1
    OTHERS = 2.

    IF sy-subrc = 0.

    * Ponemos modo pasivo
    CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
    handle = hdl
    command = 'set passive off'
    TABLES
    data = result
    EXCEPTIONS
    OTHERS = 1.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
    text = 'Create file on FTP Server'.

    REFRESH result.

    CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
    handle = hdl
    command = 'ascii'
    TABLES
    data = result
    EXCEPTIONS
    tcpip_error = 1
    command_error = 2
    data_error = 3.

    * Nos movemos a la carpeta PILSA
    CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
    handle = hdl
    * command = 'cd pilsa'
    command = 'cd 1111'
    TABLES
    data = result
    EXCEPTIONS
    tcpip_error = 1
    command_error = 2
    data_error = 3.

    * Cada fichero que obtenga en el directorio indicado se descarga vía FTP
    LOOP AT w_itab WHERE name(6) = 'ORDERS'.
    CLEAR itab.
    REFRESH itab.

    * Ruta del fichero que se coge del directorio
    CONCATENATE '\\172.24.140.21\Overlim\idoc\salida\' w_itab-name INTO file.
    * Nombre del fichero que se descargará.
    CONCATENATE w_itab-name '.txt' INTO fname.

    * Se sube el fichero a una tabla interna
    OPEN DATASET file FOR INPUT IN TEXT MODE ENCODING DEFAULT.

    READ DATASET file INTO itab.
    IF sy-subrc IS INITIAL.
    APPEND itab.
    CLEAR itab.
    READ DATASET file INTO itab-linea.
    IF sy-subrc IS INITIAL.
    APPEND itab.
    CLEAR itab.
    DO.
    READ DATASET file INTO itab-linea.
    IF sy-subrc IS INITIAL.
    APPEND itab.
    CLEAR itab.
    ELSE.
    EXIT.
    ENDIF.
    ENDDO.
    ENDIF.
    ENDIF.

    CLOSE DATASET file.

    DESCRIBE TABLE itab LINES lin.
    blob_length = lin * 80.

    * Se descarga el archivo al servidor
    CALL FUNCTION 'FTP_R3_TO_SERVER'
    EXPORTING
    handle = hdl
    fname = fname
    blob_length = blob_length
    character_mode = 'X'
    TABLES
    text = itab
    EXCEPTIONS
    tcpip_error = 1
    command_error = 2
    data_error = 3
    OTHERS = 4.
    IF sy-subrc = 0.
    * Borramos del directorio local cada uno de los ficheros
    * DELETE DATASET file.
    CLEAR texto.
    CONCATENATE 'Se descarga el archivo' fname INTO texto SEPARATED BY space.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
    text = 'Descargando fichero'.
    IF sy-subrc EQ 0.
    WRITE: / texto, 'al servidor'.
    SKIP 1.
    ENDIF.

    CLEAR texto.
    CONCATENATE 'Se borra el archivo' fname INTO texto SEPARATED BY space.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
    text = 'Eliminando fichero del servidor'.
    IF sy-subrc EQ 0.
    WRITE: / texto, 'del servidor'.
    SKIP 1.
    ENDIF.

    ENDIF.
    ENDLOOP.
    ELSE.
    WRITE: / 'Error al conectar al servidor FTP'.
    SKIP 1.

    ENDIF.

    CALL FUNCTION 'FTP_DISCONNECT'
    EXPORTING
    handle = hdl.
    IF sy-subrc EQ 0.
    WRITE: / 'Desconectado del servidor FTP'.
    SKIP 1.
    ENDIF.

    ENDFORM. " CONECTAR_FTP

    Vale, por otro lado me he descargado el Filezilla server y Filezilla Cliente para probar con mi máquina. Si ejecuto el programa online funciona correctamente poniendo el host SAPFTP pero si pongo SAPFTPA no funciona (por lo que he leido SAPFTPA es para procesos en fondo). La cuestión es que me creo un job que lance mi programa (conectándome a mi máquina) y ya no funciona.

    Pongo la dirección del cliente (la que viene ahí de 80...) y no me funciona. Hoy en concreto se les ha caido el servicio FTP pero bueno, yo nunca he conseguido conectar con ello. Desde sistemas me dicen que está todo ok, que ellos hacen un ftp 80.... desde una ventana de msdos y que se conectaba (hoy no), pero yo desde el report nunca lo he conseguido.

    Algiuen ha tenido alguna vez un problema similar o se le ocurre qué puede ser ???

    Muchas gracias !!!

    María
    Si pudiste resolver el problema? a mi me pasa que si debugueo el job si funciona al 100% pero si no lo debugueo no.


    haaa ya lo solucione, el problema es que el RFC estaba mal configurado SAPFTPA
    SM59->Conexiones TCP/IP->SAPFTPA. En opciones tecnicas, seleccionar Inicio en servidor de aplicacion.

    y en el programa:
    data: dest TYPE rfcdes-rfcdest VALUE 'SAPFTPA'.
    CALL FUNCTION 'FTP_CONNECT'
    EXPORTING
    user = user
    password = pwd
    host = host
    rfc_destination = dest
    IMPORTING
    handle = hdl.

    Espero a alguien le ahorre dolores de cabeza
    Editado por última vez por ayaxrojo; 07/10/2011, 00:56:42.

    Comentario

    Trabajando...