PDA

Ver la Versión Completa : Duplicar una tabla con otro nombre dentro de una base de datos de access desde delphi


feliz-58
23-04-2013, 05:00:33
Saludos, Esto es lo que quiero hacer.

tengo una base de datos de access donde tiene 2 tablas, 1-empleado1, 2-empleado2.

en delphi tengo un ADOconection, ADOtable y un DBGrid para ver la data.
Como puedo hacer que con un boton copiar la tabla que dice empleado1,con un nuevo nombre que yo ponga en el edit (Ejemplo empleado3) con solo dar clic en el boton, y asi cada vez que quiera copiar la misma tabla "Empleado1" pueda guardarla con nombres diferentes dentro de la misma base de datos?


Gracias, si no es mucho pedir, me podrian ayudar?

no soy muy pro en delphi :)

:D

ecfisa
23-04-2013, 07:37:11
Hola feliz-58.

Agregar un TADOQuery y proba de este modo:

...
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOTable1.Connection := ADOConnection1;
ADOQuery1.Connection := ADOConnection1
end;

procedure CloneTable(aTable: TADOTable; aQuery: TADOQuery;
const NewTableName: string);
var
i : Integer;
Str : string;
begin
Str := 'SELECT ';
for i := 0 to aTable.FieldCount-1 do
Str := Str + aTable.Fields[i].FieldName + ', ';
SetLength(Str, Length(Str)-2);
Str := Str + ' INTO ' + NewTableName + ' FROM '+ aTable.TableName;
with aQuery do
begin
Close;
SQL.Text := Str;
ExecSQL;
end;
end;


Llamada ejemplo:

procedure TForm1.Button1Click(Sender: TObject);
begin
CloneTable(ADOTable1, ADOQuery1, Edit1.Text);
end;

No uso mucho ADO así que tal vez exista un modo mas simple o mejor de realizarlo. De ser así, seguro los compañeros mas experimentados con esos componentes te darán una mejor alternativa.

Saludos. :)

olbeup
23-04-2013, 08:53:13
Modificando la función de ecfisa, podemos copiar cualquier base de datos Origen o Destino

procedure CloneTable(TableSource, TableTarget: String);
begin
with TADOQuery.Create(Self) do
begin
ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=Unidad:\Ruta\BaseDeDatos.mdb;' +
'Persist Security Info=False';

SQL.Add('SELECT *');
SQL.Add(' INTO ' + TableTarget);
SQL.Add(' FROM ' + TableSource);

ExecSQL;

Free;
end;
end;


Un saludo.

feliz-58
23-04-2013, 15:27:15
Hola feliz-58.

Agregar un TADOQuery y proba de este modo:

...
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOTable1.Connection := ADOConnection1;
ADOQuery1.Connection := ADOConnection1
end;

procedure CloneTable(aTable: TADOTable; aQuery: TADOQuery;
const NewTableName: string);
var
i : Integer;
Str : string;
begin
Str := 'SELECT ';
for i := 0 to aTable.FieldCount-1 do
Str := Str + aTable.Fields[i].FieldName + ', ';
SetLength(Str, Length(Str)-2);
Str := Str + ' INTO ' + NewTableName + ' FROM '+ aTable.TableName;
with aQuery do
begin
Close;
SQL.Text := Str;
ExecSQL;
end;
end;


Llamada ejemplo:

procedure TForm1.Button1Click(Sender: TObject);
begin
CloneTable(ADOTable1, ADOQuery1, Edit1.Text);
end;

No uso mucho ADO así que tal vez exista un modo mas simple o mejor de realizarlo. De ser así, seguro los compañeros mas experimentados con esos componentes te darán una mejor alternativa.

Saludos. :)

Me sale este error:
[Error] Unit6.pas(33): Undeclared identifier: 'CloneTable'

como resolvemos este error?
Y gracias por la ayuda.

feliz-58
23-04-2013, 15:40:17
Gracias, ya pude resolverlo, simplemtente coloque el Primer codigo despues de implementation :), no sabes cuanto te agradesco.

Saludos. :D:D:D:D

feliz-58
26-04-2013, 17:09:45
tengo este codigo para copiar una tabla con otro nombre diferente dentro de una misma base de datos:


...
implementation
procedure CloneTable(aTable: TADOTable; aQuery: TADOQuery;
const NewTableName: string);
var
i : Integer;
Str : string;
begin
Str := 'SELECT ';
for i := 0 to aTable.FieldCount-1 do
Str := Str + aTable.Fields[i].FieldName + ', ';
SetLength(Str, Length(Str)-2);
Str := Str + ' INTO ' + NewTableName + ' FROM '+ aTable.TableName;
with aQuery do
begin
Close;
SQL.Text := Str;
ExecSQL;
end;
end;


{$R *.dfm}

y la llamada:


