Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   copiar una tabla a otra (https://www.clubdelphi.com/foros/showthread.php?t=83824)

ozsWizzard 05-08-2013 08:22:36

Otro matiz, creo que la "select" del "insert" ha de ir con parénteis.
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject); 
begin 
  with Query1 do begin         
    Close;         
    SQL.Clear;    
    SQL.Add('INSERT INTO detfactfinal');    
    SQL.Add('(SELECT * FROM detfactura)');    
    ExecSQL;     
    Close;    
    SQL.Clear;    
    SQL.Add('DELETE detfactura');    
    ExecSQL;   
  end; 
end;

Además, si la base de datos es Sql Server, se debe poner la lista de campos de las tablas

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject); 
begin 
  with Query1 do begin         
    Close;         
    SQL.Clear;    
    SQL.Add('INSERT INTO detfactfinal (Numdetfact, Numfact, Cod_art, Cantidad');    
    SQL.Add('(SELECT Numdetfact, Numfact, Cod_art, Cantidad FROM detfactura)');    
    ExecSQL;     
    Close;    
    SQL.Clear;    
    SQL.Add('DELETE detfactura');    
    ExecSQL;   
  end; 
end;

olbeup 05-08-2013 10:22:46

Cita:

Empezado por ozsWizzard (Mensaje 465025)
Otro matiz, creo que la "select" del "insert" ha de ir con parénteis.
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject); 
begin 
  with Query1 do begin         
    Close;         
    SQL.Clear;    
    SQL.Add('INSERT INTO detfactfinal');    
    SQL.Add('(SELECT * FROM detfactura)');    
    ExecSQL;     
    Close;    
    SQL.Clear;    
    SQL.Add('DELETE detfactura');    
    ExecSQL;   
  end; 
end;

Además, si la base de datos es Sql Server, se debe poner la lista de campos de las tablas

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject); 
begin 
  with Query1 do begin         
    Close;         
    SQL.Clear;    
    SQL.Add('INSERT INTO detfactfinal (Numdetfact, Numfact, Cod_art, Cantidad)');    <-- Te falta un ")"
    SQL.Add('(SELECT Numdetfact, Numfact, Cod_art, Cantidad FROM detfactura)');  <-- Puedes omitir los paréntesis
    ExecSQL;     
    Close;    
    SQL.Clear;    
    SQL.Add('DELETE detfactura');    
    ExecSQL;   
  end; 
end;

Si la base de datos es SQL SERVER lo puedes hacer todo en una sola consulta, Insertar, Borrar, Actualizar e incluso hacer un Select al final de la consulta.

Un saludo.

ozsWizzard 05-08-2013 12:02:53

Cita:

Empezado por olbeup (Mensaje 465029)
Si la base de datos es SQL SERVER lo puedes hacer todo en una sola consulta, Insertar, Borrar, Actualizar e incluso hacer un Select al final de la consulta.

Un saludo.

El paréntesis me lo comí.
Los paréntesis del insert es por costumbre-

Y sobre lo de insertar, borrar y hacer select en Sql Server... ¿con el mismo TQuery?, eso sí que no lo sabía.¿cómo?

olbeup 05-08-2013 12:40:08

Cita:

Empezado por ozsWizzard (Mensaje 465033)
El paréntesis me lo comí.
Los paréntesis del insert es por costumbre-

Y sobre lo de insertar, borrar y hacer select en Sql Server... ¿con el mismo TQuery?, eso sí que no lo sabía.¿cómo?

Hola ozsWizzard

Te pongo un ejemplo:

Código SQL [-]
DECLARE
  @myTable  TABLE
    (
      IDCLIENTE int IDENTITY(1,1)
      ,CLIENTE  varchar(50)
    )

INSERT INTO @myTable (CLIENTE) VALUES ('Pedro Mtnz')
INSERT INTO @myTable (CLIENTE) VALUES ('Antonio Martinez')
INSERT INTO @myTable (CLIENTE) VALUES ('Pedro Mtn')

