| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
jorgesl Cdt

Registrado: 03 Feb 2006Mensajes: 3
|
Publicado: Jue 06 Abr, 2006 3:37 pm Asunto: insert into tabla (select * from... ¿? |
|
|
Hola, que tal.
Tengo un TQuery con la siguiente instruccion SQL:
| Código: |
select * from SOSTAT_RESUL where SOSTAT_RESUL.PNTNAM like :nomenclatura and SOSTAT_RESUL.SUBNAM like :sSubE order by SOSTAT_RESUL.PNTNAM |
Esa instruccion me regresa una serie de registros que estan almacenados en una tabla y esos registros, necesito insertarlos en otra tabla.
El problema es que esos registros tienen muchísimos campos (como 70) y seria muy dificil hacer insert into tabla values (x1,x2,x3, ....,x70);.. se imaginan ?
Entonces, hice lo siguiente (está en delphi, pero creo que igual me pueden ayudar los que saben builder )
| Código: |
Qinte := TQuery.Create(Self);
Qinte.DatabaseName := 'Objetos';
Qinte.RequestLive := True;
Qinte.Close;
Qinte.SQL.Text := 'insert into SOSTAT_RESUL_ORDEN (select * from SOSTAT_RESUL where SOSTAT_RESUL.PNTNAM like :interruptor)';
Qinte.Prepare;
Qinte.ParamByName('interruptor').AsString := interruptor;
Qinte.Open;
Qinte.Close;
|
pero en Qinte.Prepare;
Marca el siguiente error:
| Código: |
'Invalid use of keyword.
Token: select
Line Number: 1.'
|
Si quito los parentesis entre lso que esta el select, el error que me marca dice:
| Código: |
'Capability not supported'
|
Que podrá ser ?
Ojalá y me puedan ayudar, me urge mucho y ya he intentado de varias formas y no se deja...
Uso delphi 2006 y la base de datos es Access.
Gracias ! |
|
| Volver arriba |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Jue 06 Abr, 2006 6:39 pm Asunto: |
|
|
Que tal jorges!
Pues por lo que veo falta la palabra VALUES en tu instrucción SQL. También debes de tomar en cuenta que el orden debe ser el mismo en ambas tablas y que ademas es el mismo numero de campos, porque de lo contrario habra errores.
| Código: |
Qinte := TQuery.Create(Self);
Qinte.DatabaseName := 'Objetos';
Qinte.RequestLive := True;
Qinte.Close;
Qinte.SQL.Text := 'insert into SOSTAT_RESUL_ORDEN VALUES(select * from SOSTAT_RESUL where SOSTAT_RESUL.PNTNAM like :interruptor)';
Qinte.Prepare;
Qinte.ParamByName('interruptor').AsString := interruptor;
Qinte.Open;
Qinte.Close;
|
Saludos _________________ Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida. |
|
| Volver arriba |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Jue 06 Abr, 2006 6:43 pm Asunto: |
|
|
Olvide mencionar que no el metodo correcto para ejecutar la instruccion es:
| Código: |
Qinte.Execute
Qinte.Close;
|
Qinte.Open -> solo habre la consulta y aplica cuando se trata de un select. Cuando usas INSERT, DELETE, UPDATE el método a llamar es Execute.
Saludos _________________ Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida. |
|
| Volver arriba |
|
 |
jorgesl Cdt

Registrado: 03 Feb 2006Mensajes: 3
|
Publicado: Jue 06 Abr, 2006 7:33 pm Asunto: |
|
|
Hola Buildero.
Gracias por contestarme, con respecto al Execute, tienes razón, se me pasó ese detalle. Sólo que en delphi se utiliza
Probé la sentencia de SQL como me dijiste, agregando 'Values':
| Código: | Qinte.SQL.Text := 'insert into SOSTAT_RESUL_ORDEN VALUES(select * from SOSTAT_RESUL where SOSTAT_RESUL.PNTNAM like :interruptor)'; |
Pero, me da el siguiente error:
| Código: |
Invalid use of keyword.
Token: select
Line Number: 1.
|
|
|
| Volver arriba |
|
 |
Rilo Ens

Registrado: 03 Jun 2003Mensajes: 40Ubicación: Ávila
|
Publicado: Jue 06 Abr, 2006 10:10 pm Asunto: |
|
|
A mí me está pasando algo parecido, pero yoo ya sé porque es. Un TQuery que tenga en su clausula ORDER BY por ejemplo, no te permite modificarlo. Para poder modificarlo necesitas utilizar un TUpdateSQL, pero ese es otro cantar porque a día de hoy no sé como se le pueden pasar parámetros a este componente, que es un poco complicado de utilizar. _________________ Ávila, ciudad patrimonio de la humanidad. Visítala. |
|
| Volver arriba |
|
 |
Buildero Master


Registrado: 23 Dic 2003Mensajes: 523Ubicación: Puebla, México
|
Publicado: Jue 06 Abr, 2006 11:39 pm Asunto: |
|
|
Tienes razón, es ExecSQL, me confundi con la instrucción.
Pues bien, al parecer el BDE no soporta este tipo de instrucciones. He hecho una prueba con los componentes ADO (conectandome a una base de datos Access) y no tuve problemas.
Ej
| Código: |
TADOQuery1->Close;
TADOQuery1->SQL->Clear();
TADOQuery1->SQL->Add("INSERT INTO Tabla1 SELECT * FROM Tabla1");
TADOQuery1->ExecSQL();
|
Por otra parte la palabra VALUES no aplica para este tipo de instrucciones, por lo que también en eso me equivoque.
El resultado del ejemplo es insertar en la misma tabla el numero de registros con los que cuente en ese momento.
Saludos _________________ Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida. |
|
| Volver arriba |
|
 |
|