Fórum Criar rotina de exportar/importar de uma determinada tabela #354171

21/02/2008

0

Não se é possível, segundo meu professor de delphi básico [i:8867c67707]Tudo é possível fazer no delphi for windows.[/i:8867c67707] Deixando o blá blá.....
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

Jpauloss

Responder

Posts

21/02/2008

Webjoel

Caro Colega!

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.


Responder

Gostei + 0

21/02/2008

Webjoel

Caro Colega!

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.


Responder

Gostei + 0

21/02/2008

Jpauloss

Caro Colega! 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.

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);



Responder

Gostei + 0

21/02/2008

Jpauloss

Uso DbExpress + FB 2.0


Responder

Gostei + 0

21/02/2008

Webjoel

Primeiramente você faz um select de toda a tabela, usando um SQL_AUX, ou no próprio ClientDataSet.

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´);


Responder

Gostei + 0

21/02/2008

Paullsoftware

Criei um form aqui somente para fazer um exemplo bem simples de como pode ser feito a Exportação / Importação dos dados da sua tabela.

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;
espero ter ajudado, qualquer coisa posta ai :wink:


Responder

Gostei + 0

09/08/2008

Charlesbm

amigão, em primeiro lugar, gostaria de agradecê-lo pela dia, deu certim... Só gostaria de pedir um grande favor seu se puder... No exemplo que aplique este código que vc apresentou abaixo...
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?


Criei um form aqui somente para fazer um exemplo bem simples de como pode ser feito a Exportação / Importação dos dados da sua tabela. 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;
espero ter ajudado, qualquer coisa posta ai :wink:



Responder

Gostei + 0

28/08/2008

Roberiorebeca

Olá Pessoal

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?


Responder

Gostei + 0

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

Aceitar