Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Duda rapida sobre Locate (https://www.clubdelphi.com/foros/showthread.php?t=41145)

Bicholoco 08-03-2007 14:31:50

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

jhonny 08-03-2007 15:16:29

asi:

Código Delphi [-]
 
 i:=0; 
 Repeat 
    i:=i+1; 
 until (cds.Locate('Numero', i, []));  
 Resultado:=i;

jhonny 08-03-2007 15:23:04

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?

jhonny 08-03-2007 15:35:54

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;

yusnerqui 08-03-2007 16:03:43

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

Bicholoco 09-03-2007 10:37:15

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.

Bicholoco 09-03-2007 12:22:36

1 Archivos Adjunto(s)
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.

jhonny 09-03-2007 16:54:13

1 Archivos Adjunto(s)
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.

Bicholoco 09-03-2007 21:51:41

Te I love U. :D

No sabes el gran favor que me haces. Espero no haberte ocupado mucho tiempo. Muchiiiiiiiiiiiiisimas gracias.


La franja horaria es GMT +2. Ahora son las 05:40:15.

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