Validar registro con contraseña en vfp

Tengo una consulta y se le agradece el apoyo, quiero hacer que en el formulario de mantenimiento de clientes en el botón eliminar me aparezca un formulario como del acceso para registrar el login del administrador que autoriza la eliminación del registro, si es el administrador recien se elimine de la base de datos caso contrario no haga nada.

Respuesta
1

Es un gusto saludarte y gracias por consultar.

Según lo que comprendo de tu consulta, ¿deseas algo así como ingresar algún password de usuario administrador que te de el permiso de eliminar? De no ser así, aclárame para poder ayudarte mejor.

De ser así, puedes proceder de la siguiente manera:

La idea, de forma secuencial, es crear un form (secundario) que te permita validar el usuario o password o ambos, del administrador. El form se genera en modo de lectura cuando haces clic en el botón "Eliminar" de tu form principal. Lo que básicamente realizaras es: cuando el form secundario se abre, digitas el usuario o password (según a como lo querrás diseñar) y lo validas, si es correcto, entonces el form se cierra y traspasa un parámetro al form principal indicando que la validación del usuario administrador si es correcta, osea que si corresponde al administrador. Si no pasa el parámetro, entonces no es valido. La opción se resume a abrir el form secundario, validar la clave y retornar un parámetro (puede ser el valor 1) que de ser correcto, te permita dar el paso siguiente: eliminar.

1. Crea el form de validación (que es donde meterás la clave) para eliminar el registro. Lo llamaremos form1 (a modo de ejemplo). Establece, en modo de diseño del form, las propiedades siguientes: WindowType = 1 - Modal, ShowWindow = 1 - Top Level.

2. En ese form1, en modo de diseño, ve al menu "form" y haz clic, luego clic en la opción "New Method" y crea un método llamado "validar".

3. Siempre en el form1, en modo diseño, ve de nuevo al menú "form" y haz clic ahora en la opcion "new property" y crea 2 propiedades: "lretval" y después crea otra propiedad llamada "oretorno". Coloca como valor por defecto para ambas propiedades ".F.".

4. En el evento INIT() del form1, coloca este código:

**--
THISFORM.oretorno = CREATEOBJECT("Empty")
**--
ADDPROPERTY(THISFORM.oretorno, "validacion", " ")

5. En el método "validar" que has creado (lo veras en la pestaña"method" de las propiedades del form, en la parte inferior al final), haz doble clic. Y en dicho método, escribí tu rutina con la que pretendes validar la clave o usuario administrador. Esto depende de como lo realices en tu aplicación. Este método claramente validara tu clave y si la clave es correcta, entonces debes cargar el parámetro de retorno (al form principal) y cerrar. Se me ocurre algo así: supongamos que en el form ponemos 2 textbox y en ellos digitamos nombre de usuario y password:

**--Validamos la clave del usuario maestro y si es correcta, cargamos el parámetro de retorno:

lcUsuario = ALLTRIM(THISFORM.Text1.Value)

lcPass = ALLTRIM(THISFORM.Text2.Value)

SELECT nombreusuario, password FROM tablausuarios WHERE nombreusuario = lcUsuario AND password = lcPass INTO CURSOR cursorvalidar

**--Se cargo el cursor?

IF USED('cursorvalidar')

SELECT cursorvalidar

**--Hay datos validos?

IF EMPTY(ALLTRIM(cursorvalidar.nombreusuario)) OR ISNULL(cursorvalidar.nombreusuario)

   MESSAGEBOX("El usuario no existe. Verifique", 48, "Aplicación")

   **--Enviamos cero al parámetro de retorno

   THISFORM.oretorno.validacion = 0

**--Si hay datos validos, el usuario y pass son validos. 

ELSE 

**--El parámetro de retorno es valido porque la clave es correcta. Su valor es 1.

   THISFORM.oretorno.validacion = 1

   **Cerramos el form.

   THISFORM.Release()

ENDIF 

**--No se cargo el cursor 

ELSE 

   MESSAGEBOX("El usuario no existe. Verifique", 48, "Aplicación")

   **--Enviamos cero al parametro de retorno

   THISFORM.oretorno.validacion = 0

ENDIF 

**--//

Acá te doy solo un ejemplo... lo importante es que cuando vos valides tu clave de admin, cargues el parámetro de retorno (THISFORM. Oretorno.validacion = 1) con valor 1. Y cerres el form. Con esto le decís: "ok la clave es valida, regresa valor 1 al form principal para indicar que la validación fue correcta y que si se puede eliminar el registro. Para llamar a este metodo validar, coloca un boton y en el evento clic pones "THISFORM.validar()".

6. En el evento "Unload" del form1, coloca este código:

RETURN THISFORM.oretorno

