Fórum Como escrever num TXT os campos de uma tabela. #348512
06/11/2007
0
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
Curtir tópico
+ 0Posts
06/11/2007
Icarus
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!
Gostei + 0
06/11/2007
Vitor Alcantara
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;
Gostei + 0
06/11/2007
Icarus
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
Gostei + 0
06/11/2007
Vitor Alcantara
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;
Gostei + 0
06/11/2007
Vitor Alcantara
Gostei + 0
06/11/2007
Icarus
To usando os componentes TpFIB (TpFIBdatabase,TpFIBDataSet, etc). Conexao com Firebird.
Grato!!!
Gostei + 0
06/11/2007
Antseralves
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 !
Gostei + 0
06/11/2007
Vitor Alcantara
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;
Gostei + 0
06/11/2007
Icarus
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!!!
Gostei + 0
06/11/2007
Icarus
No TXT eu preciso que contenha, da seguinte forma:
nomedatabela1;campo1;tipodocampo1
nomedatabela2;campo2;tipodocampo2
etc.
Grato!
Gostei + 0
06/11/2007
Icarus
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;
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)