2012-04-04 17 views
7

làm cách nào để tìm hiểu xem trường thành phần nhận thức dữ liệu đã được sửa đổi khi tập dữ liệu đã ở trạng thái Chèn chưa? Tôi muốn biết nếu một lĩnh vực đã được 'thực sự' sửa đổi. (Tôi không quan tâm nếu người dùng đã nhập một cái gì đó trong một lĩnh vực và sau đó xóa tất cả mọi thứ, điều này có nghĩa là một sửa đổi xảy ra).Delphi - TDataSet xác định xem nó đã được sửa đổi khi đang ở trạng thái chèn/chỉnh sửa

DataSet.Modified, DataSet.UpdateStatus hoặc ChangeCount không giải quyết được sự cố của tôi.

LE: hãy để tôi giải thích chi tiết hơn về điều này. như vậy, số liệu ban đầu trông giống như

------------------------------------- 
|PK | Field1| Field2| Field3|Field4| 
------------------------------------- 
| 1 | a | b  | c  | d | 
------------------------------------- 

sau khi chèn

------------------------------------- 
|PK | Field1| Field2| Field3|Field4| 
------------------------------------- 
| 2 |  |  |  |  | 
------------------------------------- 
| 1 | a | b  | c  | d | 
------------------------------------- 

khi dữ liệu được thực sự sửa đổi

------------------------------------- 
|PK | Field1| Field2| Field3|Field4| 
------------------------------------- 
| 2 | avalue|  |  |  | 
------------------------------------- 
| 1 | a | b  | c  | d | 
------------------------------------- 
+0

Còn yêu cầu trực tiếp kiểm soát thì sao? Ý tôi là ví dụ: 'TDBEdit.Modified'? Lấy nó như là một lưu ý què, xin vui lòng, tôi không phải là một người sử dụng điều khiển nhận thức DB :-) – TLama

+1

@TLama - vấn đề là, điều này được chứa bởi một hình thức tổng thể/khung được sử dụng rất nhiều. Vì vậy, tôi đang cố gắng tìm một giải pháp chung, có thể chỉ ra cho tôi nếu tập dữ liệu 'thực sự' thay đổi khi đã ở chế độ chèn/chỉnh sửa ... – RBA

+2

Không có cách nào để làm điều này. Chỉ có một cách thức kiểm soát nhận biết dữ liệu để thực hiện điều này. –

Trả lời

8

Bạn có thể hack DataSet để thay đổi nó Modified tài sản trên AfterInsert/AfterEdit (và thiết lập ban đầu/default giá trị) và sau đó kiểm tra cho DataSet.Modified (ví dụ: trên trước khi đăng bài).
Để xác định các lĩnh vực cụ thể đã được sửa đổi, tôi giữ một bản sao của hồ sơ ban đầu ví dụ .:

type 
    TDataRecord = array of record 
    FieldName: string; 
    Value: Variant; 
    end; 

type 
    TForm1 = class(TForm) 
    ... 
    private 
    FInitRecord, FPostRecord: TDataRecord; 
    end; 

function GetDataRecord(DataSet: TDataSet): TDataRecord; 
var 
    I: Integer; 
begin 
    Result := nil; 
    if Assigned(DataSet) then begin 
    SetLength(Result, DataSet.FieldCount); 
    for I := 0 to DataSet.FieldCount - 1 do begin 
     Result[I].FieldName := DataSet.Fields[I].FieldName; 
     Result[I].Value := DataSet.Fields[I].Value; 
    end; 
    end; 
end; 

type 
    TDataSetAccess = class(TDataSet); 

procedure TForm1.ADODataSet1AfterInsert(DataSet: TDataSet); 
begin 
    // set initial values 
    ADODataSet1.FieldByName('PK').Value := GetMyPKValue; 
    ADODataSet1.FieldByName('DateCreated').AsDateTime := Now(); 
    // un-modify 
    TDataSetAccess(ADODataSet1).SetModified(False); 
    // save initial record 
    FInitRecord := GetDataRecord(ADODataSet1); 
end;  

procedure TForm1.ADODataSet1BeforePost(DataSet: TDataSet); 
var 
    I: Integer; 
begin 
    if ADODataSet1.Modified then 
    begin 
    FPostRecord := GetDataRecord(ADODataSet1); 
    Memo1.Lines.Clear; 
    for I := 0 to Length(FPostRecord) - 1 do begin 
     if FPostRecord[I].Value <> FInitRecord[I].Value then 
     Memo1.Lines.Add(Format('Field %s was modified', [FPostRecord[I].FieldName])); 
    end; 
    end; 
end; 

Vâng, Đó là ý tưởng trừu tượng anyway. Bạn có thể phân loại TDataSet như tôi và thực hiện tính năng này ngay bên trong thành phần TDataSet của bạn.

3

Khi nhà nước là dsInsert sử dụng:

VarCompareValue(Field.NewValue, Unassigned) = vrNotEqual; 

dsEdit sử dụng:

OldValue <> Value; 

Không sử dụng này trong trạng thái dsInsert như trong lĩnh vực số 0 bằng Unassigned:

Field.NewValue <> Unassigned 
+1

điều này có nghĩa là để xác minh là trường không rỗng ...biến thể null – RBA

+0

Không nhận được bình luận của bạn, mã tôi đăng phải được xác nhận trong hồ sơ thực tế, thường là trong sự kiện BeforePost, nó sẽ cho bạn biết nếu nó đã được "thực sự" sửa đổi. Sau khi sự kiện Đăng chỉ kiểm tra ChangeCount. –

0

Cho đến bây giờ, tôi đã tìm thấy giải pháp có vẻ hoạt động. Giải pháp bao gồm: - liên kết nguồn dữ liệu với hậu duệ tdataset - biến boolean chung được đặt thành false trên số liệu OnAfterScroll sự kiện và đúng trên sự kiện OnDataChange của nguồn dữ liệu.

Từ các thử nghiệm tôi đã thực hiện trên ứng dụng cho đến bây giờ, có vẻ như công việc này đang hoạt động. Bây giờ tôi cần điều tra tất cả các sự kiện xảy ra và cần điều trị đặc biệt để không thay đổi trạng thái của biến toàn cục trong tiến trình.

Bất kỳ ý tưởng nào khác đều được hoan nghênh

Các vấn đề liên quan