PDA

Ver la Versión Completa : ¿Cómo "sacar" la existencia de un producto?


Yare
22-02-2013, 06:30:36
Hola soy nueva aquí en el foro, aunque lo sigo bastante... También en Delphi soy novata...
Por ahora estoy haciendo un control de inventarios... Pero tengo el problema de que no puedo mostrar la
existencia por producto... No sé como hacerlo...
Tengo la tabla de existencia
-Código_barras
-Cantidad

Ventas
-Código_barras
-Cantidad
....y los demás campos

Compras
-Código_barras
-Cantidad
....Y más campos


Entonces lo que quiero es que en la forma de ventas me muestre la existencia en un dbedit...
Por la venta que ejecute en ese rato, o sea por código... :confused:

Yare
22-02-2013, 07:15:25
Puse está sentencia en el interactive de ib console y la ejecute en un query... sin embargo de un producto por ejemplo, vendí 1 pieza y tenia 2 pero en el stock me devuelve un 6

Select (sum(registro.Cantidad)-Sum(ventas.Cantidad)) as stock From registro, ventas where registro.codigo_barras = ventas.codigo_barras


¿Alguien que pueda ayudarme?

Además lo que pongo en ese DBEDIT lo quiero guardar en la BD pero creo que por ser un Query no me deja... :confused:

ecfisa
22-02-2013, 07:54:05
Hola Yare.

Paciencia, paciencia que no hay muchos deambulando a esta hora... :)

Agrega al form:

Un TIBQuery, (o el equivalente en los componentes que uses) que le daremos por nombre: Tu_Query.
Un TDataSource asociado al query que denominaremos: dsQuery.
Un TDBEdit para ir mostrando la existencia.

Las asignaciones de los ejemplos siguientes podes realizarlas desde el Object Inspector en tiempo de diseño; para darle más claridad lo hago por código .

Si ya tenes actualizadas las existencias en tabla EXISTENCIA:

procedure TForm.FormCreate(Sender: TObject);
begin
with Tu_Query do
begin
DataSource:= dsVentas; // TDataSource asociado a tabla VENTAS
Close;
SQL.Clear;
SQL.Add('SELECT CANTIDAD AS STOCK FROM EXISTENCIA');
SQL.Add('WHERE CODIGO_BARRAS = :CODIGO_BARRAS'); // (*)
Open;
end;
DBEdit1.DataSource:= dsQuery;
DBEdit1.DataField := 'STOCK';
end;


Si no tenes actualizadas las existencias en la tabla EXISTENCIA, podes obtenerlas restando a el campo CANTIDAD de la tabla COMPRAS el campo CANTIDAD de la tabla VENTAS. Para lo que habría que cambiar un poco la consulta:

procedure TForm1.FormCreate(Sender: TObject);
begin
with Tu_Query do
begin
DataSource:= dsVentas; // TDataSource asociado a tabla VENTAS
Close;
SQL.Clear;
SQL.Add('SELECT TC.CANTIDAD - TV.CANTIDAD AS STOCK');
SQL.Add('FROM COMPRAS TC, VENTAS TV');
SQL.Add('WHERE TC.CODIGO_BARRAS = TV.CODIGO_BARRAS');
SQL.Add('AND TV.CODIGO_BARRAS = :CODIGO_BARRAS'); // (*)
Open;
end;
DBEdit1.DataSource:= dsQuery;
DBEdit1.DataField := 'STOCK';
end;

De ambos modos mientras te vayas desplazando por los diferentes artículos mostrará la existencia en el TDBEdit.

(*) Es indispensable que lo que sigue a los ':' (CODIGO_BARRAS) sea exáctamente el nombre del campo de la tabla VENTAS. Y que la propiedad DataSource del query apunte al TDataSource asociado a la tabla VENTAS para que se vaya mostrando la existencia al desplazarse por la misma.

Saludos.

Yare
22-02-2013, 17:55:54
Gracias por responder de verdad, es un embrollo total... Siento que es tan sencillo, pero las existencias no me salen... :confused:

with Modulo_datos.Ds_Tabla_existencias do
begin
Modulo_datos.Ds_Tabla_existencias:= Modulo_datos.Ds_tabla_ventas;
Close;
SQL.Clear;
SQL.Add('SELECT registro.CANTIDAD - ventas.CANTIDAD AS STOCK');
SQL.Add('FROM registro, ventas');
SQL.Add('WHERE registro.CODIGO_BARRAS = ventas.CODIGO_BARRAS');
SQL.Add('AND ventas.CODIGO_BARRAS = :CODIGO_BARRAS');
Open;
end;
DBEdit1.DataSource:= Modulo_datos.Ds_Tabla_existencias;
DBEdit1.DataField := 'STOCK';
end;



Y me marca como error: Undeclared identifier "SQL" ..... Missing Operator Semicolon...

Revise los punto y coma pero no funciono.

¿Me podrían auxiliar? :o

ecfisa
22-02-2013, 18:11:08
Hola Yare.
[SIZE="4"][
Y me marca como error: Undeclared identifier "SQL" ..... Missing Operator Semicolon...


¿ Que componente es Modulo_datos.Ds_Tabla_existencias ? Juego mi cabeza que no es un query...

También sería muy útil que nos menciones que componentes estas usando (IBX,ADO,etc).

Por favor cuando incluyas código en tus mensaje usa etiquetas para darle más legibilidad, esta imágen explica el uso:

http://img403.imageshack.us/img403/3461/75416396.jpg
(Ya las agregué a tu mensaje)

Saludos.:)

ElDioni
22-02-2013, 18:11:45
Prueba así


begin
Modulo_datos.Ds_Tabla_existencias:= Modulo_datos.Ds_tabla_ventas;
Modulo_datos.Ds_Tabla_existencias.Close;
Modulo_datos.Ds_Tabla_existencias.SQL.Clear;
Modulo_datos.Ds_Tabla_existencias.SQL.Add('SELECT registro.CANTIDAD - ventas.CANTIDAD AS STOCK');
Modulo_datos.Ds_Tabla_existencias.SQL.Add('FROM registro, ventas');
Modulo_datos.Ds_Tabla_existencias.SQL.Add('WHERE registro.CODIGO_BARRAS = ventas.CODIGO_BARRAS');
Modulo_datos.Ds_Tabla_existencias.SQL.Add('AND ventas.CODIGO_BARRAS = :CODIGO_BARRAS');
Modulo_datos.Ds_Tabla_existencias.Open;
DBEdit1.DataSource:= Modulo_datos.Ds_Tabla_existencias;
DBEdit1.DataField := 'STOCK';
end;


Saludos.

ElDioni
22-02-2013, 18:14:13
Hola Yare.


¿ Que componente es Modulo_datos.Ds_Tabla_existencias ? Juego mi cabeza que no es un query...



Pues si, ahora que lo dices...

Yare
22-02-2013, 18:35:23
Cierto no un un Query estoy mandando llamar a la tabla de existencias.... por medio del datasource...

Uso componentes: Ttable y Tdatasource en el Data Module...
Estoy usando IBconsole como manejador de base datos...

Lo que pasa es que mandé llamar al Query, y tuve el problema de que me decía que no existe el código_barras...

Modulo_datos.Ds_Tabla_existencias corresponde a el datasource de la tabla de existencias....

Yare
22-02-2013, 18:46:04
Hola, gracias por ayudarme... Me marca errores también... No entiendo porque me sale el error, que no tengo declarado SQL o la sentencia close... Por que sucederá eso???


Prueba así


begin
Modulo_datos.Ds_Tabla_existencias:= Modulo_datos.Ds_tabla_ventas;
Modulo_datos.Ds_Tabla_existencias.Close;
Modulo_datos.Ds_Tabla_existencias.SQL.Clear;
Modulo_datos.Ds_Tabla_existencias.SQL.Add('SELECT registro.CANTIDAD - ventas.CANTIDAD AS STOCK');
Modulo_datos.Ds_Tabla_existencias.SQL.Add('FROM registro, ventas');
Modulo_datos.Ds_Tabla_existencias.SQL.Add('WHERE registro.CODIGO_BARRAS = ventas.CODIGO_BARRAS');
Modulo_datos.Ds_Tabla_existencias.SQL.Add('AND ventas.CODIGO_BARRAS = :CODIGO_BARRAS');
Modulo_datos.Ds_Tabla_existencias.Open;
DBEdit1.DataSource:= Modulo_datos.Ds_Tabla_existencias;
DBEdit1.DataField := 'STOCK';
end;


Saludos.

ecfisa
22-02-2013, 20:15:31
Hola Yare.

Uso componentes: Ttable y Tdatasource en el Data Module..
Ahora vamos mejor... Sabiendo que estas usando BDE, la sintáxis de la consulta para un TQuery cambia un poco:

procedure TForm1.FormCreate(Sender: TObject);
begin
with Tu_Query do
begin
DataSource:= dsVentas; // TDataSource asociado a tabla VENTAS
Close;
SQL.Clear;
SQL.Add('SELECT "COMPRAS".CANTIDAD - "VENTAS".CANTIDAD AS STOCK');
SQL.Add('FROM COMPRAS , VENTAS');
SQL.Add('WHERE "COMPRAS".CODIGO_BARRAS = "VENTAS".CODIGO_BARRAS');
SQL.Add('AND "VENTAS".CODIGO_BARRAS = :CODIGO_BARRAS'); // (*)
Open;
end;
DBEdit1.DataSource:= dsQuery;
DBEdit1.DataField := 'STOCK';
end;


Saludos.

Yare
22-02-2013, 23:13:08
Muchísimas gracias de verdad... Si funcionó... Todavía no puedo creerlo, duré muchos días entrando al Club pero no se me ocurrió preguntar... Me ha ayudado muchísimo... EFICSA.... he aprendido algo nuevo de verdad... Espero pronto llegar a saber así....

Y una última pregunta... Por ser un Query, no lo puedo mostrar en un Qreport? :D


Estoy feliz!!!!

Yare
22-02-2013, 23:28:24
Ya pude hacerlo, me equivoqué en cuanto a la selección del Query....

estoy muy contenta, me sale todo perfectamente... Gracias a todos por ayudarme... :D



Gracias infinitas de todo corazón!