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.

DOS 17-08-2013 23:53:53

Hola, estuve probando colocar un Tdatabase en el formulario y lo configure de la siguiente manera en el DataBase Editor:
Name: Facturacion
Alias name: ArgOs
Parameter overrides:
PATH=C:\ITM\Tablas
ENABLE BCD=FALSE
DEFAULT DRIVER=PARADOX

En las propiedades
AliasName ArgOs
connected False
DatabaseName Facturacion //el nombre inventado

El Database ArgOs lo cree con estas caracteristicas
type STANDAR
defaul driver PARADOX
enable BCD FALSE
path C:\tablas

las tablas y el Query
DatabaseName Facturacion

Ahora cuando lo hago correr me tira el siguiente error:
Database1: the transaction isolation level be dirty read local databases...


DOS 18-08-2013 03:34:14

Bueno la otra materia (Visual C#) aprobe con 9, esta quedara para diciembre, asi que si quieren seguir ayudandome, les cuento como sigue esto.
con el siguiente codigo y la ayuda de ozswizzard casi funciona, osea realiza lo que quiero pero lo almacena todo de forma temporal, cuando salgo se borra todo.
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;
Asi que me acosnsejo esto
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;
El asunto como le mencione nunca habia utilizado un Tdatabase, asi que buscando llegue a colocar un Tdatabase en el formulario y lo configure de la siguiente manera en el DataBase Editor:
Name: Facturacion
Alias name: ArgOs
Parameter overrides:
PATH=C:\ITM\Tablas
ENABLE BCD=FALSE
DEFAULT DRIVER=PARADOX

En las propiedades
AliasName ArgOs
connected False
DatabaseName Facturacion //el nombre inventado

El Database ArgOs lo cree con estas caracteristicas
type STANDAR
defaul driver PARADOX
enable BCD FALSE
path C:\tablas

las tablas y el Query
DatabaseName Facturacion



Ahora cuando lo hago correr me tira el siguiente error:
Database1: the transaction isolation level be dirty read local databases...
a ver si logran identificar que estoy haciendo mal o me falta hacer. gracias.

Caral 18-08-2013 04:01:12

Hola
Creo que usas paradox y componentes dbe, sera que estos componentes no tienen el comit ?.
No lo se.
Saludos

ozsWizzard 18-08-2013 11:08:29

Yo he usado paradox con BDE y el commit funcionaba.

DOS 18-08-2013 14:44:00

Creo que el error pasa por la configuracion de mi Database y no por el codigo, ozsWizzard vez algo en lo que puse de mi configuracion que creas que este mal o me falte hacer, para ver si esta correcto, gracias.

DOS 18-08-2013 16:53:03

Volvi a el codigo que mas se acerco a la solucion
DOBLE CLICK EN EL DBGRID
Código Delphi [-]
// Doble click para la carga de productos y servicios
procedure TForm14.DBGrid2DblClick(Sender: TObject);
Begin
if (Edit6.Text) = ''then
  begin
  Application.MessageBox('Ingrese el Numero de Factura'+ #13 +'Luego cargue los Items'+ #13 +'Finalmente pulse Nueva Factura','¡ATENCION!',Mb_OK + Mb_IconWarning);
  end
else
begin
Table2.Filtered := False;
Table2.Close;
Table2.Open;
Table7.Open;  // nuevo
Table7.Last;    // nuevo
Table7.Insert;  // nuevo
Table7.Edit;
if combobox1.Text = 'Productos' then
  begin
   datasource5.DataSet:= Table4;  // tabla de productos
   Table2.Insert; // inserta un campo
   Table2Cod_prodser.Value:= Table4Cod_prod.Value; // el campo cod_prod de la tabla nueva es igual al de la tabla5
   Table2Codigo.Value:= Table4Codigo.Value;
   Table2Descripcion.Value:= Table4Descripcion.Value;
   Table2Importunidad.Value:= Table4ImpVent.Value;
   Table2Cantidad.Value:= StrToFloat(Edit1.Text);  //cantidad cargada por el usuario
   Table2TotalImp.Value:=Table2Cantidad.Value * Table2Importunidad.Value;   // multiplica la cantidad por el valor unitario
   Table2ID_Factura.Value:= StrToInt(Edit6.Text); // Nº de facturar del usuario
   Table2.Post; // guarda el dato en la tabla nueva.
   end;
  if combobox1.Text = 'Servicios' then
  begin
  datasource3.DataSet:= Table3;  // tabla servicios
   Table2.Insert; // inserta un campo
   Table2Cod_prodser.Value:= Table5Cod_servcio.Value; // el campo cod_servicio de la tabla nueva es igual al de la tabla3
   Table2Codigo.Value:= Table5Codigo.Value;
   Table2Descripcion.Value:= Table5Servicio.Value;
   Table2Cantidad.Value:= StrToFloat(Edit1.Text);  // cantidad cargada por el usuario
   Table2Importunidad.Value:= Table5ImpServ.Value;
   Table2TotalImp.Value:=Table2Cantidad.Value * Table2Importunidad.Value;
   Table2ID_Factura.Value:= StrToInt(Edit6.Text); // Nº de facturar del usuario
   Table2.Post; // guarda el dato en la tabla nueva.
   end;
  calcula;
end;
end;

BOTON NUEVA FACTURA
Código Delphi [-]
procedure TForm14.BitBtn1Click(Sender: TObject);  // nueva factura,
begin
if Table2.IsEmpty then
Application.MessageBox('Ingrese Nº de Factura'+ #13 +'Cargue los Items a Facturar'+ #13 +'Finalmente pulse Nueva Factura','¡ATENCION!',Mb_OK + Mb_IconWarning);
with Query1 do
begin
   Close;
   SQL.Clear;
   SQL.Add('INSERT INTO detfacturafinal');
   SQL.Add('SELECT * FROM detfactura');
   ExecSQL;
end;
end;

BOTON GUARDAR
Código Delphi [-]
procedure TForm14.SpeedButton4Click(Sender: TObject);
begin
Table7.Edit;
Table7.Post;
Table7.Refresh;
end;

BOTON LIMPIAR LA TABLA TEMPORAL
Código Delphi [-]
procedure TForm14.SpeedButton3Click(Sender: TObject);
begin
with Query1 do
begin
  Close;
  SQL.Clear;
  SQL.Add('DELETE FROM detfactura');
  ExecSQL;
end;
Edit6.Text:='';
Table2.Refresh;
Table7.Refresh;
end;

Esta casi funcionando, puedo cargar la factura, guardarla, limpiar el DBGrid Y si intento cargar una nueva factura ahi salta el error EDBEngineError with message 'key violation'. ...
a mi me parece como que ademas de guardar inserta una linea nueva en blanco, asi que cuando pongo nuevamente, nueva factura salta el error.
Creo que me estoy equivocando con los edit, insert, post, close, etc en las distintas parte del codigo, alguno no esta bien ubicado, a ver si ustedes logran darse cuenta.

DOS 26-08-2013 01:30:20

No se si alguien me querra ayudar, pero bueno, solucione el punto anterior, todo funcionaba bien pero ahora quieren que la factura sea auto incrementable, con esto en realidad no tenia problema, de echo era autoincrementable, pero el asunto que al no poder cargar un numero y la tabla detalle de factura no es autoincrementable, estoy tratando de que sea asi.
el punto creo que esta aca
Código Delphi [-]
procedure TForm14.DBGrid2DblClick(Sender: TObject);
begin
Table2.Filtered := False;
Table2.Close;
Table7.Close;
Table2.Open;
Table7.Open;
Table7.Last;
Table7.Edit;
if combobox1.Text = 'Productos' then
  begin
   datasource5.DataSet:= Table4;  // tabla de productos
   Table2.Insert; // inserta un campo
   Table2Cod_prodser.Value:= Table4Cod_prod.Value; // el campo cod_prod de la tabla nueva es igual al de la tabla5
   Table2Codigo.Value:= Table4Codigo.Value;
   Table2Descripcion.Value:= Table4Descripcion.Value;
   Table2Importunidad.Value:= Table4ImpVent.Value;
   Table2Cantidad.Value:= StrToFloat(Edit1.Text);  //cantidad cargada por el usuario
   Table2TotalImp.Value:=Table2Cantidad.Value * Table2Importunidad.Value;   // multiplica la cantidad por el valor unitario
   Table2ID_Factura.Value:= StrToInt(Edit6.Text); // Nº de factura del usuario //NO SE REALIZA MAS
   Table2.Post; // guarda el dato en la tabla nueva.
   end;
  if combobox1.Text = 'Servicios' then
  begin
  datasource9.DataSet:= Table8;  // tabla servicios
   Table2.Insert; // inserta un campo
   Table2Cod_prodser.Value:= Table5Cod_servcio.Value; // el campo cod_servicio de la tabla nueva es igual al de la tabla3
   Table2Codigo.Value:= Table5Codigo.Value;
   Table2Descripcion.Value:= Table5Servicio.Value;
   Table2Cantidad.Value:= StrToFloat(Edit1.Text);  // cantidad cargada por el usuario
   Table2Importunidad.Value:= Table5ImpServ.Value;
   Table2TotalImp.Value:=Table2Cantidad.Value * Table2Importunidad.Value;
   Table2ID_Factura.Value:= StrToInt(Edit6.Text); // Nº de factura del usuario  //NO SE REALIZA MAS
   Table2.Post; // guarda el dato en la tabla nueva.
   end;
  calcula;
end;

EL BOTON DE NUEVA FACTURA

Código Delphi [-]
procedure TForm14.BitBtn1Click(Sender: TObject);  // nueva factura,
begin
Table1.Open;
Table1.Last;
Table2.Open;
Table2.Last;
c:=Table1.FieldByName('Cod_factura').Asinteger;
    c:=c+1;
Table1.insert;
Table1.Edit;
if Table2.IsEmpty then   //verifica la carga de factura
Application.MessageBox('Cargue los Items a Facturar'+ #13 +'Luego pulse Nueva Factura','¡ATENCION!',Mb_OK + Mb_IconWarning);
Table2.Last;
Table2.Refresh;
with Query1 do
begin
   Close;
   SQL.Clear;
   SQL.Add('INSERT INTO detfacturafinal');
   SQL.Add('SELECT * FROM detfactura');
   ExecSQL;
end;
BitBtn1.Enabled := false;
SpeedButton4.Enabled:=true;
PageControl1.ActivePage := TabSheet2;
end;

y el boton guardar
Código Delphi [-]
procedure TForm14.SpeedButton4Click(Sender: TObject);
begin
Table7.Edit;
Table7.FieldByName('ID_factura').AsInteger:=k;
Table7.Post;
  Table1.Edit;
  Table1.FieldByName('Cod_factura').AsInteger:=Table7.FieldByName('ID_factura').AsInteger;
  Table1Cod_productserv.Value:=Table2Cod_prodser.Value;
  Table1Cod_detalleFactura.Value:=Table2ID_factura.Value;
  Table1Cod_cliente.Value:=Table8Cod_prop.Value;
  Table1Fecha.Value:=Now();
  Table1Descuento.Value:=StrToFloat(Edit3.Text);
  Table1Incremento.Value:=StrToFloat(Edit4.Text);
  Table1Total.Value:=StrToFloat(Edit5.Text);
  Table1.Post;   
BitBtn1.Enabled := true;
SpeedButton4.Enabled:=false;
Table7.Refresh;
end;
El asunto es como ponerle un numero a la tabla detallefactura si esta es temporal y con cada carga despues borro todo
y la tabla detallefacturafinal, creo que deberia pasar los datos entre detallefactura y detallefacturafinal y viceversa y sumarle 1, se entiende lo que digo.
digamos asi
Cargo detallefactura (tengo que ver de donde saco el numero)
Copio esta a detallefacturafinal
guardo luego borro detallefactura
cargo nueva detallefactura y el numero de la clave principal la tomo de detallefacturafinal +1
no se si la idea esta bien, pero todavia no lo supe implementar.
si alguien me tira una mano, caral¿?

DOS 02-09-2013 03:43:07

bueno sigo intentando, lo detallo en el codigo los cambios, pero surge el problema de master record mising...
primera modificacion en la carga del producto en la clave principal, la toma de la factura.
Código Delphi [-]
// Doble click para la carga de productos y servicios
procedure TForm14.DBGrid2DblClick(Sender: TObject);
begin
Table2.Filtered := False;
Table2.Close;
Table7.Close;
Table2.Open;
Table7.Open;
Table7.Last;
Table7.Edit;
if combobox1.Text = 'Productos' then
  begin
   datasource5.DataSet:= Table4;  // tabla de productos
   Table2.Insert; // inserta un campo
   Table2Cod_prodser.Value:= Table4Cod_prod.Value; // el campo cod_prod de la tabla nueva es igual al de la tabla5
   Table2Codigo.Value:= Table4Codigo.Value;
   Table2Descripcion.Value:= Table4Descripcion.Value;
   Table2Importunidad.Value:= Table4ImpVent.Value;
   Table2Cantidad.Value:= StrToFloat(Edit1.Text);  //cantidad cargada por el usuario
   Table2TotalImp.Value:=Table2Cantidad.Value * Table2Importunidad.Value;   // multiplica la cantidad por el valor unitario
   Table2ID_Factura.Value:=Table1Cod_detalleFactura.value + 1; // Nº del detalle factura + 1 correspondiente a la tabla factura
   Table2.Post; // guarda el dato en la tabla nueva.
   end;
  if combobox1.Text = 'Servicios' then
  begin
  datasource9.DataSet:= Table8;  // tabla servicios
   Table2.Insert; // inserta un campo
   Table2Cod_prodser.Value:= Table5Cod_servcio.Value; // el campo cod_servicio de la tabla nueva es igual al de la tabla3
   Table2Codigo.Value:= Table5Codigo.Value;
   Table2Descripcion.Value:= Table5Servicio.Value;
   Table2Cantidad.Value:= StrToFloat(Edit1.Text);  // cantidad cargada por el usuario
   Table2Importunidad.Value:= Table5ImpServ.Value;
   Table2TotalImp.Value:=Table2Cantidad.Value * Table2Importunidad.Value;
   Table2ID_Factura.Value:=Table1Cod_detalleFactura.value + 1; // Nº del detalle factura + 1 correspondiente a la tabla factura
   Table2.Post; // guarda el dato en la tabla nueva.
   end;
  calcula;
end;
Boton de nueva factura
Código Delphi [-]
procedure TForm14.BitBtn1Click(Sender: TObject);  // nueva factura,
begin
Table1.Open;
Table1.Last;
Table2.Open;
Table2.Last;
Table7.Open;
Table7.Last;
Table1.insert;
Table1.Edit;
if Table2.IsEmpty then   //verifica la carga del nº de factura
Application.MessageBox('Seleccione el cliente'+ #13'Cargue los Items a Facturar'+ #13 +'Luego pulse Nueva Factura','¡ATENCION!',Mb_OK + Mb_IconWarning)
else
begin
Table2.Refresh;
with Form14.Query1 do
  begin
   Close;
   SQL.Clear;
   SQL.Add('INSERT INTO detfacturafinal');
   SQL.Add('SELECT * FROM detfactura');
   ExecSQL;
  end;
    BitBtn1.Enabled := false;
    SpeedButton4.Enabled:=true;
    PageControl1.ActivePage := TabSheet2;
end;
end;
botón de guardar
Código Delphi [-]
procedure TForm14.SpeedButton4Click(Sender: TObject);
begin
Table1.Last;
k:=Table1.FieldByName('Cod_factura').AsInteger;//para incrementar el numero de la factura
k:=k+1;
Table7.Edit;
Table7.Post;//guardo la tabla detallefacturafinal
  Table1.Edit;
  Table1.FieldByName('Cod_factura').AsInteger:=k;
  Table1Cod_productserv.Value:=Table7Cod_prodser.Value;
  Table1Cod_detalleFactura.Value:=Table7ID_factura.Value;//asigno el numero de detallefacturafinal a factura
  Table1Cod_cliente.Value:=Table8Cod_prop.Value;
  Table1Fecha.Value:=Now();
  Table1Descuento.Value:=StrToFloat(Edit3.Text);
  Table1Incremento.Value:=StrToFloat(Edit4.Text);
  Table1Total.Value:=StrToFloat(Edit5.Text);
  Table1.Post; //guardo factura 
BitBtn1.Enabled := true;
SpeedButton4.Enabled:=false;
Table7.Refresh;
Table1.Refresh;
end;
continuo intentando, ya saldra, si alguien ve que estoy haciendo mal, me avisa por favor ^\||/ gracias.

oscarac 02-09-2013 22:57:59

no he revisado todo el post
pero me atrevo a darte un consejo
cuando uses componentes de tablas (AdoTable por ejemplo)
trate de colocarle un nombre para que sea mas facil identificarlo
ejemplo

table4 x TblProductos
table8 x TblServicios

DOS 05-09-2013 00:59:30

OK lo voy a tener en cuenta ^\||/ pero todavia no lo solucione:(

DOS 07-12-2014 19:36:59

Despues de mas de un año, sigo tan perdido como siempre, nunca termino de funcionar bien y ni iquiera se si vale la pena revivirlo, pero siempre me quede con las ganas de que funcione, creo que tiene un tonto error en alguna parte y yo no lo encuentro, asi que si alguien lo ve, me chifla por favor :D
al problema surge al apretar el boton guardar, aprarece el malefico, master record missing.

Código Delphi [-]
// Doble click para la carga de productos y servicios
procedure TForm14.DBGrid2DblClick(Sender: TObject);
begin
Table2.Filtered := False;
Table2.Close;
Table7.Close;
Table2.Open;
Table7.Open;
Table7.Last;
Table7.Edit;
              Table1.Open;
              Table1.Last;
              Table1.Edit;
              c:=Table1Cod_detalleFactura.Asinteger;
   c:=c+1;
if combobox1.Text = 'Productos' then
  begin
   datasource5.DataSet:= Table4;  // tabla de productos
   Table2.Insert; // inserta un campo
   Table2Cod_prodser.Value:= Table4Cod_prod.Value; // el campo cod_prod de la tabla nueva es igual al de la tabla5
   Table2Codigo.Value:= Table4Codigo.Value;
   Table2Descripcion.Value:= Table4Descripcion.Value;
   Table2Importunidad.Value:= Table4ImpVent.Value;
   Table2Cantidad.Value:= StrToFloat(Edit1.Text);  //cantidad cargada por el usuario
   Table2TotalImp.Value:=Table2Cantidad.Value * Table2Importunidad.Value;   // multiplica la cantidad por el valor unitario
   Table2ID_Factura.Value:=c; //incremento el numero del codigo
   Table2.Post; // guarda el dato en la tabla nueva.
   end;
  if combobox1.Text = 'Servicios' then
  begin
  datasource9.DataSet:= Table8;  // tabla servicios
   Table2.Insert; // inserta un campo
   Table2Cod_prodser.Value:= Table5Cod_servcio.Value; // el campo cod_servicio de la tabla nueva es igual al de la tabla3
   Table2Codigo.Value:= Table5Codigo.Value;
   Table2Descripcion.Value:= Table5Servicio.Value;
   Table2Cantidad.Value:= StrToFloat(Edit1.Text);  // cantidad cargada por el usuario
   Table2Importunidad.Value:= Table5ImpServ.Value;
   Table2TotalImp.Value:=Table2Cantidad.Value * Table2Importunidad.Value;
   Table2ID_Factura.Value:=c; // Nº de factura
   Table2.Post; // guarda el dato en la tabla nueva.
   end;
  calcula;
end;

Código Delphi [-]
// boton nueva factura,
procedure TForm14.BitBtn1Click(Sender: TObject);
begin
          k:=0;
          Table1.Open;     //factura
          Table1.Last;
          Table2.Open;  //det. factura
          Table2.Last;
          Table7.Open;    //det. factura final
          Table7.Last;
           //Table1.insert;
          Table1.Edit;
          Table2.Edit;
          k:=Table1.FieldByName('Cod_factura').AsInteger;
          k:=k+1;  // incrementa el numero del afactura
if Table2.IsEmpty then   //verifica la carga del nº de factura
Application.MessageBox('Seleccione el cliente'+ #13'Cargue los Items a Facturar'+ #13 +'Luego pulse Nueva Factura','¡ATENCION!',Mb_OK + Mb_IconWarning)
else
begin
Table2.Refresh;
with Form14.Query1 do  //pasa de la tabla temporal a la de detalle final
  begin
   Close;
   SQL.Clear;
   SQL.Add('INSERT INTO detfacturafinal');
   SQL.Add('SELECT * FROM detfactura');
   ExecSQL;
  end;
    BitBtn1.Enabled := false;
    SpeedButton4.Enabled:=true;
    PageControl1.ActivePage := TabSheet2;

             l:=Table7.FieldByName('Cod_prodser').AsInteger;
             l:=l+1;
end;

end;

Código Delphi [-]
//Guarda la tabla factura
procedure TForm14.SpeedButton4Click(Sender: TObject);
begin
Table7.Edit;
Table7.Post; //det. factura final
  Table1.Edit;
                   Table1.Insert;
  Table1.FieldByName('Cod_factura').AsInteger:=k;
  Table1Cod_productserv.Value:=l;
  Table1Cod_detalleFactura.Value:=c;
  Table1Cod_cliente.Value:=Table8Cod_propi.Value;
  Table1Fecha.Value:=Now();
  Table1Descuento.Value:=StrToFloat(Edit3.Text);
  Table1Incremento.Value:=StrToFloat(Edit4.Text);
  Table1Total.Value:=StrToFloat(Edit5.Text);
  Table1.Post;
BitBtn1.Enabled := true;
SpeedButton4.Enabled:=false;
Table7.Refresh;
Table1.Refresh;
PageControl1.ActivePage := TabSheet1;
end;

tabla detalle factura temporal IDEM detalle factura final
ID_factura
Cod_prodser
Codigo
Descripcion
Importunidad
Cantidad
TotalImp

Tabla Factura
Cod_factura
Cod_detalleFactura // ID_factura
Cod_productserv
Cod_cliente
Fecha
Descuento
Incremento
Total

si a alguien se le ocurre algo gracias ^\||/

Casimiro Noteví 07-12-2014 19:54:07

Cita:

Empezado por DOS (Mensaje 486245)
tabla detalle factura temporal IDEM detalle factura final

ID_factura
Cod_prodser
Codigo
Descripcion
Importunidad
Cantidad
TotalImp

Tabla Factura
Cod_factura
Cod_detalleFactura // ID_factura
Cod_productserv
Cod_cliente
Fecha
Descuento
Incremento
Total

¿Pero no eran tablas iguales?

DOS 07-12-2014 20:01:12

hola, si las tablas iguales eran detalle de factura (la temporal) y detalle de factura final, luego copio esos datos mas los otros mostrados en la tabla, a la tabla factura.
entonces queda una detalle de factura y otra factura, gracias.

Casimiro Noteví 07-12-2014 20:04:59

¿Por qué no lo haces todo en sql?, es más simple, fácil y rápido.

DOS 07-12-2014 20:19:38

no dudo que tengas razon, pero esto esta en un 95% diria yo y solo salta ese problema, con lo cual estaria todo solucionado, solo que no lo encuentro:( lo otro seria para mi empesar todo nuevamente y ver que errores me van surgiendo

Casimiro Noteví 07-12-2014 20:30:24

Ya, te entiendo, pero es que así (como has podido comprobar en tanto tiempo) es casi imposible poder ayudar.
Para empezar: ¿Dónde exactamente sale el error, en qué línea?, ¿has depurado el programa paso a paso para encontrarlo?

DOS 07-12-2014 20:34:40

Tenes razon, deberia intentar sql en el boton de guardar, agradeceria si me tiras una idea como para empezar, por otra parte , no se como se depura el programa y solo puedo decir que el error salta al apretar el boton guardar la tabla factura, que ahi esta la codificacion.

Casimiro Noteví 07-12-2014 20:39:09

Pues pones un breakpoint justo al entrar en esa parte del programa, donde aprietas el botón guardar. Luego vas paso a paso, línea a línea.
No lo recuerdo de memoria, creo que era F5 para poner el breakpoint y luego F7 para avanzar a la siguiente línea. Mira el menú "Debug" de delphi :p


La franja horaria es GMT +2. Ahora son las 11:16:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi