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 05-05-2011
_CALI _CALI is offline
Miembro
 
Registrado: mar 2008
Posts: 99
Poder: 17
_CALI Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 05-05-2011
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.735
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
Responder Con Cita
  #3  
Antiguo 05-05-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por duilioisola Ver Mensaje
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.
Responder Con Cita
  #4  
Antiguo 05-05-2011
_CALI _CALI is offline
Miembro
 
Registrado: mar 2008
Posts: 99
Poder: 17
_CALI Va por buen camino
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;
Responder Con Cita
  #5  
Antiguo 05-05-2011
_CALI _CALI is offline
Miembro
 
Registrado: mar 2008
Posts: 99
Poder: 17
_CALI Va por buen camino
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;
Responder Con Cita
  #6  
Antiguo 05-05-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Recuerda poner el código entre etiquetas:





.
Responder Con Cita
  #7  
Antiguo 05-05-2011
_CALI _CALI is offline
Miembro
 
Registrado: mar 2008
Posts: 99
Poder: 17
_CALI Va por buen camino
Smile

..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

Última edición por Casimiro Notevi fecha: 06-05-2011 a las 01:37:07. Razón: Arreglar etiquetas
Responder Con Cita
  #8  
Antiguo 05-05-2011
_CALI _CALI is offline
Miembro
 
Registrado: mar 2008
Posts: 99
Poder: 17
_CALI Va por buen camino
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???
Responder Con Cita
  #9  
Antiguo 06-05-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
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 Ver Mensaje
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 Ver Mensaje
[...] 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.
Responder Con Cita
  #10  
Antiguo 06-05-2011
_CALI _CALI is offline
Miembro
 
Registrado: mar 2008
Posts: 99
Poder: 17
_CALI Va por buen camino
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]
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
Reporte del tipo Detalle/Sub Detalle/Sumarotia del Sub detalle - Sumatoria Total sonjeux Impresión 1 28-12-2009 18:55:27
Estado Dataset vtdeleon Conexión con bases de datos 2 18-04-2007 02:14:45
Maestro-detalle sin DataSet en QuickReports Jan_polero Impresión 3 19-04-2005 00:58:43
Relacion Mestro-Detalle silviodp Conexión con bases de datos 2 01-06-2004 15:20:00
Problema relacion maestro-detalle (Nested Dataset) Toni Conexión con bases de datos 10 19-05-2004 16:38:56


La franja horaria es GMT +2. Ahora son las 10:03:55.


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