Hace un par de dias me llamaron de una farmacia local, ya que tenian un problema critico en el sistema central de gestion de la farmacia, o sea: compras, ventas, creditos, despachos, y todos los manejos administrativos que se puedan imaginar. Cuando hable por telefono con la persona a cargo, esta me señalo solamente que era un problema en un Unix y ningun otro dato, rapidamente cometi el error de pensar que se trataba de algun problema comun en el sistema en si como: respaldos, algun sistema de red, u otro problema de confirguracion habitual. Al llegar, me encontre con una maquina con SCO UNIX, eso no me gusto mucho, pero no me asusto porque ya tenia experiencia con ellos… Al los segundos la persona encargada me mostro que el problema no era del Unix en si, sino que era un error de la aplicacion misma, que personalmente no sabia ni en que lenguaje estaba desarrollada. Despues de cachurear un rato, pude darme cuenta que estaba desarrollado en BBX4, nada mas rebuscado a mi juicio; y lo peor de todo es que nunca en mi perra vida si quiera habia hecho algo en este lenguaje (que no es igual que el simple Basic). Pero en fin, habian dos metas claras: La primera era detectar los errores:
Al tratar de recuperar la ubicacion de los documentos, el programa se caia con el siguiente mensaje:
!ERROR = 47 (SUBSTRING/FIELD ERROR)
120 IF MH0$ <> $$ AND A1$(11,2) > MH0$ THEN GOTO 1500
Luego, al tratar de actualizar los ingresos en bodega, salia lo siguiente:
!ERROR = 41 (INTEGER OR RANGE ERROR)
6994 LET + 888 = NUM(B11$(D88 * 11 - 10,11));
LET B11$(D888 * 11-10,11) = STR(+888+E99 : W6994 : 888$);
WRITE(11, KEY = A11$)IOL = 7411
Sin conocer el lenguaje en si logre darme cuenta que se habia un dato ingresado mal, el cual excedia un limite permitido por una variable X.
Como veran, la tarea que se me venia encima era bastante grande y compleja, para lo cual tenia dos alternativas: La primera era buscar en que archivo (de miles) era donde se ocacionaba el error, detectar las lineas comprometidas y solucionar el problema; pero para esto necesitaba al menos aprender bastante de BBX4, y el tiempo me jugaba en contra por ser un sistema en costante produccion. La otra opcion era, entender la logica de los archivos, y solamente conocer su estructura y asi poder regenerar con el mismo sistema sin los bloques que supuestamente estaban corruptos por el ingreso catastrofico.
Me propuse a leer el manual de la aplicacion, y di con cuatro archivos que posiblemente correspondian a los afectados, por lo que me la jugue a muerte, y procedi de la siguiente manera:
- Renombre los archivos comprometidos: RFFV0600 - RFFV0700 - RFFV0876 - RFFV0976, por lo mismo pero con “extension” .BAK.
- Generar nuevamente estos archivos desde la aplicacion en si.
- Traspasar el contenido de los archivos .BAK a los archivos recien generados: esto podia hacerlo de dos formas, la primera era a mano; y la mas sexy obviamente era hacer una aplicacion en el mismo BBX4 que la hiciece por nosotros; para lo cual fue necesario aprender el lenguaje en tiempo real, lo que fue posible gracias a la gran ayuda de Alexi Torres (Uno de los desarrolladores del sistema en si), y quedo algo mas o menos asi:
> 10 OPEN(1)”RFFV0XXXX.BAK”
> 20 OPEN(2)”RFFV0XXXX”
> 30 READ(1, END=100)IOL=7401
> 40 WRITE(2, KEY = A1$)IOL=7401
> 50 GOTO 30
> 100 END
> 7401 IOLIST A1$, B1$,C1$,D1$,E1$,F1$,G1$,H1$,I1$,J1$,K1$,L1$,M1$,N1$,O1$,P1$,Q1$,R1$,S1$,T1$,U1$,V1$,W1$
> RUN
Las X de la linea 10 y 20, deben modificarse para la ejecucion con cada uno de los archivos, y la linea 7401, se deben adecuar a las variables que este tenga, pueden ser menos…
Solo quedaba cruzar los dedos y esperar que todo funcionara… y asi fue; con esto la Farmacia X, puede seguir con su trabajo diario sin problemas, Aunque de todos modos he acordado con ellos hacer una reingenieria a sus sistemas, para automatizar ciertos proceos, y ver si es posible implementar el sistema en si, en algun otro Unix OpenSource, E0F.
Leer el post completo »