Foros Club Delphi

Foros Club Delphi (http://www.clubdelphi.com/foros/index.php)
-   Varios (http://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas al cerrar con boton (http://www.clubdelphi.com/foros/showthread.php?t=92585)

The Cid James 04-12-2017 01:25:58

Problemas al cerrar con boton
 
Buenas gente tengo este botón que llama a un form que me da a elegir el modo de pago

Código Delphi [-]
procedure Tfventa.BVaceptarClick(Sender: TObject);
begin
  fmodulo.tVenta.Insert;
  fmodulo.qFechahora.Active := true;
  fmodulo.qFechahora.Open;
  fmodulo.tProductos.Edit;
    if idcliente = 0
      then
        begin
          application.MessageBox(pchar('Solo Clientes Registrados pueden pagar con credito'),
          pchar('ERROR'), (MB_OK + MB_ICONINFORMATION));
          fmodulo.tVenta['id_cliente'] := 1;
          fpago.BPcredito.Enabled := false;
          Tfpago.Create(self).ShowModal;
        end
     else
        begin
          fmodulo.tVenta.Insert;
          fmodulo.tVenta['id_cliente'] := idcliente;
          tfpago.Create(self).ShowModal;
        end;
end;

En el form que llamo solo tengo 3 botones.
1- si el cliente paga en efectivo
2- si el cliente paga con crédito
3- con el botón cerrar

Ahora bien, todo funciona normalmente a menos que cancele la operacion
en el boton cancelar solo tengo esto

Código Delphi [-]
procedure Tfpago.BPcancelarClick(Sender: TObject);
begin
    Self.Close;
end;

ahora el problema surge cuando al cerrar el segundo form, quiero volver a abrir el form de modo de pago, me dice que tiene una excepción sql y que los datos not null de la base de datos no pueden ser nulos. pero no estoy cerrando ningún dataset al cerrar el segundo form ni nada parecido, solo cerrando el form por lo cual los datos deberian seguir como estan hasta el momento. Ademas el post a la base de datos lo tengo en el boton de pago en efectivo y credito.

Código Delphi [-]
procedure Tfpago.BPefectivoClick(Sender: TObject);
begin
  fmodulo.tVenta['fecha'] := fmodulo.qFechahora['fecha'];
  fmodulo.tVenta['hora'] := fmodulo.qFechahora['hora'];
  fmodulo.tVenta['total_venta'] := fmodulo.Qtotal.Fields.FieldByName('Total').AsString;
  fmodulo.tProductos['Stock'] := fmodulo.tProductos ['Stock'] - fmodulo.tVentadetalle['cantidad'];
    if fventa.idcliente = 0
      then
        begin
          fmodulo.tVenta['id_cliente'] := 1;
        end
    else
      begin
        fmodulo.tVenta['id_cliente'] := fventa.idcliente;
      end;
  fmodulo.tVenta.Post;
  fmodulo.qventadetalle.Close;
  fmodulo.qFechahora.Active := false;
  fmodulo.tVenta.Active := false;
  fmodulo.qProductos.Active := false;
  fmodulo.qventadetalle.Active := false;
  fmodulo.tProductos.Active := false;
  Close;
  fventa.Close;
end;

Ñuño Martínez 04-12-2017 20:20:26

¿Estás seguro de que al cerrar o abrir una u otra ventana no estás, también, cerrando o cambiando algo en la base de datos? Lo digo porque muchas veces ponemos algo en un evento "onClose" y luego se nos olvida. También hay que tener en cuenta que hay muchos componentes implicados en una consulta. Un TSQLTransaction puesto donde no es puede cerrarte una conexión o hacerte un roll-back si se destruye antes de tiempo, por ejemplo.

La verdad, no sé qué comentarte, salvo decirte que todos los componentes implicados en el trabajo de la base de datos deberían estar en otro objeto fuera de las ventanas (por ejemplo, en un TData).

The Cid James 04-12-2017 23:46:10

No nada de echo el unico evento que tengo el form principal es el formcreate con esto que no tiene nada que ver

Código Delphi [-]
begin
 DTPfecha.Date := now;
 fmodulo.qnumventa.Active := true;
 fmodulo.Qtotal.Active := true;
  if fmodulo.qnumventa.Fields.FieldByName('id_venta').IsNull
    or (not TryStrToInt(Endeventa.Text, numventa))
      then
        numventa := fmodulo.qnumventa.fields.FieldByName ('id_venta').AsInteger + 1;
        Endeventa.Text := IntToStr(numventa);
  if fmodulo.Qtotal.IsEmpty
    then
        Eventatotal.Text := '0'
  else
  fmodulo.Qtotal.ParamByName('idv').AsInteger := numventa;
  fmodulo.Qtotal.Open;
  fmodulo.Qtotal.Refresh;
  Eventatotal.Text := fmodulo.Qtotal.Fields.FieldByName('Total').AsString;
end;

En ningun momento toco la consulta de la fecha que es la que me esta generando problemas
Ademas cierro las consultas y demas una vez que se "paga" no tengo nada ahi mas que 3 botonos y ningun evento en el segundo form.
Con respecto a las componentes estoy usando zeos con dataset y consulta nada mas que se activan al abrir el primer form y como dije no se cierran hasta que se hace efectivo el pago. No deberia cerrarse nada si no se hace efectivo el pago

The Cid James 05-12-2017 06:51:18

Al final lo termine haciendo con un checkboxlist dentro del mismo form porque no encontre el error gracias por la ayuda :)


La franja horaria es GMT +2. Ahora son las 05:40:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi