Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error en Codigo SQL en consulta a base de datos Access (https://www.clubdelphi.com/foros/showthread.php?t=83741)

feliz-58 19-07-2013 23:05:51

Guardar registros de facturacion en base de datos access
 
Saludos amigos,

Tenia una incógnita, cuando hacemos un programa que tiene un modulo de facturación, y esos registros de facturas quieren guardarlos luego, como le hacen para que el campo que dice descripción, cantidad y precio unitario, sean independientes y se pueda guardar en un registro de la base de datos, porque ya saben que a veces se pueden facturar hasta tres cosas, cual seria la mejor forma de hacerlo?

Saludos, Gracias. :confused: :) :)

Caral 20-07-2013 00:15:02

Hola
Hay muchas formas de hacerlo.
Te aconsejo que veas ESTE tutorial de facturación que hice para novatos y cualquier duda la puedes comentar aqui.
Saludos
Nota: con vuestro permiso.

feliz-58 22-07-2013 20:57:56

Caral
 
Cita:

Empezado por Caral (Mensaje 464176)
Hola
Hay muchas formas de hacerlo.
Te aconsejo que veas ESTE tutorial de facturación que hice para novatos y cualquier duda la puedes comentar aqui.
Saludos
Nota: con vuestro permiso.

Vi el Tutorial, pero hay muchas cosas que no puedo hacerlas igual, porque hay muchas cosas que en este programa no iran, como el impuesto, itebis, sub-total, etc.

Me gustaria ir paso a paso contigo adaptandolo al mio, crees que me puedas ayudar?, ya lo iba intentando pero no tengo un basto conocimiento de delphi y por lo tanto no pude, crees que sea posible que me ayudes?

Es sos, tengo que hacerlo antes del jueves :( :confused:

Casimiro Notevi 22-07-2013 21:23:48

Imagina que estudias medicina y vienes preguntando: "¿cómo se hace una operación de corazón y de cerebro?", por favor, ayúdenme rápido, que el jueves tengo que operar a un paciente. :eek:

Que nadie caiga en tus manos ;)

feliz-58 22-07-2013 21:58:39

Gracias
 
Cita:

Empezado por Casimiro Notevi (Mensaje 464258)
Imagina que estudias medicina y vienes preguntando: "¿cómo se hace una operación de corazón y de cerebro?", por favor, ayúdenme rápido, que el jueves tengo que operar a un paciente. :eek:

Que nadie caiga en tus manos ;)


Gracias, tu sarcasmo es muy Motivador :) :D

Casimiro Notevi 22-07-2013 22:45:35

Es que tu pregunta es muy ambigua y tiene una contestación muy amplia que depende de infinidad de factores. Deberías de "acotar" exactamente lo que necesitas, porque un módulo de facturación puede ser algo tan básico como una simple tabla o una gestión completa. De lo primero a lo segundo hay una diferencia enorme.
Básicamente lo que tú quieres son 2 tablas, una de cabeceras (resúmenes, maestro, o como quieras llamarla) y la otra de líneas de facturas (detalles, cliente, o como quieras llamarla)

Tabla cabecera, con los campos: id, numero, fecha, cliente, ...
Tabla lineas, con los campos: id, id_cabecera, articulo, cantidad, precio, ...

Así cada cabecera tiene un id único, y las líneas enlazan con su cabecera mediante el campo id_cabecera.

Eso es lo más básico. A partir de ahí, todo lo que quieras.

feliz-58 22-07-2013 23:03:58

Error en Codigo SQL en consulta a base de datos Access
 
lo he intentado adaptar a mi programa y asi es mas o menos como me quedo, pero me da un error: Error de Sintaxis en la instrucción INSERT INTO

la tabla de datos esta en access y tiene los siguientes campos:
CodFactura
fecha
CodCliente
CodArticulo
Descripción
Cantidad
MontoTotal

el código es el siguiente:

Código Delphi [-]
Var
  a,b,c : real;
begin
 a:= StrTofloat(cantidad.Text);
 b:= StrTofloat(preciounitario.Text);
 c:= a * b;
 total.Text:= floatToStr(c);
 qry1.SQL.Text := 'Insert into Factura values ('+QuotedStr(CodFactura.Text)+', :fecha, '+QuotedStr(CodCliente.Text)+ ', '+QuotedStr(CodArticulo.Text)+ ', '+Descripcion.Caption+ ', '+
             QuotedStr(Cantidad.Text)+ ', '+QuotedStr(Total.Text);
 qry1.Parameters.ParamByName('fecha').Value:= DateToStr(Dtp1.Date);
 qry1.ExecSQL;

