PDA

Ver la Versión Completa : restar existencias de mysql


edgar_prospero
20-09-2012, 21:44:24
que hay amigos traigo un buen problema que no encuentro ni por donde empezar, resulta que estoy usando clientdataset para guardar informacion en mi tabla, tratare de explicar lo que hace o intenta hacer el programita; hay una tabla que se llama productos los cuales traigo y los voy metiendo a un dbgrid y cuando son los registros qe necesito medianteun boton los guardo en una tabla llamada venta hasta ahi todo bien mi problema esta en que en productos tengo un campo llamada existencias que por decir tengo 90 de un producto entonces lo que quiero hacer es que al guardar 1 producto en mi tabla ventas se descuente de productos de mi tabla productos no se si me explico o puse mucho rollo y no me di a entender jeje ojala me puedan orientar

ecfisa
20-09-2012, 22:11:34
Hola Edgar.

Si no entendí mal la situación, podrías actualizar la existencia en la tabla productos luego de guardar el registro en la tabla ventas, por ejemplo:


procedure TForm1.DataSetVentasAfterPost(DataSet: TDataSet);
begin
with DataSetProductos do
begin
Edit;
FieldByName('EXISTENCIAS').Value := FieldByName('EXISTENCIAS').Value-
DataSetVentas.FieldByName('CANTIDAD').Value;
Post;
end;
end;


Saludos. :)

edgar_prospero
20-09-2012, 23:31:44
lo intente de esa manera pero me marca el siguiente error clientdatasetproductos : field 'existencia' not found a que se debera??

Casimiro Notevi
20-09-2012, 23:44:40
Sustituye "existencias" por el nombre que tenga el campo de tu tabla, ¿stock?, ¿cantidad?, etc.

edgar_prospero
20-09-2012, 23:48:10
es que asi se llama el campo en mi tabla de productos 'existencia' no se que estoy haciendo mal, tengo un clientdataset para productos y un clientdataset para venta no se si ahi este correcto

Casimiro Notevi
21-09-2012, 00:18:02
es que asi se llama el campo en mi tabla de productos 'existencia'

Pues en el ejemplo no pone "existencia', pone 'existencias'.

edgar_prospero
21-09-2012, 00:23:12
fue un error de dedo pero si es 'existencia' mira este es mi codigo un poco mas completo con el que voy a agregando los registros que necesito al dbgrid:

procedure TForm4.codigoKeyPress(Sender: TObject; var Key: Char);
var Total: double;
begin
if Key = #13 then
begin

query2.Close;
query2.SQL.Text := 'select * from productos where codigo=:codigo';
query2.Params[0].Value := codigo.Text;

query2.Open;


descripcion.Text := query2.FieldByName('descripcion').asString;
precio.Text := query2.FieldByName('precio').asString;
existencia.Text := query2.FieldByName('existencia').asString;

form4.clientdataset1.Append;

form4.clientdataset1['codigo'] := codigo.Text;
form4.clientdataset1['descripcion'] := descripcion.Text;
form4.clientdataset1['precio'] := precio.Text;
form4.clientdataset1['cantidad'] := cantidad.Text;
form4.clientdataset1['folio'] := folio.Text;
form4.clientdataset1['fecha'] := fecha.Date;
form4.clientdataset1['subtotal'] := floatToStr( StrTofloat(cantidad.Text) * StrTofloat(precio.Text) );

form4.clientdataset1.Post;



query2.Close;
query2.SQL.Text:='SELECT folio FROM venta ORDER BY folio ASC LIMIT 1';
query2.Open;
folio.text := floatToStr( StrTofloat(folio.Text) + StrTofloat(numero.Text)) ;



ClientDataSet1.First;
while not ClientDataSet1.eof do begin
total := total + clientdataset1.FieldByName('subtotal').AsFloat;

ClientDataSet1.Next;
end;

total2.Caption := FormatFloat('#,##0.00', total);




begin
if Key = #13 then
begin
Key := #0;
Perform(WM_NEXTDLGCTL, 0, 0);
codigo.SetFocus;
end
end;
end;


y este es mi codigo para guardar esos datos mediante un boton:

procedure TForm4.BitBtn2Click(Sender: TObject);
begin
clientdataset1.ApplyUpdates(0);

showmessage('grabado con exito ');

ClientDataSet1.EmptyDataSet;
end;

Casimiro Notevi
21-09-2012, 00:50:22
No sé cómo tienes organizado el proyecto, pero el evento keypress está para controlar teclas pulsadas, yo no lo usaría para hacer búsquedas, guardar registros, actualizar, etc.

Y de todas formas no has hecho lo que te ha aconsejado ecfisa.

edgar_prospero
21-09-2012, 00:57:44
el evento evento keypress lo tengo para meter el numero de codigo y al darle enter me traigo la oinformacion de la base de datos de mis productos y si hice lo que me dijo eficsa pero me marca el error que mencionaba anteriormente clientdatasetproductos : field 'existencia' not found y si existe ese campo

Casimiro Notevi
21-09-2012, 01:07:03
el evento evento keypress lo tengo para meter el numero de codigo y al darle enter me traigo la oinformacion de la base de datos de mis productos y si hice lo que me dijo eficsa pero me marca el error que mencionaba anteriormente clientdatasetproductos : field 'existencia' not found y si existe ese campo

Me vas a perdonar, pero si un compilador dice: clientdatasetproductos : field 'existencia' not found, entonces es que no existe, él no se equivoca ;)

De todas formas, dices que has puesto el código de ecfisa, pero como tampoco lo has mostrado aquí... pues es difícil ayudar, tenemos que estar "adivinando" qué has puesto exactamente.

edgar_prospero
21-09-2012, 01:11:20
pues mira tal vez el compilador no se equivoque pero yo estoy seguro que en mi base de datos en la tabla productos esta un campo llamado 'existencia ' asi que por mas que no se equivoque el compilador yo estoy seguro a lo mejor el problema va por otro lado. y del codigo que mencionas de efica no lo puseporque al mencionarmelo tu daba por hecho que lo habias visto pero de todas formas aqui esta no hay problema en agregarlo de nuevo y de una vez lo agrego como lo puse yo:


procedure TForm1.clientdataset1AfterPost(DataSet: TDataSet);
begin
with clientdataset2 do
begin
Edit;
FieldByName('existencia').Value := FieldByName('existencia').Value - clientdataset1.FieldByName('cantidad').Value;
Post;
end;
end;

roman
21-09-2012, 01:55:21
Y, ¿se puede saber a qué dataset están conectados los clientdatasets?

// Saludos

edgar_prospero
21-09-2012, 01:58:18
esta un tmyconection, cliendataset a este agregado un datasetprovider y aqui agregado un tmyquery y un datasource al cual esta conectado al clientdataset1

roman
21-09-2012, 02:00:12
Eso no nos sirve de nada. Sólamente estás describiendo en términos generales como se conectan los distintos componentes. Lo que estoy preguntando es a qué dataset en específico está conectado. Si es a un query, ¿cuál es la consulta SQL de ese query?

// Saludos

edgar_prospero
21-09-2012, 02:05:15
:D pues creo que estoy muy verde porque no entiendo bien tu pregunta pero tratare de responderte amigo y es que como te dije anteriormente el clientdataset esta conectado a un datasetprovider y este esta conectado a un query y de la consulta no se a cual te refieres pero tengo una que dice select * from productos where codigo=codigo, no se si puedes orientarme un poco mas en lo que me preguntas

roman
21-09-2012, 02:09:48
Pues no :confused:. Sinceramente si tú no sabes a qué está conectado tu ClientDataSet, entonces, no sólo es imposible que los demás lo sepamos, sino que poco futuro tienes en esta aplicación. ¡A espabilarse!

// Saludos

edgar_prospero
21-09-2012, 02:11:11
gracias por los buenos deseos

edgar_prospero
21-09-2012, 02:17:42
EL SIN FUTURO COMENTA:
y es que mi clientdataset lo uso para agregar registros temporalmente de la tabla productos y ya despues esos productos los guardo en otra tabla llamada ventas mediante un boton pero ya que tengo los registros en mi dbgrid que voy a necesitar guardar.
esta es la forma como los agrego al dbgrid y obvio temporalmente al cliendataset


form4.clientdataset1.Append;

form4.clientdataset1['codigo'] := codigo.Text;
form4.clientdataset1['descripcion'] := descripcion.Text;
form4.clientdataset1['precio'] := precio.Text;
form4.clientdataset1['cantidad'] := cantidad.Text;
form4.clientdataset1['folio'] := folio.Text;
form4.clientdataset1['fecha'] := fecha.Date;
form4.clientdataset1['subtotal'] := floatToStr( StrTofloat(cantidad.Text) * StrTofloat(precio.Text) );

form4.clientdataset1.Post;



y para guardar esa informacion que tengo en el dbgrid utilizo:

clientdataset1.ApplyUpdates(0);

showmessage('grabado con exito ');

ClientDataSet1.EmptyDataSet;

pero pues creo que no me di a entender muy bien y pues desgraciadamente tampoco te pude entender lo que me preguntabas espero llegar a ser grande como tu amigo

Casimiro Notevi
21-09-2012, 02:22:06
No sirve que digas que has puesto un clientdatset, un datasetprovider, un label, ... y así puedes decirnos cien mil millones de componentes que se te ocurra poner en el formulario, que si no sabemos los parámetros, las sentencias, las propiedades, las "uniones" entre ellos, etc.

Si quieres ayudas... tienes que ayudarnos.
Debes detallarnos las tablas y campos involucrados, los componentes de acceso a datos con sus correspondientes sentencias, la relación entre ellos, todo el código fuente que puedas proporcionarnos (a ser posible el proyecto completo), explicaciones claras y concisas, etc.

Es que no podemos adivinar, ya te lo ha dicho Román y ya lo comenté varios mensajes más arriba, no somos adivinos.

Compréndelo, aunque queramos ayudar... ¡no podemos!

Casimiro Notevi
21-09-2012, 02:23:31
form4.clientdataset1.Append;
form4.clientdataset1['codigo'] := codigo.Text;
form4.clientdataset1['descripcion'] := descripcion.Text;
form4.clientdataset1['precio'] := precio.Text;
form4.clientdataset1['cantidad'] := cantidad.Text;
form4.clientdataset1['folio'] := folio.Text;
form4.clientdataset1['fecha'] := fecha.Date;
form4.clientdataset1['subtotal'] := floatToStr( StrTofloat(cantidad.Text) * StrTofloat(precio.Text) );
form4.clientdataset1.Post;



Y el clientdatset2, ¿qué tiene?

edgar_prospero
21-09-2012, 02:34:22
el clientdataset2 es el que estoy tratando de usar para actualizar mi tabla productos segun yo pero es donde estoy confundido ya me perdi un poco con esto y espero y me tengan paciencia, pues aqui adjunto lo que llevo del proyecto para que puedan orientarme bien y decirme todos mis errores

Casimiro Notevi
21-09-2012, 02:42:01
Entonces el código que ha puesto ecfisa te tiene que servir perfectamente.
Tienes que hacer click en el clientdataset1, luego en el inspector de objetos vas a la pestaña "eventos" y en el AfterPost le das doble click.
Se verá algo así:
procedure TForm1.clientdataset1AfterPost(DataSet: TDataSet);
begin

end;

Y debes escribir lo tecleado por ecfisa;

Quedando así:

procedure TForm1.clientdataset1AfterPost(DataSet: TDataSet);
begin
with clientdataset2 do
begin
Edit;
FieldByName('EXISTENCIAS').Value := FieldByName('EXISTENCIAS').Value - clientDataSet1.FieldByName('CANTIDAD').Value;
Post;
end;

Casimiro Notevi
21-09-2012, 02:45:44
Realmente confunde con esos nombres, procura siempre ponerle nombres claros, como ha hecho ecfisa, ya que clientdataset1, clientdataset2, etc. confunde y no sabes qué son cada uno, creo que yo me he confundido.
Debes renombrarlo como (ejemplo) cdsVentas, cdsProductos

Por cierto, en el afterpost, antes de actualizar el campo existencias, debes tener localizado el registro a actualizar.

ElMug
21-09-2012, 02:51:40
Edgar, tienes DOS datasets.

Asegurate que el cambio a Existencias lo mandes al dataset debido y que vaya a dar a la tabla Productos.

edgar_prospero
21-09-2012, 02:57:52
pues si hice eso amigo pero me marca el error de que clientdataset2:field 'existencia' not found tratare de ver porque me marca eso es que no se en donde esta mi error no se que me falte

edgar_prospero
21-09-2012, 03:08:21
acabo de leer tu comentario casimiro tomare en cuenta tu consejo y cambiare el nombre ahora no se si me puedas decir como esta eso de tener localizado el registro a actualizar, antes de actualizar el campo existencias me podrias orientar en esto

edgar_prospero
01-10-2012, 17:54:51
que hay amigos ya hace tiempo de este post pero ya logre hacer que me reste las existencias nomas que tengo un problema que al ir agregando los productos al dbgrid ya desde ahi me quita las existencias y queiro quelo haga hasta que guarde el producto porque encaso de un error de que me equivoque de producto lo voy a eliminar del dbgrid pero a se va a quedar modificado en existencias ojala me puedan ayudar

procedure TForm1.clientdataset1AfterPost(DataSet: TDataSet);
begin
with clientdataset2 do
begin
Edit;
FieldByName('EXISTENCIA').Value := FieldByName('EXISTENCIA').Value - clientDataSet1.FieldByName('CANTIDAD').Value;
Post;
end;

Casimiro Notevi
01-10-2012, 18:12:32
que hay amigos ya hace tiempo de este post pero ya logre hacer que me reste las existencias nomas que tengo un problema que al ir agregando los productos al dbgrid ya desde ahi me quita las existencias y queiro quelo haga hasta que guarde el producto porque encaso de un error de que me equivoque de producto lo voy a eliminar del dbgrid pero a se va a quedar modificado en existencias ojala me puedan ayudar

Amigo, imagina que eso lo ha escrito otra persona, intenta leerlo a ver si lo entiendes, sin ni un un signo de puntuación, no se sabe dónde acaba una frase y empieza otra, no se sabe si afirmas, preguntas, confirmas... en fin, que cuesta entenderlo.

edgar_prospero
01-10-2012, 18:17:11
tienes toda la razon tratare de explicarme de mejor forma y sacar mis clases de español para la puntuacion.

gracias a su ayuda logre hacer que me restara las existencias con el codigo que puse anteriormente, pero tengo el problema que con ese evento de afterpost al ir mandando mis productos al dbgrid ya me lo va descontando de existencias, siendo que lo que necesito es que haga el descuento hasta que le de en el boton guardar. no se si ahora me explicaria un poco mejor jeje

Casimiro Notevi
02-10-2012, 11:40:49
Ahora sí :)
Bueno, entonces si no quieres que descuente existencias por cada línea que se va guardando... te queda solamente una opción: cuando le des a terminar/finalizar/aceptar el documento, o sea, cuando se termina, antes de salir debes de recorrer el dataset con todas las líneas y hacer la resta por cada una de ellas. Resumiendo, hacer "lo mismo" pero manualmente. Algo así (tú debes sustituir los dataset, nombres de tablas, campos, etc.), es sólo para que te hagas una idea:

qlineas.first;
while not qlineas.eof do
begin
update tablaexistencias set existencias=existencias - qlineas.cantidad.asinteger;
post;
qlineas.next;
end;

Aunque, desde luego, la otra opción es más efectiva.

roman
02-10-2012, 17:10:58
No entiendo cuál es el problema. Mientras no se haga el ApplyUpdtes de ambos ClientDataSets, no se guardarán los registros cambiados en la base de datos.

// Saludos