Heme aquí de nuevo, un poco tarde, después de un día maldito y frustrante. Resulta que ayer decidí hincar el diente en algo que venía dejando para el final en el programa del Rapa Nui: la trasmisión de los archivos desde el bar a la oficina, cosa que por ahora venía haciendo manualmente arrastrando todos los días a una carpeta web.
Claro que esto era una solución de parche porque cuando se manipulan manualmente los archivos hay que hacerlo con cuidado, no cuesta nada borrar o sobreescribir equivocadamente. Lo que necesitaba era un simple botón que desde el Excel hiciera la trasmisión sin posibilidad de equivocaciones. Pensé que sería algo muy sencillo -para eso se inventó Internet- y por eso lo dejé para el final. Efectivamente era sencillo, pero me demoré mucho en encontrar la forma; un día completo dándome de cabeza como mosca contra el vidrio.
Hay muchas formas de mandar archivos por Internet, desde adjuntos en un correo electrónico, arrastrar a carpetas web o usar un programa cliente FTP. Pero lo que yo necesitaba era programar un botón en VBA que hiciera todo. Y me puse alegremente a buscar con Google, ese gran programador que todo lo sabe, donde encontré varias soluciones. Pero todas pasaban por usar controles OCX que hay que registrarlos, no siempre son compatibles con la versión del Office y la programación era enredada y llena de funciones que no necesitaba, ¡diablos, yo solo busco un botón con unas pocas instrucciones!
Entonces pensé que lo más simple sería usar el FTP del DOS, en modo consola, controlado por un archivo bat, llamándolo del programa con una función de shell(), fácil y bonito como me gusta a mi. Pero no había caso, después que encontrar como se hacía manualmente traté de automatizarlo en un bat y solo llegaba hasta el password: al recibir el password me botaba. Toda la tarde probando y tratando de imaginar donde estaba el problema, nada. Y como dice la canción “y nos dieron la una y las dos”, pasaban las horas y no avanzaba ni un milímetro.
Se me ocurrió otra cosa ¿por qué no usar un cliente comercial de FTP que funcione con línea de comandos?, al apretar un botón le mandaba un script con lo que tenía que hacer y listo. Pero no encontré ni un solo cliente FTP que pudiera manejar con un script, seguramente no busqué bien ¡como no va a haber uno al menos!: Naranjas, nada. Y me seguía calentando la cabeza, probé con un gestor de backups llamado Cobian que no pude lograr que se conectara, luego con Curl, que de puro ver la cantidad de archivos y documentación que traía me desanimó, algo que necesita tantas explicaciones no puede ser bueno.
Se hizo de noche y seguía sin encontrar como, ¡algo tan sencillo! empecé a leer documentación de Microsoft sobre el FTP y me encontré con que el problema de leer el password desde un archivo bat era com{un y conocido, incluso un gracioso puso que recomendaba strongly no usar archivos bat para automatizar el FTP aunque no daba ninguna solución. De madrugada finalmente pillé la forma, sencillícima como sospeché desde un principio: un archivo ft. bat con una sola línea
ftp -s:f.scr
Y luego un archivo script f.scr con unas pocas líneas
open bradanovic.cl
(mi username)
(mi password)
cd public_html
cd RAPANUI
lcd c:\inventario
put prueba.txt
bye
¿Y el botón en VBA?, eso es lo más fácil, también una sola línea:
Shell (“c:\windows\ft.bat”)
¡Eso era todo! algo tan sencillo pero recién lo vine a sacar a las 3:18 AM después de andar todo el día buscando distintas cosas que no funcionaron. El problema con el archivo bat original era que al poner enter en un archivo windows coloca dos caracteres CR+LF, mientras que Unix reconoce solo CR y el LF lo toma como parte del password echándo todo a perder. Usando un archivo de script .scr se soluciona la cosa porque Unix reconoce cada línea como un comando.
En fin, las cosas que parecen más sencillas terminan complicándose “el diablo está en los detalles” pero al fin tengo, al menos en teoría, resuelto el maldito asunto, ahora solo me falta programarlo, hacer la otra parte (bajar los archivos) y todo eso, pero el problema principal ya está resuelto, en un tiempo más no tendré que ir todas las noches al Rapa a pasar los archivos y mi alma inmortal se verá beneficiada, evitando todos los pecados de la carne imaginarios y de pensamiento que he cometido -onda Jimmy Carter- en tan sacrificado trabajo. Hasta pronto.