Cómo programar una aplicación de simulación de un cajero automático con Microsoft Excel

De ante mano un saludo... Espero pueda ayudarme soy estudiante de ing. En tec. De la inf. Y telec. Y me encargaron como examen final un programa que simule un cajero automático. Por tanto es necesario que reste el saldo del usuario solamente y que en el saldo actual permanezca el resultado de esto... Tengo como inicio un login y de ahí al ingresarlo correctamente pasa al form1 donde tengo los dos cammand button uno de consulta y otro de retiro todo ligado en una base de datos de access llamada elnuevocajer.mdb con los datos de las columnas nombre, nip, saldo, saldo actual, y esta ingresando con el nip (esto es lo que tengo)
Option Explicit
Public LoginSucceeded As Boolean
Private Sub cmdCancel_Click()
    'establecer la variable global a false
    'para indicar un inicio de sesión fallido
    LoginSucceeded = False
    Me.Hide
End Sub
Private Sub cmdOK_Click()
Data1.Recordset.MoveFirst
Do While Not (Data1.Recordset.EOF)
If txtPassword = Data1.Recordset.Fields("nip") Then
Form1.Show
End If
Data1.Recordset.MoveNext
Loop
Me.Hide
End Sub
Se que es muy poco pero el problema es lo de el retiro de saldo y la consulta espero se halla entendido mi pregunta y que pueda ayudarme es de carácter urgente espero pueda ayudarme gracias y hasta pronto.

2 Respuestas

Respuesta
1
Por las especificaciones que usas voy a asumir que tu proyecto es un vbp (proyecto visual basic) y no un xls (Libro de excel), siendo así, sin alterar mucho lo que llevas, deberías hacer lo siguiente:
(Los que listo a continuación son controles obligatorios, si necesitas más, los agregas)
En form1
- Agregar también un control data (para el ejemplo "data2") configurado igual que data1
- Agregar un label (para el ejemplo "lblSaldo") que en su propiedad DataSource contenga "data2" y en su propiedad DataField contenga "saldo" (Asumiendo que el retiro lo descontaremos de saldo). De esta forma enlazamos directamente la etiqueta lblSaldo al campo "saldo" del data2 y por consiguiente a la tabla asociada al data2.
- Agregar un campo de texto (para el ejemplo "txtMontoRetiro")
- Agregar un botón (para el ejemplo "cmdRetirar")
Pasos a seguir:
- Una vez validado el usuario, debes guardar el valor de Data1. Recordset. AbsolutePosition en algún lugar al que también tenga acceso form1
- En el evento Form_Activate() de form1, asignas el valor que almacenaste en el paso anterior a Data2. Recordset. AbsolutePosition, de esta forma tenemos el data2 posicionado en el mismo registro que quedó data1.
- Por último, en el evento _Click de cmdRetirar pones lo siguiente
lblSaldo.Caption = lblSaldo.Caption - txtMontoRetiro.txt
Esta acción cambiará automáticamente el valor en la base de datos al momento que se modifique el contenido de lblSaldo, ya que está enlazado directamente con el campo saldo de la base de datos a través de data2.
-------Fin :-) -----------
Una corrección:
- Una vez validado el usuario, debes guardar el valor de Data1. Recordset. AbsolutePosition en algún lugar al que también tenga acceso form1 (llamemos a este lugar "posData1" )
- En el evento Form_Activate() de form1 agregas: Data2. Recordset. Move (posData1), de esta forma tenemos el data2 posicionado en el mismo registro que quedó data1.
Ok, ahora debería resultar.
Muchas gracias por la ayuda si m funciono asta cierta parte ya que si m resta y m guarda el resultado pero también quiero que no se guarde solo el de un usuario si no el de el usuario que ingrese el nip y solo su perfil o cuenta como guste llamarlo y se guarde en mi base de datos y que en la consulta de saldo solo muestre el saldo hasta ahora esto es lo que llevo espero pueda orientarme:
El en formlogin:
Option Explicit
Dim CUENT As Integer
Public LoginSucceeded As Boolean
Private Sub cmdCancel_Click()
    'establecer la variable global a false
    'para indicar un inicio de sesión fallido
    LoginSucceeded = False
    Me.Hide
End Sub
Private Sub cmdOK_Click()
    'comprobar si la contraseña es correcta
    Data1.Recordset.MoveFirst
Do While Not (Data1.Recordset.EOF)
If txtPassword = Data1.Recordset.Fields("nip") Then
CUENT = Data1.Recordset.Fields("saldo").DataUpdatable
Form1.lblsaldo.Visible = False
Form1.lblsaldo.Caption = Data1.Recordset.Fields("saldo")
Form1.Show
LoginSucceeded = True
      Me.Hide
      Data1.Recordset.MoveLast
        Else
        SendKeys "(home)+(end)"
        'colocar código aquí para pasar al sub
'que llama si la contraseña es correcta
'lo más fácil es establecer una variable global
    End If
    Data1.Recordset.MoveNext
    Loop
    txtUserName.Text = ""
    'establecer la variable global a false
'para indicar un inicio de sesión fallido
    Me.Hide
End Sub
Y en el form1:
Public posdata1 As Integer
Private Sub Command1_Click()
lblsaldo.Visible = True
posdata1.Data1.Recordset.AbsolutePosition
Data2.Recordset ("saldo")
End Sub
Private Sub Command2_Click()
lblsaldo.Caption = lblsaldo.Caption - txtmontoretiro.Text
End Sub
Private Sub Form_Activate()
Data2.Recordset.Move (posdata1)
End Sub
ojALA pueda ayudarme de antemano muchas gracias
Tienes varias confusiones y algunas cosas mal hechas. Ya veo cuando me dices que esto funciona a medias :).
Primero vamos a configurar los controles en tiempo de diseño. Esto lo hacemos modificando las propiedades en la hoja de propiedades de cada control (Nada de código aún).
Propiedades de data1 y data2
Propiedad Valor

DataBaseName "Ruta a tu base de datos"
RecordSource cuenta
Visible                         False
Propiedades de lblSaldo de form1
Propiedad Valor
DataSource Data2
DataField saldo
Visible                        False      'Si quieres que aparezca invisible
Ahora nos vamos al código (Voy a poner sólo los procedimientos que hay que modificar, los demás se conservan)
Private Sub cmdOK_Click()
    'comprobar si la contraseña es correcta
    Data1.Recordset.MoveFirst
Do While Not (Data1.Recordset.EOF)
   If txtPassword = Data1.Recordset.Fields("nip") Then
      'CUENT = Data1.Recordset.Fields("saldo").DataUpdatable 'Lo comento porque no sé para qué lo usas
'''''''''''''''''''''Están en hoja de propiedades'''''''''''''''''''''''''
      'Form1.lblsaldo.Visible = False
      'Form1.lblsaldo.Caption = Data1.Recordset.Fields("saldo")
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
      Form1.Show
      LoginSucceeded = True
      Me.Hide
      Exit Do 'Rompemos el ciclo Do
      'Data1. Recordset. MoveLast 'Es importante conservar
                                                  'la posición en que encontró el nip
                                                  'Esta línea hace que la posición se pierda
   'Else
        'SendKeys "(home)+(end)" 'No le veo utilidad
    End If
    Data1.Recordset.MoveNext
Loop
    txtUserName.Text = ""   
    Me.Hide
End Sub
'Ok, Eliminando todo lo que no sirve, el evento cmdOk_Click Nos queda
Private Sub cmdOK_Click()
    'comprobar si la contraseña es correcta
    Data1.Recordset.MoveFirst
Do While Not (Data1.Recordset.EOF)
   If txtPassword = Data1.Recordset.Fields("nip") Then
      Form1.Show
      LoginSucceeded = True
      Me.Hide
      Exit Do 'Rompemos el ciclo Do     
    End If
    Data1.Recordset.MoveNext
Loop

   
    txtUserName.Text = ""   
    Me.Hide
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Ahora vamos con el código de form1
Private Sub Command1_Click()
  lblsaldo.Visible = True
  'posdata1.Data1.Recordset.AbsolutePosition 'Esta línea es un error
  'Data2.Recordset ("saldo") 'Esta línea no es necesaria
End Sub

Private Sub Command2_Click()
  lblsaldo.Caption = lblsaldo.Caption - txtmontoretiro.Text
End Sub


Private Sub Form_Activate()   

   'Se extrae la posición en que quedó el data1
   posdata1= formlogin.Data1.Recordset.AbsolutePosition
   'Se asigna la posición al data2
   Data2. Recordset. Move (posdata1)
End Sub
Lo que está en negrita es el código bueno. Te recomiendo que leas la respuesta con calma y que trates de entender lo que se hace. Si tienes alguna duda, me consultas.
Hola...
Ya lo hice de la manera que m dijiste pero prevalece el saldo de uno solo
si resta bien y todo pero el problema es que solo a uno saldo
cuando ingreso queda el mismo saldo y sin importar con que usuario ingrese
queda la misma cantidad
mi pregunta es:
¿Cómo le hago para que use el saldo de el usuario con que se ingreso el nip y a dar click en el botón de comando 1 me muestre el saldo?
Espero no fastidiar con tantas dudas.
Gracias por su ayuda.
A mí me funciona bien el código y si tu tienes el mismo código que yo, revisa que tienes bien hechas estas asignaciones en la hoja de propiedades.
Propiedades tanto para data1 como para data2
Propiedad Valor
DataBaseName "Ruta a tu base de datos"
RecordSource cuenta
Visible                         False
Propiedades para lblSaldo de form1
Propiedad Valor
DataSource Data2
DataField saldo
Visible                        False      'Si quieres que aparezca invisible
Insisto en que el código fuente está funcionando bien, así que verifica la asignación de las propiedades.
Agrego nuevamente el código
'''''''''''''''''''Código para formlogin''''''''''''''''''''''''
Private Sub cmdOK_Click()
    'comprobar si la contraseña es correcta
    Data1.Recordset.MoveFirst
Do While Not (Data1.Recordset.EOF)
   If txtPassword = Data1.Recordset.Fields("nip") Then
      Form1.Show
      LoginSucceeded = True
      Me.Hide
      Exit Do 'Rompemos el ciclo Do     
    End If
    Data1.Recordset.MoveNext
Loop
    txtUserName.Text = ""   
    Me.Hide
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''Código para Form1''''''''''''''''''''''''
Ahora vamos con el código de form1
Private Sub Command1_Click()
  lblsaldo.Visible = True 
End Sub
Private Sub Command2_Click()
  lblsaldo.Caption = lblsaldo.Caption - txtmontoretiro.Text
End Sub
Private Sub Form_Activate()   
   'Se extrae la posición en que quedó el data1
   posdata1= formlogin.Data1.Recordset.AbsolutePosition
   'Se asigna la posción al data2
   Data2.Recordset.Move (posdata1)
End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Insisto en que el código funciona tal cual como quieres, pero es necesario que configures bien los controles (asignes las propiedades que menciono)
Hola
Muchísimas gracias no sabes cuanto t agradezco ya m funciono todo
tuve que mejorar ciertas cosas que m dijiste y si m funciono a la perfección
nuevamente gracias y espero sigas ayudando a los chavos como yo en esto de la programación hasta pronto.
Saludos
Respuesta
1
Viendo lo que precisas lo que necesitas es más o menos que vaya actualizando el saldo a medida que realiza algún depósito o retiro pero no en consultas. Podrías tomar algunos parámetros para ejecutar tus consultas tal como numero de cuenta, o el login mismo.
Para realizar ingresos o depósitos nuevos tendrías un código más o menos así:
campos = "(campo1,campo2,campo3,campo4,campo5)"
valores = "('" + dato1 + "','" + dato2 + "', " + dato3 + " ,#" + dato4 + "#,'" + dato5 + "')"
grabar = "INSERT INTO MOVIMIENTOS " + campos + " VALUES " + valores
CN. Execute grabar
Donde CN indica la conexión a tu base de datos.
Para realizar retiros se generan nuevos registros en esta forma también pero actualizando tu saldo y cuando realiza la consulta tu cajero, podrías levantar los datos solo del último registro de retiro. De otra manera, al retirar generarás un nuevo registro actualizando un campo que se podría llamar 'saldo_diario' que calcule al momento de generar ese movimiento de retiro y/o ingreso.
En cuanto a la actualización sería más o menos así:
cambios = "MONTO=" + txtmonto + " "
actualiza = "UPDATE CUENTA SET " + cambios + " WHERE NROCTA='" + txtNroCuenta + "'"
CN. Execute actualiza
Es lo que más o menos haría para no complicar tanto las cosas.
Aplícalo y me avisas para ver alguna manera de ayudarte en lo que precisas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas