PDA

Ver la Versión Completa : Creacion de Tabla e inserción de datos


klionsis
18-09-2008, 12:20:56
Hola gente. Les cuento que estoy intentando crear una tabla en tiempo de ejecución y a la vez estoy intentando insertar datos a la misma. El procedimiento que estoy utilizando es similar al siguiente:


procedure TForm1.Button1Click(Sender: TObject);
var
Productos: TTable;
begin
Productos := TTable.Create(nil);
try
with Productos do begin

// Definición de la tabla
DatabaseName := 'c:\Actualizacion\Tablas'
TableType := ttDBase;
TableName := 'Tabla1.DBF';

with FieldDefs do begin // Definición de los campos
with AddFieldDef do begin
Name := 'IDProducto';
DataType := ftSmallint;
end;
with AddFieldDef do begin
Name := 'Descripcion';
DataType := ftString;
Size := 25;
end;
with AddFieldDef do begin
Name := 'Precio';
DataType := ftFloat;
end;
end;

with IndexDefs do begin // Definición de los índices
with AddIndexDef do begin
Name := 'PorID';
Fields := 'IDProducto';
end;

CreateTable; // Crea la tabla

// Insercion de datos
query1.SQL.Clear();
query1.SQL.Add('Insert Into Productos select * from Articulos');
query1.ExcecSQL;


end;
except
Productos.Free;
raise;
end;
Productos.Free;
end;


El problema de esto es que la tabla productos es la que acabo de crear en tiempo de ejecucion y se aloja en 'c:\Actualizacion\Tablas' y la tabla desde adonde estoy sacando los datos 'Articulos' se encuentra en la base de datos que yo estoy manipulando en base a un alias que he creado y que esta en un lugar distinto a la ubicacion de primera tabla.

Por el principio el error que me esta dando es que no existe esta tabla 'Productos'. Les pregunto entonces como puedo hacer para crear esta tabla e insertarle datos como pretendo?

Espero me puedan ayudar.


Gracias.

coso
18-09-2008, 13:00:58
Hola, mediante una consulta


Query1.SQL.Text := 'select * into tabla_destino in ' + ruta_tabla_destino + ' from ' + ruta_tabla_origen;
Query1.ExecSQL;


ruta_tabla_destino y ruta_tabla_origen deben entre comillas, por si hay espacios en esa ruta. saludos.

PD: creo que para acceder a una tabla mediante alias se usa [alias].tabla, no estoy seguro. Igualmente, haciendo que la conexion de tu query1 sea la de la tabla origen, tansolo deberas poner su nombre en vez de ruta_tabla_origen.

klionsis
18-09-2008, 19:38:27
Antes que nada gracias coso. Entiendo lo que me decís pero no lo veo del todo. Segun esto mi consulta quedaria de la siguiente manera ?

Query1.SQL.Text := 'select * into Productos in "c:\Actualizacion\Tablas" from Articulos';
Query1.ExecSQL;


Gracias.

coso
18-09-2008, 19:40:52
si, pruebalo, a ver que tal te va. No hara falta entonces nada del resto del codigo, solo esa consulta.

coso
18-09-2008, 20:25:36
perdon, seria


Query1.SQL.Text := 'select * into Productos in "c:\Actualizacion\Tablas\tabla.dbf" from Articulos';
Query1.ExecSQL;

klionsis
19-09-2008, 02:08:30
He probado de la siguiente manera:

DataModule1.InsProd.SQL.Add('insert into Productos in "c:\Actualizacion\Tablas\Productos.DBF" select * from Productos');
DataModule1.InsProd.ExecSQL;

Elimine la creacion de la tabla en tiempo de ejecucion ya que la tabla ya se encuentra en el lugar ("c:\Actualizacion\Tablas\Productos.DBF")

pero la aplicacion me informa esto:

"Invalid use of keyword. Token: in..."

Evidentemente hay un problema con la localizacion de la tabla.


como podré solucionarlo ?

coso
19-09-2008, 09:32:23
pero...probaste la consulta 'select ... into'?

klionsis
19-09-2008, 13:00:25
no, entiendo que en la conssulta que te estoy mostrando está el select necesario para realizar la insercion, lo tome como si fuera de la seguiente manera


Insert into Tabla select * from Tabla2

desde esta inserción básica le he agregado el in RutaArchivo como me habias indicado.

A esto te referis?


Gracias.

coso
19-09-2008, 13:04:52
saldras antes de dudas probandolo...

coso
19-09-2008, 13:05:22
creo que tanto el insert into como el select into te da error si la tabla ya existe en el fichero.