end;

Casimiro Notevi 22-07-2013 23:09:20

Por favor, no abras otro hilo para seguir con el mismo tema, gracias.

feliz-58 22-07-2013 23:15:25

Cita:

Empezado por Casimiro Notevi (Mensaje 464265)
Por favor, no abras otro hilo para seguir con el mismo tema, gracias.

Es diferente, pero ok Carimiro, Por lo menos responde si puedes.

mcs 22-07-2013 23:21:11

Cambía el código:

Código Delphi [-]
qry1.SQL.Text := 'Insert into Factura (CodFactura, Fecha, CodClient, CodArticulo, Descripcion, Cantidad, MontoTotal) '+
  'VALUES (:CodFactura, :Fecha, :CodClient, :CodArticulo, :Descripcion, :Cantidad, :MontoTotal)';
qry1.ParamByName('CodFactura').AsString := CodFactura.Text;
qry1.ParamByName('Fecha').AsDate := Dtp1.Date;
qry1.ParamByName('CodClient').AsString := CodClient.Text;
qry1.ParamByName('CodArticulo').AsString := CodArticulo.Text;
qry1.ParamByName('Descripcion').AsString := Cantidad.Text;
qry1.ParamByName('MontoTotal').AsString := Total.Text;
qry1.ExecSQL;

Así indicas exactamente cuales campos quieres insertar (los nombres entre paréntesis antes del VALUES) e insertas los valores usando parámetros (los nombres de campo con el ":" delante).

Por otra parte, si lo que quieres es guardar una factura, vas por el mal camino. Tal cómo te ha dicho Casimiro, debes usar dos tablas distintas:
- Factura, con los valores CodFactura, Fecha y CodCliente
- LíneaFactura, con los valores CodFactura (para enlazar con la tabla Factura), CodArtículo, Cantidad y Total.

De esta forma, una factura puede tener muchos productos, y tal cómo lo has hecho tu, cada factura sólo puede tener un producto de venta. Por otra parte, creo que deberías guardar en la línea de la factura el precio del producto, pero esto es lo de menos.

Casimiro Notevi 22-07-2013 23:25:38

Hombre, si estás hablando del tutorial de Caral y haces una pregunta sobre el código del tutorial de Caral, entonces es el mismo tema :)
Por cierto, no es código SQL, es Delphi ;)

Para poder ayudarte con el error, tendría que saber exactamente el contenido de esas variables y componentes, porque seguramente ahí está el error, por ejemplo (por intentar adivinar algo), que un valor numérico lleva la coma decimal, eso variará la sentencia.

Cuando tengas que pasar valores a una sentencia sql desde delphi, lo ideal es hacerlo con parámetros, en lugar de componer toda la sentencia, te ahorrarás errores y dolores de cabeza.

EDITO: tal y como ha explicado mcs

feliz-58 22-07-2013 23:31:02

Cita:

Empezado por mcs (Mensaje 464267)
Cambía el código:

Código Delphi [-]
qry1.SQL.Text := 'Insert into Factura (CodFactura, Fecha, CodClient, CodArticulo, Descripcion, Cantidad, MontoTotal) '+
  'VALUES (:CodFactura, :Fecha, :CodClient, :CodArticulo, :Descripcion, :Cantidad, :MontoTotal)';
qry1.ParamByName('CodFactura').AsString := CodFactura.Text;
qry1.ParamByName('Fecha').AsDate := Dtp1.Date;
qry1.ParamByName('CodClient').AsString := CodClient.Text;
qry1.ParamByName('CodArticulo').AsString := CodArticulo.Text;
qry1.ParamByName('Descripcion').AsString := Cantidad.Text;
qry1.ParamByName('MontoTotal').AsString := Total.Text;
qry1.ExecSQL;

Así indicas exactamente cuales campos quieres insertar (los nombres entre paréntesis antes del VALUES) e insertas los valores usando parámetros (los nombres de campo con el ":" delante).

Por otra parte, si lo que quieres es guardar una factura, vas por el mal camino. Tal cómo te ha dicho Casimiro, debes usar dos tablas distintas:
- Factura, con los valores CodFactura, Fecha y CodCliente
- LíneaFactura, con los valores CodFactura (para enlazar con la tabla Factura), CodArtículo, Cantidad y Total.

De esta forma, una factura puede tener muchos productos, y tal cómo lo has hecho tu, cada factura sólo puede tener un producto de venta. Por otra parte, creo que deberías guardar en la línea de la factura el precio del producto, pero esto es lo de menos.

tengo 3 tablas, la del cliente, la del articulo y la de factura, entones cual seria la forma correcta de hacerlo?

Observa
Cliente
CodCliente
Nombre
Telefono
Celular
Direccion
E-mail

Articulo
CodArticulo
Fecha
Descripcion
Cantidad
Precio de Venta

Factura
CodFactura
Fecha
CodCliente
CodArticulo
descripcion
Cantidad
total

Como lo haria?

mcs 22-07-2013 23:43:10

Cita:

Empezado por feliz-58 (Mensaje 464270)
tengo 3 tablas, la del cliente, la del articulo y la de factura, entones cual seria la forma correcta de hacerlo?

Observa
Cliente
CodCliente
Nombre
Telefono
Celular
Direccion
E-mail

Articulo
CodArticulo
Fecha
Descripcion
Cantidad
Precio de Venta

Factura
CodFactura
Fecha
CodCliente
CodArticulo
descripcion
Cantidad
total

Como lo haria?

Cliente y Artículo es correcto. Lo que tienes que separar es factura y línea factura, tal cómo te he dicho antes:

- Factura, con los valores CodFactura, Fecha y CodCliente
- LíneaFactura, con los valores CodFactura (para enlazar con la tabla Factura), CodArtículo, Cantidad y Total.

feliz-58 22-07-2013 23:45:28

Cita:

Empezado por mcs (Mensaje 464267)
Cambía el código:

Código Delphi [-]
qry1.SQL.Text := 'Insert into Factura (CodFactura, Fecha, CodClient, CodArticulo, Descripcion, Cantidad, MontoTotal) '+
  'VALUES (:CodFactura, :Fecha, :CodClient, :CodArticulo, :Descripcion, :Cantidad, :MontoTotal)';
qry1.ParamByName('CodFactura').AsString := CodFactura.Text;
qry1.ParamByName('Fecha').AsDate := Dtp1.Date;
qry1.ParamByName('CodClient').AsString := CodClient.Text;
qry1.ParamByName('CodArticulo').AsString := CodArticulo.Text;
qry1.ParamByName('Descripcion').AsString := Cantidad.Text;
qry1.ParamByName('MontoTotal').AsString := Total.Text;
qry1.ExecSQL;

Así indicas exactamente cuales campos quieres insertar (los nombres entre paréntesis antes del VALUES) e insertas los valores usando parámetros (los nombres de campo con el ":" delante).

Por otra parte, si lo que quieres es guardar una factura, vas por el mal camino. Tal cómo te ha dicho Casimiro, debes usar dos tablas distintas:
- Factura, con los valores CodFactura, Fecha y CodCliente
- LíneaFactura, con los valores CodFactura (para enlazar con la tabla Factura), CodArtículo, Cantidad y Total.

De esta forma, una factura puede tener muchos productos, y tal cómo lo has hecho tu, cada factura sólo puede tener un producto de venta. Por otra parte, creo que deberías guardar en la línea de la factura el precio del producto, pero esto es lo de menos.

Me da este error:
[Error] Unit7.pas(133): Undeclared identifier: 'ParamByName'
[Error] Unit7.pas(133): Missing operator or semicolon

feliz-58 22-07-2013 23:47:03

Cita:

Empezado por mcs (Mensaje 464271)
Cliente y Artículo es correcto. Lo que tienes que separar es factura y línea factura, tal cómo te he dicho antes:

- Factura, con los valores CodFactura, Fecha y CodCliente
- LíneaFactura, con los valores CodFactura (para enlazar con la tabla Factura), CodArtículo, Cantidad y Total.

y Luego? soy novato:

entonces serian 4 tablas?

Caral 23-07-2013 00:00:46

Hola
no llevo el siguimiento de lo que estas o quieres hacer.
lo mejor es poner en un zip el programa como lo tienes con la bd incluida y dar una explicacion detallada de lo que necesitas.
saludos

mcs 23-07-2013 00:01:24

Cita:

Empezado por feliz-58 (Mensaje 464272)
Me da este error:
[Error] Unit7.pas(133): Undeclared identifier: 'ParamByName'
[Error] Unit7.pas(133): Missing operator or semicolon

No sé qué componentes usas. Podría ser que entre el qry1 y el ParamByName debas incluir "Parameters". O sea:

Código Delphi [-]
qry1.Parameters.ParamByName("variable").AsString := valor;

Y respecto a lo de "y después", pues no sé... Creo que estás empezando la casa por el tejado. Si quieres aprender bién, descargate "La Cara Oculta de Delphi 6" (http://commanet.blogspot.com.es/2010...-delphi-6.html) y estudíatelo a fondo. Así aprenderás cómo funciona Delphi, el acceso a datos y las bases de datos.

Casimiro Notevi 23-07-2013 00:03:01

Cita:

Empezado por feliz-58 (Mensaje 464273)
y Luego? soy novato:
entonces serian 4 tablas?

feliz-58, lo de "soy novato" es la excusa típica. Así no se aprende, porque se supone que quieres aprender, tienes que mirar código, leer, escribir, probar, dedicar una cantidad casi infinita de tiempo. Ya digo, suponiendo que quieras aprender porque vayas a dedicarte a estas cosas.

Lo que pretendes es como querer aprender a nadar sin tirarte al agua, es imposible. O aprender a montar en bicicleta sin montar en bicicleta. No se puede.

feliz-58 23-07-2013 00:05:36

Cita:

Empezado por Casimiro Notevi (Mensaje 464277)
feliz-58, lo de "soy novato" es la excusa típica. Así no se aprende, porque se supone que quieres aprender, tienes que mirar código, leer, escribir, probar, dedicar una cantidad casi infinita de tiempo. Ya digo, suponiendo que quieras aprender porque vayas a dedicarte a estas cosas.

Lo que pretendes es como querer aprender a nadar sin tirarte al agua, es imposible. O aprender a montar en bicicleta sin montar en bicicleta. No se puede.

cuando yo lo publico es que estoy arto de probar y probar y no llego a la solución, no me rindo tan fácil pero cuando pongo algo que no entiendo es porque he buscado y no encuentro!

puse lo de novato porque cuando te explican la solucion no son tan explicitos con los terminos, y por lo tanto tengo que a la solucion buscarle las mil y una formas para usarla!

Gracias!

feliz-58 23-07-2013 01:05:01

Cita:

Empezado por Caral (Mensaje 464275)
Hola
no llevo el siguimiento de lo que estas o quieres hacer.
lo mejor es poner en un zip el programa como lo tienes con la bd incluida y dar una explicacion detallada de lo que necesitas.
saludos

aqui esta el proyecto, es en el form de facturacion.

Mi proyecto

este codigo en el boton de guardar

Código Delphi [-]
Var
  a,b,c : real;
begin
 a:= StrTofloat(cantidad.Text);
 b:= StrTofloat(precio.Text);
 c:= a * b;
 total.Text:= floatToStr(c);
 qry1.SQL.Text := 'Insert into Factura (CodFactura, Fecha, CodCliente, CodArticulo, Descripcion, Cantidad, Total) '+
  'VALUES (:CodFactura, :Fecha, :CodCliente, :CodArticulo, descripcion, :Cantidad, :Total)';
qry1.Parameters.ParamByName('CodFactura').AsString := CodFactura.Text;
qry1.Parameters.ParamByName('Fecha').AsDate := Dtp1.Date;
qry1.Parameters.ParamByName('CodClient').AsString := CodClient.Text;
qry1.Parameters.ParamByName('CodArticulo').AsString := CodArticulo.Text;
qry1.Parameters.ParamByName('Descripcion').AsString := lbl9.Text;
qry1.Parameters.ParamByName('Cantidad').AsString := Cantidad.Text;
qry1.Parameters.ParamByName('Total').AsString := Total.Text;
qry1.ExecSQL;
end;
gracias


La franja horaria es GMT +2. Ahora son las 22:14:13.

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