{**
Kopieren von selektierten Datensätzen aus einer Datenbank
in eine gleich aufgebaute Datenbank-Tabelle.
Die selektierten Datensätze werden in einem
TBetterADODataSet dargestellt.
@param sTableName Name der Datenbank-Tabelle
@param ds_Source Dataset mit selektierten Datensätzen
@return
@see CreateInsertSQL
}
procedure TdmCopyVertrag.CopyTable(sTableName:
String;
ds_Source: TBetterADODataSet);
begin
ds_Source.Open;
ds_Source.First;
{
Für jeden Datensatz des Result-Sets wird ein INSERT-Statement erzeugt und
auf die Ziel-Tabelle ausgeführt.
}
while not ds_Source.Eof
do
begin
qu_Dest.SQL.Clear;
qu_Dest.SQL.Add (CreateInsertSQL(sTableName, ds_Source));
qu_Dest.ExecSQL;
ds_Source.Next;
end;
// while not ds_Source.Eof do
ds_Source.Close;
end;
// CopyTable
{**
Erstellen eines Insert-Statements für den aktuellen Datensatz
der Quell-Tabelle.
@param sTableName Name der Datenbank-Tabelle
@param ds_Source Dataset mit selektierten Datensätzen
@return Insert-Statement
@see CopyTable
}
function TdmCopyVertrag.CreateInsertSQL(sTableName:
String;
ds_Source: TBetterADODataSet
):
String;
var
sFields, sValues:
String;
i: Integer;
DefaultLCID: Integer;
begin
{
Dezimal-Trennzeichen in SQL-Statement muß ein Punkt sein!
}
DecimalSeparator := '
.';
ThousandSeparator := '
,';
sValues := '
VALUES(';
sFields := '
(';
for i := 0
to ds_Source.FieldCount - 1
do
begin
if ds_Source.Fields[i].IsNull
then
sValues := sValues + '
NULL'
else
begin
{
Zeichenketten müssen von '' begrenzt werden. Bei Informix muß zusätzlich
die Funktion Date() verwendet werden.
Gegebenenfalls können hier Besonderheiten weiterer Datentypen abgehandelt
werden
}
case ds_Source.Fields[i].DataType
of
ftString:
begin
sValues := sValues +
QuotedStr(ds_Source.Fields[i].AsString);
end;
// ftString
ftDate:
begin
sValues := sValues + '
Date(' +
QuotedStr(ds_Source.Fields[i].AsString)+ '
)';
end;
// ftDate
else begin
sValues := sValues + ds_Source.Fields[i].AsString;
end;
// else
end;
// case ds_Source.Fields[i].DataType of
end;
// if ds_Source.Fields[i].IsNull else
sFields := sFields + ds_Source.Fields[i].FieldName;
{
Values und Feldnamen werden durch Komma getrennt. Nach dem letzten Wert bzw.
Feldnamen hingegen steht eine runde schließende Klammer!
}
if i = ds_Source.FieldCount - 1
then
begin
sValues := sValues + '
)';
sFields := sFields + '
)';
end // if i = ds_Source.FieldCount - 1 then
else
begin
sValues := sValues + '
, ';
sFields := sFields + '
, ';
end;
// if i = ds_Source.FieldCount - 1 else
end;
// for i := 0 to ds_Source.FieldCount - 1 do
Result := '
INSERT INTO ' + sTableName + sFields + sValues;
{
Rücksetzen auf Standard-Werte für den jeweiligen PC
}
DefaultLCID := GetThreadLocale;
DecimalSeparator := GetLocaleChar(DefaultLCID, LOCALE_SDECIMAL, '
.');
ThousandSeparator := GetLocaleChar(DefaultLCID, LOCALE_STHOUSAND, '
,');
end;
// CreateInsertSQL