2011-06-02 5 views
5

Güncelleştirmeleri iç içe veri kümesine uygularken, bir sağlayıcının BeforeUpdateRecord olayındaki ana veri kümesi bilgilerine (MyField.NewValue gibi) erişebilir miyim?Delphi: Güncelleştirme uygulandığında Yuvalanmış Veri kümesi ana bilgilerine erişme

Sebep:

ben iç içe bir ayrıntı olan bir CDS güncellemeleri uygulamak

, usta PK yatan sorgusu ( TIBCQuery) tarafından oluşturulan ve ana CDS yayılır.

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

ve delta henüz birleştirilmez: alanına AfterUpdateRecord güncellenir olarak

Ama yeni anahtar detay BeforeUpdateRecord görünmüyor.

BeforeUpdateRecord olayının DeltaDS parametresinin, ayrıntılar için çağrı gerçekleştiğinde yalnızca iç içe veri kümesine ilişkin bilgileri içerdiği anlaşılıyor.

ben gibi bir şey yapıp yapamayacağımı iyi olurdu:

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

Düzenleme: İç içe veri setlerini kullanırken

BeforeUpdateRecord olay ayrıntı için bir kez usta ve bir kez, iki kez denir (eğer her ikisinin de bir kaydı varsa). Olay ayrıntı için çağrıldığında, DeltaDS'da bulunan ana bilgilere erişmenin bir yolu var mı?

Değişiklikler birleştirilmemiş olduğundan, ana CDS'nin verilerine o anda erişemeyiz. Umarım bu daha fazla karışıklık eklemez. Sen sağlayıcı en Resolver aramak için kullanabileceğiniz

+0

soruyu yeniden yorumlamak? –

cevap

2

TUpdateTree tekabül:

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; 

Sen OnBeforeUpdate işleyicisi bu kullanabilirsiniz: Ben bu beni eminim, ama sen yapabilirsin lütfen

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

Harika çalışıyor! –

+1

Sorunu çözdüyse ['this way'] (http://meta.stackexchange.com/a/5235) cevabını kabul etmeyi unutmayın ;-) Teşekkürler! – TLama