Fórum Criar rotina de exportar/importar de uma determinada tabela #354171
21/02/2008
0
O cliente me pediu uma rotina que exportasse e importasse dados de uma determinada tabela do Banco de dados. É possível? Faz com arquivos .txt?
Jpauloss
Curtir tópico
+ 0Posts
21/02/2008
Webjoel
Seu professor tem razão! Tudo é possível se tratando de Delphi! e Para seu problema existe solução sim. Pelo delphi, você pode criar uma rotina que ( while clientdataset1.eof do ), percorrendo toda a tabela e gravando seus dados no arquivo .txt que você informaou, você pode fazer isso de várias formas, tanto via write quanto via stringlist.
Existe uma outra maneira, caso você prefira, a ferramenta IbExpert Full tem uma opção que você pode tanto exportar os dados para arquivo texto ou também gerar script em SQL dos dados.
Gostei + 0
21/02/2008
Webjoel
Seu professor tem razão! Tudo é possível se tratando de Delphi! e Para seu problema existe solução sim. Pelo delphi, você pode criar uma rotina que ( while clientdataset1.eof do ), percorrendo toda a tabela e gravando seus dados no arquivo .txt que você informaou, você pode fazer isso de várias formas, tanto via write quanto via stringlist.
Existe uma outra maneira, caso você prefira, a ferramenta IbExpert Full tem uma opção que você pode tanto exportar os dados para arquivo texto ou também gerar script em SQL dos dados.
Gostei + 0
21/02/2008
Jpauloss
Pode me dar um exemplo prático com essa tabela
CREATE TABLE MATERIAL ( COD_ORDENADO VARCHAR(20) NOT NULL, DESCRICAO VARCHAR(70) COLLATE PT_BR, UN VARCHAR(2), PRECO_UNITARIO NUMERIC(15,2) ); /******************************************************************************/ /**** Primary Keys ****/ /******************************************************************************/ ALTER TABLE MATERIAL ADD CONSTRAINT PK_MATERIAL PRIMARY KEY (COD_ORDENADO);
Gostei + 0
21/02/2008
Jpauloss
Gostei + 0
21/02/2008
Webjoel
Depois...
//declare uma variavel tipo TStringList
tabela : TStringList;
//cria lista
tabela := TStringList.Create;
//varre tabela
ClientDataSet1.First;
while not (ClientDataSet1.eof) do
begin
//adiciona campos na stringlist
tabela.add(´Código: ´ + ClientDataSet1COD_ORDENADO.AsString + ´ - ´ + ´Descrição: ´ + ClientDataSet1DESCRICAO.AsString + ´ - ´ + ´Un.: ´ + ClientDataSet1UN.AsString + ´ - ´ + ´Preço: R$ ´ + ClientDataSet1PRECO_UNITARIO.AsFloat);
ClientDataSet1.Next;
end;
//sava o arquivo lista em txt
tabela.SaveToFile(´C:\MATERIAL.TXT´);
Gostei + 0
21/02/2008
Paullsoftware
Para Exportar faça:
procedure TForm1.Button1Click(Sender: TObject); var ArqTxt:TextFile; NomeArquivo:String; I:Integer; begin //Caminho do txt gerado pela exportação NomeArquivo := ExtractFilePath(ParamStr(0)) + ´Material.txt´; try AssignFile(ArqTxt,NomeArquivo); Rewrite(ArqTxt); with SQLDataSet1 do begin if not Active then Open; First; while not Eof do begin I := FieldCount; for I := 0 to Fields.Count - 1 do //Cada linha gerado no txt corresponde a um Registro da tabela, separando cada um deles com um ";" Ponto e Virgula Write(ArqTxt,Fields[I].Value,´;´); Writeln(ArqTxt);//Gera nova linha no txt Next; end; end; finally CloseFile(ArqTxt); end; end;
Para Importar os registros use o código abaixo:
procedure TForm1.Button2Click(Sender: TObject); Var Registros,ListaCampos: TStringList; j: Integer ; NomeArquivo:String; Const Enter_ = #13 + 10; begin try NomeArquivo := ExtractFilePath(ParamStr(0)) + ´Material.txt´; Registros := TStringList.Create; ListaCampos := TStringList.Create; Registros.LoadFromFile(NomeArquivo);// Aqui estou informando um nome fixo, deve ser usado uma // opção para o usuário selcionar o arquivo a ser importado for j := 0 to Registros.Count -1 do begin // Separa os campos do registro em itens do TStrinList, registro a registro. ListaCampos.Text := StringReplace(Registros[j], ´;´, Enter_, [rfReplaceAll, rfIgnoreCase]); ClientDataSet1.Open; ClientDataSet1.Insert; ClientDataSet1COD_ORDENADO.AsString := ListaCampos[0]; ClientDataSet1DESCRICAO.AsString := ListaCampos[1]; ClientDataSet1UN.AsString := ListaCampos[2]; ClientDataSet1PRECO_UNITARIO.AsString := ListaCampos[3]; ClientDataSet1.Post; end; finally Registros.Free; ListaCampos.Free; end; end;
Gostei + 0
09/08/2008
Charlesbm
chamai uma procedure no AfterPost do ClientDataSet para o sistema gravar no Generator a sequencia dos registros, só que ele não gravou a ultima sequencia e sim fez a contagem colocando o número sequencial, sendo que existia números desordenados na sequencia. e Como faço par ao sistema verificar se há novos registros para importar ignorando os que existem? Uma vez que quero usar esta rotina diaria para trasnferir a rotina diaria par aum pc que nao esta na rede?
procedure TForm1.Button1Click(Sender: TObject); var ArqTxt:TextFile; NomeArquivo:String; I:Integer; begin //Caminho do txt gerado pela exportação NomeArquivo := ExtractFilePath(ParamStr(0)) + ´Material.txt´; try AssignFile(ArqTxt,NomeArquivo); Rewrite(ArqTxt); with SQLDataSet1 do begin if not Active then Open; First; while not Eof do begin I := FieldCount; for I := 0 to Fields.Count - 1 do //Cada linha gerado no txt corresponde a um Registro da tabela, separando cada um deles com um ";" Ponto e Virgula Write(ArqTxt,Fields[I].Value,´;´); Writeln(ArqTxt);//Gera nova linha no txt Next; end; end; finally CloseFile(ArqTxt); end; end;
procedure TForm1.Button2Click(Sender: TObject); Var Registros,ListaCampos: TStringList; j: Integer ; NomeArquivo:String; Const Enter_ = #13 + 10; begin try NomeArquivo := ExtractFilePath(ParamStr(0)) + ´Material.txt´; Registros := TStringList.Create; ListaCampos := TStringList.Create; Registros.LoadFromFile(NomeArquivo);// Aqui estou informando um nome fixo, deve ser usado uma // opção para o usuário selcionar o arquivo a ser importado for j := 0 to Registros.Count -1 do begin // Separa os campos do registro em itens do TStrinList, registro a registro. ListaCampos.Text := StringReplace(Registros[j], ´;´, Enter_, [rfReplaceAll, rfIgnoreCase]); ClientDataSet1.Open; ClientDataSet1.Insert; ClientDataSet1COD_ORDENADO.AsString := ListaCampos[0]; ClientDataSet1DESCRICAO.AsString := ListaCampos[1]; ClientDataSet1UN.AsString := ListaCampos[2]; ClientDataSet1PRECO_UNITARIO.AsString := ListaCampos[3]; ClientDataSet1.Post; end; finally Registros.Free; ListaCampos.Free; end; end;
Gostei + 0
28/08/2008
Roberiorebeca
Primeiro gostaria de parabenizar a todos deste fórum, pois tem sido uma ferramenta muito umportando para os programadores que estão iniciando nesta jornada.
Segundo agradecer o paullsoftware com este codigo que disponibilizou.
Só estou com um pequeno probleminha, quando importo os dados ele está puxando os dados um duplicidade ou seja duas vezes o mesmo registro do arquivo TXT
Teria que informar algum código pra não importar em duplicidade?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)