Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Problema con Dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=25640)

aurbano 28-09-2005 22:06:12

Problema con Dbgrid
 
Amigos Buenas Tardes.


Agradeceria de su ayuda ya que soy un novato programando en Delphi y quiero aprender mas. Abajo les describo el problema.


Estoy trabajando con un dbgrid relacionado a una datasource1 y este a su vez esta relacionado a un table1 (auxiliar de compras). Tengo una tabla2 en la cual voy a grabar los registros de la tabla1 pero no los guarda bien ya que un registro reemplaza otro:

el codigo que estoy utilizando es el siguiente:

table2.insert;
table2.fieldbyname(`serial´):= dbgrid1.fields[0].asinteger;
//////asi con cada uno de los registros.
table2.post



AL INTRODUCIR EN EL DBGRID1 TABLA 1 (AUXILIAR D COMPRAS)SerialNro. FacturaDescripcionCantidadCosto/unitarioivaCosto/total22288003541jgo CABLES10 25.000 35.000 285.000 22288013541ROLINERA10 35.000 49.000 399.000 22288023541CABLES PARA BUJIAS10 25.000 35.000 285.000 22288003542JGO. CABLES20 25.000 70.000 570.000 22288013542ROLINERA10 35.000 49.000 399.000 22288023542CABLES PARA BUJIAS10 25.000 35.000 285.000 22288033543RELE10 7.500 10.500 85.500 AL GRABAR EN LA TABLA NRO. 2 (COMPRAS)SerialNro. FacturaDescripcionCantidadCosto/unitarioivaCosto/total22288023541CABLES PARA BUJIAS10Bs 35.000 Bs 25.000 Bs 285.000 22288003542JGO. CABLES20Bs 70.000 Bs 25.000 Bs 570.000 22288013542ROLINERA10Bs 49.000 Bs 35.000 Bs 399.000 22288023542CABLES PARA BUJIAS10Bs 35.000 Bs 25.000 Bs 285.000 22288033543RELE10Bs 10.500 Bs 7.500 Bs 85.500 22288033543RELE10Bs 10.500 Bs 7.500 Bs 85.500 22288013541ROLINERA10Bs 49.000 Bs 35.000 Bs 399.000

marcoszorrilla 28-09-2005 22:37:48

Código Delphi [-]
  table2.insert;
  table2.fieldbyname('serial').AsInteger:=Tabla2.Fieldbyname('LoqueSea').AsInteger;
 //////asi con cada uno de los registros.
  table2.post

Un Saludo.

aurbano 29-09-2005 22:08:21

Problema con dbgrid.
 
Marcos muchas gracias por tu ayuda, pero ya lo intente. Tienes un email para enniarte el codigo fuente para ver si me puedes ayudar y me indiques en donde falle..


Gracias.

vtdeleon 30-09-2005 01:39:16

Saludos

Cita:

1 pero no los guarda bien ya que un registro reemplaza otro:
....
table2.insert;
table2.fieldbyname(`serial´):= dbgrid1.fields[0].asinteger;
//////asi con cada uno de los registros.
table2.post
Estás seguro de que es el verdadero código que tienes, ya que esto, al compilar, da error. Seguro que sí

Alfonso Jurado 30-09-2005 12:22:53

Hazlo de tabla a tabla
 
Por qué no pruebas a hacer esto (supongo que son todos los registros de tabl2):
Código Delphi [-]
While not(table2.eof) do begin
 table2.insert;
 table2.fieldvalues['serial']:= table1.fieldvalues['serial'];.
 table2.post;
 table1.next;
end;

vtdeleon 30-09-2005 14:16:55

Saludos
Existe un pequeño error en el codigo de Alfonso en While, deberia ser:
Código Delphi [-]
While not(table1.eof) do begin
 table2.insert;
 table2.fieldvalues['serial']:= table1.fieldvalues['serial'];.
 table2.post;
 table1.next;
end;

También, recomiendo(asi lo hago) usar mejor FieldByName().As...., porque este tiene definido el tipo de datos

aurbano 30-09-2005 20:38:30

Problema con Dbgrid.
 
Okay voy a utilizar el codigo de vtdeleon a ver si funciona.

Gracias luego le aviso.

aurbano 01-10-2005 16:55:28

key violation
 
Me da ahora un error que se llama key violation. Como puedo solventar este error.


el codigo que utilizo es este:

Código Delphi [-]
unit Unit8;
 
 interface
 
 uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls, Buttons, ExtCtrls, Grids, DBGrids, DB, DBTables,
   RoundButton, Mask, DBCtrls;
 
 type
   TForm8 = class(TForm)
     Table1: TTable;
     DataSource1: TDataSource;
     DBGrid1: TDBGrid;
     Label1: TLabel;
     Panel1: TPanel;
     Label2: TLabel;
     Label3: TLabel;
     Label4: TLabel;
     Label5: TLabel;
     RoundButton2: TRoundButton;
     RoundButton1: TRoundButton;
     Label6: TLabel;
     Label7: TLabel;
     Label8: TLabel;
     Label9: TLabel;
     Label10: TLabel;
     DBEdit1: TDBEdit;
     DBEdit2: TDBEdit;
     DBEdit3: TDBEdit;
     DBEdit4: TDBEdit;
     DBEdit5: TDBEdit;
     Table2: TTable;
     DataSource2: TDataSource;
     DBEdit6: TDBEdit;
     Label11: TLabel;
     procedure DBGrid1KeyPress(Sender: TObject; var Key: Char);
     procedure RoundButton2Click(Sender: TObject);
     procedure RoundButton1Click(Sender: TObject);
     procedure DBEdit1KeyPress(Sender: TObject; var Key: Char);
   private
     { Private declarations }
   public
     { Public declarations }
   end;
 
 var
   Form8: TForm8;
 
 implementation
 
 uses
   Unit2, unit9;
 
 {$R *.dfm}
 
 procedure TForm8.DBGrid1KeyPress(Sender: TObject; var Key: Char);
 begin
   If Key = #13 then
   begin
     Table1.Edit;
     if Dbgrid1.Fields[0].Value<>Null then
     begin
       Form2.Table1.IndexFieldNames:='Ser_PRO';
       if Form2.Table1.FindKey([Dbgrid1.Fields[0]])=True then
       begin
         Dbgrid1.Fields[2].AsString:=Form2.Table1.FieldbyName('des_PRO').AsString;
         Dbgrid1.Fields[5].Ascurrency:= Dbgrid1.Fields[4].Ascurrency * (14/100)* Dbgrid1.Fields[3].Asfloat;
         Dbgrid1.Fields[6].Ascurrency:= Dbgrid1.Fields[3].Asfloat * Dbgrid1.Fields[4].Ascurrency
           + Dbgrid1.Fields[5].Ascurrency;
         Dbgrid1.Fields[0].FocusControl;
         Table1.First;
         Label3.Caption := '0';
         Table1.First;
         while Table1.Eof = false do
         Begin
           Label3.Caption := FloatToStr(Table1.FieldByName('costo/total').AsFloat + StrToFloat(Label3.Caption));
           Label5.Caption := floattostr(table1.fieldbyname('IVA').ascurrency+ StrToFloat(Label5.Caption));
           table1.edit;
           TABLE1.POST;
           TABLE1.NEXT;
         end;
       end
       else
         ShowMessage('Producto no encontrado');
       Dbgrid1.Fields[0].FocusControl;
     end;
   end;
 end;
 
 procedure TForm8.RoundButton2Click(Sender: TObject);
 begin
   table1.edit;
   TABLE1.first;
   while table1.eof = false do
     table1.Delete;
   label3.caption:= '0';
   label5.Caption:= '0';
   dbgrid1.Fields[0].FocusControl;
 end;
 
 procedure TForm8.RoundButton1Click(Sender: TObject);
 begin
   table1.first;
   while table1.Eof=false do
   begin
     form2.Table1.FindKey([table1.fieldbyname('serial').asinteger]);
     form2.Table1.edit;
     form2.Table1.fieldbyname('exi_PRO').asfloat := form2.Table1.fieldbyname('exi_pro').asfloat
       + dbgrid1.Fields[3].asfloat;
     form2.Table1.FieldByName('iva_PRO').ascurrency:= form2.Table1.fieldbyname('prv_pro').AsCurrency * (14/100);
     form2.Table1.fieldbyname('prV_PRO').AsCurrency:= dbgrid1.Fields[4].ascurrency * (40/100)
       + dbgrid1.Fields[4].ascurrency;
     form2.Table1.Post;
     /// REGISTRO EN LA TABLA DE COMPRAS
     TABLE2.INSERT;
     table2.fieldbyname('fec_COM').asdatetime := date;
     table2.fieldbyname('ser_COM').asinteger := dbgrid1.Fields[0].AsInteger;
     table2.fieldbyname('Nro_fac').Asstring := dbgrid1.Fields[1].Asstring;
     table2.fieldbyname('Des_com').asstring := dbgrid1.Fields[2].Asstring;
     table2.fieldbyname('Can_com').asfloat := dbgrid1.Fields[3].Asfloat;
     table2.fieldbyname('Cun_com').ascurrency := dbgrid1.Fields[4].Ascurrency;
     table2.fieldbyname('IVA_com').ascurrency := dbgrid1.Fields[5].Ascurrency;
     table2.fieldbyname('Cot_com').ascurrency := dbgrid1.Fields[6].Ascurrency;
     table2.fieldbyname('RIF_com').asstring := dbedit1.Field.AsString;
     table2.fieldbyname('nom_com').asstring := dbedit2.Field.AsString;
     table2.fieldbyname('nit_com').asinteger := dbedit3.Field.Asinteger;
     table2.fieldbyname('dir_com').asstring := dbedit4.field.AsString;
     table2.fieldbyname('tel_com').asstring := dbedit5.Field.AsString;
     table2.post;
     table1.Next;
   end;
 END;
 
 procedure TForm8.DBEdit1KeyPress(Sender: TObject; var Key: Char);
 begin
   If Key = #13 then
   begin
     TABLE1.EDIT;
     if dbedit1.Field.Value<>Null then
     begin
       Form9.Table1.IndexFieldNames:='rif_prv';
       if Form9.Table1.FindKey([Dbedit1.Field])=TRUE then
       begin
         Dbedit2.Field.AsString:=Form9.Table1.FieldbyName('nom_prv').AsString;
         Dbedit3.Field.Asinteger:=Form9.Table1.FieldbyName('Nit_prv').Asinteger;
         Dbedit4.Field.Asstring:=Form9.Table1.FieldbyName('Dir_prv').asstring;
         Dbedit5.Field.AsString:=Form9.Table1.FieldbyName('tel_prv').AsString;
         Dbedit1.Field.FocusControl;
       end;
     end;
   end;
 end;
 
 end.