procedure TNuevo_empleado.Button1Click(Sender: TObject);
begin
CloneTable(ADOTable1, ADOQuery1, Edit1.Text);
showmessage ('Su Nuevo Empleado a sido agregado');
edit1.Clear;
end;

La pregunta es, como copiar una tabla en espesifico, por el nombre, es decir, siempre tener como modelo la tabla llamada "original"?

Base de datos en Access, ADOconection, ADOtable, ADOquery.

gracias :)

ecfisa
26-04-2013, 18:38:50
Hola feliz-58

Combiné tu último mensaje por que está en relación directa con este hilo.

La pregunta es, como copiar una tabla en espesifico, por el nombre, es decir, siempre tener como modelo la tabla llamada "original"?

No entiendo bién lo que buscas, ¿ Podrías explicar con mas detalle la consulta ?

Por otro lado, fijate que es mucho mas simple y eficiente el modo que nos mostró olbeup.

Una variante del mismo puede ser:

procedure CloneTable(const OldTableName, NewTableName: string;
Connection: TADOConnection);
begin
with TADOQuery.Create(nil) do
try
Connection := Connection;
Close;
SQL.Text := 'SELECT * INTO ' + NewTableName + ' FROM '+ OldTableName;
ExecSQL
finally
Free
end
end;


Saludos. :)

feliz-58
26-04-2013, 19:37:14
tengo una tabla en la base de datos que esta sin ningun registro, el codigo que coloque, copia la primera tabla de la base de datos (Clona) y la copia la pega en la misma base de datos con el nombre que yo le indique en el edit, lo que quiero hacer es lo siguiente:
con el boton cada vez que quiera clonar la tabla que sea de una en especifico que si yo pongo en el codigo que la tabla original sea "Base" que siempre clone de esa, y las clonadas le defina el nombre con el edit que ya tengo.

feliz-58
26-04-2013, 19:49:37
Hola feliz-58

Combiné tu último mensaje por que está en relación directa con este hilo.


No entiendo bién lo que buscas, ¿ Podrías explicar con mas detalle la consulta ?

Por otro lado, fijate que es mucho mas simple y eficiente el modo que nos mostró olbeup.

Una variante del mismo puede ser:

procedure CloneTable(const OldTableName, NewTableName: string;
Connection: TADOConnection);
begin
with TADOQuery.Create(nil) do
try
Connection := Connection;
Close;
SQL.Text := 'SELECT * INTO ' + NewTableName + ' FROM '+ OldTableName;
ExecSQL
finally
Free
end
end;


Saludos. :)

Como seria la llamada?

ecfisa
26-04-2013, 19:57:32
Hola feliz-58.
...lo que quiero hacer es lo siguiente:
con el boton cada vez que quiera clonar la tabla que sea de una en especifico que si yo pongo en el codigo que la tabla original sea "Base" que siempre clone de esa, y las clonadas le defina el nombre con el edit que ya tengo.
Si no te entendí mal basta con hacer:

procedure CloneTable(const NewTableName: string; Connection: TADOConnection);
begin
with TADOQuery.Create(nil) do
try
Connection := Connection;
Close;
SQL.Text := 'SELECT * INTO ' + NewTableName + ' FROM nombre_de_la_tabla_base';
ExecSQL
finally
Free
end
end;


Como seria la llamada?
Ejemplo de llamada para el código del mensaje #7:

CloneTable('TABLA1', 'TABLA2', ADOConnection1);


Para el código de este mensaje:

CloneTable('TABLA1', ADOConnection1);


Saludos. :)

feliz-58
26-04-2013, 20:16:39
procedure CloneTable(const NewTableName: string; Connection: TADOConnection);
begin
with TADOQuery.Create(nil) do
try
Connection := Connection;
Close;
SQL.Text := 'SELECT * INTO ' + NewTableName + ' FROM llllllllll';
ExecSQL <------------------- me resalta el delphi el problema
finally
Free
end
end;

y la ventana de error es esta

TOPX
26-04-2013, 20:27:16
Por favor cambie las siguientes dos líneas:

procedure CloneTable(const NewTableName: string; Connection: TADOConnection);
por
procedure CloneTable(const NewTableName: string; aConnection: TADOConnection);
y
Connection := Connection;
por
Connection := aConnection;
-

ecfisa
26-04-2013, 20:30:36
Hola.

Perdón, cambiá el nombre del parámetro 'Connection' por 'aConnection'.

procedure CloneTable(const NewTableName: string; aConnection: TADOConnection);
begin
with TADOQuery.Create(nil) do
try
Connection := aConnection;
Close;
SQL.Text := 'SELECT * INTO ' + NewTableName + ' FROM llllllllll';
ExecSQL
finally
Free
end
end;


Saludos.


Edito: No había visto el mensaje de TOPX, que ya aclaraba el problema.

feliz-58
26-04-2013, 20:49:32
Gracias Amigos y perdonen las molestias, era que tenia que entregar ese trabajo hoy jeje.

Todo funciono perfectamente.

Saludos :D;)