PDA

Ver la Versión Completa : ayuda con tabla en delphi


7pilas
10-07-2007, 08:23:42
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...

basti
10-07-2007, 09:18:26
Sólo tienes que sustituir

Table3.Edit;
Table3.Insert;

por

Table3.Append;

7pilas
10-07-2007, 09:56:48
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;

mamaro
12-07-2007, 14:10:12
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 :confused: )

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:

Table3.FieldByName('clave').AsFloat := Table1.FieldByName('clave').AsFloat ;

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!! :eek:

Como te habían dicho por ahí de pronto se puede solucionar con campos autonuméricos, pero necesitamos los datos que te digo arriba.

7pilas
13-07-2007, 07:52:55
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

Table3.FieldByName('clave').AsFloat := Table1.FieldByName('clave').AsFloat ;
la table1 y la table3 tienen los mismos campos (tambien el mismo campo llave)

Arturo_
13-07-2007, 23:01:43
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...

Delfino
14-07-2007, 12:35:15
Q componentes usas?
verifica las propiedades InsertSQL, RefreshSQL etc.

7pilas
15-07-2007, 08:56:27
aun soy nuevo en esto y no entiendo bien lo de

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;
no entiendo el funcionamiento de eso.....

NEOALEX00016
21-07-2007, 00:56:19
Mira No Te Lleves De Ningunos De Estos Programadores Barato Lo Que Tienes Que Hacer Para Que Se Te Grabe Todos Los Registro En Un Dbgrid Es Tener El La Tabla Maestro El Registro Index Y El La Tabla Detalles No Tener Ninguna Clave Primaria Le Pones A La Tabla Maestro Un Autoincrementar Y En El Dbgrid Pones Todos Los Campos Que Nesecitas(producto,costo,cantidad,subtotal)y Pones El Campo Factura Del Dbgrid Invisible Cuando Se Escriba El La Primera Celda Pones Que El Campo Que Esta Invisivle Sea Igual A El Numero De La Factura Que Te Genero La Tabla Maestro

mamaro
23-07-2007, 18:15:53
Mira No Te Lleves De Ningunos De Estos Programadores Barato...

creo que después de un comentario de esos ... no hace falta decir nada .. :rolleyes:

ptt
23-07-2007, 20:54:57
Mira No Te Lleves De Ningunos De Estos Programadores Barato


NEOALEX00016 creo que no faltará quien se sienta ofendido por tu desafortunado comentario.
Por otro lado te pido que escribas sin poner mayúsculas a todas las palabras ya que esto sumado a que no utilizas signos de puntuación hace bastante dificil e incómodo adivinar el sentido de tu mensaje.
Quizás te venga bien ver esto (http://www.clubdelphi.com/foros/guiaestilo.php)

marcoszorrilla
23-07-2007, 21:15:27
Mira No Te Lleves De Ningunos De Estos Programadores Barato Lo Que Tienes Que Hacer Para Que Se Te Grabe Todos Los Registro En Un Dbgrid Es Tener El La Tabla Maestro El Registro Index Y El La Tabla Detalles No Tener Ninguna Clave Primaria Le Pones A La Tabla Maestro Un Autoincrementar Y En El Dbgrid Pones Todos Los Campos Que Nesecitas(producto,costo,cantidad,subtotal)y Pones El Campo Factura Del Dbgrid Invisible Cuando Se Escriba El La Primera Celda Pones Que El Campo Que Esta Invisivle Sea Igual A El Numero De La Factura Que Te Genero La Tabla Maestro

En primer lugar, se han dado soluciones correctas y profesionales a la pregunta y tratar de programadores baratos a los compañeros que se han preocupado en elaborar dichas soluciones, debidamente etiquetadas para mejorar su presentación y entendimiento y con la sintáxias y ortografía que procede, me parece un dislate.

Creo que debes rectificar tu respuesta en lo que se refiere a la parte claramente ofensiva de la misma. Un mal momento lo tiene cualquiera pero hay que respetar a los compañeros.

En espera de que edites tu mensaje y retires la parte ofensiva pues en este Foro siempre han imperado los buenos modos y la educación entre compañeros y así deben seguir como siempre los buenos oficios y convivencia.

Un Saludo.

ContraVeneno
23-07-2007, 22:48:16
jejeje :D

y resulta que nosotros somos programadores baratos:

http://www.clubdelphi.com/foros/showpost.php?p=155897&postcount=5
http://www.clubdelphi.com/foros/showpost.php?p=156127&postcount=7

jojojo :D

NEOALEX00016
24-07-2007, 05:54:43
Les pido excusa si los ofendi, pero cuando estaba empezando me ubiera gustado que me explicaran las cosas mas clara por que aqui hay muchos programadores que te explican las cosa dificil de entender por eso es que aveces menojo hay que tratar de explicarle a los novatos (como yo tambien) las cosas lo mas simple posible

Faust
24-07-2007, 06:25:59
¿Con esas faltas de ortografía y de redacción :rolleyes: te atreves a decirnos que somos programadores baratos?

Mejor atrévete a leer la Guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php).

Estos foros son de ayuda a todos, ya sean principiantes o experimentados, y sin importar el nivel que tengamos creo que son útiles todas y cada una de las respuestas expuestas aquí, cada aportación de los foreros en la solución de una duda de un compañero tiene validez, si este foro tratará de pelearse por quién "cobra más" no creo que NEOALEX00016 quedara en primer lugar.

Ya lo decía Benito Juárez "El respeto al derecho ajeno es la paz"... y un agregado anónimo "... y la conservación de los dientes"

Un saludo a todos los compañeros del foro.

marcoszorrilla
24-07-2007, 07:05:48
Como quiera que ya ha pedido disculpas creo que lo mejor es dar por cerrado el asunto que espero sirva de ejemplo para no volverse a faltar entre compañeros pues cada uno aporta lo que puede y unas veces puede que por una parte no se expliquen bien las cosas pero también ocurre que aun estando bien explicadas no se entienden por las razones que fuere.

Seguimos con la programación que es nuestro tema. Ya puestos recordamos una par de consejos:

Escribir todo en mayúsculas equivale a chillar.
Por respeto a los demás hay que esmerarse un poco en la redacción de nuestras preguntas.
Las respuestas posibles son puro altruismo entre compañeros, por lo tanto no podemos exigir prontitud ni mucho menos urgencia.

Un Saludo.