PDA

Ver la Versión Completa : Buscar registro por parametros


jafera
22-06-2012, 18:56:58
Hola a todos.

Estoy intentando controlar si un registro esta dentro de una tabla con el código siguiente:


for i:= 1 to StrToInt(CursaVOLTES.Text) do
begin
Pasos.Close;
Pasos.Open;
if Pasos.Locate('ID_CURSA; ID_VOLTA; DORSAL', VarArrayof([PasosID_CURSA.Value, PasosID_VOLTA.Value, PasosDORSAL.Value]),[])then
begin
ShowMessage('Corredor existent');
Abort;
end
else
begin
with ibqryInserta_Pas do
begin
Close;
ParamByName('ID_CURSA').AsString:= IntToStr(CursaID_CURSA.Value);
ParamByName('DORSAL').AsString:= IntToStr(InscritsDORSAL.Value);
ParamByName('VOLTA').AsString:= IntToStr(i);
ParamByName('PASAT').AsString:='N';
Open;
end;
ibqryInserta_Pas.Next;
end;
end;



Pasos es la tabla donde guardo los registros, los cuales constan de un ID (autoincremental con trigger y único) un ID_CURSA y un ID_Volta, (se los paso por parametro) y un DORSAL, que es el que escribo a mano.

No se si estoy pasando bien los parametros al arrayof, pero si ejecuto paso a paso, el valor que cogen los campos es siempre 0, con lo que el array queda 0,0,0 y evidentemente no cumple la condición, con lo cual me añade un registro que ya existe a la tabla, es decir si existe 1,1,6 me dice que no y lo vuelve a crear.

Alguna idea?

Delphi 6 Firebird 1.5.6

Saludos

Casimiro Notevi
22-06-2012, 19:29:17
No entiendo bien lo que estás haciendo, si quieres comprobar si existe un dorsal:

q.close;
q.sql.text := 'select * from tabla where dorsal= :numero';
q.params[0].asinteger = StrToInt(edit1.text); // aquí teclea el usuario el núm. de dorsal
q.execsql;
if q.recordcount>0 then // existe
begin
// lo que quieras
end
else // no existe
begin
// lo que quieras
end;

jafera
22-06-2012, 21:36:58
Gracias Antonio.

Primero felicidades por tus 16 k, pareces un ordenador antiguo, jejeje

En cuanto a tu respuesta, igual es que no me he explicado bien.

Tengo una tabla de la carrera con un ID unico, enlazado a esta la tabla de los inscritos con un campo id_carrera que es igual en las dos tablas, otra tabla de vueltas unida a la tabla carrera por el id_carrera y finalmente una tabla pasos con el campo id_carrera, id_vuelta y dorsal.

Desde el formulario de la carrera creo la cabecera con unos datos basicos, id, fecha, nombre numero de inscritos y numero de vueltas.

Al salir del campo numero de vueltas, genero en la tabla vueltas tantos registros como valor tiene la tabla carrera, es para poder controlar si una vuelta esta cerrada (han pasado todos los corredores, o no y estan doblados).

Ej. ID_Carrera =1, nombre = prueba, categoria= prueba, fecha = hoy numer inscritos 5 numero vueltas 5

En la tabla vueltas oibtengo:
ID ID_CARRERA ID_VUELTA FINALIZADA
1 1 1 N
2 1 2 N
3 1 3 N
4 1 4 N
5 1 5 N

Luego pongo lo inscritos

ID ID_CARRERA DORSAL RETIRADO
1 1 1 N
2 1 2 N
3 1 45 N
4 1 60 N
5 1 70 N

En el afterpost de esta tabla, genero las vueltas

ID ID_CARRERA ID_VUELTA DORSAL
1 1 1 1
2 1 2 1
3 1 3 1
4 1 4 1
5 1 5 1
6 1 1 2
7 1 2 2
Asi hasta que s completa el bucle........
...........
24 1 4 70
25 1 5 70

El problema viene cuando cambio un dorsal en su dbgrid correspondiente, que lo que quiero controlar es que no exista, ya que sinó me lo duplica y no es lo que me interesa precisamente.

Por eso busco con el array que la combinacion carrera, vuelta, dorsal, no exista ya que esta combinacion solo puede darse una vez en toda la tabla.(no pueden haber dos carreras 1, aunque si dos vueltas 1 pero de distintas carreras).

Espero haber sido más claro.

Saludos

Josep

Casimiro Notevi
22-06-2012, 21:56:27
Primero felicidades por tus 16 k, pareces un ordenador antiguo, jejeje
Gracias, aunque antigüo sí que soy, y ordenado también :D

Entonces, si lo he entendido, se trata de consultar la tabla esta última, ¿no?

q.close;
q.sql.text := 'select * from carrera where carrera= :carrera and vuelta= :vuelta and dorsal= :dorsal';
q.params[0].asinteger := strtoint(edit1.text);
q.params[1].asinteger := strtoint(edit2.text);
q.params[2].asinteger := strtoint(edit3.text);
q.execsql;
if q.recordcount>0 then // existe
...

Casimiro Notevi
22-06-2012, 21:58:54
Aunque lo que realmente no entiendo es eso de "cambiarle el dorsal", eso no debería de poder hacerse, ni tampoco darle un mismo número a otro, ¿no?

jafera
22-06-2012, 22:19:28
Evidentemente, no puede duplicarse.
Cambiarse si porque me puedo equivocar y si en vez de 12 pongo 14, se debe cambiar.

Aunque despues de haber escrito los mensajes, creo que ya se por donde va el fallo, no paso correctamente los parametros pues estoy buscando en la tabla algo que no le digo que es.

Los valores carrera, vuelta y dorsal, estan en la tabla pasos pero yo no veo estoa tabla directamente, solo le puedo pasar como parametro ID_Carrera, Dorsal ya que estos datos si los tengo visibles.

Voy a probar y cuento.

Josep

Nota: Lo de los 16k me referia al Commodore 16 que fue mi primer ordenador, luego pase al 128 y ya a los PC.

Casimiro Notevi
22-06-2012, 22:41:22
Nota: Lo de los 16k me referia al Commodore 16 que fue mi primer ordenador, luego pase al 128 y ya a los PC.

Ya, aunque pensé que lo decías por el "Dragón 16" :D

Este es el Dragón 32:
http://farm9.staticflickr.com/8168/7421859062_6fa5457982.jpg