7. Guarda los cambios en tu form1.

8. Ve ahora al form principal (desde donde eliminaras el registro). En el botón que mencionas "eliminar", coloca este código:

Local lcRespuesta

**--

lcRespuesta = MESSAGEBOX("Desea eliminar el registro?", 36, "Aplicación")

DO CASE 

   CASE lcRespuesta = 6      &&La respuesta es "Si"

   **--Llamamos el form de validación de usuario admin

   DO FORM "form2.scx" TO lMyRetVal

    IF NOT EMPTY(lMyRetVal.validacion) AND lMyRetVal.validacion = 1 

      **--Acá el proceso para eliminar el registro. 

   ENDIF 

   **--//

   CASE lcRespuesta = 7      &&La respuesta es "No"

      *--()

ENDCASE 

**--//

Y listoooo! Es todo. Se ve algo complicado en letras... jaja pero en la practica, si seguís los pasos, te funcionara exitosamente.

Bien... si esto contesta a tu inquietud, muy bien. Si tenes alguna duda, avísame por acá! Estoy a tus ordenes para lo que necesites. Con muchísimo gusto te contestare y apoyare.

Fue un placer y cuídate mucho.

Te mando un abrazo!

Desde Managua, capital de Nicaragua!

Ravenn :D :D :D

¡Gracias! ravenn, hice lo que me indicas y algunas modificación y logre lo que necesitaba, gracias por tu tiempo y te tomare la palabra, ah por cierto mientras iba leendo iba recordando un ejemplo de un formulario de login (la forma de tu escritura) hace varios años y oh sorpresa era suyo maestro, gracias

¿Ah si? ¿Era una publicación mía? Ja ja pues que bueno que a pesar del tiempo, te ha servido! Por acá estaré ahora... he regresado al foro para ayudar en lo que pueda, siempre con Fox.

1 respuesta más de otro experto

Respuesta
1

Te envío una idea de una clase para que veas si puedes resolverlo por ese lado... Cualquie duda me lo dices.

Lparameters cCodigouser, cNombreUser
If Empty(cCodigouser)
    Return
Endif
Use <TablaDeRegistro>
Locate For cCodigouser = <CodigoEnTabla>
gActivada = .F.                                     && Si pasó o no la clave correcta.
m.cExacto = Set("Exact")
frmUsuarios = Createobject('frmUsuarios')              && Create Form.
* -------
frmUsuarios.AddObject('lbUsuario','Labelver')
frmUsuarios.lbUsuario.Caption = cNombreUser
* -------
frmUsuarios.AddObject('lbRotuser','Labrotuser')
frmUsuarios.AddObject('txClave','CajaDeTexto')
* -------
frmUsuarios.Show                                  && Display the form.
Return gActivada
Read Events                                          && Start event processing.
Define Class frmUsuarios As Form
    Caption     = 'Autorización del Usuario'
    ControlBox  = .F.                                  && Disable the Control menu box.
    BorderStyle = 2
    Height      = 97
    Width       = 293
    AutoCenter  = .T.
    ShowWindow  = 2                                         && Form de Nivel Superior.
    AlwaysOnTop = .T.
    WindowType  = 1
    ShowWindow  = 1
    Procedure Load
    Endproc
    Procedure Init
    Endproc
    Procedure LostFocus
    frmUsuarios.Release
    Endproc
    Procedure Destroy
    Set Exact &cExacto
    Endproc
    Procedure CargarDatosDelUsuario
    ** Aquí escribes el procedimiento al ingresar clave de usuario.
    Endproc
Enddefine
Define Class CajaDeTexto As TextBox
    Top          = 48
    Left         = 120
    Height       = 23
    Width        = 120
    Visible      = .T.
    PasswordChar = '*'
    Procedure Valid
    Set Exact On
    m.cDatoInter = Alltrim(This.Value)
    Do Case
        Case Empty(cDatoInter) And Lastkey()=13
            && Nada que hacer aquí.
            frmUsuarios.Release
        Case cDatoInter=cLeeclave
            Thisform.CargarDatosDelUsuario()
            frmUsuarios.Release
        Otherwise
            Wait Window [Clave erronea.]
            This.Value = []
            Return
    Endcase
    Endproc
Enddefine
Define Class Labrotuser As Label
    Caption   = 'Usuario:'
    Left      = 36
    Top       = 48
    FontName  = 'Arial'
    FontSize  = 9
    BackStyle = 0
    Visible   = .T.
    ForeColor = Rgb(128,128,64)
Enddefine
Define Class Labelver As Label
    Left      = 24
    Top       = 12
    FontName  = 'Arial'
    FontSize  = 11
    AutoSize  = .T.
    Visible   = .T.
    ForeColor = Rgb(0,0,0)
Enddefine

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas