Ups, ¿y la contraseña del superusuario?

Ayer me encontré con un pequeño y pintoresco problema: después de instalar la actualización para el nuevo plan contable en la aplicación de gestión y contabilidad que usamos en la fábrica me encontré con que no me aceptaba la contraseña del superusuario (en este caso, llamado Supervisor). Jaja, diréis algunos, se le olvidó. Pues no, yo juro y perjuro que mi burro nació sin rabo, digo, que con la contraseña que yo intentaba meterle sin éxito estuvimos trabajando el viernes anterior, cuando hicimos el primer intento de abrir el nuevo ejercicio 2008.

En todo caso, el asunto era simple: no podía entrar como Supervisor y el Supervisor es el único usuario que puede hacer ciertas tareas de mantenimiento, como, por ejemplo, no sé, ¿quitar una contraseña olvidada? Para solucionar este pequeño contratiempo necesitaba pensar rápido y conocer a fondo las herramientas internas del programa (que las tiene muy buenas). En la parte primera, el contratiempo se produjo poco antes del fin de la jornada matutina, así que tuve dos horitas para pensar tranquilamente la solución. Realmente, tampoco es que el problema fuera tan complicado, pero todo pasaba por saber dónde guardaba el programa la contraseña de los usuarios y cómo eliminarla (o leerla, si estaba en claro). Por lo pronto, esta información debe ser común a todo el programa. Un rápido vistazo al árbol de directorios del programa me llevó a la carpeta “comunes” y ahí encontrar el archivo “usuarios”. Concretamente, tres archivos, con extensión .cdx, .dbf y .fpt. Ya tenía la tabla usuarios localizada, sólo quedaba abrirla.

Ups, mira que llevo tiempo diciéndome que debo aprender a usar las herramientas de gestión de base de datos que incluye la aplicación. Las he visto usar cuando nos han dado asistencia remota con un problema recurrente que tenemos y son muy completas. El caso es que no sé cómo funcionan y tampoco tenía tiempo en ese momento de ponerme a averiguarlo. Necesitaba abrir esa base de datos de Visual FoxPro con una herramienta conocida por mí, y ya está, así que recurrí a Visual Basic 2005, con idea de generar una aplicación simple con un dataset tipado, rezando para que Visual Estudio fuera capaz de abrir una base de Visual FoxPro como origen de datos.

Origen de datos ODBC

Dicho y hecho: elegí como origen de datos OBDC y en Especificación del origen de datos marqué Usar cadena de conexión y pulsé en Generar. Buceando por la pestaña Origen de datos de equipo encontré directamente el origen de datos COMUN001 que quería. Así da gusto. En la cadena de conexión, de todos modos, cambié la ruta por una copia de la base de datos que me llevé al disco duro local. El resto de los pasos para generar el dataset tipado fueron los normales. Efectivamente, en la base de datos comunes había una tabla usuarios con un campo llamado clave. Metí en el formulario una rejilla vinculada al dataset por el procedimiento del tirón (o sea, arrastra y suelta) y listo.

Bueno, casi. Al ejecutar la miniaplicación efectivamente accedí a la tabla de usuarios y vi las claves, pero se presentaron dos problemas. El primero es que las claves no estaban en claro. Éste fue el de menos, ya que uno de los usuarios tiene la clave en blanco, así que tenía que coger los caracteres de la clave de este usuario y ponérselos al superusuario para tener la clave de éste en blanco. Aquí llegó el segundo problema: Visual Basic no fue capaz de generar la sentencia UPDATE al crear el dataset tipado.

Pues nada, que tocó escribir código. 3 minutos más de trabajo, total de 15 (incluyendo el repaso rápido del UPDATE, que siempre se me olvida cómo va). Agregué un botón al formulario con lo siguiente:

Private Sub Button1_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button1.Click
    Dim ocConexion As New Odbc.OdbcConnection( _
                My.Settings.ConnectionString)
    Dim coComando As New Odbc.OdbcCommand
    Dim Usuario As String
    Dim Clave As String
    Dim msg As Microsoft.VisualBasic.MsgBoxResult
    msg = MsgBox(My.Settings.ConnectionString, MsgBoxStyle.OkCancel)
    If msg = MsgBoxResult.Cancel Then Exit Sub
    Usuario = InputBox("Usuario")
    Clave = InputBox("clave")
    coComando.CommandText = "UPDATE usuarios SET clave='" _
            & Clave & "' WHERE nombre='" & Usuario & "'"
    ocConexion.Open()
    coComando.Connection = ocConexion
    coComando.ExecuteNonQuery()
    ocConexion.Close()
    MsgBox("Ok")
End Sub

Por último, cogí la tabla de usuarios así modificada (los tres archivos), se la encasqueté a la base de datos buena del servidor, inicié la aplicación y listo, todo funcionando bien otra vez (durante media tarde, hasta que dio el siguiente error en la actualización, un error al acceder a una tabla en la que se había introducido un valor basura al ejecutar la primera parte de la actualización). Moraleja: no hay nada como un poco de pensamiento lateral y, sobre todo, si no tienes o no sabes manejar la herramienta adecuada, ten una que pueda hacer el trabajo y que sí sepas manejar.

Saludos desde el Forlon. Sed buenos y que os traigan muchas cosas los Reyes (por ejemplo, una canuta nuclear táctica). Yo quiero una furgoneta nueva, a ver si me dura más que las otras.

Deja un comentario