Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-02-2007
Tauro78 Tauro78 is offline
Miembro
 
Registrado: sep 2006
Posts: 88
Poder: 18
Tauro78 Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 21-02-2007
Avatar de Monchi
Monchi Monchi is offline
Miembro
 
Registrado: jun 2006
Ubicación: Cordoba, Argentina
Posts: 18
Poder: 0
Monchi Va por buen camino
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!
Responder Con Cita
  #3  
Antiguo 21-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #4  
Antiguo 21-02-2007
Tauro78 Tauro78 is offline
Miembro
 
Registrado: sep 2006
Posts: 88
Poder: 18
Tauro78 Va por buen camino
Gracias Lepe por tu comentario, Monchi me podrias poner un pequeño ejemplo
de lo que comentas si no es molestia, gracias.
Responder Con Cita
  #5  
Antiguo 21-02-2007
Avatar de Monchi
Monchi Monchi is offline
Miembro
 
Registrado: jun 2006
Ubicación: Cordoba, Argentina
Posts: 18
Poder: 0
Monchi Va por buen camino
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!
Responder Con Cita
  #6  
Antiguo 24-02-2007
Tauro78 Tauro78 is offline
Miembro
 
Registrado: sep 2006
Posts: 88
Poder: 18
Tauro78 Va por buen camino
Muchas gracias Monchi, voy a probar a ver como me va.
Responder Con Cita
  #7  
Antiguo 24-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Crear y destruir formas dinamicamente ing_gera C++ Builder 1 16-02-2007 00:45:23
Pasar datos entre formularios davitcito OOP 1 29-06-2005 09:48:03
Problema al pasar datos entre 2 formas maguib Varios 6 10-03-2005 20:19:33
Problema con JBuilder(pasar datos entre ventanas) fgabriel JAVA 0 17-02-2005 16:23:55
Creando dinamicamente formas D.M Varios 2 12-09-2003 20:59:38


La franja horaria es GMT +2. Ahora son las 19:59:56.


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
Copyright 1996-2007 Club Delphi