Delphi .NET 1.1 NIE PRZENOSIĆ DO DZIAŁU DELPHI !
Ładuje tabele z bazy danych do DataSet. Dodaje jeszcze kilka kolumn których dane są budowane przez wyrażenie (własność Expression) oparte o pozostałe kolumny. Na końcu działania programu muszę usunąć dodane kolumny aby zrobić update bazy. No i pojawia się problem. Mimo iż usuwam powiązanie to ciągle dostaję wyjątek "Cannot remove this column, because it is a part of an expression: ...".
To chyba jakiś bug .NET 1.1, ale nie chcę od razu go obwiniać, może o czymś nie wiem. No i zaprezentuje przykładowy kodzik, który się wysypuje:
var
ds: DataSet;
items, groups: DataTable;
procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs);
begin
//na potrzeby przykładu utworze bazę ręcznie
items := DataTable.Create('items');
items.Columns.Add('group', TypeOf(System.Int32));
items.Columns.Add('value', TypeOf(System.Double));
groups := DataTable.Create('groups');
groups.Columns.Add('id', TypeOf(System.Int32));
ds := DataSet.Create;
ds.Tables.Add(items);
ds.Tables.Add(groups);
//dodaje relacje items.group <-> groups.id
ds.Relations.Add('item2group', groups.Columns['id'], items.Columns['group'], False);
//i kolumnę opartą o Expression sumującą "value" wszystkich itemów przynależnych do grupy
groups.Columns.Add('total', TypeOf(System.Double), 'Sum(Child(item2group).value)');
end;
procedure TWinForm.Button2_Click(sender: System.Object; e: System.EventArgs);
begin
//koniec programu, chcę usunąć kolumnę "items.value", o którą jest oparta kolumna "groups.total"
//w przykładzie jest to zwykła kolumna, u mnie w programie będzie to kolumna oparta o inne kolumny tej samej tabeli
//PODEJSCIE 1 - usunięcie kolumny z Expression
groups.Columns.Remove('total');
ds.Relations.Clear;
Thread.Sleep(2000); //na wszelki wypadek aby inne wątki się dokończyły
items.Columns.Remove('value'); //tu dostej wyjątek:
//"Cannot remove this column, because it is a part of
//an expression: total = Sum(Child(item2group).value)."
//PODEJSCIE 2 - usunięcie tabeli "groups" i dataset'u
ds.Relations.Clear;
ds.Tables.Remove(groups);
groups.Dispose;
ds.Tables.Remove(items);
ds.Dispose;
Thread.Sleep(2000);
items.Columns.Remove('value');//tu dostej ten sam wyjątek:
//"Cannot remove this column, because it is a part of
//an expression: total = Sum(Child(item2group).value)."
//PODEJSCIE 3 - usunięcie wyrażenia
groups.Columns['total'].Expression := '';
ds.Relations.Clear;
Thread.Sleep(2000);
items.Columns.Remove('value');//tu dostej wyjątek:
//Message: "Object reference not set to an an instance of an object"
//StackTrace:
// "at System.Data.DataColumnCollection.CanRemove(DataColumn column, Boolean fThrowException)
// at System.Data.DataColumnCollection.BaseRemove(DataColumn column)
// at System.Data.DataColumnCollection.Remove(DataColumn column)
// at System.Data.DataColumnCollection.Remove(string columnName)"
end;
Jakieś pomysły ?
//edit
PS.
Jak nie usunę tych kolumn to podczas update'u (DataSet.Update) dostaję wyjątek
System.Data.ReadOnlyException "Cannot change ReadOnly property for the expression column."