vtdeleon 01-10-2005 18:20:02

Saludos

El código se me hace un poco difícil de leer.

En que parte del código te da el error.

Usa las etiquetas [delphi] [ /delphi]por favor.

marcoszorrilla 01-10-2005 22:15:49

Key Violation, quiere decir que estás repitiendo un campo clave, es decir que el registro que estás dando de alta ya existe en la clave primaria que tiene esa tabla.

Un Saludo.

aurbano 03-10-2005 16:27:44

problema con dbgrid.
 
Ok. Marcos el problema se origina de la siguiente manera:



Cuando marco con asterico cualquier campo de la tabla ventas, me da ese error. Cuando no coloco ningun campo clave en la tabla no me lo da.

Como hago para exigir una referencia integral en el database desktop, si la tabla ventas no le puedo colocar un campo clave.

Por ejemplo en la tabla inventario tengo el campo Ser_pro que es el serial del producto marcado como clave primaria.

en la tabla ventas tengo el campo ser_ven que es el serial del producto a vender y este no lo puedo marcar como clave primaria porque me da el key violation.


Gracias...

marcoszorrilla 03-10-2005 17:53:02

Por lo que deduzco tienes la tabla y además datos y ahora pretentendes establecer ciertas reglas, claves....

El asunto es que esto debe de hacerse con las tablas vacias para evitar que exista alguna incoerencia en los datos y nos impidan poner las reglas, que precisamente son para evitar éstas.

Sino estoy deduciendo mal, lo que tienes que hacer antes de intentar poner una clave única es una consulta de valores repetidos para eliminarlos ya que sino te va a ser imposible establecer la clave.

Por otra parte cuando ningún campo pueda ser cadidato a clave primaria, se crea uno a dichos efectos, que aunque no es lo más aconsejable puede ser un autoincrementado.

Un Saludo.

aurbano 04-10-2005 16:02:27

problema con dbgrid
 
Ok. marcos si me puedes explicar como haria para establecer una consulta de valores repetidos, para despues de establecer la clave.


Gracias y disculpa.

vtdeleon 04-10-2005 19:04:28

Saludos

Con sentencias SQL
Código SQL [-]
select distinct campo
FROM tabla WHERE campo In (SELECT campo FROM 
tabla As Tmp GROUP BY campo HAVING Count(*)>1)

aurbano 05-10-2005 17:25:58

ayuda con dblookupcombobox
 
Buenos dias.

Estoy trabajando con un dblookupcombobox, y no se despliega la lista de los registros. He relacionado el Datasourse y el datafield con una tabla pero no se funciona.


Si me puedes explicar porque tengo entendido que el dblookupcombobox despliega una lista de valores de una tabla para modificar otra.

Gracias.

Lepe 06-10-2005 13:11:41

Tienes que configurar la lista desplegable (de donde quieres que se muestren los valores)

Imagina 2 Tablas Cliente y Albaran, en el albaran se guarda el codigo del cliente, y ahora quieres que se muestre el codigo y el nombre del cliente en el albaran:

DataSource: Albaran
DataField: AlbaranIdCliente
ListSource: Clientes
ListField: codigo;NombreCliente
ListIndex: 1
KeyField: codigo

si dicho DBlookup está en la ventana de albaranes, mostrará en la lista desplegable el codigo y nombre del cliente.

Cuando eliges con el ratón un cliente, en el Editor del combo se muestra el NombreCliente, (lo indica el ListIndex, pon ese a 0 y verás los cambios). Además se guarda en la tabla Albaran, en el campo AlbaranIdCliente, el código del cliente elegido.

Espero se entienda.

aurbano 06-10-2005 18:29:02

probema con dblookupcombobox.
 
Gracias lepe por tu ayuda. me funciono.

Si alguien del foro me me puede ayudar ya que tengo un problema.


EL DBLOOKUPCOMBOBOX QUE ESTOY UTILIZANDO ESTA RELACIONADO EN EL LISTSOURCE CON LA TABLA CLIENTES UN CAMPO LLAMADO RIF_CLI. EN EL DATASOURCE TENGO RALACIONADO LA TABLA VENTAS UN CAMPO LLAMADO RIF_COM. EN EL FORMULARIO TENGO UNOS DBEDITS TODOS RELACIONADOS CON LA TABLA CLIENTES. TAMBIEN EN EL FORMULARIO TENGO UN DBGRID RELACIONADO A LA TABLA VENTAS.


EL PROBLEMA RADICA ES QUE CUANDO GUARDO LOS REGISTROS DE LA TABLA VENTA Y LA TABLA CLIENTES QUEDA DE LA SIGUIENTE FORMA:

RIF_CLI NOM_CLI DES_COM PUN_COM PTO_COM
PEDRO P. BUJIAS 35.000,00 70.000,00
12.745.722


PORQUE NO ME GUARDA EL CAMPO RIF_CLI EN EL REGISTRO INICIAL, SINO QUE LA GUARDA EN EL REGITRO SIGUIENTE. COMO HAGO PARA QUE LA GUARDE EN LA POSICION INICIAL.

EL CODIGO QUE UTILIZO ES EL SIGUIENTE:


procedure TForm8.RoundButton2Click(Sender: TObject);
begin
table1.edit;
TABLE1.first;
while table1.eof = false do
table1.Delete;
label3.caption:= '0';
label5.Caption:= '0';
dbgrid1.Fields[0].FocusControl;
end;

procedure TForm8.RoundButton1Click(Sender: TObject);
begin
table1.first;
while table1.Eof=false do
begin
form2.Table1.FindKey([table1.fieldbyname('serial').asinteger]);
form2.Table1.edit;
form2.Table1.fieldbyname('exi_PRO').asfloat := form2.Table1.fieldbyname('exi_pro').asfloat
+ dbgrid1.Fields[3].asfloat;
form2.Table1.FieldByName('iva_PRO').ascurrency:= form2.Table1.fieldbyname('prv_pro').AsCurrency * (14/100);
form2.Table1.fieldbyname('prV_PRO').AsCurrency:= dbgrid1.Fields[4].ascurrency * (40/100)
+ dbgrid1.Fields[4].ascurrency;
form2.Table1.Post;
/// REGISTRO EN LA TABLA DE COMPRAS
TABLE2.INSERT;
table2.fieldbyname('fec_COM').asdatetime := date;
table2.fieldbyname('ser_COM').asinteger := dbgrid1.Fields[0].AsInteger;
table2.fieldbyname('Nro_fac').Asstring := dbgrid1.Fields[1].Asstring;
table2.fieldbyname('Des_com').asstring := dbgrid1.Fields[2].Asstring;
table2.fieldbyname('Can_com').asfloat := dbgrid1.Fields[3].Asfloat;
table2.fieldbyname('Cun_com').ascurrency := dbgrid1.Fields[4].Ascurrency;
table2.fieldbyname('IVA_com').ascurrency := dbgrid1.Fields[5].Ascurrency;
table2.fieldbyname('Cot_com').ascurrency := dbgrid1.Fields[6].Ascurrency;
table2.fieldbyname('RIF_com').asstring := dbedit1.Field.AsString;
table2.fieldbyname('nom_com').asstring := dbedit2.Field.AsString;
table2.fieldbyname('nit_com').asinteger := dbedit3.Field.Asinteger;
table2.fieldbyname('dir_com').asstring := dbedit4.field.AsString;
table2.fieldbyname('tel_com').asstring := dbedit5.Field.AsString;
table2.post;
table1.Next;
end;
END;




