Importar arquivo.txt

30/06/2008

18

Boa Tarde

Estou usando o Delphi 7 + Fire Bird 2.0

Tenho um arquivo chamado cad_cliente.txt, o mesmo contem informaçãoes de posições definidas, preciso importar o arquivo para uma tabela do banco e gravar as informações, no exemplo que estou passando o arquivo contem 5 linhas mas somente a ultima linha grava na tabela no banco. Segue abaixo

// Arquivo

000001FCIA. DO IPAM LTDA
000002ASSOCIACAO EDUCADORA SAO CARLOS
000003DROG MAIS ECONOMICA LTDA
000004DROG MAIS ECONOMICA LTDA
000005DROG MAIS ECONOMICA LTDA
000006DROG MAIS ECONOMICA LTDA
000007DROG CAPILE LTDA
000008FCIA. DO IPAM LTDA
000009DROG MAIS ECONOMICA LTDA
000010DROG MAIS ECONOMICA LTDA

// Código

procedure TForm1.BitBtn1Click(Sender: TObject);
var
fArq : TextFile; // tipo texto
Caminho : String; // armazena o caminho
Linha : String; // lê a linha do tipo texto
mTexto : TStringList;
i : Integer; //utilizada no contador de linhas
begin
Caminho := Edit1.Text; // variavel recebe os dados do edit
AssignFile(fArq,Caminho);
Reset(fArq);
mTexto := TStringList.Create;
mTexto.LoadFromFile(Caminho);
ProgressBar1.Max :=mTexto.Count - 1;
i := 0;
mTexto.Free;
while not Eof(fArq) do // faça enquanto não chegar ao fim do arquivo
begin
Application.ProcessMessages;
Readln(fArq, linha); // leia o texto e a linha
//ClientDataSet1.Params.ParamByName(´CODIGO´).AsString := Trim(copy(Linha,1,6)); // buscando pelo parâmetro código
ClientDataSet1.Open; // abrindo a tabela
if ClientDataSet1.IsEmpty then // se a tabela estiver vazia
ClientDataSet1.Append // insira os arquivos lidos
else // senao
ClientDataSet1.edit; // edite e atualize

// aqui os campos recebem as linhas lidas
ClientDataSet1CODIGO.AsString := Trim(copy(Linha,1,6));
ClientDataSet1NOME.AsString := Trim(copy(Linha,7,32));

ClientDataSet1.Post; // salva
ClientDataSet1.ApplyUpdates(0); //atualiza no banco
ClientDataSet1.Close; // fecha a tabela
Inc(i);
ProgressBar1.Position := ProgressBar1.Position + 1;
Next;
End;
MessageBeep(65);
ShowMessage(´Processo Concluído com êxito´);
ClientDataSet1.Open;
ProgressBar1.Position :=0;

end;
end.

A linha abaixo esta comentada no código pois qd compilo o pragrama da erro nessa linha, após comentar a linha o programa compila e roda normal, mas não grava todas as informações.

//ClientDataSet1.Params.ParamByName(´CODIGO´).AsString := Trim(copy(Linha,1,6)); // buscando pelo parâmetro código

Desde já agradeço pela atenção de todos.


Responder

Posts

30/06/2008

Altingon

Escreva aqui a mensagem de erro, ajuda bastante...


Responder

30/06/2008

Preto_filho

Quando eu clico no botão importar da a seguinte mensagem.

´CLIENTDATASET1: parameter ´CODIGO´ not found.

fora esse erro que estou enviando, porque quando importo o arquivo apenas o ultimo registro do arquivo grava na tabela no banco.

Grato pela atenção.


Responder

30/06/2008

Altingon

Você esta com problema no seu sql.... ele deve ficar mais ou menos assim: ´select * from tabela where codigo = :codigo´ esse é o jeito de passar por parametro
Antes de passar o parametro feche o ClientDataSet

Valeu


Responder

30/06/2008

Preto_filho

É por esse motivo que não esta gravando todos os registro na tabela no banco ?

Grato pela atenção de todos.


Responder
deve ser algo mais ou menos assim:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  fArq: TextFile; // tipo texto
  Caminho: String; // armazena o caminho
  Linha: String; // lê a linha do tipo texto
  mTexto: TStringList;
begin
  Caminho := Edit1.Text; // variavel recebe os dados do edit
  AssignFile(fArq,Caminho);
  Reset(fArq);
  mTexto := TStringList.Create;
  mTexto.LoadFromFile(Caminho);
  ProgressBar1.Max := mTexto.Count - 1;
  mTexto.Free;

  // fecha a tabela e atribui a instrução sql
  ClientDataSet1.Close; 
  ClientDataSet1.CommandText := ´select * from tabela where codigo = :codigo ´;

  while not Eof(fArq) do // faça enquanto não chegar ao fim do arquivo
  begin
    Application.ProcessMessages;
    Readln(fArq, linha); // lê a linha e joga o conteúdo na variável linha

    // buscando pelo parâmetro código
    ClientDataSet1.Close; // fechando a tabela
    ClientDataSet1.Params.ParamByName(´CODIGO´).AsString := Trim(copy(Linha,1,6));
    ClientDataSet1.Open; // abrindo a tabela

    if ClientDataSet1.IsEmpty then // se a tabela estiver vazia
    begin
      ClientDataSet1.Append; // insira um registro vazio
      ClientDataSet1CODIGO.AsString := Trim(copy(Linha,1,6));
    end
    else // senao
      ClientDataSet1.edit; // edita o registro encontrado

    // aqui os campos recebem os valores lidos
    ClientDataSet1NOME.AsString := Trim(copy(Linha,7,32));
    ClientDataSet1.Post; // salva
    ClientDataSet1.ApplyUpdates(0); //atualiza no banco

    ProgressBar1.Position := ProgressBar1.Position + 1;
  end;

  MessageBeep(65);
  ShowMessage(´Processo Concluído com êxito´);
  ProgressBar1.Position := 0;

  ClientDataSet1.Close; // fecha a tabela
end;



Responder

01/07/2008

Preto_filho

Bom Dia

Ai emersom.en, fiz como vc comentou, mas quando eu no botão para importar o arquivo da a seguinte mensagem de erro.

´ CommandText Changes are not alowed ´

Grato pela atenção de todos.


Responder
adicione o item poAllowCommandText à propriedade Options do seu DatasetProvider.


Responder

01/07/2008

Preto_filho

ae emerson.en, setei para ´TRUE´ conforme vc informou, mas agora esta dando outro error.


Table unknown
TABELA
At line 1 , column 22.



Grato pela atenção .


Responder
ô meu filho... troque TABELA pelo nome da sua tabela.
aquilo foi somente pra você saber como montar a instrução.

se sua tabela é CLIENTE, a instrução deve ser:

select * from cliente where codigo = :codigo


Responder

02/07/2008

Preto_filho

Bom Dia

Ai emerson.en bl ?

acabei me descuidando no nome da tabela, mas já esta funcionado,

mas acabei ficando com outra duvida, sempre que importo um arquivo no GRID, retorna sempre o ultimo registro do arquivo.
ae se eu fechar o programa e abrir novamente retorna todos os registros do arquivo.

Dese já agradeço pela atenção .


Responder

02/07/2008

Preto_filho

Já resolvi, fiz um select para retornar os campos.

Mas gerou outra duvida,

no final do arquivo eu estou jogando uma mensagem na tela, nessa mesma mensagem gostaria de mostrar o total de registros no arquivo.



Grato pela atenção.


Responder

02/07/2008

Altingon

Você pode fazer um contador.

var
i:integer;

depois do ClientDataSet1.Post; vc coloca inc(i);

Espero ter ajudado


Responder
o total de registros não é o mesmo valor em ProgressBar1.Max?


Responder

02/07/2008

Preto_filho

Pessoal já resolvi.

Agora é o seguinte, tenho um botão para cancelar a operação de importação, por exemplo , o arquivo já esta sendo importado, mas no meio da importação preciso cancelar, como devo fazer?

Desde já agradeço pela atenção de todos.


Responder

02/07/2008

Comodelphi

uma Thread resolve, da uma pesquisada no fórum deve ter uma penca de tópicos.

abcs


Responder