Hallo zusammen,
ich möchte das Layout und den gesetzten Filter eines TcxGridDBTableView (QuantumGrid von DevExpress) in eine Tabelle einer MS
SQL Datenbank schreiben.
Das Feld habe ich als VarBinary(Max) definiert, weil es den Datentypen BLOB nicht gibt. Ich habe dann eine Routine für die Speicherung und eine für das Laden der Daten geschrieben, aber ich bekomme lediglich das Layout richtig zurückgeliefert.
Da das Rücksetzen des Grids mit einem Memorystream ohne Speicherung in einer Datenbank funktioniert, zieht sich DevExpress aus der Angelegenheit heraus. Leider gibt es keine fertigen Methoden. Ich habe inzwischen unterschiedliche Verfahrensweisen ausprobiert, doch ich bekomme den Filter nicht gesetzt.
Vielleicht habe ich irgendwo einen Denkfehler oder muss noch etwas bei der Bearbeitung des Streams ändern. Für mich als auch für den Support von DevExpress ist das Verhalten jedenfalls nicht nachvollziehbar.
Delphi-Quellcode:
procedure TDatenmodul.GridLayoutSave(ParamFormname: string; ParamGrdView : TcxGridDBTableView);
var
Formularname : string;
LayoutStream : TMemoryStream;
begin
if ParamGrdView <> nil then
begin
Formularname := AnsiUpperCase(ParamFormname);
LayoutStream := TMemoryStream.Create;
Try
ParamGrdView.StoreToStream(LayoutStream, [gsoUseFilter, gsoUseSummary]);
if not(Datenmodul.GridViews.Active) then
Datenmodul.GridViews.Active := true;
if not(Datenmodul.GridViews.Locate('Formular;Benutzer;Viewname', VarArrayOf([Formularname, Benutzername, AnsiUpperCase(ParamGrdView.Name)]),[])) then
begin
with Datenmodul.GridViews Do
begin
Append;
Fieldbyname('Formular').AsString := Formularname;
Fieldbyname('Benutzer').AsString := Benutzername;
Fieldbyname('Viewname').AsString := AnsiUpperCase(ParamGrdView.Name);
end;
end
else
Datenmodul.GridViews.Edit;
LayoutStream.Position := 0;
if Datenmodul.GridViews.FieldByName('Layout').IsBlob then
begin
TBlobField(Datenmodul.GridViews.FieldByName('Layout')).LoadFromStream(LayoutStream);
end;
Datenmodul.GridViews.Post;
Finally
FreeAndNil(LayoutStream);
End;
end;
end;
procedure TDatenmodul.GridLayoutLoad(ParamFormname : string; ParamGrdView : TcxGridDBTableView; ParamBerechtigung : boolean);
var
Formularname : string;
LayoutStream : TMemoryStream;
begin
if ParamGrdView <> nil then
begin
Formularname := AnsiUpperCase(ParamFormname);
if not(Datenmodul.GridViews.Active) then
Datenmodul.GridViews.Active := true;
if Datenmodul.GridViews.Locate('Formular;Benutzer;Viewname', VarArrayOf([Formularname, Benutzername, AnsiUpperCase(ParamGrdView.Name)]),[]) then
begin
try
LayoutStream := TMemoryStream.Create;
try
if Datenmodul.GridViews.FieldByName('Layout').IsBlob then
begin
TBlobField(Datenmodul.GridViews.FieldByName('Layout')).SaveToStream(LayoutStream);
LayoutStream.Position := 0;
ParamGrdView.RestoreFromStream(LayoutStream, true, false, [gsoUseFilter, gsoUseSummary]);
end;
except
end;
Finally
FreeAndNil(LayoutStream);
end;
end;
end;
end;
Vielleicht hat ja jemand die Problemstellung schon in ähnlicher Form umgesetzt. Ich wäre für Tipps in jedem Fall dankbar.
Viele Grüße
Ingo