Importar arquivo.txt

Delphi

30/06/2008

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.


Preto_filho

Preto_filho

Curtidas 0

Respostas

Altingon

Altingon

30/06/2008

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


GOSTEI 0
Preto_filho

Preto_filho

30/06/2008

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.


GOSTEI 0
Altingon

Altingon

30/06/2008

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


GOSTEI 0
Preto_filho

Preto_filho

30/06/2008

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

Grato pela atenção de todos.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/06/2008

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;



GOSTEI 0
Preto_filho

Preto_filho

30/06/2008

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.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/06/2008

adicione o item poAllowCommandText à propriedade Options do seu DatasetProvider.


GOSTEI 0
Preto_filho

Preto_filho

30/06/2008

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 .


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/06/2008

ô 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


GOSTEI 0
Preto_filho

Preto_filho

30/06/2008

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 .


GOSTEI 0
Preto_filho

Preto_filho

30/06/2008

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.


GOSTEI 0
Altingon

Altingon

30/06/2008

Você pode fazer um contador.

var
i:integer;

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

Espero ter ajudado


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/06/2008

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


GOSTEI 0
Preto_filho

Preto_filho

30/06/2008

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.


GOSTEI 0
Comodelphi

Comodelphi

30/06/2008

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

abcs


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/06/2008

mas como você quer fazer?

ao pressionar cancelar somente pára a importação, ou cancela também os registros que já foram processados?


GOSTEI 0
Preto_filho

Preto_filho

30/06/2008

Bom Dia

Ai emerson.en bl ?

Tem como vc me mostrar as duas formas .

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


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/06/2008

como você não publicou o seu procedimento corrigido, vou me basear naquele que eu te passei...

cancelando pela ´metade´...
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;

  lCancelou := False; // variável private

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

  // faça enquanto não chegar ao fim do arquivo e não for cancelado pelo usuário
  while not Eof(fArq) and not lCancelou do
  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);
  if not lCancelou then
    ShowMessage(´Processo Concluído com êxito´)
  else
    ShowMessage(
      Format(´Processo CANCELADO pelo usuário.´#13´Foram processados ¬d registros de um total de ¬d´,
        [ProgressBar1.Position, ProgressBar1.Max]));

  ProgressBar1.Position := 0;

  ClientDataSet1.Close; // fecha a tabela
end;


no código do botão coloque algo como:
procedure TForm1.ButtonCancelarClick(Sender: TObject);
begin
  lCancelou := Application.MessageBox(´Deseja realmente cancelar a importação?´,
    ´Cancelar´, mb_TaskModal + mb_IconQuestion + mb_YesNo) = mrYes;
end;



GOSTEI 0
Preto_filho

Preto_filho

30/06/2008

Bom Dia

emerson.en ai bl ? a variavel lcancelou é e que tipo ?

o que vai fazer o código, qd cancelar , vai apenas cancelar a importação e deixar gravado até o momento que foi cancelado , ou vai cancelar toda a importação .

Grato pela atenção.


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;
Gauge1.Visible := True;
Gauge1.MaxValue := mTexto.Count -1;
mTexto.Free;
Label2.Visible := False;

// fecha a tabela e atribui a instrução sql
ClientDataSet1.Close;
ClientDataSet1.CommandText := ´select * from ATENDIMENTO 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
ClientDataSet1RAZAO_SOCIAL.AsString := Trim(copy(Linha,7,49));
ClientDataSet1CNPJ.AsString := Trim(copy(Linha,57,13));
ClientDataSet1IE.AsString := Trim(copy(Linha,70,19));
ClientDataSet1ENDERECO.AsString := Trim(copy(Linha,90,75));
ClientDataSet1CIDADE.AsString := Trim(copy(Linha,166,29));
ClientDataSet1CEP.AsString := Trim(copy(Linha,197,8));
ClientDataSet1UF.AsString := Trim(copy(Linha,205,02));
ClientDataSet1BAIRRO.AsString := Trim(copy(Linha,207,24));
ClientDataSet1REDE_ASSOC.AsString := Trim(copy(Linha,232,02));
ClientDataSet1COD_REDE.AsString := Trim(copy(Linha,234,06));
ClientDataSet1RZ_SOCIAL_REDE.AsString := Trim(copy(Linha,240,24));
ClientDataSet1COD_ASSOC.AsString := Trim(copy(Linha,265,06));
ClientDataSet1RZ_SOCIAL_ASSOC.AsString := Trim(copy(Linha,271,20));
ClientDataSet1.Post; // salva
ClientDataSet1.ApplyUpdates(0); //atualiza no banco
//ProgressBar1.Position := ProgressBar1.Position + 1;
Gauge1.Progress := Gauge1.Progress + 1;
end;

MessageBeep(65);
ShowMessage(´Processo Concluído com êxito´);
//ProgressBar1.Position := 0;
Gauge1.Progress := 0;
with ClientDataSet1 do
begin
Close;
CommandText := ´select * from ATENDIMENTO´;
Open;
end;
Label2.Visible := True;
Label2.Caption := IntToStr(ClientDataSet1.RecordCount);
Gauge1.Visible := False;

end;


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/06/2008

pela linha da atribuição - lCancelou := False; - você consegue saber qual é o tipo da variável (obviamente, boolean).

o procedimento, da forma que foi passado, pára a importação, mas mantém o que for importado até o momento do pressionamento do botão.


GOSTEI 0
Preto_filho

Preto_filho

30/06/2008

Boa Tarde

Ai emerson.en bl ?

Até agora suas dicas estão sendo show de bola.

Agora estou realizando uma pesquisa em uma tabela com 18.000,00 mil registros, caso eu busque pelo código digitando os 6 digitos retorna certinho, mas no meu caso na tabela tem muitos códigos que iniciam com zeros a esquerda, nesse caso o meu código não retorna nada, sobi a mensagem código não encontrado.

procedure TForm2.Button2Click(Sender: TObject);
begin
if Edit3 .Text<>´´then
begin
if not ClientDataSet1.Locate(´CODIGO´,StrToInt(Edit3 .Text),[]) then
ShowMessage(´Código Não encontrado!´)
end
else
ClientDataSet1.First;
Edit3.Text:=´´;
Edit3.SetFocus;
end;

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


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/06/2008

antes de fazer a busca, coloque os zeros à esquerda no valor que vocÊ quer procurar. assim:
procedure TForm2.Button2Click(Sender: TObject);
begin
  if Edit3.Text <> ´´ then
  begin
    Edit3.Text := RightStr(´000000´+Trim(Edit3.Text),6);
    if not ClientDataSet1.Locate(´CODIGO´,Edit3.Text,[]) then
      ShowMessage(´Código Não encontrado!´);
  end
  else
    ClientDataSet1.First;

  Edit3.SetFocus;
end;

adicione a unit StrUtils à cláusula uses.


GOSTEI 0
Preto_filho

Preto_filho

30/06/2008

Bom Dia


Ai emerson.en bl ?

Novamente Show de bola sua dica.

Kra, agora que não tenho idéia de como agir, tenho uma tabela de cliente e uma tabela de produtos.
O que preciso fazer é o seguinte : preciso criar outra tabela por exemplo ´chamado´ nesta tabela preciso digitar o código do cliente em um edit e ao clicar no botão preencher o outro edit com a Razão Social do cliente + endereço + UF, esses dados estão na tabela de cliente.

como faço para gravar as informações nessa nova tabela ´CHAMADO´.

Desde já agradeço pela sua atenção.


GOSTEI 0
Preto_filho

Preto_filho

30/06/2008

Bom Dia


Ai emerson.en bl ?

Novamente Show de bola sua dica.

Kra, agora que não tenho idéia de como agir, tenho uma tabela de cliente e uma tabela de produtos.
O que preciso fazer é o seguinte : preciso criar outra tabela por exemplo ´chamado´ nesta tabela preciso digitar o código do cliente em um edit e ao clicar no botão preencher o outro edit com a Razão Social do cliente + endereço + UF, esses dados estão na tabela de cliente.

como faço para gravar as informações nessa nova tabela ´CHAMADO´.


Obs: na tabela chamado tenho outros campos que prencho manualmente, por exemplo data, e outras informações, o campos CODIGO e FK é da tabela de clientes.

Desde já agradeço pela sua atenção.


GOSTEI 0
POSTAR