Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
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
  #2  
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
  #3  
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
  #4  
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
  #5  
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
  #6  
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
  #7  
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
  #8  
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
  #9  
Antiguo 02-12-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Vales.

Cita:
Yo estoy utilizando este codigo

Código Delphi [-]
if MiTabla.Locate('campo1; campo2; campo3', VarArrayOf[Valor1, Valor2, Valor3], []) then
La sintáxis correcta es:
Código Delphi [-]
   Locate('Campo1; Campo2;...', VarArrayOf ( [Valor1, Valor2, ...] ), [])

Por favor recordá que : nueva pregunta = nuevo hilo

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #10  
Antiguo 02-12-2011
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Buen día.

Además de lo ya dicho por ecfisa, añadiría que tu código puede mejorar de varias maneras. Por ejemplo, mirá este código equivalente (pero más compacto):

Código Delphi [-]
...
var
  Año: Word;
  Mes: string;
const
  NombreMes: array[1..12] of string = ('ENERO', 'FEBRERO', 'MARZO', 'ABRIL', 'MAYO'
    , 'JUNIO', 'JULIO', 'AGOSTO', 'SEPTIEMBRE', 'OCTUBRE', 'NOVIEMBRE', 'DICIEMBRE');

begin
  //cuidado, el primer elemento del ComboBox (parece ser eso) tiene index 0, quizas haya que 
  //correr el arreglo, pero lo dejo así para que sea equivalente con el código publicado originalmente
  Mes := NombreMes[Meses.ItemIndex];
  Año := Anio.ItemIndex + 2010;
  if not DM.Q_agen_tur.Locate('MES; ANIO', VarArrayOf([Mes, Año]), []) then
...

Un saludo.

Cita:
Empezado por Vales08 Ver Mensaje
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..
Con respecto de esto, en este caso particular yo no veo problema en que no se abra un hilo nuevo, de hecho, creo que es mejor hacer tu consulta aquí para estar en contexto de lo ya dicho antes.

Un saludo.
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate

Última edición por jachguate fecha: 02-12-2011 a las 17:52:37.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 13:55:27.


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