Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Post de las tablas (https://www.clubdelphi.com/foros/showthread.php?t=27402)

JavierO 19-11-2005 00:32:13

Post de las tablas
 
Hola a todos:

Tengo un problema con el post de las tablas, en que consiste este?
pues tengo 3 tablas de las cuales 1 es la maestra y 2 las hijas, y al momento de hacer el post de la maestra primero se va al beforepost de la ultima hija sin que yo haya mendado a ejecutar el post previamente de ella y es que priimero necesito ejecutar el post de la trabla maestra ya que en base a ello obtengo los campos de serie y numero que sirven de base para ligarlas con las 2 hijas.

a que se debe que ejecute primero el beforepost del la hija y como puedo hacer para haga primero post de la tabla maestra.

Desde ya muchas gracias

Reciban un coordial saludo

Lepe 19-11-2005 12:06:21

Si vas a añadir un registro en la hija, es lógico que al guardarlo, se haga en la hija, y el beforePost de la maestra no ocurra.

En las tablas hijas, en sus evento BeforePost, añade un Maestra.Edit guarda lo que necesites y haz el post de la maestra.

saludos

luisgutierrezb 19-11-2005 16:22:50

pues se me hace raro el problema seguro que no tienes el beforepost del maestro apuntando al de detalle o algo asi?, a mi nunca me ha pasado, sin embargo, en el before post de la del detalle, revisa si esta la tabla en modo de insercion o de edicion, como no va a estar (bueno, se supone) entonces no hara nada en el before post de la hija...

JavierO 21-11-2005 20:05:47

primero antes que nada gracias por sus respuestas.

esta asi la situación tengo una forma el la cual tengo 3 ttable, la primera que es la maestra, despliega la información principalmete en dbedits, las otras 2 estan apuntando cada una a un dbgrid respectivamente, y tengo un boton para guardar la información entonces a la hora de presionarlo manda a hacer el post de las 3 tablas pimero el de la maestra si estado de edicion o inserción y posteriormente el de las detalle.

Y validando que este la maestra en estado de inserción o edicion, mando a ejecutar el post de de dicha tabla, y sabiendo que existe un registro tambien de inserción en una de las tablas detalle, me manda a ejecutar primero el beforepost de la tabla datalle, a pesar de que yo le mande a ejecutar primero el post de la maestra, y es que necesito que haga primero el de la maestra para obtener los valores de los campos que van a relacionar dichas tablas

Lepe 22-11-2005 11:48:44

Pues tendrás un código que hace que se mueva el registro activo en la maestra o algo por el estilo, y hace que se guarde primero el detalle.

Tendrás que mostrar el código que usas para guardar el maestro y los detalles.

saludos

JavierO 22-11-2005 17:47:32

este es el codigo que estoy utilizando

bueno solo la parte que manda a guardar

Código:


procedure Tsilfpe0001.TB_SalvarClick(Sender: TObject);
begin
  if sistema_lw_trigger_pedi = 'UPDATE' then
  begin
          if sil_pedi_lw_cambio_datos = 'S' then
          begin
                sistema_lw_ejecuta_bitacora := 'TRUE';
                if sistema_lw_ejecuta_bitacora = 'TRUE' then
                begin
                        Application.CreateForm(Tsilfpe0001_Bitacora_Cambios_Pedidos,silfpe0001_Bitacora_Cambios_Pedidos);
                        silfpe0001_Bitacora_Cambios_Pedidos.ShowModal;
                end;
                sistema_lw_ejecuta_bitacora := 'FALSE';
          end;
  end;
  sistema_lw_ejecuta_bitacora := 'FALSE';
  if T_PEDI.State <> dsBrowse then
          COMPLEMENTA_PEDIDO();
  {Stores.SIL_P_COMPLEMENTA_PEDIDO(T_PEDI.FieldByName('pedi_serie').Value, T_PEDI.FieldByName('pedi_numero').Value, lw_error);
  if not(VarIsNull(lw_error)) and (lw_error <> '') then
  begin
          Application.MessageBox(PChar(lw_error), 'SIL Light', mb_ok+mb_iconinformation);
          Abort;
  end;}
  sil_pedi_lw_usuario_autoriza := T_PEDI.FieldValues['pedi_usuario_autoriza'];
  sil_pedi_lw_clave_autoriza  := T_PEDI.FieldValues['pedi_clave_autoriza'];
  sil_pedi_lw_pedi_estatus        := T_PEDI.FieldValues['pedi_estatus'];
  sil_pedi_lw_ante_estatus        := sil_pedi_lw_pedi_estatus;
  sil_pedi_lw_prod_original        := NVL(T_PEDI.FieldValues['pedi_prod_clave'],'');
  sil_pedi_lw_cant_fec_actual := FPE0001_CANTIDAD_FECHA(gw_plan_clave,T_PEDI.FieldValues['pedi_fecha_suministro'],T_PEDI.FieldValues['pedi_serie'],T_PEDI.FieldValues['pedi_numero'],'A');
  sil_pedi_lw_cant_fec_ante  := FPE0001_CANTIDAD_FECHA(gw_plan_clave,T_PEDI.FieldValues['pedi_fecha_suministro'],T_PEDI.FieldValues['pedi_serie'],T_PEDI.FieldValues['pedi_numero'],'O');
  //Aquie es la parte donde mandoa guardar la tabla maestra T_PEDI y los detalles T_BOPE Y T_DEPE
  if T_PEDI.State in [dsInsert, dsEdit] then
          T_PEDI.Post;
  if T_BOPE.State in [dsInsert, dsEdit] then
          T_BOPE.Post;
  if T_DEPE.State in [dsInsert, dsEdit] then
          T_DEPE.Post;
  PPE0001_INSERTA_PROG_PEDIDO;          //inserta programacion de pedidos
  Q_Consulta.Close;
  Q_Consulta.SQL.Clear;
  Q_Consulta.SQL.Add(' UPDATE sil_programas_pedido                          ');
  Q_Consulta.SQL.Add(' SET        prpe_pedi_serie  = :gw_pedi_serie, ');
  Q_Consulta.SQL.Add('                prpe_pedi_numero = :gw_pedi_numero ');
  Q_Consulta.SQL.Add(' WHERE  prpe_pedi_serie  = ''X''                  ');
  Q_Consulta.SQL.Add(' AND        prpe_pedi_numero = 0                          ');
  Q_Consulta.ParamByName('gw_pedi_serie').Value  := DBE_Pedi_Serie.Text;
  Q_Consulta.ParamByName('gw_pedi_numero').Value  := DBE_Pedi_Numero.Text;
  Q_Consulta.ExecSQL;
  A_PRPE := NIL; //limpia el arreglo
end;
//aqui es donde surge el problema porque en lugar de hacer directamente el boforepost de PEDI hace el de DEPE
procedure Tsilfpe0001.T_PEDIBeforePost(DataSet: TDataSet);
begin
  if T_PEDI.State = dsInsert then
  begin
          PEDI_PRE_INSERT();
  end
  else if T_PEDI.State = dsEdit then
                begin
                  PEDI_PRE_UPDATE();
                end;
end;

procedure Tsilfpe0001.T_BOPEBeforePost(DataSet: TDataSet);
begin
  if not(T_BOPE.FieldByName('bope_pedi_serie').IsNull) and not(T_BOPE.FieldByName('bope_pedi_numero').IsNull) then
  begin
          if T_BOPE.State = dsInsert then
          begin
                  T_BOPE_PRE_INSERT;
                  silfse0000.Trigger_Insert(DataSet);
                  sistema_lw_trigger_bope  := 'INSERT';
          end;
          if T_BOPE.State = dsEdit then
          begin
                  T_BOPE_PRE_UPDATE;
                  silfse0000.Trigger_Update(DataSet);
                  sistema_lw_trigger_bope  := 'UPDATE';
          end;
  end
  else
  begin
          T_BOPE.Cancel;
          Abort;
  end;
end;
procedure Tsilfpe0001.T_DEPEBeforePost(DataSet: TDataSet);
begin
  if not(T_DEPE.FieldByName('depe_pedi_serie').IsNull) and not(T_DEPE.FieldByName('depe_pedi_numero').IsNull) then
  begin
          if T_DEPE.State = dsInsert then
          begin
                  T_DEPE_PRE_INSERT;
                  silfse0000.Trigger_Insert(DataSet)
          end;
  end
  else
  begin
          T_DEPE.Cancel;
          Abort;
  end;
end;

solo una cosa mas las tablas de BOPE y DEPE tienen un procedimiento Oncalc
gracias Lepe por el apoyo

Lepe 23-11-2005 17:58:44

Código Delphi [-]
procedure Tsilfpe0001.T_BOPEBeforePost(DataSet: TDataSet);
begin
   if not(T_BOPE.FieldByName('bope_pedi_serie').IsNull) and not(T_BOPE.FieldByName('bope_pedi_numero').IsNull) then
   begin
//**************************************
  if T_PEDI.State in dsEditModes then
    T_PEDI.Post // me aseguro de que se guarda antes la maestra.
//**************************************
    if T_BOPE.State = dsInsert then
    begin
      T_BOPE_PRE_INSERT;
      silfse0000.Trigger_Insert(DataSet);
      sistema_lw_trigger_bope  := 'INSERT';
    end;
    if T_BOPE.State = dsEdit then
    begin
      T_BOPE_PRE_UPDATE;
      silfse0000.Trigger_Update(DataSet);
      sistema_lw_trigger_bope  := 'UPDATE';
    end;
   end
   else
   begin
    T_BOPE.Cancel;
    Abort;
   end;
end;

Lo mismo para la tabla Depe.

Prueba eso y si persiste los problemas, ya despues nos metemos con otras dudas que tengo sobre el código.

saludos


La franja horaria es GMT +2. Ahora son las 09:44:34.

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