DELETE 
  FROM @myTable 
  WHERE CLIENTE = 'Pedro Mtn'

UPDATE @myTable
  SET
    CLIENTE = 'Pedro Martinez'
  WHERE CLIENTE = 'Pedro Mtnz'

SELECT
    CLIENTE
  FROM @myTable

Un saludo.

P.D.: Siempre trabajo con ADO

DOS 05-08-2013 13:42:10

OK, tratemos de ver otra opcion o volver a la original de dos tablas, tal vez sea mas facil aunque no mejor, pasar de una tabla a otra. Me dieron la fecha y lo tengo que entregar el dia 15, pero se me complica un poco ya que trabajo y solo a la noche puedo probar cualquier avance y para colmo el viernes tengo un examen final :mad: estoy complicado.

DOS 05-08-2013 19:08:31

Cita:

Empezado por olbeup (Mensaje 465035)
Hola ozsWizzard

Te pongo un ejemplo:

Código SQL [-]DECLARE @myTable TABLE ( IDCLIENTE int IDENTITY(1,1) ,CLIENTE varchar(50) ) INSERT INTO @myTable (CLIENTE) VALUES ('Pedro Mtnz') INSERT INTO @myTable (CLIENTE) VALUES ('Antonio Martinez') INSERT INTO @myTable (CLIENTE) VALUES ('Pedro Mtn') DELETE FROM @myTable WHERE CLIENTE = 'Pedro Mtn' UPDATE @myTable SET CLIENTE = 'Pedro Martinez' WHERE CLIENTE = 'Pedro Mtnz' SELECT CLIENTE FROM @myTable


Un saludo.

P.D.: Siempre trabajo con ADO

Gracias lo probare a la noche, aunque no se que lenguaje estas utilizando olbeup, digo por mi falta de conocimiento nunca hice algo asi en SQL y la base que utilizo es Paradox (si ya se no coment, es solo para pruebas) gracias.

ozsWizzard 05-08-2013 21:59:35

Cita:

Empezado por olbeup (Mensaje 465035)
Hola ozsWizzard

Te pongo un ejemplo:

Código SQL [-]
DECLARE
  @myTable  TABLE
    (
      IDCLIENTE int IDENTITY(1,1)
      ,CLIENTE  varchar(50)
    )

INSERT INTO @myTable (CLIENTE) VALUES ('Pedro Mtnz')
INSERT INTO @myTable (CLIENTE) VALUES ('Antonio Martinez')
INSERT INTO @myTable (CLIENTE) VALUES ('Pedro Mtn')

DELETE 
  FROM @myTable 
  WHERE CLIENTE = 'Pedro Mtn'

UPDATE @myTable
  SET
    CLIENTE = 'Pedro Martinez'
  WHERE CLIENTE = 'Pedro Mtnz'

SELECT
    CLIENTE
  FROM @myTable

Un saludo.

P.D.: Siempre trabajo con ADO

Nunca se me ha ocurrido meter todo eso seguido en el mismo execute, veo más claro hacer cada ejecución por su cuenta, para ejecutar todo eso haría un procedimiento almacenado.

Pero bueno, siempre se aprende algo nuevo, lo probaré un día de estos por curiosidad.

AzidRain 05-08-2013 23:29:07

Está excelente la ayuda que ha estado dando magistralmente Caral. Sin embargo quisiera remitirme a otro aspecto de la consulta que vale la pena sacar a flote:

Nuestro amigo está preparándose para estudiar y ejercer algún día su carrera. No puede cumplir con una tarea y ofrece dinero a quien se la termine porque aduce "no tener tiempo". Me pregunto que haría si estuviera laborando en el mundo real, ¿Subcontratar para cumplir un compromiso con su cliente? ¿Decirle al cliente que no tiene tiempo para sus proyectos, pero que no es falta de conocimiento? ¿Regresar los anticipos ya cobrados?.

Independientemente de sus razones, que seguramente son totalmente válidas para él creo que se aleja de lo que debería aprender..en este caso que no le dedicó el tiempo necesario a un proyecto y que no organizó sus actividades como debía ser. Lo mas honesto sería presentar lo que tenga tal como esté y apegarse a la calificación merecida que le pongan y no autoengañarse tratando de comprarla o peor que alguién como Caral, que tan amablemente lo hace, invierta tiempo en algo que el interesado justamente dice no tener.

Yo me quedaría con mi reprobación, terminaría el proyecto aunque ya no sirva para mejorar la calificación pero si me sirva para aprender y punto. Prefiero sacar 7 en la carrera pero en lo profesional ser siempre de 10 a que sea lo contrario como luego tristemente pasa. Supuestos "eruditos" de 10 en todo pero a la hora de los cocolazos reales nomás no.

Lo siento por mi tono, pero me parece adecuado hacer el comentario para todos los novatos y que inician en esto, sobre todo a los que están estudiando ya que yo igual lo viví en mis años de la uni, toda una mafia que vendía "proyectos hechos" y otros tantos que lo solicitaban, hoy unos y otros están haciendo otras cosas distintas a lo que estudiaron porque al final no sabían tanto como creían.

Caral 06-08-2013 01:13:08

Hola
Amigo AzidRain, justamente comparto tu filosofía, me parece que en la vida hay que romperse la cabeza para aprender, de lo contrario simplemente se pasa.
Una de las razones por las que no he tocado el proyecto es precisamente por eso y he tratado, dentro de mi pobre conocimiento, hacer que el amigo DOS piense y resuelva el mismo los problemas, yo simplemente le marco un camino, o por lo menos eso trato.
Habrás notado que lo hace y lo hace solo y lo hace bien, aveces nos piden y no damos, aveces nos piden y los encaminamos esta en nosotros decidir dar el pescado o enseñar a pescar.
Yo como programador seria un buen albañil pero trato de ponerme en los zapatos del que pide y buscar un punto de equilibrio.
Hay buenas personas todavía no perdamos la esperanza en ellos.
Saludos

DOS 06-08-2013 01:50:27

AzidRain, tenes razon en tus palabras, pero quisiera dejar mas claro de como es la situacion, he solicitado en varias ocaciones ayuda para realizar algo, mostrando lo que hice y corrigiendome en lo que estaba mal o mal encaminado, de hecho antes de llegar a este punto abri este tread para encontrar la solucion que necesito http://www.clubdelphi.com/foros/showthread.php?t=83824 si esto lo hubiese visto en clases, seguramente revisaria la carpeta y lo resolveria.
Como lo mencione anteriormente no voy a vivir de esto(lamentablemente), esto no es un titulo universitario, seguramente si me presentara a una postulacion de trabajo con mi edad, tendria un centenar de jovenes mejor preparados primero que yo.
Lo mas cercano a desarrollar un sistema, seguramente sera este, tambien tengas razon con lo del tiempo y no haberle dedicado mas, pero cuando uno trabaja todo el dia, a la noche va a estudiar y el fin de semana, uno tiene que poner en la balanza, entre quedarce a estudiar o salir con la familia al cine o a comer, cada uno vera lo que mas le pesa. No es vagancia, doy todo lo que puedo dentro de mi magro conocimiento.
Seguramente como decis esto no es un buen ejemplo, para quien este estudiando, tambien pude haber mentido y disfrazar este pedido de otra manera, opte por la verdad. Quien este estudiando y haga trampas, solo se engaña a si mismo, si quiere realmente lo que hace, debe poner lo mejor. Esto lo tome como un hobby, pero con muchas ganas de aprender y de seguir formandome, pero yo nunca me engañe, se a lo que puedo llegar.
No quiero crear una polemica, sino creamos un nuevo thread, agradesco muchisimo a caral y a todo aquel que alguna vez me ayudo, incluso a casimiro que siempre me recuerda que lea la cara oculta de Delphi.
Gracias.

