Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Obtener un campo a a partir de otro (https://www.clubdelphi.com/foros/showthread.php?t=81410)

giulichajari 12-11-2012 09:59:48

Obtener un campo a a partir de otro
 
Bueno, tengo una tabla de alumnos, con dni, nombre y otras cositas.

Como hago para dado un nombre, obtener el dni, porque necesito asignar el pago de una cuota.
En la tabla cuotas, tengo el dni como relacion con el dni de la tabla alumnos, entonce necesito obtener el dni ingresado un nombre, y asignar segun ese dni el estado pago o algo asi del mes seleccionado.

Aunque sea me pueden decir que componentes se usan, yo luego busco. O si quieren mostrarme me da igual.

Tengo un formulario con un TTable para alumnos, y otro para cuotas. Dos DataSource y un Query.

Gracias

Casimiro Noteví 12-11-2012 13:49:27

Veo que andas bastante perdido, lo que dices es como si alguien pregunta:
"Quiero correr una maratón olímpica, ¿cómo tengo que ponerme la gorra si hace viento?, cuento con un par de zapatillas, una camiseta y un calzón azul.

Te aconsejo este libro, es de lo mejorcito que puedes encontrar, y además es gratis.

ElDioni 12-11-2012 17:26:51

Hola,

digo yo que lo normal sería buscar al alumno por el DNI y no por el nombre, imagina que tienes dos alumnos que se llaman igual, si haces una consulta en la que no compruebas si el resultado te devuelve más de un valor para los dos alumnos te dará el mismo resultado ya que mirarás el primer DNI de la consulta. De todas formas sería algo así.

Código Delphi [-]
Query1.Close;
Query1.SQL.Text:='SELECT dni FROM alumnos WHERE nombre LIKE '+quotedstr('%'+txtnombre.text+'%');
Query1.Open;
Query2.Close;
Query2.SQL.Text:='SELECT cuota FROM cuotas WHERE dni='+quotedstr(Query1.FieldByName('dni').AsString);
Query2.Open;
showmessage(Query2.FieldByName('Cuota').AsString);

Saludos.

giulichajari 14-11-2012 15:20:53

¿Que significa txtnombre?
 
Cita:

Empezado por ElDioni (Mensaje 449242)
Hola,

digo yo que lo normal sería buscar al alumno por el DNI y no por el nombre, imagina que tienes dos alumnos que se llaman igual, si haces una consulta en la que no compruebas si el resultado te devuelve más de un valor para los dos alumnos te dará el mismo resultado ya que mirarás el primer DNI de la consulta. De todas formas sería algo así.

Código Delphi [-]
Query1.Close;
Query1.SQL.Text:='SELECT dni FROM alumnos WHERE nombre LIKE '+quotedstr('%'+txtnombre.text+'%');
Query1.Open;
Query2.Close;
Query2.SQL.Text:='SELECT cuota FROM cuotas WHERE dni='+quotedstr(Query1.FieldByName('dni').AsString);
Query2.Open;
showmessage(Query2.FieldByName('Cuota').AsString);

Saludos.

¿Y que es txtnombre en el primer select? Me da un error al compilar esa parte
Gracias.

ecfisa 14-11-2012 16:45:44

Cita:

Empezado por giulichajari (Mensaje 449435)
¿Y que es txtnombre en el primer select? Me da un error al compilar esa parte
Gracias.

Hola.

Creo que el amigo ElDioni está hablando de un TEdit que es lo que usualmente se utiliza. Le dió ese nombre para que fuera más representativo del contenido que almacena.

Saludos.

giulichajari 14-11-2012 19:21:21

Cita:

Empezado por ecfisa (Mensaje 449451)
Hola.

Creo que el amigo ElDioni está hablando de un TEdit que es lo que usualmente se utiliza. Le dió ese nombre para que fuera más representativo del contenido que almacena.

Saludos.

Pues tampoco, pruebo con el nombre de mi TEdit y lo mismo...

Saludos

ecfisa 14-11-2012 20:49:17

Cita:

Empezado por giulichajari (Mensaje 449491)
Pues tampoco, pruebo con el nombre de mi TEdit y lo mismo...

Saludos

¿ Y cuál es exáctamente el mensaje de error que recibis ?

Saludos.

giulichajari 14-11-2012 20:56:49

Cita:

Empezado por ecfisa (Mensaje 449501)
¿ Y cuál es exáctamente el mensaje de error que recibis ?

Saludos.

Undefined symbol
pero con el TEdit tampoco lo toma

ecfisa 14-11-2012 21:18:40

A ver...

En un mensaje anterior (Relacionar Popupmenu con fila de DBGrid), hiciste la consulta en el foro C++ Builder.

¿ Estas trabajando en C++ ?

Saludos.

giulichajari 14-11-2012 22:18:59

Cita:

Empezado por ecfisa (Mensaje 449505)
A ver...

En un mensaje anterior (Relacionar Popupmenu con fila de DBGrid), hiciste la consulta en el foro C++ Builder.

¿ Estas trabajando en C++ ?

Saludos.

Si. Claro ahí puede estar el error. Mil disculpas

ecfisa 14-11-2012 23:05:49

Hola.

Entonces el código de ElDioni quedaría:
Código:

  Query1->Close();
  Query1->SQL->Text = "SELECT dni FROM alumnos WHERE nombre LIKE " +
      QuotedStr("%" + tuEdit1->Text + "%");
  Query1->Open();

  Query2->Close();
  Query2->SQL->Text = "SELECT cuota FROM cuotas WHERE dni = " +
    QuotedStr(Query1->FieldByName("DNI")->AsString);
  Query2->Open();
  ShowMessage(Query2->FieldByName("Cuota")->AsString);

Recorda que la sintáxis de C++ es sensible a mayúsculas/minúsculas.

Saludos.

giulichajari 15-11-2012 08:20:40

Cita:

Empezado por ecfisa (Mensaje 449518)
Hola.

Entonces el código de ElDioni quedaría:
Código:

  Query1->Close();
  Query1->SQL->Text = "SELECT dni FROM alumnos WHERE nombre LIKE " +
      QuotedStr("%" + tuEdit1->Text + "%");
  Query1->Open();

  Query2->Close();
  Query2->SQL->Text = "SELECT cuota FROM cuotas WHERE dni = " +
    QuotedStr(Query1->FieldByName("DNI")->AsString);
  Query2->Open();
  ShowMessage(Query2->FieldByName("Cuota")->AsString);

Recorda que la sintáxis de C++ es sensible a mayúsculas/minúsculas.

Saludos.

Me da el siguiente problema. Mil disculpas
Código SQL [-]
Ambiguity between '_fastcall System::operator +(int,const System::Variant &)' and '_fastcall System::operator +(int,const System::Currency &)'

giulichajari 15-11-2012 20:48:40

Gracias por su tiempo
 
Bueno ya logre solucionarlo, habian algunas cosas mal, muchas gracias..

giulichajari 21-11-2012 05:59:34

Pregunta
 
Cita:

Empezado por ecfisa (Mensaje 449518)
Hola.

Entonces el código de ElDioni quedaría:
Código:

  Query1->Close();
  Query1->SQL->Text = "SELECT dni FROM alumnos WHERE nombre LIKE " +
      QuotedStr("%" + tuEdit1->Text + "%");
  Query1->Open();

  Query2->Close();
  Query2->SQL->Text = "SELECT cuota FROM cuotas WHERE dni = " +
    QuotedStr(Query1->FieldByName("DNI")->AsString);
  Query2->Open();
  ShowMessage(Query2->FieldByName("Cuota")->AsString);

Recorda que la sintáxis de C++ es sensible a mayúsculas/minúsculas.

Saludos.

Una pregunta:¿porqué ponen primero Close al SQL y luego de las instrucciones un Open y no al reves?

ecfisa 21-11-2012 19:01:37

Cita:

Empezado por giulichajari (Mensaje 450048)
Una pregunta:¿porqué ponen primero Close al SQL y luego de las instrucciones un Open y no al reves?

Hola giulichajari.

Por que si es necesario modificar alguna propiedad en la consulta SQL que afecte la selección del conjunto de datos, previamente es necesario cerrarlo.

En el código anterior, al ser una consulta simple, se asigna directamente a la propiedad SQL->Text, de tipo PChar y que apunta a la actual consulta SQL. Sobreescribiéndo de ese modo la cadena SQL previamente almacenada.

Pero, en consultas mas complejas, donde el uso del método Add de la propiedad SQL hace más entendible el código, también es necesario limpíar cualquier residuo anterior.

Tomando parte del código anterior para ejemplificar el uso de Add:
Código:

  Query1->Close();
  Query1->SQL->Clear();  // <== Limpiar posibles residuos
  Query1->SQL->Add("SELECT dni");
  Query1->SQL->Add("FROM alumnos");
  Query1->SQL->Add("WHERE nombre LIKE "+QuotedStr("%"+tuEdit1->Text+"%"));
  Query1->Open();
  ...

Saludos. :)

giulichajari 21-11-2012 20:00:31

Gracias
 
Cita:

Empezado por ecfisa (Mensaje 450085)
Hola giulichajari.

Por que si es necesario modificar alguna propiedad en la consulta SQL que afecte la selección del conjunto de datos, previamente es necesario cerrarlo.

En el código anterior, al ser una consulta simple, se asigna directamente a la propiedad SQL->Text, de tipo PChar y que apunta a la actual consulta SQL. Sobreescribiéndo de ese modo la cadena SQL previamente almacenada.

Pero, en consultas mas complejas, donde el uso del método Add de la propiedad SQL hace más entendible el código, también es necesario limpíar cualquier residuo anterior.

Tomando parte del código anterior para ejemplificar el uso de Add:
Código:

  Query1->Close();
  Query1->SQL->Clear();  // <== Limpiar posibles residuos
  Query1->SQL->Add("SELECT dni");
  Query1->SQL->Add("FROM alumnos");
  Query1->SQL->Add("WHERE nombre LIKE "+QuotedStr("%"+tuEdit1->Text+"%"));
  Query1->Open();
  ...

Saludos. :)

Muchas gracias por responder
Saludos


La franja horaria es GMT +2. Ahora son las 20:28:28.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi