Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-09-2008
klionsis klionsis is offline
Miembro
 
Registrado: may 2006
Posts: 50
Poder: 19
klionsis Va por buen camino
Creacion de Tabla e inserción de datos

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:


Código Delphi [-]
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.
Responder Con Cita
  #2  
Antiguo 18-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola, mediante una consulta

Código Delphi [-]
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.

Última edición por coso fecha: 18-09-2008 a las 13:05:29.
Responder Con Cita
  #3  
Antiguo 18-09-2008
klionsis klionsis is offline
Miembro
 
Registrado: may 2006
Posts: 50
Poder: 19
klionsis Va por buen camino
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 ?

Código Delphi [-]
Query1.SQL.Text := 'select * into Productos in "c:\Actualizacion\Tablas" from Articulos';
Query1.ExecSQL;


Gracias.
Responder Con Cita
  #4  
Antiguo 18-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
si, pruebalo, a ver que tal te va. No hara falta entonces nada del resto del codigo, solo esa consulta.
Responder Con Cita
  #5  
Antiguo 18-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
perdon, seria

Código Delphi [-]
Query1.SQL.Text := 'select * into Productos in "c:\Actualizacion\Tablas\tabla.dbf" from Articulos';
Query1.ExecSQL;
Responder Con Cita
  #6  
Antiguo 19-09-2008
klionsis klionsis is offline
Miembro
 
Registrado: may 2006
Posts: 50
Poder: 19
klionsis Va por buen camino
He probado de la siguiente manera:

Código Delphi [-]
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 ?
Responder Con Cita
  #7  
Antiguo 19-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
pero...probaste la consulta 'select ... into'?
Responder Con Cita
  #8  
Antiguo 19-09-2008
klionsis klionsis is offline
Miembro
 
Registrado: may 2006
Posts: 50
Poder: 19
klionsis Va por buen camino
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


Código SQL [-]
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.
Responder Con Cita
  #9  
Antiguo 19-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
saldras antes de dudas probandolo...
Responder Con Cita
  #10  
Antiguo 19-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
creo que tanto el insert into como el select into te da error si la tabla ya existe en el fichero.
Responder Con Cita
  #11  
Antiguo 19-09-2008
klionsis klionsis is offline
Miembro
 
Registrado: may 2006
Posts: 50
Poder: 19
klionsis Va por buen camino
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.
Responder Con Cita
  #12  
Antiguo 19-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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

Código Delphi [-]
        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 OLEDBatabase Password="";'+
        'Jet OLEDB:Engine Type=96;Jet OLEDBatabase 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 OLEDBon''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 (''')

Última edición por coso fecha: 19-09-2008 a las 17:19:59.
Responder Con Cita
  #13  
Antiguo 20-09-2008
klionsis klionsis is offline
Miembro
 
Registrado: may 2006
Posts: 50
Poder: 19
klionsis Va por buen camino
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.
Responder Con Cita
  #14  
Antiguo 20-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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.

Última edición por coso fecha: 20-09-2008 a las 10:05:21.
Responder Con Cita
  #15  
Antiguo 25-09-2008
klionsis klionsis is offline
Miembro
 
Registrado: may 2006
Posts: 50
Poder: 19
klionsis Va por buen camino
Disculpas a todos, me habia olvidado de contestar. Evidentemente me estaba ahogando en un baso de agua, la solucion a mi problema es:

Código SQL [-]
Insert Into 'c:\Atualizaciones\tablas\Tabla1.dbf' select * from Tabla2.dbf


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

Gracias

Saludos..!
Responder Con Cita
  #16  
Antiguo 25-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
tranquilo klionsis, ya pasa...un saludo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Insercion de datos con un dbgrid luxus Conexión con bases de datos 2 26-10-2006 17:02:55
insercion de datos en navision mak8888 Conexión con bases de datos 9 02-02-2006 08:47:53
Seleccionar registros en una tabla, envio, e insercion en otra tabla!! EfrainSanmiguel Conexión con bases de datos 3 21-10-2004 01:12:43
Urgente. insercion en tabla de SQL sin orden asendente? danytorres SQL 5 19-12-2003 23:08:18
Controlar insercion de fecha y hora en una tabla paradox Muten Tablas planas 7 13-08-2003 17:42:53


La franja horaria es GMT +2. Ahora son las 18:09:17.


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
Copyright 1996-2007 Club Delphi