Caral 06-08-2013 01:59:32

Hola
No creo que AzidRain te guizgue, me parece que lo dice en general.
Yo en lo personal te entiendo perfectamente, tal vez la edad nos de esa visión.
De todos modos ya sabes, aqui siempre estamos para tratar de ayudar amigo.
Saludos

DOS 12-08-2013 01:16:02

Hola estuve probando lo visto acá, pero tengo un problema, hice dos botones uno que copia una tabla a la otra y un botón para limpiar, el asunto es que no me guarda nada, es todo temporal, no faltaría poner un Edit, Post algo así, perdón si digo una burrada, porque esto estaría funcionando solo faltaría que lo almacene de forma definitiva, muchas gracias.
Código Delphi [-]
procedure TForm14.BitBtn1Click(Sender: TObject);  // copia una factura a la otra
begin
with Query1 do
begin     
   Close;     
   SQL.Clear;
   SQL.Add('INSERT INTO detfacturafinal');
   SQL.Add('SELECT * FROM detfactura');
   ExecSQL;
end;
end;

procedure TForm14.SpeedButton3Click(Sender: TObject);//limpia la tabla detfactura
begin
with Query1 do
begin
  Close;
  SQL.Clear;
  SQL.Add('DELETE FROM detfactura');
  ExecSQL;
end;
end;
Les recuerdo que trabajo con Delphi 7 y Paradox, gracias.

ozsWizzard 12-08-2013 01:36:37

Falta iniciar una transacción y acabarla.

El componente TDatabase tiene un procedimiento "StartTransaction" que sirve para iniciar la transacción. Cuando acabes de hacer todas las operaciones que consideres oportunas, para acpetar los cambios se usa el procedimiento del mismo componente "Commit", si quieres cancelar los cambios, "Rollback", es decir:

Código Delphi [-]
procedure TForm14.BitBtn1Click(Sender: TObject);  // copia una factura a la otra
begin
   Database1.StartTransaction;
   try
      with Query1 do
      begin     
         Close;     
         SQL.Clear;
         SQL.Add('INSERT INTO detfacturafinal');
         SQL.Add('SELECT * FROM detfactura');
         ExecSQL;
      end;
      DataBase1.Commit;
   except      
      DataBase1.Rollback;
   end;
end;

procedure TForm14.SpeedButton3Click(Sender: TObject);//limpia la tabla detfactura
begin
   Database1.StartTransaction;
   try
      with Query1 do
      begin
         Close;
         SQL.Clear;
         SQL.Add('DELETE FROM detfactura');
         ExecSQL;
      end;
      DataBase1.Commit;
   except      
      DataBase1.Rollback;
   end;
end;

DOS 12-08-2013 03:28:35

Ok pero debo poner el rollback en un boton, como un cancel, seria algo asi.
Botón cancel
Código Delphi [-]
   begin
DataBase1.Rollback;
   end;
No se si esta bien esto, nunca use este comando, agradezco tu ayuda.

ozsWizzard 12-08-2013 11:50:35

Tal y como tú tenías pensado el proceso no creo que haga falta un botón nuevo, yo lo haría como te he puesto. El propio proceso, si es correcto hace commit y si ocurre algún error, rollback.

Tal y como lo he puesto se come el mensaje de error, te lo muestro completo:
Código Delphi [-]
procedure TForm14.BitBtn1Click(Sender: TObject);  // copia una factura a la otra
begin
   Database1.StartTransaction;
   try
      with Query1 do
      begin     
         Close;     
         SQL.Clear;
         SQL.Add('INSERT INTO detfacturafinal');
         SQL.Add('SELECT * FROM detfactura');
         ExecSQL;
      end;
      DataBase1.Commit;
   except            
      on E:Exception do begin
         DataBase1.Rollback;         
         MessageDlg('Error:' + E.Message, mtError, [mbOK], 0);
      end;
   end;
