Base de datos sendilla

Necesito hacer una bd que llene mediante un formulario con numero de teléfono, y 5 campos de nombres (nom1, nom2,... Nom5), y la idea es que al poner el numero de teléfono, si este ya existe me muestre y deje modificar todos los nombres y si al termina
Inicio | Publicidad | Condiciones de uso | Declaración de privacidad | Blog
© 1999 - 2011 Todoexpertos.com. Todos los derechos reservados. Desarrollado por Avanzis.

1 respuesta

Respuesta
1
El texto de tu consulta parece cortado. ¿Serías tan amable de volver a plantear tu consulta?
Gracias.
Hola necesito hacer una bd que llene mediante un formulario con numero de teléfono, y 5 campos de nombres (nom1, nom2,... nom5), y la idea es que al poner el numero de teléfono, si este ya existe me muestre y deje modificar todos los nombres y si este numero fuese nuevo en la base de datos, tome el registro como nuevo incorporando dicho numero más lo que llene en los campos nombres, gracias.
Para hacer lo que me comentas tienes que hacer un par de cosillas. Como no sé los nombres de tus campos ni de tu formulario te voy a marcar en negrita las palabras del código que debes cambiar por las tuyas. Al final de este mensaje te pongo las equivalencias. Si alguna de las cosas que te explico no las sabes hacer me la comentas y te lo explico con más detalle.
Allá vamos...
1. Al formulario donde vas a meter los datos, al evento "Al abrir", (Propiedades->Pestaña Eventos) le pones el siguiente código:
---
Private Sub Form_Open(Cancel As Integer)
    DoCmd.RunCommand acCmdRecordsGoToNew
End Sub
---
2.- En el campo donde introduces el teléfono (que yo lo he llamado "Telf"), en sus propiedades, al evento "Después de actualizar le pones este código":
---
Private Sub Telf_AfterUpdate()
    Dim vTel As Variant
    Dim vExiste As Variant
    Dim rst As Recordset
    vTel = Me.Telf.Value
        'Si no se ha escrito ningún teléfono sale del
'procedimiento sin hacer nada
    If IsNull(vTel) Then Exit Sub
        'Copiamos el recordset del formulario
    Set rst = Me.Recordset.Clone
        'Comprobamos si el teléfono introducido ya existe
        'Si existe nos muestra los datos. Si no nos permite
'seguir introduciendo número
rst. MoveFirst
    Do Until rst.EOF
        vExiste = rst.Fields("Telf").Value
        If vExiste = vTel Then
            MsgBox "El teléfono introducido ya existe", vbInformation, "EXISTE"
            Me.Undo
            DoCmd.OpenForm Me.Name, , , "[Telf]= '" & vTel & "'"
            Forms!FTelf.Nom1.SetFocus
            Exit Do
        End If
        rst.MoveNext
    Loop
    'Cerramos conexiones y liberamos memoria
    rst.Close
    Set rst = Nothing
