FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
ayuda con tabla en delphi
tengo un sistema venta de articulos y en una dbgrid es donde el usuario pone los productos que quiere comprar, tengo una tabla donde se guarda el precio total de articulos vendidos y su fecha de venta, y otra tabla donde tengo el nombre del producto vendido,su clave ,precio etc... pero mi problema es que cada que quiero guardarlos en la tabla lo unico que hace es guardar un solo registro, si digamos el usuario compra mas de 2 articulos , en la tabla solo se guardara el ultimo producto ..alguien podria ayudarme este es el codigo que tengo para hacer esto:
//Registro los productos vendidos en la tabla producto1. Table3.Edit; Table3.Insert; Table3.FieldByName('clave').AsFloat := Table1.FieldByName('clave').AsFloat ; Table3.FieldByName('cantidad').AsFloat := Table1.FieldByName('cantidad').AsFloat ; Table3.FieldByName('precio').AsFloat := Table1.FieldByName('precio').AsFloat ; Table3.FieldByName('producto').AsString := Table1.FieldByName('producto').AsString ; Table3.FieldByName('Fecha').AsDateTime := Date; Table3.Post; con esto guardo la ultima linea del dbgrid, osea el producto de esa linea pero si digamos tengo 10 productos(10 columnas en el dbgrid) solo guardara la numero 10... |
#3
|
|||
|
|||
no sirvio..
me sigue apareciendo lo mismo aun con el
table3.append; me dijeron que alomejor lo que tenia que poner era un autoincrement, no se si sera eso pero no se como hacerlo, igual anexo todo el script que uso en el boton alomejor eso sirve para que se den una idea: procedure TForm3.BitBtn1Click(Sender: TObject); var Cambio : Real; Cadena : String; begin Cambio := StrToFloat(Edit1.Text) - StrToFloat(Label3.Caption); //Verifico que el pago sea correcto if Cambio >= 0 then begin //Mando un mensaje dando gracias y el cambio si es que hay. if Cambio = 0 then ShowMessage('GRACIAS POR SU COMPRA') Else begin Cadena := 'CAMBIO $'; Cadena := Cadena + FloatToStr(round((cambio*100))/100); Cadena := Cadena + ' GRACIAS POR SU COMPRA'; ShowMessage(Cadena); end; //Descuento los productos vendidos en el almacen. Table1.First; While Table1.Eof = False do begin Form2.Table1.FindKey([Table1.FieldByName('Clave').AsInteger]); Form2.Table1.Edit; Form2.Table1.FieldByName('Cantidad').AsInteger := Form2.Table1.FieldByName('Cantidad').AsInteger - Form3.Table1.FieldByName('Cantidad').AsInteger; Form2.Table1.Post; Table1.Next; end; //Registro los productos vendidos en la tabla producto1. Table3.Append; Table3.FieldByName('clave').AsFloat := Table1.FieldByName('clave').AsFloat ; Table3.FieldByName('cantidad').AsFloat := Table1.FieldByName('cantidad').AsFloat ; Table3.FieldByName('precio').AsFloat := Table1.FieldByName('precio').AsFloat ; Table3.FieldByName('producto').AsString := Table1.FieldByName('producto').AsString ; Table3.FieldByName('subtotal').AsFloat := Table1.FieldByName('subtotal').AsFloat ; Table3.FieldByName('Fecha').AsDateTime := Date; Table3.Post; //Registro la venta en la tabla Ventas. Table2.Edit; Table2.FieldByName('Ingreso').AsFloat := Table2.FieldByName('Ingreso').AsFloat + StrToFloat(Label3.Caption); Table2.Post; BitBtn2.Click; Dbgrid1.Fields[0].FocusControl; end else begin ShowMessage('El Pago es menor al total a pagar'); Edit1.SetFocus; end; end; |
#4
|
|||
|
|||
hola
Saludos!!
Para empezar te diré que sería mucho más cómodo (para tí y para nosotros), si a tustablas en vez de Table1, Table2 ... le pusieras Artículos, Stock, Ventas, etc ... con los nombres actuales si te alejas algún tiempo del proyecto y luego lo retomas nuevamente estarás totalmente ) Bueno me parece que sí, que puedes tener un problema con la clave de Table3, sería muy útil que nos comentaras con que motor de bases de datos estás trabajando, y la estructura de la tabla. Si la estructura es del tipo: Campo1 <- clave primaria Campo2 Campo3 ... tendrás problemas con la linea:
Debido a que le estarás asignando la misma clave primaria a varios campos de Table3, que dependiendo del motor y aveces de la estructura te puede generar una excepción o sobreescribirte el registro con esa clave!! Como te habían dicho por ahí de pronto se puede solucionar con campos autonuméricos, pero necesitamos los datos que te digo arriba. |
#5
|
|||
|
|||
batallo un poco poniendo cambiando los nombres de las tablas por que me reborujo, mira es un programa de ventas, en el primer form tengo el menu principal, con 4 botones(salir,almacen,ventas y reportes)
el boton almacen me lleva al form 2 que es donde guardo, modifico o elimino los productos en la tabla1 que es la tabla de inventario(es diferente esta tabla a la tabla1 del form3) donde en esta tabla tengo clave----campo llave producto cantidad precio medida(si es litro,kilo etc) minimo(cant minima de prod ) **** todas las tablas son echas en paradox 7 en el form 3 tengo lo que son las ventas donde tengo un dbgrid donde es que se ponen los productos para vender,podiendo agregar,eliminar,etc todos los productos en el, tengo 3 tablas table1.- es la tabla auxiliar (donde se guardan los productos vendidos pero al finalizar la compra se borran de la tabla) table2.-es la tabla ventas(donde se almacena el monto total y la fecha) table3.- es la tabla productos(donde se van a guardar los productos vendidos) entonces con lo que me comentabas que puedo tener error la table1 y la table3 tienen los mismos campos (tambien el mismo campo llave) |
#6
|
|||
|
|||
Arturo_ te: ayuda con tabla en delphi
En la segunda table para guardar mas productos lo que tienes que hacer es sensillo: Antes de ingresar un nuevo producto debes dar un Table2.Append para que el sistema le asigne una nueva posición de registro a tu prodcuto.
Ejemplo: // Aqui se inserta un nuevo registro para un nuevo producto // Si la tabla esta vacia toma el primer registro por defecto // Si no esta vacia inserta un nuevo registro if (Table2.RecordCount <> 0) then Table2.Append Table2.Edit Table2.FieldByName('Productp').AsString := 'xxxxx'; Table2.Post Claro esta que tienes que tener bien enlazadas las tablas: Tabla1 y Tabl22 Cuando ingreses un nuevo registro usa el evento BeforPost en el cual tienes que extraer el ultimo el valor del ultimo registro y sumarle 1 para el nuevo registro. He publicado una rutina en Tables Planas 'Maximo Valor para un Nuevo Registro', esto te servira si lo usas de la manera correcta. Ejemplo: Evento -> BeforePost procedure TForm_BeEMPPRJ.Table2BeforePost(DataSet: TDataSet); begin if (Table2.State = dsInsert) then begin Table2.Value := Table1.FieldByName('LINK_0001').AsFloat; ASSEMBLY_RECORD_MaxKey(Table2, 'LINK_0002'); // Init_VALUES_TABLE Table2Edit; if (Table2Producto.IsNULL) then Table2Producto.Value := ''; end; end; // Versión: 10.0000 - © 1980, 2006 For Tables DELPHI SERVER .DB // Ejecutar en: El Evento <Table.BeforePos> **** // Función que Extrae el Valor Maximo para un Nuevo Registro Key // Con este Procedimiento ya no se Necesita Utilizar las Tablas: // Ejemplos: // Form_DDBTLM.ASSEMBLY_RECORD_MaxKey(Table_NN, 'LINK_0001'); // Form_DDBTLM.ASSEMBLY_RECORD_MaxKey(Table_NN, 'LINK_0002'); // Form_DDBTLM.ASSEMBLY_RECORD_MaxKey(Table_NN, 'LINK_0003'); procedure TForm_BeEMPPRJ.ASSEMBLY_RECORD_MaxKey(var pmt_TABLE: TTable; pmt_FIELD: string); begin // Init_PROPERTIES if (Table_ARMK.Active) then Table_ARMK.Close; Table_ARMK.Filter := ''; Table_ARMK.Filtered := False; Table_ARMK.IndexFieldNames := ''; Table_ARMK.MasterFields := ''; Table_ARMK.MasterSource := nil; // Assign_PROPERTIES Table_ARMK.DatabaseName := pmt_TABLE.DatabaseName; Table_ARMK.SessionName := pmt_TABLE.SessionName; Table_ARMK.TableName := pmt_TABLE.TableName; Table_ARMK.MasterSource := pmt_TABLE.MasterSource; Table_ARMK.MasterFields := pmt_TABLE.MasterFields; if (Table_ARMK.MasterFields = '') then Table_ARMK.IndexFieldNames := pmt_FIELD else Table_ARMK.IndexFieldNames := Table_ARMK.MasterFields + ';' + pmt_FIELD; // Open_TABLE Table_ARMK.Open; Table_ARMK.Last; // Load_RECORD_KEY if (Table_ARMK.RecordCount = 0) then pmt_TABLE.FieldByName(pmt_FIELD).AsFloat := 1 else pmt_TABLE.FieldByName(pmt_FIELD).AsFloat := Table_ARMK.FieldByName(pmt_FIELD).AsFloat + 1; // Close_TABLE Table_ARMK.Close; end; Claro esta que los enlaces LINK_0001 LINK_0002, LINK_0003 los uso de una forma dinamica para enlazar tablas paradox: Por ejemplo en tus dos tablas Tabla1 el Primary Key seria LINK_0001 Y en tu Table2 el Primary Key seria LINK_0002, claro esta que en la tabla2 el indice LINK_0001 seria el enlace con el indice LINK_0001 de la Tabla1. Espero que te sirva... Última edición por Arturo_ fecha: 13-07-2007 a las 23:05:45. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
ayuda con agregar datos a una tabla | zanyodark | Conexión con bases de datos | 1 | 21-05-2007 20:45:56 |
Ayuda con la busqueda en una tabla | mjjj | Conexión con bases de datos | 5 | 02-04-2007 23:48:12 |
Ayuda filtro tabla Access con ADO | jcheco | Conexión con bases de datos | 4 | 19-04-2006 10:30:54 |
Ayuda actualizar tabla | buffygcs | SQL | 4 | 15-04-2005 01:22:30 |
Ayuda con una tabla y sus consultas | CI>140 | Conexión con bases de datos | 1 | 12-09-2003 00:21:31 |
|