klionsis
19-09-2008, 16:56:36
Pero por lo que estoy entendiendo hay otra alternativa de como hacer estos a parte de la que estoy tratando de hacer funcionar, el "Select into", si es así no se como prodria aplicarla. Vos podrias con los datos que tengo mas arriba darme un ejemplo de lo que me queres decir??

Quizas estoy haciendo algo mal... lo estoy probando y no me funciona.


Muchas gracias nuevamente, je.

Saludos.

coso
19-09-2008, 17:15:36
es que no tiene mucho secreto mas...es aquella consulta, tal cual. te tendria que funcionar si la tabla no existe dentro de productos.dbf...a mi, al menos, me funciona asi, y lo uso bastante. Busca el parametro 'in' de sql, que es para acceder a bases de datos externas a la conectada (aunque es bastante entendible ya por los ejemplos) a ver si sacas algo en claro.

Te pongo un ejemplo en la que uso esta forma


s := ExtractFileName(OpenDialog1.Filename); // Nom de l'arxiu
p := ExtractFilePath(OpenDialog1.Filename); // path de l'arxiu
...
c.Connected := false; // Fem conexió a l'arxiu
c.LoginPrompt := false;
c.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;'+
'Data Source='+ ExtractFilePath(OpenDialog1.Filename) + ';Mode=Share Deny None;Extended Properties="text;HDR=Yes;FMT=Fixed";'+
'Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";'+
'Jet OLEDB:Engine Type=96;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;'+
'Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;'+
'Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;'+
'Jet OLEDB:SFP=False';
c.Connected := true;
...
q.Connection := c; // insert massiu a ARTICLES_TMP
q.Active := false;
q.SQL.Text := 'select ' +
'id, '+
'cod_mar, ' +
'cod_fam, ' +
'IIF((select marge from MARQUES in ''' + str_articles + ''' where id = cod_mar),'+
'(select marge from MARQUES in ''' + str_articles + ''' where id = cod_mar),0) as marge_tmp, '+
'(select id_linia from FAMILIES in ''' + str_articles + ''' where id = cod_fam) as cod_lin, '+
'(select DESCR from FAMILIES in ''' + str_articles + ''' where id = cod_fam) as FAMILIA, ' +
'(select DESCR from MARQUES in ''' + str_articles + ''' where id = cod_mar) as MARCA, ' +
'Trim(IIF(DESCR1,Trim(DESCR1),'' '') + '' '' + IIF(DESCR2,Trim(DESCR2),'' '')) as DESCR,' +
'PMin, ' +
'PRec, ' +
'PBase, ' +
'iif(iif(PMin > PRec,PMin,PRec) = 0, PBASE * 116/(100 - marge_tmp),iif(PMin > PRec,PMin,PRec)) as PVP,'+
'iif(stock = ''&'',true,false) as STOCK ' +
'into ARTICLES_TMP in ''' + str_articles + ''' from ' + s;
q.ExecSQL;
...


como ves, en esencia es lo mismo que te he puesto, solo que calcula los argumentos que necesito. A ver si el unico problema que vas a tener es que usas las comillas dobles. Prueba de hacer + QuotedStr(Ruta_archivo_destino,'''') o bien poner las comillas tal como se ponen en una cadena (''')

klionsis
20-09-2008, 01:35:53
coso, verdaderamente no quiero agotar tu paciencia pero realmente esto no me sale, la ultima prueba que he hecho es esta:


tquery1.SQL.Add('select CPROD,"DESC",MA,LE,PREV,ACTUA into ARTIC in QuotedStr(c:\Actualizacion\Tablas\ARTIC.dbf,'''') from ART21');


donde ARTIC.DBF es la tabla que esta en otro lado, ART21 es la tabla que se encuentra en mi alias...

No se que probar... ves que puede estar mal en lo que estoy haciendo?

Gracias nuevamente.. je.
Saludos


Perdon me olvidé de etiquetar el código.

coso
20-09-2008, 09:58:40
Fijate que la ruta tiene que ser una string, y en este caso no lo es. De igual manera, no entiendo porque DESC le pones comillas...en fin, no tiene mas secreto. Quiza no te debe funcionar a ti por algun otro motivo. saludos.

klionsis
25-09-2008, 00:38:56
Disculpas a todos, me habia olvidado de contestar. Evidentemente me estaba ahogando en un baso de agua, la solucion a mi problema es:

Insert Into 'c:\Atualizaciones\tablas\Tabla1.dbf' select * from Tabla2.dbf


jeje.. así de fácil...

Gracias

Saludos..!

coso
25-09-2008, 10:29:00
tranquilo klionsis, ya pasa...un saludo.