End Sub
---
Ahora el proceso debería ser el siguiente: escribes el número de teléfono. Si no existe te dejará acabar de rellenar los datos (nom1, nom2...), y así ya lo tendrás dado de alta como un nuevo registro.
Si el teléfono introducido ya existe te saldrá un mensaje informativo y te llevará al registro con los datos de ese teléfono, donde podrás cambiar lo que quieras a tu gusto.
Las equivalencias son:
Telf -> Nombre de tu campo para introducir el teléfono
Nom1-> Nombre de tu campo donde introduces el primer nombre
FTelf-> Nombre de tu formulario
Ya me dirás qué tal te ha ido.
Desde ya neckkito, mil gracias spor tu ayuda, la verdad desde mi ignorancia pensé que era más sencillo y que se podía hacer sin código.
Ahora vamos al tema, probé el código y funciona perfecto hasta que pongo un numero existente, en ese momento aparece el mensaje de que el numero existe pero al aceptar sale un error de depuración 2501 diciendo que acción openform se cancelo. La depuración marca la linea DoCmd.OpenForm Me. Name, , , "[Telf]= '" & vTel & "'" del codigo. Otra vez desde mi ignorancia pensé que podría ser que quería abrir un form ya abierto así que directamente elimine toda la linea! Pero al hacer esto, después de aceptar el mensaje de nnumero existente, se posiciona en el primer campo de nombres en el mismo registro (por ejemplo si ese numero existía en el registro 2 y el primer registro vacío para llenar es el 5 se sitúan en este ultimo por lo que no muestra los datos ya cargados).
No se si me explique bien, gracias nuevamente por tu ayuda.
Yo creo que deberíamos hacer algo con el origen de los datos de los campos Nom1,.. Nom5 si el numero ya esta ingresado, tipo marcarle que el origen de los datos en ese caso es del numero de registro en cuestión o algo así. Gracias nuevamente.
OK.
Abre la tabla donde tienes la información y dime con qué tipo de dato tienes configurado el campo donde recoges el número de teléfono (texto, número,...).
A ver si con esa información puedo decirte algo para arreglar la cosa.
Aprovecho para comentarte que uno de los misterios de Access, para mí, es que cosas sencillas en apariencia deben hacerse con código, y que cosas complicadas que parece que tienes que ser un súper-programador para hacerlas a veces basta con pulsar un botón.
En fin, cosas de Access.
Hola, gracias nuevamente, al campo Telf le puse numérico y a los Nom1, Nom2,... Nom5 texto, gracias.
OK.
Tienes que cambiar esta línea de código:
DoCmd.OpenForm Me.Name, , , "[Telf]= '" & vTel & "'"
Por esta otra
DoCmd.OpenForm Me.Name, , , "[Telf]= " & vTel
A ver si ahora te funciona. Ya me dirás.
Hola, gracias nuevamente, veo que estas on lline!, funciono pero por momentos me deja entrar un numero duplicado y obviamente como registro nuevo, no llegue a notar bien cuando lo hace creo que luego de la consulta de un numero existente.
En teoría yo creé una miniBD y el funcionamiento es correcto. A veces pasa que si no estás en lo que sería un proceso "normal" (abrir la BD->abrir formulario->meter datos) y te dedicas a poner el formulario en vista diseño, y luego en vista normal, y otra vez en vista diseño, y así sucesivamente, quedan "cosas" colgadas que pueden darte la impresión de que la cosa va mal.
Haz la prueba como si metieras los datos de manera normal, como te comentaba antes, sin poner el formulario en vista diseño en ningún momento.
Si ves que falla, y no te importa, pásame la BD comprimida en un zip y yo le echo un vistazo.
Mi correo es [email protected]
Ya me dirás cosas.
Otra cosa cuando se usa la base por primera vez, es decir con la tabla vacía, al ingresar el primer numero sale error 3021 no currrent record y la depuración para en rst.MoveFirst, se ve que quiere mover un registro todavía inexistente o algo así creo.
Caramba!
Te gusta complicar las cosas, ¿eh? Je, je...
En realidad lo raro es acertar con un código a la primera, así que no te preocupes. En el código, antes de la línea que comentas (rst. MoveFirst) le añades esta línea de control:
---
If rst.RecordCount = 0 Then Exit Sub
---
Que, como intuirás, dice que si no hay registros salgas del procedimiento.
Ya me dirás.
He vuelto a comprobar la aplicación y, efectivamente, te deja meter un número que ya existía. Ello se debe a que el proceso:
- Comprueba si el número existe
- Si existe lo filtra para mostrarte los datos que habías metido, para poder modificarlos.
Si desde esta pantalla vas a añadir registro sigues con el filtro del formulario puesto, y claro, al estar filtrado el código sólo puede "ver" los números que hay filtrados, no los de toda la tabla.
Para solucionar eso me imagino que en el formulario tendrás un botón que sea "Añadir nuevo registro". Sacas sus propiedades, te vas a la pantalla eventos y en el evento "Al hacer click" (si has creado ese botón a través de macro borras lo que te pone de "procedimiento de evento") le asignas el siguiente código (la línea que te he marcado en negrita no la debes cambiar, dejas la que te salga a ti por defecto):
---
Private Sub Comando6_Click()
If Me.FilterOn = True Then
    Me.FilterOn = False
End If
    DoCmd.RunCommand acCmdRecordsGoToNew
End Sub
---
Ahora, cuando añadas un nuevo registro, los datos ya no estarán filtrados, y te reconocerá si el nuevo número ya existe.
Lamento no haberme percatado de este detalle antes. Mil disculpas.
La verdad no le puse ningún botón pero si es necesario lo agrego, gracias.
Estoy probando en otra maquina y comencé todo de nuevo pero algo esta fallando después te comento bien, agregue el botón pero el tema es que si no lo apretás igual salta al próximo registro, tendría que pasar al próximo registro solo si oprimo el botón así nos aseguramos que se saque el filtro y no pasar al terminar el ultiomo campo o barriendo con tab. Lo pruebo en un rato y te digo si encontré algo más. Abrazos y mil gracias.
Hola, te cuento lo que hice, el código que hiciste para el botón lo puse en el evento del formulario después de actualizar, comencé a hacer pruebas y aparentemente andaba bárbaro y en un momento intento meter un numero existente y lo toma pero no puedo identificar bien cuando lo hace, aparentemente después de modificar algunos existentes si ingresas el primer numero lo toma igual, entonces probé apretando el botón y me dice que no se encuentra disponible la propiedad newrecordset supongo que porque la esta usando el formularios.
Como puedes ver, resulta difícil dar una solución "perfecta" sin tener la BD delante.
La solución es la siguiente:
Partimos del formulario que me comentabas que habías añadido el botón. Lo que comentas en tu último mensaje (esto de ponerlo en el evento de formulario después de actualizar, etc.) no lo tienes que hacer. ¿OK? Doy por supuesto que todas estas acciones las has deshecho.
Access, y en concreto el formulario, tiene una propiedad que se denomina "Ciclo". Esta propiedad, por defecto, está establecida en que el ciclo que se debe "recorrer" es el de todos los registros. Por eso, cuando llegas al final del último campo del formulario, te lleva a un nuevo registro.
Vamos a cambiar esto, de manera que para añadir un nuevo registro te "obligue" a usar el botón. Para ello sacamos las propiedades del formulario, pestaña "Otras", propiedad "Ciclo", y ahí le cambias la propiedad a "Registro Activo".
Ahora, si lo pruebas, verás que al llegar al último campo te salta al primero, no a uno nuevo. Y, al utilizar el botón, "fuerzas" a que se ejecute el código de ese botón para añadir el nuevo registro.
Y eso es todo. Ya me dirás qué tal te ha ido.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas