Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   alterar el estado de un DataSet mestro detalle (https://www.clubdelphi.com/foros/showthread.php?t=73619)

_CALI 05-05-2011 08:40:49

alterar el estado de un DataSet mestro detalle
 
hola amigos, tengo dos clientDataset(maestro detalle), solo el CDS maestro esta asociado al proveedor, el detalle esta realcionado mediante DataSetField al CDS mestro, bueno en fin.

mi problema es que cuando quiero insertar o modificar un registro en el detalle el estado del CDS maestro cambia a dsEdit, eso causa una mala sincronizacion de mis botones de (nuevo, grabar, cancelar) del maestro que esta en el evento OnStateChanged del DataSource asociado al maestro


mi pregunta es: como haria para que cuando cambien los estados del CDS detalle no afecten a los estados del CDS maestro

alguna tecnica o sugerencia....gracias de antemano.

duilioisola 05-05-2011 10:33:00

Cuando el CDS detalle cambia de estado el CDS maestro permanece igual.

Código Delphi [-]
CDSMaestro.Open; // CDSMaestro.state = dsBrowse
CDSDetalle.Open; // CDSMaestro.state = dsBrowse, CDSDetalle.state = dsBrowse
CDSDetalle.Edit; // CDSMaestro.state = dsBrowse, CDSDetalle.state = dsEdit
...
CDSDetalle.Post; // CDSMaestro.state = dsBrowse, CDSDetalle.state = dsBrowse
...

Supongo que tienes algún código que al cambiar datos del CDS detalle recalcula o actualiza el CDS maestro.

Al González 05-05-2011 18:28:00

Cita:

Empezado por duilioisola (Mensaje 398991)
Cuando el CDS detalle cambia de estado el CDS maestro permanece igual [...] Supongo que tienes algún código que al cambiar datos del CDS detalle recalcula o actualiza el CDS maestro.

Hola duilioisola. Eso sería si fuese una relación maestro-detalle típica (MasterSource, MasterFields...), pero en el caso que plantea _Cali se trata de conjuntos de datos anidados (nested data sets), donde el detalle se asocia al maestro mediante la propiedad DataSetField.

_Cali: El comportamiento que observas es normal, pues al ser el detalle un conjunto de datos anidado, es considerado "parte" del conjunto de datos maestro. El código nativo que lo produce está en la clase base TDataSet:
Código Delphi [-]
procedure TDataSet.CheckParentState;
begin
  if DataSetField <> nil then
    DataSetField.DataSet.Edit;
end;

procedure TDataSet.Edit;
begin
  if not (State in [dsEdit, dsInsert]) then
    if FRecordCount = 0 then Insert else
    begin
      CheckBrowseMode;
      CheckCanModify;
      DoBeforeEdit;
      CheckParentState;
      CheckOperation(InternalEdit, FOnEditError);
      GetCalcFields(ActiveBuffer);
      SetState(dsEdit);
      DataEvent(deRecordChange, 0);
      DoAfterEdit;
    end;
end;

En mi opinión está bien que ocurra de esa forma, pues cualquier cambio que hagas en el conjunto de datos detalle necesitarás aplicarlo con el método ApplyUpdates del conjunto de datos maestro. Así que antes de proponer soluciones, indaguemos cuál es el problema realmente. ¿Podrías darnos algo más de información de por qué no deseas que el estado del maestro sea congruente con lo que ocurre en el detalle?

Saludos.

Al González. :)

_CALI 05-05-2011 20:10:05

gracias a ambos por responder:

al gonzales te muestro una imagen de mi formulario ejecutado por q quiero q se vea desde el punto de vista del usuario final



Lo que quiero realmente es que cuando el usuario añade o modifique registro del CDS detalle, estos cambios no afecten alos estados del maestro, mi razonamiento es logico y se q tambien esta bien q intercatuen los estados en dataset anidados, pero al usuario final como q se complicaria un poco el hecho de estar presionando post en el detalle y luego post en el mestro, aunque haciendo applyupdates al maetro graba todo de todo, ojala me haya explicado bien, en pocas palabras quisera un codigo mas "limpio" que gestione estas interacciones entre elos estados del maestro y del detalle, lo ideal seria que se anulen dichas interacciones y permtir que cada CDS haga lo suyo.. Gracias!!

:)

codigo asociado al envento OnDataChanged del datasource asociado al CDSMaestro




Código Delphi [-]
case cdsTransportistas.State of
dsBrowse: begin //al guardar o cancelar
btnNuevo.Enabled := True;
btnGuardar.Enabled := False;
btnCancelar.Enabled := False;
//habilito los botones del navegador de la grilla
grdVehiculos.OptionsData.Appending := True;
grdVehiculos.OptionsData.Editing := True;
grdVehiculos.OptionsData.Deleting := True;
end;
dsInsert,
dsEdit:
begin //al insertar o editar
btnNuevo.Enabled := False;
btnGuardar.Enabled := True;
btnCancelar.Enabled := True;
//deshabilito los botones del navegador de la grilla
grdVehiculos.OptionsData.Appending := False;
grdVehiculos.OptionsData.Editing := False;
grdVehiculos.OptionsData.Deleting := False;
end;
end;

_CALI 05-05-2011 20:12:25

gracias a ambos por responder:

al gonzales te muestro una imagen de mi formulario ejecutado por q quiero q se vea desde el punto de vista del usuario final


codigo asociado al envento OnDataChanged del datasource asociado al CDSMaestro


Código Delphi [-]
case cdsTransportistas.State of
dsBrowse: begin //al guardar o cancelar
btnNuevo.Enabled := True;
btnGuardar.Enabled := False;
btnCancelar.Enabled := False;
//habilito los botones del navegador de la grilla
grdVehiculos.OptionsData.Appending := True;
grdVehiculos.OptionsData.Editing := True;
grdVehiculos.OptionsData.Deleting := True;
end;
dsInsert,
dsEdit:
begin //al insertar o editar
btnNuevo.Enabled := False;
btnGuardar.Enabled := True;
btnCancelar.Enabled := True;
//deshabilito los botones del navegador de la grilla
grdVehiculos.OptionsData.Appending := False;
grdVehiculos.OptionsData.Editing := False;
grdVehiculos.OptionsData.Deleting := False;
end;
end;

Casimiro Notevi 05-05-2011 20:25:55

Recuerda poner el código entre etiquetas:





.

_CALI 05-05-2011 20:26:51

..de la imagen mostrada:

CDSMaestro es el cdsTransportistas y
CDSDetalle es el cdsVehiculos

me gustaria los ste:

Código Delphi [-]
cdsVehiculos.Insert; //cdsTransportistas.State = dsBrowse, cdsVehiculos.State = dsInsert;
cdsVehiculos.Edit; //cdsTransportistas.State = dsBrowse, cdsVehiculos.State = dsEdit;

si tienes una mejor solucion hasmelo saber porfavor

Gracias

_CALI 05-05-2011 20:46:33

una solucion...
 
bueno, analisando el codigo q enviaste

puse en el envento ONStateChanged del CDSMaestro los ste:


cdsDetalle.DataSetField.DataSet.CheckBrowseMode;

y funciona!!! los cambios aparentemente ya no se afectal al CDSMaestro

pero esta bien esa solucion???:)

Al González 06-05-2011 01:30:44

Antes que nada te rogaría que cuides darle formato Delphi al código que pongas para que no se pierda el sangrado. Casimiro ya te ilustró cómo hacerlo. :)

Cita:

Empezado por _CALI (Mensaje 399075)
puse en el envento ONStateChanged del CDSMaestro los ste:
cdsDetalle.DataSetField.DataSet.CheckBrowseMode;
y funciona!!! los cambios aparentemente ya no se afectal al CDSMaestro
pero esta bien esa solucion???:)

No, con ello lo que estás haciendo es forzar la ejecución prematura del método Post en el conjunto de datos maestro.

Cita:

Empezado por _CALI (Mensaje 399062)
[...] te muestro una imagen de mi formulario ejecutado por q quiero q se vea desde el punto de vista del usuario final [...]
q se complicaria un poco el hecho de estar presionando post en el detalle y luego post en el mestro [...]

Pues déjale un sólo Post, el del maestro:



Como podrás notar, para el detalle solamente utilizo tres botones: agregar, eliminar y cancelar, que son los que realmente se necesitan en la mayoría de estos casos. Vaya, ni siquiera le dejo ver al usuario en qué estado se encuentra el actual registro detalle (¿eso es relevante para él?). El diseño que propongo está hecho bajo la óptica de que el usuario observa en un formulario como este "un documento", no "un registro maestro con registros detalles asociados".

Saludos.

Al González. :)

_CALI 06-05-2011 03:13:03

Muchas gracias por tu aportacion al gonzales, estuve colocando las etiquetas delphi pero al mandar el post a este hilo aparecieron mal, en fin disculpas por ello, por otro lado estudie bien la imagen de tu formulario y pues me parecio una buena sugerencia desde el punto de vista del usuario y depende del diseño tambien depende la complejidad del codigo, por eso adoptare tu criterio.

muschas gracias!!!:)


Como podrás notar, para el detalle solamente utilizo tres botones: agregar, eliminar y cancelar, que son los que realmente se necesitan en la mayoría de estos casos. Vaya, ni siquiera le dejo ver al usuario en qué estado se encuentra el actual registro detalle (¿eso es relevante para él?). El diseño que propongo está hecho bajo la óptica de que el usuario observa en un formulario como este "un documento", no "un registro maestro con registros detalles asociados".

Saludos.

Al González. :)[/quote]


La franja horaria es GMT +2. Ahora son las 01:20:17.

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