Ver Mensaje Individual
  #5  
Antiguo 16-01-2006
Avatar de Thales
Thales Thales is offline
Miembro
 
Registrado: ago 2005
Posts: 48
Reputación: 0
Thales Va por buen camino
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;

Última edición por Thales fecha: 16-01-2006 a las 18:08:32.
Responder Con Cita