GARANTIR DESCONTO

Fórum Como escrever num TXT os campos de uma tabela. #348512

06/11/2007

0

Opa pessoal,

Tenho uma tabela X, como eu falo ao sistema para pegar os nomes dos campos da tabela, os tipos, e escrever em um TXT?

Grato!


Icarus

Icarus

Responder

Posts

06/11/2007

Icarus

Na verdade, a duvida e um pouquinho mais funda.

Eu gostaria de pegar o nome da tabela, depois o nome do campo, e o tipo do campo e colocar num txt.

No caso, o txt teria o seguinte formato:

Nome_Tabela;Campo;Tipo_Campo

E bem, no caso teria que ter um loop para fazer isso em todas as tabelas.

Grato!


Responder

Gostei + 0

06/11/2007

Vitor Alcantara

Você tem que fazer um laço que pecorra os dados da tabela e jogar em um arquivo de texto, pelo comando writeln.

Primeiro você deve declarar uma váriavel do tipo TextFile;
var
  f:TextFile;


Depois você deve informar o endereço do arquivo que você irá gravar.
Begin
  AssignFile(f, ´c:\Nome Do arquivo.txt´);


Depois informe que o arquivo irá ser construido ou regravado.
  Rewrite(f);


Dai é só dentro do laço escrever os dados de sua tabela concatenizando o comando Write e WriteLn;
  MinhaTabela.First;
  While Not MinhaTabela.EOF do
  Begin
    //O Comando Write escreve os dados no arquivo e continua na mesma linha
   //O Comando WriteLn escreve os dados no arquivo e pula para próxima linha.
    Write(f,MinhaTabela.FieldByName(´Campo1´).AsString+ ´ ´);
    Write(f,MinhaTabela.FieldByName(´Campo2´).AsString +´ ´);
    WriteLn(f,MinhaTabela.FieldByName(´Campo3´).AsString);
    MinhaTabela.Next;
  end;

Depois você deve da um CloseFile para gravar os dados e liberar o arquivo de texto.
  CloseFile(f);
end;


Você também poderá obter o mesmo resultado utilizando-se de uma stringList;

var
  list:tStringList;
begin
  list := tStringList.Create;
  MinhaTabela.First;
  while not MinhaTabela.EOF do
  Begin
     List.Add(
     MinhaTabela.FieldByname(´Campo1´).AsString + ´ ´+
     MinhaTabela.FieldByname(´Campo2´).AsString+´ ´+
     MinhaTabela.FieldbyName(´Campo3´).AsString);
     MinhaTabela.Next;
  end;
  List.SaveToFile(´c:\ Nome do Arquivo.Txt´);
end;



Responder

Gostei + 0

06/11/2007

Icarus

Opa Vitor! Tudo bem?

Mas o problema [e o seguinte, eu tenho um banco de dados, certo. Tenho o nome das tabelas? Tenho. Mas o que eu queria salvar nesse TXT, nao ia ser o valor dos campos, mas os nomes dos campos e os tipos deles, de uma forma automatica...

Imagina como?

Abraco! xD


Responder

Gostei + 0

06/11/2007

Vitor Alcantara

Descreva qual tipo de componente e de conexao e banco de dados está utilizando pra ficar mais fácil.

Um exemplo utilizando os componentes da palheta IbExpert

const
  tipoCampo : array [tFieldType] of String =
            (´ftUnknown´, ´ftString´, ´ftSmallint´, ´ftInteger´, ´ftWord´, // 0..4
    ´ftBoolean´, ´ftFloat´, ´ftCurrency´, ´ftBCD´, ´ftDate´, ´ftTime´, ´ftDateTime´, // 5..11
    ´ftBytes´, ´ftVarBytes´, ´ftAutoInc´, ´ftBlob´, ´ftMemo´, ´ftGraphic´, ´ftFmtMemo´, // 12..18
    ´ftParadoxOle´, ´ftDBaseOle´, ´ftTypedBinary´, ´ftCursor´, ´ftFixedChar´, ´ftWideString´, // 19..24
    ´ftLargeint´, ´ftADT´,´ftArray´, ´ftReference´, ´ftDataSet´, ´ftOraBlob´, ´ftOraClob´, // 25..31
    ´ftVariant´, ´ftInterface´, ´ftIDispatch´, ´ftGuid´, ´ftTimeStamp´, ´ftFMTBcd´, // 32..37
    ´ftFixedWideChar´, ´ftWideMemo´, ´ftOraTimeStamp´, ´ftOraInterval´);



procedure TForm1.Button1Click(Sender: TObject);
var
  f:textfile;
  lTabela,lCampo:tStringList;
  x,y:integer;
  qr:tSqlQuery;
begin
  AssignFile(f,´c:\Dados.txt´);
  rewrite(f);
  lTabela:= tStringList.Create;
  lCampo:= TStringList.Create;
  //Pega os nomes da tabela e joga na variavel lTAbela;
  Conexao.GetTableNames(lCampo);

  //Cria o componente de query para tirar os tipos de campo
  qr := tSQlQuery.Create(Self);
  qr.SQLConnection := conexao;

  //Laço pecorrendo todas as tabelas
  for x := 0 to LTabela.Count  - 1 do
  Begin
    //Pega os nomes dos campos da tabela e joga na variavel lCampo
    Conexao.GetFieldNames(lTabela.Strings[x],lCampo);

    //Constroi query para pegar os tipos de campo da tabela
    qr.Close;
    qr.SQL.Text := ´SELECT FIRST 0 * FROM ´+LTabela.Strings[x];
    qr.Open;

    //Laço pecorrendo todo os campos da tabela
    for y := 0 to lCampo.Count  - 1 do
    Begin
      write(f,Format(´¬-20s´,[lTabela.Strings[x]]));
      write(f,Format(´¬-20s´,[lCampo.Strings[y]]));
      writeLn(f,format(´¬-20s´,[TipoCampo[qr.FieldByName(lCampo.Strings[y]).DataType]]));
    End;

  End;
  closeFile(f);

end;



Responder

Gostei + 0

06/11/2007

Vitor Alcantara

O componente de conexão é da palheta dbExpress e não ibExpert como coloquei no post anterior.


Responder

Gostei + 0

06/11/2007

Icarus

Opa Vitor!

To usando os componentes TpFIB (TpFIBdatabase,TpFIBDataSet, etc). Conexao com Firebird.

Grato!!!


Responder

Gostei + 0

06/11/2007

Antseralves

Uma maneira de fazer isso é:

Coloque em um formulários os componentes IBDatabase,IBTransaction e
um IBTable apontando para a tabela que vc quer imprimir. Coloque tambem um TMemo (só pra ter um visual do arquivo gravado) e um TButton.

No OnClick do TButton:


procedure TForm1.Button1Click(Sender: TObject);

var I : integer;
Lista : TStringList;

begin
Lista := TStringList.Create;
Memo1.Clear;
Lista.Clear;
IBTable1.Open;
with IBTable1 do
for I := 0 to Fields.Count -1 do
begin
Memo1.Lines.Add(Fields[I].FieldName+´ ´+Fields[I].ClassName);
Lista.Add(Fields[I].FieldName+´ ´+Fields[I].ClassName);
end;
Lista.SaveToFile(´.\´+IBTable1.TableName+´.txt´);
IBTable1.Close;
Lista.Free;
end;

Será gravado um arquivo .txt na pasta onde está o programa
com o nome da tabela em questão.
Boa sorte !


Responder

Gostei + 0

06/11/2007

Vitor Alcantara

Icarus não sei se o componente em questão tem os metodos GetTableNames e GetFieldNames.
Caso não tenha você pode tentar retirar os dados que são gravados (no Firebird) na tabela RDB$RELATION_FIELDS (depois da um SELECT * FROM RDB$RELATION_FIELDS pra ver).


procedure TForm1.Button1Click(Sender: TObject);
var
  f:TextFile;
begin
  AssignFile(f,´c:\Campos.txt´);
  Rewrite(f);
  Query.Close;
  Query.Sql.Clear;
  Query.Sql.Add(´SELECT * FROM RDB$RELATION_FIELDS WHERE RDB$FIELD_SOURCE > ´´RDB$0´´ AND   RDB$FIELD_SOURCE < ´´RDB$9´´´);
  Query.Open;

  Query.First;
  While not Query.EOF do
  Begin
    Query1.Close;
    Query1.Sql.Clear;
    Query1.Sql.Add(´SELECT FIRST 0 ´+Query.FieldByName(´RDB$FIELD_NAME´).AsString );
    Query1.Sql.Add(´FROM ´+Query.FieldByName(´RDB$RELATION_NAME´).AsString);
    Query1.Open;

    writeLn(f, Query.FieldByName(´RDB$RELATION_NAME´).AsString +´;´+ Query.FieldByName(´RDB$FIELD_NAME´).AsString+´;´+TipoCampo[query1.Fields[0].DataType]+´;´);
    Query.next;

  End;
  CloseFile(f);
end;



Responder

Gostei + 0

06/11/2007

Icarus

Bom pessoal, esse e o estagio atual do codigo:
procedure TFPrincipal.LerTabelasANTIGO();
// Esta procedure tem como objetivo criar um arquivo de texto em aonde o migrador esta sendo executado e, em seguida,
// escrever o nome dos campos da tabela antiga e o nome da tabela, tal como tipo do campo, etc.
// As variaveis globais responsaveis pelo armazenamento de dados sao:
//DadosBDANTIGO : TStringList;
var
  ArquivoTexto            : TextFile;                            //Declarando var do arquivo de texto.
  TiposBDANTIGO_Temp      : TStringList;                     //Declarando a variavel que armazenara o tipo dos campos, temporariamente.
  CamposBDANTIGO_Temp     : TStringList;                     //Declarando a variavel que armazenara o nome dos campos, temporariamente.
  TabelasBDANTIGO_Temp    : TStringList;                     //Declarando a variavel que armazenara o nome dos campos, temporariamente.
begin
  DadosBDANTIGO           := TStringList.Create;
  AssignFile(ArquivoTexto, ´C:\BD.txt´);
  Rewrite(ArquivoTexto);

  DataBaseANTIGO.GetTableNames(TabelasBDANTIGO_Temp, FALSE);  // Armazenando o nome das tabelas na variavel.
  DataSetANTIGO.GetFieldNames(CamposBDANTIGO_Temp);           // 
end;



Bem, eu estou conseguindo armazenar os valores corretos nas variaveis. Mas o problema esta na hora de escrever isso no arquivo TXT.

Afinal, como eu faco?

grato!!!


Responder

Gostei + 0

06/11/2007

Icarus

Ah, so uma observacao...

No TXT eu preciso que contenha, da seguinte forma:

nomedatabela1;campo1;tipodocampo1
nomedatabela2;campo2;tipodocampo2

etc.

Grato!


Responder

Gostei + 0

06/11/2007

Icarus

Pronto galera! Consegui! =)

Ai pessoal, abaixo, o source:

procedure TFPrincipal.LerTabelasANTIGO();
// Esta procedure tem como objetivo criar um arquivo de texto em aonde o migrador esta sendo executado e, em seguida,
// escrever o nome dos campos da tabela antiga e o nome da tabela, tal como tipo do campo, etc.
// As variaveis globais responsaveis pelo armazenamento de dados sao:
//DadosBDANTIGO : TStringList;
var
  ArquivoTexto            : TextFile;                        //Declarando var do arquivo de texto.
  TiposBDANTIGO_Temp      : TStringList;                     //Declarando a variavel que armazenara o tipo dos campos, temporariamente.
  CamposBDANTIGO_Temp     : TStringList;                     //Declarando a variavel que armazenara o nome dos campos, temporariamente.
  TabelasBDANTIGO_Temp    : TStringList;                     //Declarando a variavel que armazenara o nome dos campos, temporariamente.
  I,J: Integer;                                                //Declarando o contador.
begin
  DadosBDANTIGO           := TStringList.Create;
  CamposBDANTIGO_Temp     := TStringList.Create;
  TabelasBDANTIGO_Temp    := TStringList.Create;
  AssignFile(ArquivoTexto, ´C:\BD.txt´);
  Rewrite(ArquivoTexto);
  DataBaseANTIGO.GetTableNames(TabelasBDANTIGO_Temp, FALSE);  // Armazenando o nome das tabelas na variavel.

  for I := 0 to TabelasBDANTIGO_Temp.Count - 1 do
  Begin
    DataSetANTIGO.Active := False;
    DataSetANTIGO.SQLs.SelectSQL.Clear;
    DataSetANTIGO.SQLs.SelectSQL.Add(´SELECT FIRST 1 * FROM ´+TabelasBDANTIGO_Temp.Strings[I]);
    DataSetANTIGO.Active := True;
    DataSetANTIGO.GetFieldNames(CamposBDANTIGO_Temp);           // Armazenando o nome dos campos na variavel.
      for J := 0 to CamposBDANTIGO_Temp.Count - 1 do
        begin
          WriteLn(ArquivoTexto, TabelasBDANTIGO_Temp.Strings[I]+´;´+CamposBDANTIGO_Temp[J]);
        end;


  end;
    Closefile(ArquivoTexto);
  end;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar