type
TZug =
String[4];
TEroeffnungsDB =
class (TObject)
private
FConn: TADOConnection;
FQuery: TADOQuery;
FDBName:
String;
//AusgangsDB
FTable:
String;
FZugID: Integer;
function Init(DBName, User, Passwd:
String):Boolean;
//DB laden
function UnInit:Boolean;
//Daten speichern
published
constructor Create;
destructor Destroy;
function SetNeuenZug(Neu: TZug):Integer;
//Zug setzen und Elemente löschen
function GetNeuenZug:TZug;
//Besten Zug raussuchen
property Tabelle:
String read FTable
write FTable;
end;
const
STD_TEMP_DB = '
Temp_DB';
implementation
constructor TEroeffnungsDB.Create;
begin
inherited Create;
FConn := TADOConnection.Create(FConn);
FQuery:=TADOQuery.Create(FQuery);
FQuery.Connection:=FConn;
end;
destructor TEroeffnungsDB.Destroy;
begin
FConn.Free;
FQuery.Free;
inherited Destroy;
end;
function TEroeffnungsDB.Init(DBName, User, Passwd:
String):Boolean;
begin
try
//in Temp-DB ablegen
FDBName:=ExtractFileDir(DBName)+STD_TEMP_DB+ExtractFileExt(DBName);
CopyFile(PAnsiChar(DBName),PAnsiChar(FDBName),False);
//öffnen
FConn.Provider:='
MSDAIPP.DSO';
FConn.DefaultDatabase:=FDBName;
FConn.Open(User, Passwd);
Result:=True;
except
Result:=False;
end;
end;
function TEroeffnungsDB.UnInit:Boolean;
begin
try
//schliessen
FConn.Close;
//Temp-DB löschen
DeleteFile(FDBName);
Result:=True;
except
Result:=False;
end;
end;
function TEroeffnungsDB.SetNeuenZug(Neu: TZug):Integer;
begin
//irrelevante Züge löschen
FQuery.SQL.Clear;
FQuery.SQL.Add('
DELETE FROM :table WHERE (Zugid=:zugid) AND (zug<>:zug)');
FQuery.Parameters.ParamValues['
table']:=FTable;
FQuery.Parameters.ParamValues['
zugid']:=FZugID;
FQuery.Parameters.ParamValues['
zug']:=Neu;
FQuery.ExecSQL;
repeat
FQuery.SQL.Clear;
FQuery.SQL.Add('
DELETE FROM :table WHERE NOT parentid IN ( SELECT id FROM :table)');
FQuery.Parameters.ParamValues['
table']:=FTable;
FQuery.ExecSQL;
until FQuery.RowsAffected=0;
FQuery.ClearFields;
inc(FZugID);
end;
function TEroeffnungsDB.GetNeuenZug:TZug;
begin
//Neuen Zug holen
FQuery.SQL.Clear;
FQuery.SQL.Add('
SELECT Zug FROM '+FTable+'
ORDER BY ZugID, Bewertung');
FQuery.Open;
Result:=FQuery.Fields.FieldByName('
Zug').AsString;
FQuery.ClearFields;
SetNeuenZug(Result);
end;