Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Codigo que estaba funcionando y ahora NO (https://www.clubdelphi.com/foros/showthread.php?t=66646)

aanil 04-03-2010 21:42:57

Codigo que estaba funcionando y ahora NO
 
Hola,

Este codigo estaba funcionando, ahora no hace nada no actualiza la tabla.

Este codigo no presenta error, pero no me actualiza la tabla

Código Delphi [-]
datam.Query7.SQL.Text:= 'Select * From 20092 Where matricula LIKE:variable';
datam.Query7.Parameters[0].Value:= '%'+ Edit1.Text +'%';
datam.Query7.Open;

datam.Query7.SQL.Text := ' select *, (exp + expgrup + pract1 + pract2 + pract3 + pract4 + pract5)As practica,( parcial1 + parcial2+ practica + final + trab_final) As tfinal from 20092';
datam.Query7.Filter:='matrciula Like '''+ Edit1.Text + '*''';
datam.Query7.Filtered:= True;

datam.Query7.Open;
 
datam.Query7.First;
while not datam.Query7.Eof do   // recorre la tabla en el query7
begin

datam.Qtemp.sql.Text := 'Update 20092 set practica = '+datam.Query7.fieldbyname('practica').AsString+' where matricula = '+QuotedStr(datam.Query7.fieldbyname('matricula').AsString);
datam.Qtemp.ExecSQL;
datam.Query7.Next;
end;

while not datam.Query7.Eof do
begin

datam.Qtemp.SQL.Text := 'Update 20092 set tfinal = '+datam.Query7.fieldbyname ('tfinal').AsString+ ' where matricula = '+QuotedStr(datam.Query7.fieldbyname('matricula').AsString);
datam.Qtemp.ExecSQL; // ejecuta el query2
datam.Query7.Next;

datam.Query7.Close;
datam.Query7.Open;

 end;

 end;
  end;

Que podría haber pasado?

Saludos a todos.

delphi.com.ar 04-03-2010 22:11:48

Tienes que tener en cuenta que se en un UPDATE no se cumple la condición del WHERE, este no producirá ningún tipo de error. ¿Estas seguro que se están cumpliendo las condiciones?.. ¿Porqué no te copias los SQL y los ejecutas en la consola para probar?

Saludos!

Caral 04-03-2010 22:13:02

Hola
Código Delphi [-]
// Esto no esta haciendo nada se lo comio el sql siguiente ya que usa el mismo query7
{
datam.Query7.SQL.Text:= 'Select * From 20092 Where matricula LIKE:variable';
datam.Query7.Parameters[0].Value:= '%'+ Edit1.Text +'%';
datam.Query7.Open;
}
datam.Query7.SQL.Text := ' select *, (exp + expgrup + pract1 + pract2 + pract3 + pract4 + pract5)As practica,( parcial1 + parcial2+ practica + final + trab_final) As tfinal from 20092';
datam.Query7.Filter:='matrciula Like '''+ Edit1.Text + '*''';
datam.Query7.Filtered:= True;

datam.Query7.Open;
 
datam.Query7.First;
while not datam.Query7.Eof do   // recorre la tabla en el query7
begin

datam.Qtemp.sql.Text := 'Update 20092 set practica = '+datam.Query7.fieldbyname('practica').AsString+' where matricula = '+QuotedStr(datam.Query7.fieldbyname('matricula').AsString);
datam.Qtemp.ExecSQL;

datam.Qtemp.SQL.Text := 'Update 20092 set tfinal = '+datam.Query7.fieldbyname ('tfinal').AsString+ ' where matricula = '+QuotedStr(datam.Query7.fieldbyname('matricula').AsString);
datam.Qtemp.ExecSQL; // ejecuta el query2
datam.Query7.Next;
end;  // termina el recorrido y luego la cierra y abre.

datam.Query7.Close;
datam.Query7.Open;

  end;
Saludos

aanil 04-03-2010 22:39:56

Hola Caral.

Copie exactamente el código que tu me presenta y no hace nada, y no produce ningún error o advertencia.

Lo raro es que antes funcionaba.

Saludos

movorack 04-03-2010 22:44:03

Un pequeño aporte... Podrias mejorar tu codigo de UPDATE... esto es una opción:

Código:

update 20092
set practica = (exp + expgrup + pract1 + pract2 + pract3 + pract4 + pract5),
        tfinal = (parcial1 + parcial2+ practica + final + trab_final)
where matricula = 'NUMERO_MATRICULA'

podrias hasta colocarlo en un Store Procedure y solo llamar al SP desde delphi.

delphi.com.ar 04-03-2010 22:58:42

Cita:

Empezado por aanil (Mensaje 355664)
Hola Caral.

Copie exactamente el código que tu me presenta y no hace nada, y no produce ningún error o advertencia.

Lo raro es que antes funcionaba.

Caral lo único que ha hecho es quitar una parte del código que a simple vista no haría la diferencia en el funcionamiento. ¿Leíste mi respuesta?

aanil 04-03-2010 23:26:52

Hola Delphi, estaba viendo tu respuesta.

Creo que si que en el Where la condición es la matricula que es única para cada estudiante, te digo que anteriormente este cogido funciono, puede que yo al rehacer el proyecto haya dejado algo.

Anteriormente ese código en vez de Query7, era Query1, lo que he hecho es poner mas bonito mi proyecto lo he separado y lo he ampliado, pero en el proyecto viejo el código si me funciona.

Saludos..

Otra cosa no soy muy bueno en esto, pero no entendí lo de probar en la consola.

delphi.com.ar 05-03-2010 14:19:45

¿Probaste dener el código en el ExecSQL, copiarte el SQL generado y ejecutarlo en la consola?.... Eso te demostrará si estas armando o no bien la instrucción.

roman 05-03-2010 14:58:26

Cita:

Empezado por aanil (Mensaje 355669)
Otra cosa no soy muy bueno en esto, pero no entendí lo de probar en la consola.

Muchos motores de bases de datos proporcionan una aplicación rudimentaria (de consola o MS-DOS) para realizar consultas SQL directamente. A lo que se refiere Federico es que muchas veces nos hacemos un lío entre la sentencia SQL en sí, y el armado de ésta mediante las instrucciones propias de Delphi. Para poder discernir correctamente dónde está el problema, conviene aislar el texto de la consulta final que se manda al servidor y probarlo directamente en la utilería que proporcione tu servidor de datos.

Para aislar el texto de la consulta puedes poner un punto de corte (breakpoint) en la línea del ExecSQL y examinar la propiedad SQL.Text del Query (Ctrl+F6). Copias el valor y lo pegas en la herramienta mencionada (habría que saber qué motor usas para conocer en detalle cuál es esta herramienta).

// Saludos

delphi.com.ar 05-03-2010 15:18:19

Cita:

Empezado por roman (Mensaje 355742)
Muchos motores...

Se me pasó ese comentario de aanil! :p..

aanil 07-03-2010 14:40:34

Hola

Todavía no encuentro el por que ya no puede actualizar, si este código estaba funcionando..

De todos modos lo seguiré intentando..

Saludos

aanil 08-03-2010 22:31:30

1 Archivos Adjunto(s)
Hola les paso el codigo que funcionaba y que ahora NO HACE NADA, para ver donde es que esta el problema.

La base de datos tiene dos nombres reales, esta comprimida en WinZip.

Les agradecería sus ayudas.

Caral 09-03-2010 01:50:58

Hola
Estoy un poco perdido en esto.
Que es lo que pretendes hacer, cual es el problema concreto, NO LO QUE FALLA.
Saludos

aanil 09-03-2010 02:10:45

Hola Caral

Hace varios días y creo que tu me ayudaste con esto, recuerdo que el código me lo ayudaste a armar y estaba corriendo bien, pero no se lo que paso, que ese código ya no me suma esos campos y no me actualiza el campo TFinal.

Ese código estaba trabajando bien hasta que modifique mi proyecto, o sea que le hice varios arreglos y dejo de funcionar.

En el archivo ajunto creo que debería funcionar; es sumar en una fila, las notas de un estudiante, luego guardar ese resultado en la tabla como un total.

Y lo mejor seria que se actualizara la tabla entera sin tener que consultar estudiante por estudiante, que fuera un grupo completo por asignatura o clave.

Por favor revisa el archivo adjunto anterior a ver si se puede sumar y guardar el resultado.


Gracias.

Caral 09-03-2010 02:25:47

Hola
El asunto es que llamas a una consulta total y tambien a una suma, esto confunde a la bd y no genera el dato.
Hay que buscar el dato que se necesita, no mas, en este caso solamente al campo Matricula y la suma de los campos que necesitas.
Otra cosa es darle a estas sumas un nombre que no sea igual al de un campo, no solo por la bd, tambien por no confundirse uno mismo.
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
begin
  try
  if Edit1.Text ='' then
  showmessage ('Falta MATRICULA');
  except
  showmessage ('Falta MATRICULA');

Query1.SQL.Text := ' select Matricula, (exp + expgrup + pract1 + pract2 + pract3 + pract4 + pract5 + trab_final) As pract,'+
                   '( parcial1 + parcial2 + practica + final ) As tfin from 20092';
Query1.Open;

while not Query1.Eof do
begin
Qtemp.sql.Text := 'Update 20092 set practica = '+Query1.fieldbyname('pract').AsString+' where Matricula = '+QuotedStr(Edit1.Text);
Qtemp.ExecSQL;

Qtemp.SQL.Text := 'Update 20092 set tfinal = '+Query1.fieldbyname ('tfin').AsString+ ' where Matricula = '+QuotedStr(Edit1.Text);
Qtemp.ExecSQL;
Query1.Next;
end;

Query1.Close;
Query1.Open;
end;

end;
Si hicieras un showmesage al final de la consulta verias que en tu caso no devuelve nada y por supuesto nada da.
Saludos

Caral 09-03-2010 03:11:45

Hola
Viendo el código me doy cuenta de que aun asi no funciona, el asunto es el siguiente:
Cuando se busca se hace con el mismo query1, tanto el dbgrid como la consulta.
A la hora de hacer la consulta no se encuentra cargado el dato, esto hace que no encuentre nada (se puede ver con un showmess).
En el ejemplo el Qtemp tampoco estaba conectado.
Bueno, el asunto lo resolvi con una variable ya que por alguna razon no me muestra el dato del query sin guardarlo antes (osea trampa de novato jejeje).
No veo el caso de hacer un recorrido si se va a buscar en una sola linea ya que se actualiza según la matricula.
Tampoco veo por que hacer dos update cuando en uno solo actualiza los dos campos.
Bueno el asunto para mi seria asi y por lo menos a mi me funciona y actualiza los datos:
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var a,b :integer;
begin
  a:= 0;
  b:= 0;
  if Edit1.Text = '' then
  begin
  showmessage ('Falta MATRICULA');
  end;

Query1.Close;
Query1.SQL.Text := ' select (exp + expgrup + pract1 + pract2 + pract3 + pract4 + pract5 + trab_final) As pract,'+
                   '( parcial1 + parcial2 + practica + final ) As tfin from 20092 where matricula = '+QuotedStr(Edit1.Text);
Query1.Open;
a:= Query1.Fields[0].value;
b:= Query1.Fields[1].value;

Qtemp.sql.Text := 'Update 20092 set Practica = '+IntToStr(a)+', Tfinal = '+IntToStr(b)+' where Matricula = '+QuotedStr(Edit1.Text);
Qtemp.ExecSQL;

Query1.Close;
Query1.SQL.Text := ' select * from 20092 where matricula = '+QuotedStr(Edit1.Text);
Query1.Open;

end;
Bueno, por lo menos esto te sirve de practica.
Saludos

aanil 09-03-2010 15:53:05

Gracias Caral,

Esto si me funciona, lo voy a usar.

Muchas, gracias..

Una cosa tengo que desconectar o dejar de usar una unidad, que esta conectada a un datamodule, no quiero usar el datamodule, para usar este código en el mismo form.

No se como me desconecto de datamodule.

Saludos.

movorack 09-03-2010 16:03:32

Aunque ya te dieron la solución...
 
Siempre nos habias pasado el código de actualización... y aunque este tenia algunas fallas de forma no significaba que no debiera funcionar... solo descargando el ejemplo que colocaste fué que encontré la razón pq no te funcionaba...

La cuestión era que tenias un bloque try..except donde TODO el código de actualización estaba dentro del área de excepción y hasta que no ocurriera un error nunca se ejecutaría.

así lo tenias en el ejemplo que subiste:

Código Delphi [-]
  try
    if Edit1.Text ='' then
      showmessage ('Falta MATRICULA');
  except
    ... //código de actualización
  end;

aanil 09-03-2010 16:54:47

Hola Movorack

Eso fue lo que paso, después que me funcionaba el código, yo le adapte ese try except para que no me diera el error de no escribir la matricula, de ahí en adelante parece que fue que se puso que no hacia nada..

Gracias..

Caral 10-03-2010 02:01:00

Hola
Parece que estas esperando una respuesta?.
Por lo menos yo no entiendo lo que quieres hacer.
Desconectar una UNIT del Datamodule???????
No entiendo nada.
Saludos


La franja horaria es GMT +2. Ahora son las 10:41:44.

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