Ver Mensaje Individual
  #13  
Antiguo 20-11-2017
Avatar de The Cid James
The Cid James The Cid James is offline
Miembro
NULL
 
Registrado: jun 2013
Posts: 129
Reputación: 11
The Cid James Va por buen camino
Cita:
Empezado por movorack Ver Mensaje
No se... Seguiste con las mismas asignaciones. lee los comentarios y entenderás un poco lo que trato de decirte

Código Delphi [-]
procedure TfCantidad.BCokClick(Sender: TObject);
var
  //Mejor coloca nombres de variables que signifiquen algo
  //a : Integer; // Cantidad de Articulos
  CantArts: integer; // Cantidad de Articulos
begin
  fmodulo.tVentadetalle.Active := true;
  fmodulo.tProductos.Active := true;

  //Esta validación la coloco acá porque la vienes haciendo en tu código,
  //pero es innecesaria o no estás haciendo bien las cosas ya que en ningún lugar de tus cálculos usas el valor del
  //TEdit Ecantidad. Si bien lo asignas a una variable mas adelante, enseguida a esa misma variable le asignas un 
  //valor traído del dataset
  if (string(Ecantidad.Text).Trim.Length = 0)
    or (not TryStrToInt(Ecantidad.Text, CantArts))  // <= Si la conversión es correcta, aquí ya se asigna el valor del edit a la variable
  then
  begin
    Application.MessageBox('El valor ingresado debe ser mayor a O', 'Drugstore',mb_yesno+mb_iconquestion);
    Exit;
  end;
  
  if fmodulo.tVentadetalle.State in [dsEdit, dsInsert] then
    fmodulo.tVentadetalle.Cancel;

  fmodulo.tVentadetalle.Insert;

  {
  a := (StrToInt(Ecantidad.text)); // Esta asignación la pierdes con la siguiente línea

  //Y no es necesario asignar a variable todo lo del dataset. Puedes usar los valores directamente
  a := fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsInteger;
  d := fmodulo.qnumventa.Fields.FieldByName('id_venta').AsInteger;
  e := (d + 1);
  fmodulo.tVentadetalle ['id_ventas'] := IntToStr(e);
  fmodulo.tVentadetalle ['id_producto'] := fmodulo.tProductos ['id_producto'];
  f := fmodulo.tProductos.Fields.FieldByName('precio_vent').AsInteger;
  g := (a * f);
  fmodulo.tVentadetalle ['Precio_v'] := IntToStr(g);
  fmodulo.tVentadetalle ['cantidad'] := IntToStr(a);
  }

  //El consecutivo trata de no calcularlo en el programa y dejarlo a que lo calcule la DB. Cuando tengas varios clientes al mismo tiempo vendiendo esto será un dolor de cabeza
  fmodulo.tVentadetalle.Fields.FieldByName('id_ventas').AsString := IntToStr(fmodulo.qnumventa.Fields.FieldByName('id_venta').AsInteger + 1); 
  fmodulo.tVentadetalle.Fields.FieldByName('id_producto').Value := fmodulo.tProductos.Fields.FieldByName('id_producto').Value;
  fmodulo.tVentadetalle.Fields.FieldByName('Precio_v').AsString := IntToStr(fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsInteger * fmodulo.tProductos.Fields.FieldByName('precio_vent').AsInteger);
  fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsString := fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsString;
  fmodulo.tVentadetalle.Post;
  fmodulo.tVentadetalle.Refresh;

  self.Close;
end;

He tratado de utilizar los mismos tipos de datos que al parecer tienes en tu dataset. pero cosas como el precio y cantidad es mejor que los coloques como float. EN un futuro pueden decirte que quieren vender medio paquete de cigarrillos o que el valor de un producto con oferta es de 9.99
Muchas gracias por tomarte el tiempo de explicarme!
Ahora bien voy a seguir tus consejos pero me quedan las siguientes dudas:
Si me di cuenta que no estaba usando el valor de la asignacion por eso no hacia los calculos, aunque no tenia ni idea de como hacerlo iba a hacer ahora un post con eso ahora que me tengo tiempo xD
En el caso de
Código Delphi [-]
  d := fmodulo.qnumventa.Fields.FieldByName('id_venta').AsInteger;
  e := (d + 1);
Esto lo hacia porque uso un autoincremental en venta, pero el post se hace despues de que se realiza la venta por lo cual no se asigna igual no sabia que podía usar los datos directamente de la base de datos en tiempo de ejecución para hacer los cálculos.
Y la ultima duda que tengo es sobre
Código Delphi [-]
 if fmodulo.tVentadetalle.State in [dsEdit, dsInsert] then
    fmodulo.tVentadetalle.Cancel;

Este codigo es necesario? porque abro y cierro el modo insert en cada boton con el que trabajo o sirve como medida de seguridad si lo tengo abierto de otro lado?
Ademas probando el codigo me dice que dsEdit y dsInsert son variables no definidas (sera porque uso zeoslib?) y la "cantidad" se carga con el valor 1 y no con el valor que le estoy cargando el tedit
__________________
We are told to remember the idea, not the man, because a man can fail. He can be caught, he can be killed and forgotten, but 400 years later, an idea can still change the world.

Última edición por The Cid James fecha: 20-11-2017 a las 11:11:09.
Responder Con Cita