Unit Unit6;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,
DB, DBTables, WideStrings, DBXMySql, SqlExpr, FMTBcd, DBClient,
Provider, Grids, DBGrids, StdCtrls, ExtCtrls, DBCtrls,DBXDataExpressMetaDataProvider,iniFiles, strUtils,cdsfield,
DBXTrace;
type
Tform6 =
class(TForm)
SQLConnection1: TSQLConnection;
ComboBoxConnections: TComboBox;
Label1: TLabel;
EditSQL: TEdit;
EditFilter: TEdit;
CheckBoxActive: TCheckBox;
DBNavigator1: TDBNavigator;
ButtonApply: TButton;
listbox1: TListBox;
DBGrid1: TDBGrid;
SQLDataSet1: TSQLDataSet;
DataSetProvider1: TDataSetProvider;
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
procedure FormCreate(Sender: TObject);
procedure ComboBoxConnectionsCloseUp(Sender: TObject);
procedure listbox1DblClick(Sender: TObject);
procedure DBGrid1CellClick(Column: TColumn);
procedure CheckBoxActiveClick(Sender: TObject);
procedure ClientDataSet1BeforeClose(DataSet: TDataSet);
procedure ButtonApplyClick(Sender: TObject);
procedure EditFilterChange(Sender: TObject);
procedure EditFilterEnter(Sender: TObject);
procedure EditFilterExit(Sender: TObject);
procedure EditSQLChange(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
TableName:
String;
AllTables: TStringList;
//Liste der Datenbanktabellen
FMetaDataProvider: TDBXDataExpressMetaDataProvider;
MemoForm: TFormCurrentField;
public
function MatchFilter(FilterStr, TestStr:
String): Boolean;
procedure PopulateListBox;
end;
const
sDefaultFilterText = '
Filter (* as wild)';
var
form6: Tform6;
implementation
{$R *.dfm}
procedure Tform6.PopulateListBox;
// AllTables muss auf die Liste der Tabellen für die aktive Datenbankverbindung gesetzt werden.
var
I: Integer;
begin
ListBox1.Items.Clear;
for I := 0
to AllTables.Count - 1
do
begin
// Wenn kein Filter vorhanden ist oder die Tabelle dem Filter entspricht, Tabelle dem Listenfeld hinzufügen.
if (EditFilter.Text = sDefaultFilterText)
or MatchFilter(EditFilter.Text, AllTables[I])
then
ListBox1.Items.Add(FMetaDataProvider.QuoteIdentifierIfNeeded(AllTables[I]));
end;
// Wenn das Listenfeld Einträge enthält, soll es aktiviert werden.
if ListBox1.Count > 0
then
ListBox1.Enabled := True;
end;
function Tform6.MatchFilter(FilterStr, TestStr:
String): Boolean;
var
Pattern, EndPattern, TempStr:
String;
WildPos: Integer;
begin
Result := True;
if FilterStr = '
'
then
Exit;
// Whitespace entfernen und in Großbuchstaben umwandeln.
Pattern := UpperCase(Trim(FilterStr));
EndPattern := '
';
//nichts bis gefunden
// Auf Platzhalter überprüfen
WildPos := AnsiPos('
*', Pattern);
if WildPos <> 0
then
begin
if WildPos < Length(Pattern)
then //letztes Zeichen
EndPattern := Copy(Pattern, WildPos+1, MaxInt);
//beliebiger Text nach Platzhalter
Pattern := Copy(Pattern, 1, WildPos-1);
end;
if (Pattern <> '
')
and (AnsiPos(Pattern, UpperCase(TestStr)) <> 1)
then
Result := False
else if EndPattern <> '
'
then
begin
TempStr := AnsiRightStr(TestStr, Length(EndPattern));
if AnsiPos(EndPattern, UpperCase(TempStr)) <> 1
then
Result := False;
end;
end;
procedure Tform6.ButtonApplyClick(Sender: TObject);
var
X, Y: Integer;
begin
// Die Aktualisierung der Client-Datenmenge wird vom Provider ausgeführt.
ClientDataSet1.ApplyUpdates(-1);
Y := Self.Top + Self.ButtonApply.Top;
X := Self.Left + Self.ButtonApply.Left;
// Benutzer fragen, ob die Daten im Gitter aktualisiert werden sollen.
if MessageDlgPos('
Refresh?',mtCustom, [mbYes, mbNo], 0, X, Y) = mrYes
then
begin
ClientDataSet1.Close;
ClientDataSet1.Open;
end;
end;
procedure Tform6.CheckBoxActiveClick(Sender: TObject);
begin
ClientDataSet1.Active := CheckBoxActive.Checked
end;
procedure Tform6.ClientDataSet1BeforeClose(DataSet: TDataSet);
begin
// Falls ein Formular für die Anzeige der Tabellenzelle vorhanden ist, wird es freigegeben.
if Assigned(MemoForm)
then
begin
MemoForm.DBMemoCurrentField.DataField := '
';
if MemoForm.Visible
then
MemoForm.Close;
end;
end;
procedure Tform6.ComboBoxConnectionsCloseUp(Sender: TObject);
begin
// Wurde eine Auswahl getroffen?
if ComboBoxConnections.ItemIndex = -1
then
Exit;
// Hilfsobjekte initialisieren.
if not Assigned(AllTables)
then
AllTables := TStringList.Create;
if Assigned(FMetaDataProvider)
then
FreeAndNil(FMetaDataProvider);
// Falls eine geöffnete Verbindung vorhanden ist, soll sie geschlossen werden. Anzeigen, dass die Verbindung nicht aktiv ist.
if SQLConnection1.Connected
then
SQLConnection1.Close;
CheckBoxActive.Checked := False;
// Die ausgewählte Datenbankverbindung öffnen.
SQLConnection1.ConnectionName := ComboBoxConnections.Items[ComboBoxConnections.ItemIndex];
SQLConnection1.LoadParamsOnConnect := True;
SQLConnection1.LoginPrompt := False;
SQLConnection1.Open;
SQLConnection1.GetTableNames(AllTables, False);
//Liste der Tabellen aus der Datenbank abrufen
// Metadaten für die ausgewählte Verbindung ermitteln.
FMetaDataProvider := TDBXDataExpressMetaDataProvider.Create;
FMetaDataProvider.Connection := sqlconnection1.DBXConnection;
//auf die geöffnete Verbindung setzen
FMetaDataProvider.Open;
// Das Listenfeld mit den Tabellen dieser Datenbankverbindung füllen.
PopulateListBox;
// Status einiger Dialogfeldelemente initialisieren.
SQLDataSet1.CommandText := '
';
EditSQL.Text := '
';
CheckBoxActive.Enabled := False;
ButtonApply.Enabled := False;
end;
procedure Tform6.EditFilterChange(Sender: TObject);
begin
if SQLConnection1.Connected
then
PopulateListBox;
//Tabellenlistenfeld entsprechend des neuen Filtertexts erneut füllen
end;
procedure Tform6.EditFilterEnter(Sender: TObject);
begin
EditFilter.Text := '
';
end;
procedure Tform6.EditFilterExit(Sender: TObject);
begin
if EditFilter.Text = '
'
then
EditFilter.Text := '
Filter (* as wild)';
end;
procedure Tform6.EditSQLChange(Sender: TObject);
begin
SQLDataSet1.CommandText := EditSQL.Text;
end;
procedure Tform6.FormDestroy(Sender: TObject);
begin
// Die Verbindung schließen.
if SQLConnection1.Connected
then
SQLConnection1.Close;
// Objekte freigeben.
if Assigned(FMetaDataProvider)
then
FreeAndNil(FMetaDataProvider);
if Assigned(MemoForm)
then
FreeAndNil(MemoForm);
if Assigned(AllTables)
then
FreeAndNil(AllTables);
end;
procedure Tform6.DBGrid1CellClick(Column: TColumn);
begin
if ClientDataSet1.Active
then
begin
// Wenn das Formular nicht angezeigt wird, wird es erstellt.
if not Assigned(MemoForm)
then
begin
MemoForm := TFormCurrentField.Create(Self);
MemoForm.DBMemoCurrentField.DataSource := DataSource1;
//Datenquelle festlegen
end;
// Formular genau unterhalb des Hauptdialogfeldes positionieren.
MemoForm.Top := Self.Top+Self.Height;
MemoForm.Left := Self.Left;
MemoForm.Visible := False;
MemoForm.Visible := True;
MemoForm.DBMemoCurrentField.DataField := Column.FieldName;
// Im Titel Informationen über das Feld anzeigen
MemoForm.Caption := Format('
Field Name: %s / Record Num: %d',[Column.FieldName, DBGrid1.DataSource.DataSet.RecNo]);
MemoForm.Width := Self.Width;
end;
end;
procedure tform6.FormCreate(Sender: TObject);
var
IniFile: TIniFile;
SectionsList: TStringList;
//für die Verbindungsliste
TempStr:
String;
I: Integer;
begin
EditFilter.Text := sDefaultFilterText;
// Informationen über die aktuellen Datenbankverbindungen ermitteln
IniFile := TIniFile.Create(GetConnectionRegistryFile);
// Eine Liste der verfügbaren Datenbankverbindungen ermitteln
SectionsList := TStringList.Create;
IniFile.ReadSections(SectionsList);
// Die Verbindungen in das Kombinationsfeld einfügen
// Jede gültige Verbindung sollte mit den Zeichen 'CONNECTION' enden.
// Nur diese Verbindungen werden hinzugefügt.
SectionsList.Sort;
for I := 0
to SectionsList.Count - 1
do
begin
TempStr := UpperCase(AnsiRightStr(SectionsList[I], Length('
connection')));
if TempStr = '
CONNECTION'
then
begin
ComboBoxConnections.Items.Add(SectionsList[I]);
end;
end;
// Nicht mehr benötigte Objekte freigeben
FreeAndNil(IniFile);
FreeAndNil(SectionsList);
end;
procedure tForm6.listbox1DblClick(Sender: TObject);
var
s :
string;
FieldNamesList: TStringList;
SQLStmt:
String;
I: Integer;
begin
// Eine Tabelle ist jetzt ausgewählt, daher nun die entsprechenden Steuerelemente aktivieren.
CheckBoxActive.Enabled := True;
ButtonApply.Enabled := True;
TableName := ListBox1.Items[ListBox1.ItemIndex];
//Tabellennamen abrufen
// Feldnamen (Spaltennamen) für diese Tabelle abrufen.
FieldNamesList := TStringList.Create;
FieldNamesList.Clear;
SQLConnection1.GetFieldNames(TableName, FieldNamesList);
if FieldNamesList.Count > 0
then
begin
SQLStmt := '
select ';
for I := 0
to FieldNamesList.Count - 1
do
if s = '
'
then
s := FieldNamesList[I]
else
s := s + '
,' + FieldNamesList[I];
SQLStmt := SQLStmt + s + '
from '+TableName;
end
else
// Feldnamen nicht gefunden, daher '*' verwenden
SQLStmt := '
select * from '+TableName;
FreeAndNil(FieldNamesList);
// SQL-Anweisung zum Abrufen aller Tabellendaten erstellen.
EditSQL.Text := SQLStmt;
// CommandText auf SQL-Anweisung setzen.
SQLDataSet1.CommandText := EditSQL.Text;
if ClientDataSet1.Active
then
ClientDataSet1.Close;
ClientDataSet1.Open;
CheckBoxActive.Checked := True;
end;
end.