end;

procedure TForm14.SpeedButton3Click(Sender: TObject);//limpia la tabla detfactura
begin
   Database1.StartTransaction;
   try
      with Query1 do
      begin
         Close;
         SQL.Clear;
         SQL.Add('DELETE FROM detfactura');
         ExecSQL;
      end;
      DataBase1.Commit;
   except      
      on E:Exception do begin
         DataBase1.Rollback;         
         MessageDlg('Error:' + E.Message, mtError, [mbOK], 0);
      end;
   end;
end;

Saludos

DOS 13-08-2013 01:13:37

me tira el siguiente error [Error] Unit14.pas(326): Undeclared identifier: 'Database1'
[Error] Unit14.pas(336): Missing operator or semicolon
:(

ozsWizzard 13-08-2013 12:54:11

Le he llamado Database1 como ejemplo, mira a ver como se llama tu componente TDatabase. Tiene que ser el mismo TDatabase al que estén asociados los querys.

DOS 14-08-2013 02:50:16

ozsWizzard, se que me has ayudado muchisimo y te topaste con un inexperto mal, te pido un ultimo esfuerzo con tu ayuda :o los querys los tengo relacionados co TDataSource y si reemplazo TDataBase por los TDataSource correspondientes no funciona, ¿el DB es otro componente?
jejeje lo acabo de encontrar esta en BDE, voy a buscar sobre este componente(odio todo lo que no me enseñaron) y a ver si puedo hacer algo, nuevamente agradesco tu ayuda.^\||/

ozsWizzard 14-08-2013 08:54:13

La asociación con TDatasource es al margen de la base de datos. El problema es que en la propiedad "DatabasName" no tendrás un TDatabase, sino la base de datos directamente (hablo a ciegas, nunca he tratado los Querys sin TDatabase)

Y la verdad, no sé como forzar el commit. Sólo se me ocurre que ejecutes commit por medio de sentencia SQL, que no sé si funcionará

Código Delphi [-]
procedure TForm14.HazCommit;
begin
   with Query1 do
   begin     
      Close;     
      SQL.Clear;
      SQL.Add('COMMIT');
      ExecSQL;
   end;
end;

procedure TForm14.HazRollBack;
begin
   with Query1 do
   begin     
      Close;     
      SQL.Clear;
      SQL.Add('ROLLBACK');
      ExecSQL;
   end;
end;

procedure TForm14.BitBtn1Click(Sender: TObject);  
begin
   try
      with Query1 do
      begin     
         Close;     
         SQL.Clear;
         SQL.Add('INSERT INTO detfacturafinal');
         SQL.Add('SELECT * FROM detfactura');
         ExecSQL;
      end;
      HazCommit;
   except            
      on E:Exception do begin
         HazRollback;         
         MessageDlg('Error:' + E.Message, mtError, [mbOK], 0);
      end;
   end;
end;
//Y lo mismo para el otro procedimiento

DOS 14-08-2013 16:49:48

Cita:

Empezado por ozsWizzard (Mensaje 465562)
La asociación con TDatasource es al margen de la base de datos. El problema es que en la propiedad "DatabasName" no tendrás un TDatabase, sino la base de datos directamente (hablo a ciegas, nunca he tratado los Querys sin TDatabase)

Y la verdad, no sé como forzar el commit. Sólo se me ocurre que ejecutes commit por medio de sentencia SQL, que no sé si funcionará

Mas allá de intentar hacer forzar el commit, que hoy lo pruebo a la noche, Después de haber realizado unas 10 tablas y unos 40 formularios del sistema, se podrá configurar un nuevo TDataSource, estoy buscando en internet y esto se suele hacer al comienzo, pero bueno, sigo investigando, muchas gracias.


La franja horaria es GMT +2. Ahora son las 20:11:45.

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