2011-06-02 8 views
5

¿Puedo acceder a la información del conjunto de datos principal (como MyField.NewValue) en el evento BeforeUpdateRecord de un proveedor cuando se aplican las actualizaciones al conjunto de datos anidados?Delphi: acceso a la información maestra de Dataset anidado al aplicar la actualización

Motivo:

Al aplicar cambios a un CDS que tiene un detalle anidada, la PK maestro es generado por la consulta subyacente (TIBCQuery) y se propagó a los CDS maestros.

Pero la nueva clave no es visible en el BeforeUpdateRecord del detalle que el campo se actualiza en el AfterUpdateRecord:

DeltaDS.FieldByName(FieldName).NewValue := SourceDS.FieldByName(FieldName).NewValue) 

y el delta no se fusiona todavía.

Parece que el parámetro DeltaDS del evento BeforeUpdateRecord contiene solo información para el conjunto de datos anidado cuando se produce la llamada para los detalles.

Sería bueno si pudiera hacer algo como:

DeltaDS.ParentDS.FieldByName('FIELDNAME').NewValue. 

Editar:

Al utilizar conjuntos de datos anidados caso BeforeUpdateRecord se llama dos veces, una para el maestro y una vez para el detalle (si tenemos un registro de ambos) Cuando se solicita el evento para el detalle, ¿hay alguna manera de acceder a la información maestra contenida en el DeltaDS?

No podemos acceder a los datos del CDS maestro en ese momento ya que los cambios no están fusionados. Espero que esto no agregue más confusión.

+0

estoy seguro de que soy yo, pero ¿podría por favor reformular la pregunta? –

Respuesta

2

Puede utilizar el Resolver del proveedor para buscar el correspondiente TUpdateTree:

function FindDeltaUpdateTree(Tree: TUpdateTree; DeltaDS: TCustomClientDataSet): TUpdateTree; 
var 
    I: Integer; 
begin 
    Result := nil; 
    if Tree.Delta = DeltaDS then 
    Result := Tree 
    else 
    for I := 0 to Tree.DetailCount - 1 do 
    begin 
     Result := FindDeltaUpdateTree(Tree.Details[I], DeltaDS); 
     if Assigned(Result) then 
     Break; 
    end; 
end; 

Puede utilizar esto en su OnBeforeUpdate manejador:

var 
    Tree, ParentTree: TUpdateTree; 
begin 
    if SourceDS = MyDetailDataSet then 
    begin 
    Tree := FindDeltaUpdateTree(TDataSetProvider(Sender).Resolver.UpdateTree, DeltaDS); 
    if Assigned(Tree) then 
    begin 
     ParentTree := Tree.Parent; 
     // here you can use ParentTree.Source (the dataset) and ParentTree.Delta (the delta) 
    end; 
    end; 
end; 
+0

¡Funciona genial gracias! –

+1

No olvides aceptar la respuesta ['this way'] (http://meta.stackexchange.com/a/5235) si resolvió tu problema ;-) ¡Gracias! – TLama

Cuestiones relacionadas