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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
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
  #2  
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
El problema es que no nos dice que comprobación es la que quiere realizar. Yo por ejemplo para eliminar un cliente supongamos que la condición es que no tenga ninguna factura ni ningún albarán.

nContro:=0;

Busca Facturas.
Si encuentra 1, no interesa si tiene más ó no.
nContro:=nContro+1;

Busca Albaranes, lo mismo que el anterior.
nContro:=nContro+1;

Código Delphi [-]
if nContro > 0 then
ShowMessage('Imposible eliminar el cliente tiene albaranes o facturas activas.');

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.

Última edición por marcoszorrilla fecha: 03-09-2004 a las 15:30:12.
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 a todos;

Quizás he sido yo desde un principio el que no se ha explicado con claridad, lo que intento es lo siguiente;

Deseo eliminar en registro de la Base de Datos pero antes hago la comprobación de que ese registro existe en la Base de Datos. Hasta aqui bien.

Ese registro que deseo eliminar tiene 3campos como clave primaria (antes había puesto sólo 2 por simplificar mi consulta, supongo que será lo mismo), entonces intentava hacer un Locate sobre esos 3 campos porque si lo hago sobre uno solo no es correcto.

He probado con OR en vez de AND pero sigue saltándose la instrucción.

Muchas gracias a todos por vuestro interés!!
Responder Con Cita
  #4  
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
Cool

Cita:
Empezado por dsa132132
Ese registro que deseo eliminar tiene 3campos como clave primaria (antes había puesto sólo 2 por simplificar mi consulta, supongo que será lo mismo), entonces intentava hacer un Locate sobre esos 3 campos porque si lo hago sobre uno solo no es correcto.
Viola!!!!

Este tampoco es correcto.

Supone que tenes los registros:

Código:
campo1   campo2   campo3
======   ======   ======
uno      uno      uno
dos      dos      dos
tres     tres     tres
y vos queres borrar el registro "uno-dos-tres", tu método actual (con and's o con or's) te devolverá verdadero, puesto que chequeas por separado que exista un registro con "uno", otro con "dos" y otro con "tres"... pero nunca que exista uno de la forma "uno-dos-tres".

Bien sea con un locate que abarque los tres campos, o con un Query que incluya los tres en el predicado, si podes garantizar que un registro existe en la BD.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
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
Sí, vale, pero Busca Facturas y Busca Albaranes han de ser una función (por ejemplo) que realice o bien un Locate sobre las tablas pertienentes, o una sentencia SQL o lo que nos de la gana. Si la elección fuera la del Locate, se puede hacer todo directamente en el mismo IF y ahorrarnos la variable

De hecho, yo más o menos suelo hacer lo mismo que tu, pero en lugar de la variable, pongo un Exit
Código Delphi [-]
function TMiClase.BorraCliente(Codigo: integer): boolean
begin
  Result := false;

  if TieneFacturas(Codigo) then Exit;
  if TieneAlbaranes(Codigo) then Exit;
  ....
  Result := true;
end;
Como suelo hacer funciones, el que se encarga de mostrar o no el mensaje será el que llame a ésta.

No obstante, como ya decía anteriormente y comentas muy bien, sin saber exactamente lo que pretende conseguir con esos Locates, es hablar por hablar
Responder Con Cita
  #6  
Antiguo 03-09-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Vaya, antes respondo, antes se me adelanta

Si lo que quieres es mirar por 3 campos a la vez....

Código Delphi [-]
if MiTabla.Locate('campo1; campo2; campo3', VarArrayOf[Valor1, Valor2, Valor3], []) then
  Existe
else
  No Existe
Responder Con Cita
  #7  
Antiguo 03-09-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Cita:
Empezado por cadetill
Código Delphi [-]
if MiTabla.Locate('campo1; campo2; campo3', VarArrayOf[Valor1, Valor2, Valor3], []) then
  Existe
else
  No Existe
Cita:
Empezado por jachguate
Bien sea con un locate que abarque los tres campos, o con un Query que incluya los tres en el predicado, si podes garantizar que un registro existe en la BD.
Qué es lo que no has entendido de estas dos respuestas????

Cita:
Empezado por roman
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.
A ver si a la tercera va la vencida

Responder Con Cita
  #8  
Antiguo 03-09-2004
Avatar de kalimero
kalimero kalimero is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 288
Poder: 22
kalimero Va por buen camino
Código:
if MiTabla.Locate('campo1; campo2; campo3', VarArrayOf[Valor1, Valor2, Valor3], []) then
Esta es la solucion mas 'pofesional' al tema. Como comenta Roman, el código que escribes solo funciona por casualidad. Probablemente en otra ocasion no funcione.

Saludos
Responder Con Cita
  #9  
Antiguo 02-12-2011
Vales08 Vales08 is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 133
Poder: 14
Vales08 Va por buen camino
Buen dia Foro..

Disculpa por meterme aca y no abrir un hilo nuevo, pero ya que estaba este problema planteado y al codigo lo saque de este hilo, me gustaria consultar una duda y un problema que tengo con tal codigo..
Yo estoy utilizando este codigo
Código Delphi [-]
if MiTabla.Locate('campo1; campo2; campo3', VarArrayOf[Valor1, Valor2, Valor3], []) then

pero el error que me salta ami es
Código:
[Error] Not enough actual parameters
yo lo interprete como que no hay suficientes parametros.. les paso mi codigo actual
Código Delphi [-]
...
var
  mes, anioo: Word;
  fecha: TDate;
  dia, mess: string;

begin
  case Meses.ItemIndex of
    1: mes:=1;
    2: mes:=2;
    3: mes:=3;
    4: mes:=4;
    5: mes:=5;
    6: mes:=6;
    7: mes:=7;
    8: mes:=8;
    9: mes:=9;
    10: mes:=10;
    11: mes:=11;
    12: mes:=12;
  end;
  case mes of
    1: mess:='ENERO';
    2: mess:='FEBRERO';
    3: mess:='MARZO';
    4: mess:='ABRIL';
    5: mess:='MAYO';
    6: mess:='JUNIO';
    7: mess:='JULIO';
    8: mess:='AGOSTO';
    9: mess:='SEPTIEMBRE';
    10: mess:='OCTUBRE';
    11: mess:='NOVIEMBRE';
    12: mess:='DICIEMBRE';
  end;
  case anio.ItemIndex of
    1: anioo:=2011;
    2: anioo:=2012;
    3: anioo:=2013;
    4: anioo:=2014;
    5: anioo:=2015;
    6: anioo:=2016;
    7: anioo:=2017;
    8: anioo:=2018;
    9: anioo:=2019;
    10: anioo:=2020;
  end;
  if not (DM.Q_agen_tur.Locate('MES; ANIO', VarArrayOf[mess, anioo], []))then
...

Me podrian decir donde o que estoy haciendo mal.. Desde ya muchisimas gracias..
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 04:27:03.


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