Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Problema al pasar Query a DBF (https://www.clubdelphi.com/foros/showthread.php?t=74940)

NeWsP 19-07-2011 21:14:05

Problema al pasar Query a DBF
 
Buenas noches,

Tengo un pequeño problema que me esta volviendo loco... os comento a ver si me podeis echar un cable ( aunque sea para colgarme con el :( )

Tengo un query con el siguiente contenido:

Código SQL [-]
SELECT NNUMPRE,SUM((NPREUNIT * NCANPED)*(1-NDTO/100)) AS TOTAL FROM preclil.dbf GROUP BY NNUMPRE

NNUMPRE es Integer ( seria el numero de pedido por ejemplo.
TOTAL es el calculo de campos numeric de 17 enteros y 6 decimales.


Si muestro el query en una Grid va perfecto.

El problema es que necesito grabar ese query en una tabla DBF nueva, lo intento de la siguiente forma:

Código Delphi [-]
begin
query1.SQL.Clear; // Limpiamos el Query Principal
query1.SQL.Add(Edit1.text); // El contenido de Edit1.Text es el que pone arriba (EL SQL)
query1.Active:=True; // Activamos la tabla
query2.DatabaseName:='c:\'; // Configuramos query para introducir datos
query2.SQL.Clear; // Limpito limpito
query2.SQL.Add('INSERT INTO temp.dbf (NNUMPRE,TOTAL) VALUES(:NUMERP,:TOTAL)');
while not query1.eof do  //mientras no acabe el query principal
begin
query2.ParamByName('NUMERP').AsInteger:=query1.FieldByName('NNUMPRE').AsInteger;//Pasamos el valor del query1 al query2
query2.ParamByName('TOTAL').AsInteger:=query1.FieldByName('TOTAL').AsInteger;
query2.ExecSQL;
query1.Next;   // Pasamos al siguiente regristro
end;

Si lo hago así me dice que los tipos de datos no coinciden

Supuestamente en el DBF son NUMERIC, y yo los puse como integer, pero vamos he probado floats para el total, y todo lo que se me ha ocurrido y nada...

Despues he probado de esta forma:

Código Delphi [-]
begin
query1.SQL.Clear; // Limpiamos el Query Principal
query1.SQL.Add(Edit1.text); // El contenido de Edit1.Text es el que pone arriba (EL SQL)
query1.Active:=True; // Activamos la tabla
query2.DatabaseName:='c:\'; // Configuramos query para introducir datos
while not query1.eof do  //mientras no acabe el query principal
begin
query2.SQL.Clear; // Limpito limpito
var1:=query1.FieldByName('NNUMPRE').AsInteger;
var2:=query1.FieldByName('TOTAL').AsFloat;
query2.SQL.Add('INSERT INTO temp.dbf (NNUMPRE,TOTAL) VALUES("'+inttostr(var1)+'","'+floattostr(var2)+'")');
query2.ExecSQL;
query1.Next;   // Pasamos al siguiente regristro
end;

Y asi funciona hasta que encuentra algun decimal en la tabla, que dice que no coinciden los tipos.

Espero que me podáis ayudar, por que ya no se me ocurre nada mas...

Muchas Gracias por adelantado.

oscarac 19-07-2011 21:21:15

y si cambias la forma de agregar los registros?

Código Delphi [-]
begin
query1.SQL.Clear; // Limpiamos el Query Principal
query1.SQL.Add(Edit1.text); // El contenido de Edit1.Text es el que pone arriba (EL SQL)
query1.Active:=True; // Activamos la tabla
query2.DatabaseName:='c:\'; // Configuramos query para introducir datos
while not query1.eof do  //mientras no acabe el query principal
begin
tblaAgregar.Append;
tblaAgregarnNumpre.value := query1nNumpre.value
tblaAgregarnTotal.value := query1Total.value
tblaAgregar.post
query1.Next;   // Pasamos al siguiente regristro
end;

NeWsP 19-07-2011 21:32:20

Hola Oscarac,

de esta forma funcionar perfecto:

Código Delphi [-]
begin
query1.SQL.Clear; // Limpiamos el Query Principal
query1.SQL.Add(Edit1.text); // El contenido de Edit1.Text es el que pone arriba (EL SQL)
query1.Active:=True; // Activamos la tabla
query2.DatabaseName:='c:\'; // Configuramos query para introducir datos
query2.SQL.Clear; // Limpito limpito
query2.SQL.Add('INSERT INTO temp.dbf (NNUMPRE,TOTAL) VALUES(:NUMERP,:TOTAL)');
while not query1.eof do  //mientras no acabe el query principal
begin
query2.ParamByName('NUMERP').Value:=query1.FieldByName('NNUMPRE').Value;//Pasamos el valor del query1 al query2
query2.ParamByName('TOTAL').Value:=query1.FieldByName('TOTAL').value;

query2.ExecSQL;
query1.Next;   // Pasamos al siguiente regristro
end;

Mirando tu codigo he visto que se podia usar la opcion Value,yo siempre la he utilizado marcando un tipo.

normalmente los ingresos en tablas los hago asi, usando un

Código Delphi [-]
Try
Query2.execsql
Finally
Query1.Next

De todos modos me podrías comentar cual es la ventaja usando Append?
Muchisimas gracias


La franja horaria es GMT +2. Ahora son las 18:09: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