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)
-   -   Problemas con Forms y querys (https://www.clubdelphi.com/foros/showthread.php?t=5342)

vetustas 18-11-2003 18:26:18

Problemas con Forms y querys
 
Estoy preguntona hoy :cool:

Mmm....Tengo un form donde se muestran los datos de los alumnos. Ahi tb los puedo modificar, borrar etc. También tengo un dialogo donde introduzco el dni del alumno. Lo que quiero es que (logicamente) al introducir el dni de un alumno, me muestre el form con sus datos.

Yo tengo lo siguiente: he puesto un tquery y un datasource en la form "Form_Altaalumnos" (que es la que quiero que me enseñe cuando introduzco el dni). En el sql del query tengo:
SELECT *
FROM alumno
WHERE dni_Alumno=:dni

y luego en el código del dialogo....
Código:

  if showModal=mrOk then
  begin
    Form_AltaAlumnos.qry_dniAlumno.close;
    try
      Form_AltaAlumnos.qry_DniAlumno.ParamByName('dni').AsString:=Edit_Dni.text;
    finally
      Form_AltaAlumnos.qry_DniAlumno.Open;
      Form_AltaAlumnos.show;
    end;
  end;

pero no se porque razon siempre me muestra el form con los datos del alumno cuyo form ha sido abierto el último (o sino hemos abierto ninguno con los datos del primer alumno de la base)

que hago mal?
Gracias

marcoszorrilla 18-11-2003 19:03:41

A parte de que pueda tener otros fallos, debes de borrar la sentencia SQL, anterior.:
Código:

  if showModal=mrOk then
  begin
    Form_AltaAlumnos.qry_dniAlumno.close;
    Form_AltaAlumnos.qry_dniAlumno.sql.Clear;

    try
      Form_AltaAlumnos.qry_DniAlumno.ParamByName('dni').AsString:=Edit_Dni.text;
    finally
      Form_AltaAlumnos.qry_DniAlumno.Open;
      Form_AltaAlumnos.show;
    end;
  end;

Un Saludo.

roman 18-11-2003 19:12:14

Cita:

marcoszorrilla comentó:
A parte de que pueda tener otros fallos, debes de borrar la sentencia SQL, anterior.:

marcos, difiero un poco en esto. Realmente la sentencia no cambia sino únicamente el valor del parámetro. Si hubiera que reescribir la sentencia cada vez entonces no tendría mucho sentido el uso de parámetros ¿no?.

Creo que el problema está en algún punto que no puede verse en el código que nos manda ya que hice la prueba y los registros se actualizan correctamente al cambiar el parámetro.

// Saludos

vetustas 18-11-2003 19:12:51

Haciendo eso me da un error : parametro dni no encontrado.

Además no se, no creo que sea eso porque hay veces que abro el form sin usar un query con lo cual no tendría por que borrar el sql.

Alguna sugerencia más?? :D

marcoszorrilla 18-11-2003 19:33:52

Sí ya me he dado cuenta, como usas parámetros, lo que te he dicho no tiene sentido, como muy bien apunta Román.

Pregunto:
El control Edit_Dni.text en donde está en el formulario que llama al que muestra el alumno que se pretende seleccionar, no será que como el control está en un formulario distinto no recibe ningún parámetro.

Por qué no muestras la sentencia SQL para comprobar si reciba o no el parametro.

ShowMessage(Query1.Sql.Text);

De esta manera podrías comprobar que quizas, no está recibiendo el parámetro.

Un Saludo.

vetustas 18-11-2003 19:42:05

Cita:

Por qué no muestras la sentencia SQL para comprobar si reciba o no el parametro.
Al hacerlo, me muestra lo siguiente

SELECT *
FROM alumno
WHERE dni_Alumno=:dni

que quiere decir? lo recibe bien o no? sale lo mismo que tengo metido en el sql. Acaso deberia salir en vez de "dni" el número que meti? :confused:

roman 18-11-2003 19:45:18

Cita:

vetustas comentó:
pero no se porque razon siempre me muestra el form con los datos del alumno cuyo form ha sido abierto el último (o sino hemos abierto ninguno con los datos del primer alumno de la base)
Además de lo que te pregunta marcos yo insisto en que hay algo que no no estás mostrando. Esta frase que pones, analizándola con una fría lógica, significa que nunca ves ningún dato como no sea el del primer alumno de la base: ¿cómo vas a ver datos del último alumno abierto si de inicio del programa este último alumno abierto sólo puede ser precisamente el primero en la base de datos.

A menos claro, que uses otro formulario para abrir los datos y estés confundiéndote con distintas componentes datasource o dataset.

// Saludos

vetustas 18-11-2003 19:45:35

x cierto si pongo:

Código:

Form_AltaAlumnos.qry_DniAlumno.ParamByName('dni').AsString:='1234567M';
tampoco funciona.

Es por si asi os da una idea de donde puedo estar haciendolo mal

Gasias

vetustas 18-11-2003 19:50:41

Roman, no entiendo bien lo que quieres decir y la verdad es que yo me explico siempre fatal :(

Tengo un form "form_altaalumno" con dbedits asociados a una base de datos y con un dbnavigator voy recorriendo. Asi que si que veo más alumnos y no solo el primero ni el ultimo. El problema es que si por ejemplo los ultimos datos mostrados en dicho form corresponden a "David" y yo luego en el dialogo meto en el edit el dni de "Maria" pues yo quiero que me muestre el form con los datos de Maria, sin embargo me muestra los datos de David ya que es el último form mostrado.
No se si me he explicado un poquito mejor....

roman 18-11-2003 20:07:07

Cita:

vetustas comentó:
Tengo un form "form_altaalumno" con dbedits asociados a una base de datos y con un dbnavigator voy recorriendo. Asi que si que veo más alumnos y no solo el primero ni el ultimo. El problema es que si por ejemplo los ultimos datos mostrados en dicho form corresponden a "David" y yo luego en el dialogo meto en el edit el dni de "Maria" pues yo quiero que me muestre el form con los datos de Maria, sin embargo me muestra los datos de David ya que es el último form mostrado.
No se si me he explicado un poquito mejor....

Pero entonces hay algo muy raro en tu aplicación!

En form_altaalumno supongo que tienes unos controles como dbedits y recorres la tabala con dbnavigator. ¿A qué datasource están ligados estos controles y el dbnavigator? No puede ser al query ya que éste te devuelve a lo sumo un registro. Y sin embargo quieres que estos controles también estén alimentados por el query!!

Creo que estás enfocando erróneamente lo que quieres. En lugar del query creo que te conviene usar un dataset y un datasource para recorrer con el dbnavigator toda la tabla (como parece ser que tienes) y para colocarte en un registro específico (indicado por el dni) utilizas el método Locate del dataset que alimenta al dbnavigator.

// Saludos

vetustas 18-11-2003 21:10:24

Por fin entiendo algo!!! :) y ahora me doy cuenta de que lo que estaba haciendo era una burrada. Te explicas mu bien ;) Voy a tratar de hacer eso que me dices, lo del dataset y el datasource. Puedes ser más especifico y explicarme con un poco más de detalle lo que tengo que hacer?

Muchisimas gracias

vetustas 18-11-2003 21:26:36

No hace falta. Ya lo he solucionado
Gracias por vuestra ayuda :D

roman 18-11-2003 21:28:08

Cita:

vetustas comentó:
Puedes ser más especifico y explicarme con un poco más de detalle lo que tengo que hacer?

Pues ya no hay mucho qué hacer. Ya tienes funcionando un formulario que muestra los datos de un alumno y que recorres con un dbnavigator.

Lo único que falta es colocarte en el registro adecuado dependiendo del dni que se especifique en un cuadro de diálogo.

Para ello puedes usar el método Locate del dataset que tengas asociado al dbnavigator, por ejemplo:

Table.Locate('dni', Edit.Text, [])

donde Edit sería el control que obtienes del cuadro de diálogo.

// Saludos


La franja horaria es GMT +2. Ahora son las 19:42:48.

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