Estoy en una situación similar a la tuya y, aprovechando la idea de Migpal, te pongo el código que he generado para hacer el script
Código Delphi
[-]
unit Scripts;
interface
uses Classes, SysUtils, DB, Variants;
function GeneraScript(Table: string; D: TDataSet): string;
procedure Guarda(Script, FileName: string);
function ValorToStr(Clase: TFieldClass; Value: variant): string;
implementation
function GeneraScript(Table: string; D: TDataSet): string;
var
I: integer;
Campos, Valores: string;
begin
with D do
begin
Open;
Campos := '';
for I := 0 to Pred(FieldCount) do
begin
if I > 0 then Campos := Campos + ', ';
Campos := Campos + Fields[i].FieldName;
end;
Result := '';
while not Eof do
begin
Valores := '';
for I := 0 to Pred(FieldCount) do
begin
if I > 0 then Valores := Valores + ', ';
with Fields[i] do
Valores := Valores + ValorToStr(TFieldClass(ClassType), Value);
end;
Result := Result + Format('insert into %s(%s) values(%s);'#13#10,
[Table, Campos, Valores]);
Next;
end;
Close;
end;
end;
procedure Guarda(Script, FileName: string);
begin
with TFileStream.Create(FileName, fmCreate) do
try
Write(Script[1], Length(Script));
finally
Free;
end;
end;
function ValorToStr(Clase: TFieldClass; Value: variant): string;
var
SaveDecimalSeparator: Char;
begin
Assert(not VarIsEmpty(Value));
if VarIsNull(Value) then
Result := 'Null'
else if Clase.InheritsFrom(TStringField) then
Result := QuotedStr(Value)
else if Clase.InheritsFrom(TDateField) then
Result := QuotedStr(FormatDateTime('mm/dd/yyyy', Value))
else if Clase.InheritsFrom(TBCDField) or
Clase.InheritsFrom(TFMTBCDField) then
begin
SaveDecimalSeparator := DecimalSeparator;
try
DecimalSeparator := '.';
Result := FloatToStr(Value);
finally
DecimalSeparator := SaveDecimalSeparator;
end;
end
else
Result := Value;
end;
end.
Para usarlo, en el form principal pones un edit con el path, un listbox con las tablas de las que quieras recoger los datos y un botón.
En el evento OnClick del botón pones este código:
Código Delphi
[-]
uses Scripts;
{$R *.dfm}
procedure TForm1.btGeneraClick(Sender: TObject);
var
S: string;
I: integer;
begin
Screen.Cursor := crHourglass;
try
S := '';
for I := 0 to Pred(lbTablas.Count) do
begin
S := S + '/* Tabla: ' + lbTablas.Items[i] + ' */'#13#10#13#10;
qrOtros.SQL.Text := 'select * from '+lbTablas.Items[i];
S := S + GeneraScript(lbTablas.Items[i], qrOtros) + #13#10;
end;
Guarda(S, ePath.Text);
finally
Screen.Cursor := crDefault;
end;
end;