Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-09-2004
dsa132132 dsa132132 is offline
Miembro
 
Registrado: jul 2004
Posts: 29
Poder: 0
dsa132132 Va por buen camino
Propiedad Locate

Hola a todos!

Necesito realizar unas comprobaciones en mi aplicación antes de eliminar un registro en la Base de Datos. El problema es que no se como realizar más de una comprobación, me explico;

if (not (DataModule.Query1.Locate('param1', Edit1.text, []))
and (DataModule.Query1.Locate('param2', edit2.text, []))
then Application.Messagebox ( ........

Si sólo realizo la comprobación de la primera línea todo va bien pero al hacer el AND el programa me salta las tres líneas de código como si no estuvieran ( Lo he probado podiendo un punto de ruptura y con F8). Por lo visto no lo estoy haciendo del modo correcto.

Alguna idea?

Gracias!!
Responder Con Cita
  #2  
Antiguo 03-09-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 22
Nuria Va por buen camino
Hola dsa!

Nunca se va cumplir la condición y por eso te salta las líneas.

Cuando haces un locate, te posicionas en el registro de la tabla, no puedes posicionarte en dos registros de la tabla a la vez por lo tanto nunca se cumple el if. Espero haberme explicado bien.

En vez de locate utiliza lookup o bien create una nueva consulta.

Espero que te sirva. Saludos!
Responder Con Cita
  #3  
Antiguo 03-09-2004
dsa132132 dsa132132 is offline
Miembro
 
Registrado: jul 2004
Posts: 29
Poder: 0
dsa132132 Va por buen camino
Hola!!

He probado con esto;

if (not (DataModule.Query1.Lookup('param1;param2', VarArrayOf(['edit1.text','edit2.text', [])))

Pero tanto con Lookup como con Locate me salen los mismos errores;
Missing operator or semicolon
Ordinal type required
Incompatible types: 'Integer' and 'String'

Por lo que he visto en la ayuda del Delphi lo podria hacer tambien con un Locate. Ahora ya no se qué hacer.

Muchas Gracias!!
Responder Con Cita
  #4  
Antiguo 03-09-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Debieras de optar por la segunda opción que te indica Nuria, es decir crear una consulta con el predicado Or si obtienes algún registro haces lo que proceda.......


Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #5  
Antiguo 03-09-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
El planteamiento de dsa132132 es totalmente correcto, lo que pasa es que quizás en lugar de AND ha de ser un OR (tampoco se exactamente lo que quiere conseguir), pero el uso de los 2 Locates en el IF no es erróneo

Código Delphi [-]
if (not (DataModule.Query1.Locate('param1', Edit1.text, [])) and //quizás OR???
   (DataModule.Query1.Locate('param2', edit2.text, [])) then 
  Application.Messagebox ( ........
Básicamente lo que hace el if este es que si no existe un registro en el que el campo "param1" sea igual a Edit1.Text (es decir, Param1 <> Edit1.Text) y existe un registro en el que el campo Param2 sea igual a Edit2.Text, muestre el mensaje

Quizás es que Param1 y Param2 no son los nombres de los campos??? Si fuera esto, tendrías que quitarle las comillas

No obstante, también creo que lo del SQL es una muy buena opción (por no decir la mejor si la tabla es grande)
Responder Con Cita
  #6  
Antiguo 03-09-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 22
Nuria Va por buen camino
Quizás no me explique bien, el uso de dos locates es correcto pero no el AND, porque nunca se cumplirá esa condición, no por otra cosa. Menos mal que siempre está cadetill para explicarlo mejor....;rolleyes:
Responder Con Cita
  #7  
Antiguo 03-09-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Yo no veo ningún problema en usar dos locates en el mismo if, incluso con AND. Esto, porque delphi no se traga toda la comprobación de un bocado.

Realiza el primer locate, que deja el puntero en un registro, y luego el segundo, que lo deja en otro.

Ahora... que esto se vea como dos pasos en el debugger... eso no lo creo, pues la operación que traza es el IF, y no cada condición. Salvo que se pueda entrar a debugear el código del Locate, y que se trace con StepIn, entraria dos veces.

Otro punto a tener en cuenta es el estado de la directiva del compilador {$B} que es el Boolean ShortCircuit. Cuando está activado, que es mas optimo, hace que el compilador deje de evaluar las condiciones en cuanto pueda determinar el resultado de la operación completa. Asi, si está en {$B+}, y el primer Locate devuelve FALSE, nunca evaluará el segundo, pues no tiene sentido para el resultado de la operación, dado que se usa AND.

Si se usara OR y el primero devuelve TRUE, igual, nunca se evaluaria el segundo.

Si el programador necesita que se evaluen todas las condiciones, independientemente de esto, por ejemplo, porque realizan alguna tarea imprescindible, entonces debe desactivar el Short Circuit, bien dentro de la pestaña del compilador, para todo el proyecto, o bien con la directiva {$B-} en el punto donde le interese.

Saludos.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #8  
Antiguo 03-09-2004
dsa132132 dsa132132 is offline
Miembro
 
Registrado: jul 2004
Posts: 29
Poder: 0
dsa132132 Va por buen camino
Saludos!

Al final lo he hecho mediante IF anidados;

if (not (DataModule.Query1.Locate('param1', Edit1.text, []))
then Application.Messagebox ( 'Error......
else if (not (DataModule.Query1.Locate('param2', Edit1.text, []))
then Application.Messagebox (.....
...

No creo que sea la solución mas eficiente pero me ha parecido la más sencilla y he estado haciendo pruebas i parece que funciona bien.

Muchas gracias a todos por vuestra ayuda e interes!!
Responder Con Cita
  #9  
Antiguo 03-09-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dsa132132
parece que funciona bien.
En efecto, parece, pero no funciona bien. Ha sido una casualidad que te resulte sólo por los datos específicos que tengas en tu tabla. Pero tarde o temprano surgirá una situación como la que te ejemplifica jachguate. Sinceramente no hay vuelta de hoja, basados en la descripción que das de lo que quieres hacer, tienes que hacer un sólo locate que abarque los tres campos.

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 00:56:19.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi