Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-03-2007
Avatar de Bicholoco
Bicholoco Bicholoco is offline
Miembro
 
Registrado: mar 2007
Posts: 21
Poder: 0
Bicholoco Va por buen camino
Question Duda rapida sobre Locate

Aunque mi pregunta se parece a la de Sergiotur ( http://www.clubdelphi.com/foros/showthread.php?t=41017) la pongo en otro tema para que no se mezclen.

Tengo una base de datos con un ClientDataSet y un DataSource.
He de hacer una consulta con un bucle. Tan solo quiero comprobar si existe un valor "i". No me importa su posición ni el contenido. Solo quiero saber si existe en la tabla. ÇQue devuelva un true o false.

La tabla posee en la columna 'Numero' diversos valores de tipo Word (por ejemplo 1,2,3,5,7,14,25).
Quiero que me diga el valor más pequeño que no está en la tabla (en el anterior ejemplo sería el 4)

Lo he intentado así:

Código:
i:=0; 
 Repeat 
i:=i+1; 
 until not (cds.Locate('Numero', i , []));  
Resultado:=i;
y así:
Código:
i:=0; 
 Repeat 
i:=i+1; 
 until not (cds.Locate('Numero', IntToStr(i) , []));  
Resultado:=i;
Pero siempre me da resultado=1. Para i<3 debería continuar el bucle, pero no lo hace.

¿Alguna sugerencia, además de dejarme esto y tirarme por un puente? Gracias
Responder Con Cita
  #2  
Antiguo 08-03-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
asi:

Código Delphi [-]
 
 i:=0; 
 Repeat 
    i:=i+1; 
 until (cds.Locate('Numero', i, []));  
 Resultado:=i;
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #3  
Antiguo 08-03-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Bueno, disculpa la intromisión anterior pues la cosa no resulto... pero así:
Código Delphi [-]
 i:=0; 
 Repeat 
    i:=i+1; 
 until not (cds.Locate('Numero', i, []));  
 Resultado:=i;
tal y cual como tu la habías planteado hice la prueba con una tabla en memoria y me funciona perfectamente.

P.D: No sera que en realidad le falta el 1 a tu tabla?
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/

Última edición por jhonny fecha: 08-03-2007 a las 15:25:45.
Responder Con Cita
  #4  
Antiguo 08-03-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Otra manera de hacerlo es... aunque como ya te he dicho anteriormente la tuya funciona a la perfección:
Código Delphi [-]
  i := 1;
  while (RxMemoryData1.Locate('Numero', i, [])) do
  begin
    inc(i);
  end;
  Result := i;
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/

Última edición por jhonny fecha: 08-03-2007 a las 15:39:49.
Responder Con Cita
  #5  
Antiguo 08-03-2007
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Hola
Suponiendo que la tabla se llame Tabla1 y el campo numerico se llame codigo yo usaría un SQL del tipo:

Código SQL [-]
SELECT min(t1.codigo) AS Minimo
FROM tabla1 AS t1
WHERE (select codigo from tabla1 as t2  where t2.codigo= t1.codigo+1) Is Null;

Esto me daría el menor número sin susesor inmediato, pues ya se que el menor número que no está en la tabla es la respuesta de esta query mas 1.

Espero sirva de algo.

Saludos
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #6  
Antiguo 09-03-2007
Avatar de Bicholoco
Bicholoco Bicholoco is offline
Miembro
 
Registrado: mar 2007
Posts: 21
Poder: 0
Bicholoco Va por buen camino
Cita:
Empezado por jhonny
tal y cual como tu la habías planteado hice la prueba con una tabla en memoria y me funciona perfectamente.

P.D: No sera que en realidad le falta el 1 a tu tabla?
Pues en realidad sí que tiene un 1. Por eso me vuelvo un poquillo loco. Es más, como nunca me encuentra el 1, al final me llena la tabla de unos.

Seguiré investigando a ver lo que puede ser. Gracias.
Responder Con Cita
  #7  
Antiguo 09-03-2007
Avatar de Bicholoco
Bicholoco Bicholoco is offline
Miembro
 
Registrado: mar 2007
Posts: 21
Poder: 0
Bicholoco Va por buen camino
He extraido de mi programa lo que me da problema. Creo que el fallo no es de codigo, sino algo del Object Inspector. Estoy seguro que es una tontería.
Archivos Adjuntos
Tipo de Archivo: zip Problema locate.zip (7,3 KB, 7 visitas)
Responder Con Cita
  #8  
Antiguo 09-03-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Uffff... Hombre casi que no...
Fue una gran ventaja el que hayas colgado el programa y la verdad es que con el locate siempre marcaba 1, ¿La razón? pues si alguien del foro puede explicarla yo también le agradecería la respuesta...
La cosa quedo así:

en el procedimiento Button3Click:
Código Delphi [-]
var
i:word;
begin
  i:=0;
  Repeat
    i:=i+1;
  until not (cds.FindKey([i]));//(cds.Locate('Dibujo', i, []));
  ShowMessage(IntToStr(i));
end;

y al objeto CDS le hice los siguientes cambios...

1. Por medio de su editor de campos le agregue el campo Dibujo de tipo Word, tal y cual como lo tenias en su FieldDefs.
2. En IndexDefs Agregue el campo dibujo, especificando su propiedad Fields como "Dibujo".
3. Y por ultimo y para activar dicho índice seleccione en la propiedad IndexFieldName (Adivinen que) el campo Dibujo.

Y listo, ya me hace lo que quieres...

Bueno Espero que te sirva esta solución.

P.D: cuelgo la aplicación para que vean los cambios en hechos.
Archivos Adjuntos
Tipo de Archivo: zip Problema locate.zip (7,8 KB, 7 visitas)
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/

Última edición por jhonny fecha: 09-03-2007 a las 16:59:44.
Responder Con Cita
  #9  
Antiguo 09-03-2007
Avatar de Bicholoco
Bicholoco Bicholoco is offline
Miembro
 
Registrado: mar 2007
Posts: 21
Poder: 0
Bicholoco Va por buen camino
Te I love U.

No sabes el gran favor que me haces. Espero no haberte ocupado mucho tiempo. Muchiiiiiiiiiiiiisimas 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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Pregunta sobre la funcion LOCATE()? Luis Alberto Varios 6 16-12-2005 00:02:55
Una duda sobre los Uses jorch_yr Varios 1 30-05-2004 04:39:40
Dudas sobre Locate silviodp Conexión con bases de datos 8 28-04-2004 14:59:26
Una duda sobre ADO PTW Conexión con bases de datos 1 13-04-2004 23:33:14


La franja horaria es GMT +2. Ahora son las 18:27:08.


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