GRACIAS.

vtdeleon 06-10-2005 18:52:07

Wow, creo que la parte donde expones el código te llevó mucho tiempo hacer (poner colores, negritas) con las Etiquetas vB evitas esto. Date una vuelta por ahí.
Ej: Tu código solo con las etiquetas
Código Delphi [-]
procedure TForm8.RoundButton2Click(Sender: TObject);
begin
  table1.edit;
  TABLE1.first;
  while not table1.eof do
    table1.Delete;
  label3.caption:= '0';
  label5.Caption:= '0';
  dbgrid1.Fields[0].FocusControl;
end;

procedure TForm8.RoundButton1Click(Sender: TObject);
begin
  table1.first;
  while not table1.Eof do
  begin 
    with form2.table1 do
    begin
      FindKey([fieldbyname('serial').asinteger]);
      edit;
      fieldbyname('exi_PRO').asfloat :=
          fieldbyname('exi_pro').asfloat + dbgrid1.Fields[3].asfloat;
      FieldByName('iva_PRO').ascurrency:=       
      fieldbyname('prv_pro').AsCurrency * (14/100);
      fieldbyname('prV_PRO').AsCurrency:= dbgrid1.Fields[4].ascurrency * (40/100)
            + dbgrid1.Fields[4].ascurrency;
      Post;
    end;//form2
/// REGISTRO EN LA TABLA DE COMPRAS
    with TABLE2 do begin 
      INSERT;
      fieldbyname('fec_COM').asdatetime := date;
      fieldbyname('ser_COM').asinteger := dbgrid1.Fields[0].AsInteger;
      fieldbyname('Nro_fac').Asstring := dbgrid1.Fields[1].Asstring;
      fieldbyname('Des_com').asstring := dbgrid1.Fields[2].Asstring;
      fieldbyname('Can_com').asfloat := dbgrid1.Fields[3].Asfloat;
      fieldbyname('Cun_com').ascurrency := dbgrid1.Fields[4].Ascurrency;
      fieldbyname('IVA_com').ascurrency := dbgrid1.Fields[5].Ascurrency;
      fieldbyname('Cot_com').ascurrency := dbgrid1.Fields[6].Ascurrency;
      fieldbyname('RIF_com').asstring := dbedit1.Field.AsString;
      fieldbyname('nom_com').asstring := dbedit2.Field.AsString;
      fieldbyname('nit_com').asinteger := dbedit3.Field.Asinteger;
      fieldbyname('dir_com').asstring := dbedit4.field.AsString;
      fieldbyname('tel_com').asstring := dbedit5.Field.AsString;
      post;
    end;//table2
  table1.Next;
  end;//While
END;//procedure
Hice algunas mejoritas no mu reelevantes;)
Pd:Para codigos delphi usa [ delphi][ /delphi] (sin los espacio entre corchete)
Nt:Se me hace un rollo esto del ident:(

aurbano 07-10-2005 16:17:30

problema con dblookupcombobox
 
Muchas gracias vtdeleon por la informacion pero como resuelvo lo del dblookupcombobox, planteado en la pregunta anterior.

Lepe 07-10-2005 17:26:17

El problema es que no veo el campo RIF_CLI en ninguna parte del código, sin embargo está el RIF_COM. Aún tratandose de RIF_COM no puedo saber lo que hay en dbedit1.Field.AsString, así que no puedo responder.


vtdeleon al pasar el código a las etiquetas + las modificaciones olvidaste pasar el "Table1.next" al final del bucle, algo que fastidió la última neurona que me quedaba ;) :p

saludos


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

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