Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como pasar datos entre dos formas modales creadas dinamicamente (https://www.clubdelphi.com/foros/showthread.php?t=40587)

Tauro78 21-02-2007 17:59:27

Como pasar datos entre dos formas modales creadas dinamicamente
 
hola quisiera saber como puedo hacer para pasar datos de una forma modal creada dinamicamente a otra forma modal creada dinamicamente. O sea tengo una forma donde doy de altas facturas (frmLiquidarAltas), por medio de un boton 'Agregar' llamo a otra forma la cual contine los detalles que quiero agregar a la facutra (frmAgregarDetalleC).

Aca llamo al form de los detalles desde el form de facturas y trato de hacer la consulta que esta ligada al dbgrid que me muestra los detalles recien agregados de la factura.


Código Delphi [-]
 
public
    nro_comprobante: Integer;
    { Public declarations }
  end;
 
procedure TfrmLiquidarAltas.BitBtn5Click(Sender: TObject); 
var           
  frm: TfrmAgregarDetalleC;
begin
  frm := TfrmAgregarDetalleC.Create(Self);
  try
    if frm.ShowModal = mrOK then
    begin
      dmTablas.QDetalleC.Close;
      dmTablas.QDetalleC.ParamByName('nro_comprobante').AsInteger := nro_comprobante;
      dmTablas.QDetalleC.Open;
      if (not dmTablas.QDetalleC.IsEmpty) then
        begin
          Label11.Caption := dmTablas.QDetalleC.FieldByName('subtotal').AsString;
          Label12.Caption := Label11.Caption;
        end;
    end;
  finally
    frm.Free;
  end;
end;

Aca en el form de los detalles grabo los datos segun el nro_comprobante, pero aca me surge la duda si puede tomar el valor del form frmLiquidarAltas ya que cuando agrego un detalle no me marca ningun error, pero cuando voy a las tablas los datos no estan grabados.

Código Delphi [-]
 
procedure TfrmAgregarDetalleC.BitBtn1Click(Sender: TObject);  
begin             
if (Edit1.Text = '') or (JvDBLookupCombo1.KeyValue = null) or (Edit2.Text = '') then
  begin
    MessageDlg('Se deben completar todos los campos.', MtInformation, [MbOK], 0);
    Exit;
  end
    else
      begin
        try
          dmTablas.DBFacturacion.StartTransaction;
          dmTablas.DetalleC.Insert;
          dmTablas.DetalleC.FieldByName('nro_comprobante').AsInteger := frmLiquidarAltas.nro_comprobante;
          dmTablas.DetalleC.FieldByName('nro_categoria').AsInteger := JvDBLookupCombo1.KeyValue;
          dmTablas.DetalleC.FieldByName('cantidad').AsInteger := StrToInt(Edit1.Text);
          dmTablas.DetalleC.FieldByName('kilo').AsFloat := StrToFloat(Edit2.Text);
          dmTablas.DetalleC.FieldByName('promedio').AsFloat := StrToFloat(Label7.Caption);
          dmTablas.DetalleC.FieldByName('precio').AsFloat := StrToFloat(Label8.Caption);
          dmTablas.DetalleC.FieldByName('importe').AsFloat := StrToFloat(Label9.Caption);
          dmTablas.DetalleC.Post;
          dmTablas.DBFacturacion.Commit;
        except
          dmTablas.DBFacturacion.Rollback;
        end;
        Edit1.Text := '';
        JvDBLookupCombo1.KeyValue := null;
        Edit2.Text := '';
        Label7.Caption := '0';
        Label8.Caption := '0';
        Label9.Caption := '0';
      end;
end;

Desde ya muchas gracias.

Monchi 21-02-2007 18:15:32

Lo que podes hacer es pasar parametros en una funcion de llamada al formulario que contiene los detalles, y usar arrays de estructura tipo var, para que te los devuelva al form de las facturas y ahi recibis los datos que trabajaste en la pantalla de detalle, para ahi poder hacer lo que quieras con los mismos.
Yo hice algo asi cuando lo necesité.
No se si me explico bien je, cualquier cosa preguntame, saludos!

Lepe 21-02-2007 18:19:03

Código Delphi [-]
          dmTablas.DBFacturacion.Commit;
        except
          dmTablas.DBFacturacion.Rollback;
       raise;
        end;

El raise, es para que vuelva a levantar la excepción que se ha producido, si no, no te enteras de nada, se realiza el Rollback y no muestra el error.

saludos

Tauro78 21-02-2007 18:41:34

Gracias Lepe por tu comentario, Monchi me podrias poner un pequeño ejemplo
de lo que comentas si no es molestia, gracias.

Monchi 21-02-2007 19:06:12

Aca te mando un ejemplito de como lo uso yo:
Tengo un form donde agrego los comprobante que quiero pagar.
Este el el boton donde llamo al form donde elijo cuales comprobantes agregar y que monto voy a pagar.

Código Delphi [-]
  public
    { Public declarations }
    g_detallePago:array [0..99]of recdetallepago;
  end;

procedure tfrmpagos.Agregar(sender:tobject);
var
codigo_comprobante:array [0..99] of longword;
monto_pago:array [0..99] of currency;
i:integer;
begin
for i:=0 to g_cantidadcomprobantes-1 do
   begin
   codigo_comprobante[i]:=g_detallepago[i].id_compra;
   monto_pago[i]:=g_detallepago[i].monto;
   end;
frmagregarcomprobante:=tfrmagregarcomprobante.Create(self);
frmagregarcomprobante.Abrir(codigo_comprobante,monto_pago,'P',strtoint(txtproveedor.Text),g_cantidad  comprobantes);
for i:=0 to g_cantidadcomprobantes-1 do
   begin
   g_detallepago[i].id_compra:=codigo_comprobante[i];
   g_detallepago[i].monto:=monto_pago[i];
   end;
end;
Y este es la llamada que tiene el form donde elijo los comprobantes
Código Delphi [-]
procedure tfrmAgregarComprobante.Abrir(var codigo:array of longword;var monto:array of currency;tipo:string;id_proveedor:word;var cantidad_comprobantes:integer);
var
i:integer;
begin
g_cantidad_comprobantes:=cantidad_comprobantes;
for i:=0 to g_cantidad_comprobantes-1 do
   begin
   g_codigo[i]:=codigo[i];
   g_monto[i]:=monto[i];
   end;
frmagregarcomprobante.ShowModal;
cantidad_comprobantes:=g_cantidad_comprobantes;
for i:=0 to cantidad_comprobantes-1 do
   begin
   codigo[i]:=g_codigo[i];
   monto[i]:=g_monto[i];
   end;
end;
Como ves, paso arrays de tipo var entre los form para poder trabajar los datos.
Espero te sirva
Saludos!

Tauro78 24-02-2007 04:42:55

Muchas gracias Monchi, voy a probar a ver como me va.

Lepe 24-02-2007 16:03:39

Sugerencia:

Si los montos van relacionados con los pagos, quizás podría hacerse así también

Código Delphi [-]

type Datos = record
    monto : currency;
    comprobante : longword;
  end;

type ADatos = array of Datos; // no indicamos el tamaño, lo hacemos luego.

procedure tfrmpagos.Agregar(sender:tobject);
var i:integer;
     M: ADatos;
begin
SetLength(M, g_cantidadComprobantes -1); // damos tamaño al array, desde 0 hasta g_cantidadcomprobantes

for i:=0 to g_cantidadcomprobantes-1 do
   begin
   m[i].comprobante:=g_detallepago[i].id_compra;
   m[i].Monto :=g_detallepago[i].monto;
   end;

En un hilo reciente se habló de copiar Arrays con la función copy, podría servir aquí, para quitar un bucle:
Código Delphi [-]
copy(g_detallepago, codigo_comprobante);

Resumiendo, usar un array de records para pasar un solo parámetro a las funciones y usar Copy para copiar arrays enteros de uno a otro.

Espero os sirva.

Saludos


La franja horaria es GMT +2. Ahora son las 01:22:43.

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