Discussion:
DLookup y FindRecord. Ayuda.
(demasiado antiguo para responder)
Jose Manuel
2004-02-14 09:03:26 UTC
Permalink
Quizas os parecezca una tonteria pero llevo dos dias pensando y leyendo
estos foros y no se hacer lo siguiente. Tengo dos tablas con los campos,

Personas: dni (clave, indexado, sin duplicados) , nombre, apellidos, direccion.
Entradas: dni (indexado, con duplicados), fecha_solicitud, motivo_solicitud.

Ambas tablas estan relacionadas (uno a varios) por el campo dni. Una persona
(un solo dni) puede tener varias entradas (varios dni).

Ante una nueva solicitud, introduzco el dni del solicitante en un formulario (cuyo
origen de datos es una consulta sobre ambas tablas). La B.D. puede llegar a
tener 30.000 personas.

Si ya existe ese dni, deberian mostrarse los campos de la tabla Personas (dni,
nombre, apellidos y direccion existentes) y, ademas, los campos en blanco de
la tabla Entradas (fecha_solicitud y motivo_solicitud). Yo relleno estos dos
ultimos campos y al salir se guarda un nuevo registro en la tabla Entradas.

Si no existe el dni, relleno ademas los campos nombre, apellidos y direccion,
y al salir se guardan dos registros, uno en cada tabla.

He creado un cuadro de texto independiente en el formulario, con el codigo:

- - - - - - - - - - - - - - - - -

Private Sub Busca_dni_AfterUpdate()

Dim X As Variant

X = DLookup("dni", "Personas", "dni = ' " & Me.Busca_dni & " ' ")

If X <> " " Then
Me.dni.SetFocus
DoCmd.FindRecord X, acEntire, , acSearchAll, , acCurrent
Else
DoCmd.GoToRecord , , acNewRec
Me.dni = Me.Busca_dni
Me.FREGISTRO.SetFocus
End If
End Sub

- - - - - - - - - - - - - - - - -

Si introduzco un dni nuevo, me da error: "Se ha producido el error "2137" en tiempo
de ejecucion. No se pueden usar Buscar ni Reemplazar ahora"

Si el dni es nuevo (no existe en la tabla Personas) entonces funciona.

Que hago mal ?

Podeis echarme una mano?
Juan M Afan de Ribera
2004-02-14 09:29:20 UTC
Permalink
Jose Manuel,

no se si será eso pero en vez de hacer la comparación

If X <> " " Then ...

podrías hacerlo de esta otra manera

If Not IsNull(X) Then ...

(aunque no lo acabo de tener claro)
--
Saludos, happy :-)
[MVP Ms Access]
http://www.clikear.com/webs4/juanmafan
Post by Jose Manuel
Quizas os parecezca una tonteria pero llevo dos dias pensando y leyendo
estos foros y no se hacer lo siguiente. Tengo dos tablas con los campos,
Personas: dni (clave, indexado, sin duplicados) , nombre, apellidos, direccion.
Entradas: dni (indexado, con duplicados), fecha_solicitud,
motivo_solicitud.
Post by Jose Manuel
Ambas tablas estan relacionadas (uno a varios) por el campo dni. Una persona
(un solo dni) puede tener varias entradas (varios dni).
Ante una nueva solicitud, introduzco el dni del solicitante en un formulario (cuyo
origen de datos es una consulta sobre ambas tablas). La B.D. puede llegar a
tener 30.000 personas.
Si ya existe ese dni, deberian mostrarse los campos de la tabla Personas (dni,
nombre, apellidos y direccion existentes) y, ademas, los campos en blanco de
la tabla Entradas (fecha_solicitud y motivo_solicitud). Yo relleno estos dos
ultimos campos y al salir se guarda un nuevo registro en la tabla Entradas.
Si no existe el dni, relleno ademas los campos nombre, apellidos y direccion,
y al salir se guardan dos registros, uno en cada tabla.
- - - - - - - - - - - - - - - - -
Private Sub Busca_dni_AfterUpdate()
Dim X As Variant
X = DLookup("dni", "Personas", "dni = ' " & Me.Busca_dni & " ' ")
If X <> " " Then
Me.dni.SetFocus
DoCmd.FindRecord X, acEntire, , acSearchAll, , acCurrent
Else
DoCmd.GoToRecord , , acNewRec
Me.dni = Me.Busca_dni
Me.FREGISTRO.SetFocus
End If
End Sub
- - - - - - - - - - - - - - - - -
Si introduzco un dni nuevo, me da error: "Se ha producido el error "2137" en tiempo
de ejecucion. No se pueden usar Buscar ni Reemplazar ahora"
Si el dni es nuevo (no existe en la tabla Personas) entonces funciona.
Que hago mal ?
Podeis echarme una mano?
unknown
2004-02-14 10:22:40 UTC
Permalink
Lo que me llama la atención, (puede ser un error de traslación) es la comparación que efectúas, pues no se si las dobles comillas encierran o no un espacio.

De cualquier forma, no veo necesario (a no ser que tenga otras aplicaciones), el crear una variable intermedia para efectuar la comparación, máxime cuando al finalizar no la liberas, esto repetido muchas veces, acaba por enlentecer la aplicación si no se libera la memoria utilizada.

Yo lo haría así:
..............
Private Sub Busca_dni_AfterUpdate()
If NZ(DLookup("dni", "Personas", "dni = ' " & Me.Busca_dni & " ' "),"") <>"" Then
Me.dni.SetFocus
DoCmd.FindRecord Me!Busca_dni , acEntire, , acSearchAll, , acCurrent
Else
DoCmd.GoToRecord , , acNewRec
Me.dni = Me.Busca_dni
Me.FREGISTRO.SetFocus
End If
End Sub
...........

Como verás, no utizo la variable, comparo con una cadena vacía, y para asegurar la respuesta que da el DLookup, utilizo la función Nz

Un saludo E. Feijoo



"Jose Manuel" <***@hotmail.com> escribió en el mensaje news:***@posting.google.com...
| Quizas os parecezca una tonteria pero llevo dos dias pensando y leyendo
| estos foros y no se hacer lo siguiente. Tengo dos tablas con los campos,
|
| Personas: dni (clave, indexado, sin duplicados) , nombre, apellidos, direccion.
| Entradas: dni (indexado, con duplicados), fecha_solicitud, motivo_solicitud.
|
| Ambas tablas estan relacionadas (uno a varios) por el campo dni. Una persona
| (un solo dni) puede tener varias entradas (varios dni).
|
| Ante una nueva solicitud, introduzco el dni del solicitante en un formulario (cuyo
| origen de datos es una consulta sobre ambas tablas). La B.D. puede llegar a
| tener 30.000 personas.
|
| Si ya existe ese dni, deberian mostrarse los campos de la tabla Personas (dni,
| nombre, apellidos y direccion existentes) y, ademas, los campos en blanco de
| la tabla Entradas (fecha_solicitud y motivo_solicitud). Yo relleno estos dos
| ultimos campos y al salir se guarda un nuevo registro en la tabla Entradas.
|
| Si no existe el dni, relleno ademas los campos nombre, apellidos y direccion,
| y al salir se guardan dos registros, uno en cada tabla.
|
| He creado un cuadro de texto independiente en el formulario, con el codigo:
|
| - - - - - - - - - - - - - - - - -
|
| Private Sub Busca_dni_AfterUpdate()
|
| Dim X As Variant
|
| X = DLookup("dni", "Personas", "dni = ' " & Me.Busca_dni & " ' ")
|
| If X <> " " Then
| Me.dni.SetFocus
| DoCmd.FindRecord X, acEntire, , acSearchAll, , acCurrent
| Else
| DoCmd.GoToRecord , , acNewRec
| Me.dni = Me.Busca_dni
| Me.FREGISTRO.SetFocus
| End If
| End Sub
|
| - - - - - - - - - - - - - - - - -
|
| Si introduzco un dni nuevo, me da error: "Se ha producido el error "2137" en tiempo
| de ejecucion. No se pueden usar Buscar ni Reemplazar ahora"
|
| Si el dni es nuevo (no existe en la tabla Personas) entonces funciona.
|
| Que hago mal ?
|
| Podeis echarme una mano?
Jose Manuel
2004-02-14 20:55:30 UTC
Permalink
Muchas gracias por vuestra rapida respuesta.

He probado ambas sugerencias y ya no obtengo error. Ahora el dni aparece
en el cuadro de texto independiente y se copia en el cuadro de texto dni,
pero aunque existan los datos de esa persona, no se muestran los valores
nombre, apellidos, direccion ... Seguire investigando, si descubro algo lo
posteare aqui.

- - - - - - - -
Post by Juan M Afan de Ribera
Jose Manuel,
no se si será eso pero en vez de hacer la comparación
If X <> " " Then ...
podrías hacerlo de esta otra manera
If Not IsNull(X) Then ...
(aunque no lo acabo de tener claro)
--
Saludos, happy :-)
[MVP Ms Access]
http://www.clikear.com/webs4/juanmafan
- - - - - - - -
Post by Juan M Afan de Ribera
Lo que me llama la atenci n, (puede ser un error de traslaci n) es
la comparaci n que efect as, pues no se si las dobles comillas
encierran o no un espacio.
De cualquier forma, no veo necesario (a no ser que tenga otras
aplicaciones), el crear una variable intermedia para efectuar la
comparaci n, m xime cuando al finalizar no la liberas, esto repetido
muchas veces, acaba por enlentecer la aplicaci n si no se libera la
memoria utilizada.
..............
Private Sub Busca dni AfterUpdate()
If NZ(DLookup("dni", "Personas", "dni = ' " & Me.Busca dni & " '
"),"") <>"" Then
Me.dni.SetFocus
DoCmd.FindRecord Me!Busca dni , acEntire, , acSearchAll, ,
acCurrent
Else
DoCmd.GoToRecord , , acNewRec
Me.dni = Me.Busca dni
Me.FREGISTRO.SetFocus
End If
End Sub
...........
Como ver s, no utizo la variable, comparo con una cadena vac a, y
para asegurar la respuesta que da el DLookup, utilizo la funci n Nz
Un saludo E. Feijoo
| Quizas os parecezca una tonteria pero llevo dos dias pensando y
| leyendo estos foros y no se hacer lo siguiente. Tengo dos tablas con los
| campos,
|
| Personas: dni (clave, indexado, sin duplicados) , nombre, apellidos,
| direccion.
| Entradas: dni (indexado, con duplicados), fecha solicitud,
| motivo solicitud.
|
| Ambas tablas estan relacionadas (uno a varios) por el campo dni. Una
| persona (un solo dni) puede tener varias entradas (varios dni).
|
| Ante una nueva solicitud, introduzco el dni del solicitante en un
| formulario (cuyo origen de datos es una consulta sobre ambas tablas).
| La B.D. puede llegar a tener 30.000 personas.
|
| Si ya existe ese dni, deberian mostrarse los campos de la tabla
| Personas (dni, nombre, apellidos y direccion existentes) y, ademas, los
| campos en blanco de la tabla Entradas (fecha solicitud y motivo solicitud).
| Yo relleno estos dos ultimos campos y al salir se guarda un nuevo registro
| en la tabla Entradas.
|
| Si no existe el dni, relleno ademas los campos nombre, apellidos y
| direccion, y al salir se guardan dos registros, uno en cada tabla.
|
| He creado un cuadro de texto independiente en el formulario, con el
|
| - - - - - - - - - - - - - - - - -
|
| Private Sub Busca dni AfterUpdate()
|
| Dim X As Variant
|
| X = DLookup("dni", "Personas", "dni = ' " & Me.Busca dni & " ' ")
|
| If X <> " " Then
| Me.dni.SetFocus
| DoCmd.FindRecord X, acEntire, , acSearchAll, , acCurrent
| Else
| DoCmd.GoToRecord , , acNewRec
| Me.dni = Me.Busca dni
| Me.FREGISTRO.SetFocus
| End If
| End Sub
|
| - - - - - - - - - - - - - - - - -
|
| Si introduzco un dni nuevo, me da error: "Se ha producido el error
| "2137" en tiempo
| de ejecucion. No se pueden usar Buscar ni Reemplazar ahora"
| Si el dni es nuevo (no existe en la tabla Personas) entonces funciona.
| Que hago mal ?
unknown
2004-02-14 21:20:06 UTC
Permalink
¿Tal vez refrescar los datos del formulario?, con el finde mostrar los cambios efectuados.

Al finalizar (lo que tengas) pon un 'Me.Refresh', si los datos son 'interdependientes' se actualizaran los campos

Un saludo E. Feijoo


"Jose Manuel" <***@hotmail.com> escribió en el mensaje news:***@posting.google.com...
| Muchas gracias por vuestra rapida respuesta.
|
| He probado ambas sugerencias y ya no obtengo error. Ahora el dni aparece
| en el cuadro de texto independiente y se copia en el cuadro de texto dni,
| pero aunque existan los datos de esa persona, no se muestran los valores
| nombre, apellidos, direccion ... Seguire investigando, si descubro algo lo
| posteare aqui.
|
| - - - - - - - -
|
| "Juan M Afan de Ribera" <happyALGARROBAyaPUNTOcom> wrote in message news:<***@TK2MSFTNGP10.phx.gbl>...
|
| >Jose Manuel,
| >
| >no se si será eso pero en vez de hacer la comparación
| >
| > If X <> " " Then ...
| >
| > podrías hacerlo de esta otra manera
| >
| > If Not IsNull(X) Then ...
| >
| >(aunque no lo acabo de tener claro)
| >
| >--
| >Saludos, happy :-)
| >[MVP Ms Access]
| >http://www.clikear.com/webs4/juanmafan
|
| - - - - - - - -
|
| "E. Feijoo" <e.feijoo()retemail.es> wrote in message news:<uzO$***@TK2MSFTNGP10.phx.gbl>...
| > Lo que me llama la atenci n, (puede ser un error de traslaci n) es
| > la comparaci n que efect as, pues no se si las dobles comillas
| > encierran o no un espacio.
| >
| > De cualquier forma, no veo necesario (a no ser que tenga otras
| > aplicaciones), el crear una variable intermedia para efectuar la
| > comparaci n, m xime cuando al finalizar no la liberas, esto repetido
| > muchas veces, acaba por enlentecer la aplicaci n si no se libera la
| > memoria utilizada.
| >
| > Yo lo har a as :
| > ..............
| > Private Sub Busca dni AfterUpdate()
| > If NZ(DLookup("dni", "Personas", "dni = ' " & Me.Busca dni & " '
| > "),"") <>"" Then
| > Me.dni.SetFocus
| > DoCmd.FindRecord Me!Busca dni , acEntire, , acSearchAll, ,
| > acCurrent
| > Else
| > DoCmd.GoToRecord , , acNewRec
| > Me.dni = Me.Busca dni
| > Me.FREGISTRO.SetFocus
| > End If
| > End Sub
| > ...........
| >
| > Como ver s, no utizo la variable, comparo con una cadena vac a, y
| > para asegurar la respuesta que da el DLookup, utilizo la funci n Nz
| >
| > Un saludo E. Feijoo
| >
| >
| >
| > "Jose Manuel" <omni tibi ***@hotmail.com> escribi en el mensaje
| > news:***@posting.google.com...
| > | Quizas os parecezca una tonteria pero llevo dos dias pensando y
| > | leyendo estos foros y no se hacer lo siguiente. Tengo dos tablas con los
| > | campos,
| > |
| > | Personas: dni (clave, indexado, sin duplicados) , nombre, apellidos,
| > | direccion.
| > | Entradas: dni (indexado, con duplicados), fecha solicitud,
| > | motivo solicitud.
| > |
| > | Ambas tablas estan relacionadas (uno a varios) por el campo dni. Una
| > | persona (un solo dni) puede tener varias entradas (varios dni).
| > |
| > | Ante una nueva solicitud, introduzco el dni del solicitante en un
| > | formulario (cuyo origen de datos es una consulta sobre ambas tablas).
| > | La B.D. puede llegar a tener 30.000 personas.
| > |
| > | Si ya existe ese dni, deberian mostrarse los campos de la tabla
| > | Personas (dni, nombre, apellidos y direccion existentes) y, ademas, los
| > | campos en blanco de la tabla Entradas (fecha solicitud y motivo solicitud).
| > | Yo relleno estos dos ultimos campos y al salir se guarda un nuevo registro
| > | en la tabla Entradas.
| > |
| > | Si no existe el dni, relleno ademas los campos nombre, apellidos y
| > | direccion, y al salir se guardan dos registros, uno en cada tabla.
| > |
| > | He creado un cuadro de texto independiente en el formulario, con el
| > | codigo:
| > |
| > | - - - - - - - - - - - - - - - - -
| > |
| > | Private Sub Busca dni AfterUpdate()
| > |
| > | Dim X As Variant
| > |
| > | X = DLookup("dni", "Personas", "dni = ' " & Me.Busca dni & " ' ")
| > |
| > | If X <> " " Then
| > | Me.dni.SetFocus
| > | DoCmd.FindRecord X, acEntire, , acSearchAll, , acCurrent
| > | Else
| > | DoCmd.GoToRecord , , acNewRec
| > | Me.dni = Me.Busca dni
| > | Me.FREGISTRO.SetFocus
| > | End If
| > | End Sub
| > |
| > | - - - - - - - - - - - - - - - - -
| > |
| > | Si introduzco un dni nuevo, me da error: "Se ha producido el error
| > | "2137" en tiempo
| > | de ejecucion. No se pueden usar Buscar ni Reemplazar ahora"
| > | Si el dni es nuevo (no existe en la tabla Personas) entonces funciona.
| > | Que hago mal ?

Loading...