Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

brunogomes93

Importar Txt Tamanho Fixo para MySQL

Recommended Posts

Ola Pessoal, primeiramente peço desculpas caso tenha postado no local errado, pois sou novo no forum


estou com o seguinte problema, estou tentando importar um txt com tamanho fixo para o mysql e nao estou conseguindo.


tentei varios codigos aqui do forum e de outros sites e nao consegui.


com o codigo que estou usando agora ele nao da erro para compilar, porem quando clico no botao a aplicacao trava e nada e inserido no banco.


segue codigo:




procedure TFRM_PRINCIPAL.BT_PROCESSA_ARQUIVOClick(Sender: TObject);
var
txt: TextFile;
arq: String;
codigo,descricao,dpto,oferta,preco : String;
begin
AssignFile(txt,ED_URL_ARQUIVO.Text);
Reset(txt);
while not eoln(txt) do
begin{2}
ReadLn(txt,arq);
codigo := Copy(arq,3,9);
descricao := Copy(arq,19,68);
dpto := Copy(arq,1,2);
preco := Copy(arq,10,15);
with DM_PRINCIPAL.SQLQ_IMPORTA_MGV do
begin
DM_PRINCIPAL.SQLQ_IMPORTA_MGV.SQL.Clear;
DM_PRINCIPAL.SQLQ_IMPORTA_MGV.SQL.Add('insert into produtos(prod_codigo,prod_descricao,prod_dpto,prod_preco) values ('+#34+codigo+#34+','+#34+descricao+#34+','+#34+dpto+#34+','+#34+preco+#34+')');
DM_PRINCIPAL.SQLQ_IMPORTA_MGV.ExecSQL;

end;
end;{2}
CloseFile(txt);
ShowMessage('Arquivo Importado com sucesso!');



end;



Agradeço desde ja pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, pode ter N razões pra isso... uma é que não está fechando a sua query antes de tentar dar o execute, outra possibilidade é estar tentando gravar algo errado e estar dando algum erro... enfim, esse é o tipo de situação em que tem que se debugar o código linha a linha e simular a execução para ver se não é um erro de lógica na sua programação ou na montagem do sql que está fazendo isso ocorrer... de todo modo, fiz de cabeça uma adequação no seu código para ver se isto o ajuda. Obviamente, não o testei, até porque não tenho a estrutura da sua tabela e nem os arquivos que irá importar.

 

 

procedure TFRM_PRINCIPAL.BT_PROCESSA_ARQUIVOClick(Sender: TObject);
var
  Arquivo   : TStringList;
  iRegistro : integer;
  codigo,
  descricao,
  dpto,
  oferta,
  preco     : String;
begin
   try
     try
        Arquivo := TStringList.Create;
        Arquivo.LoadFromFile( ED_URL_ARQUIVO.Text );
     except
        showmessage('Erro durante a criação do TStringList de leitura do arquivo ' + ED_URL_ARQUIVO.Text);
        Exit;
     end;
     //Auxiliar que irá controlar o registro (linha) que está sendo lido do arquivo
     iRegistro     := -1;
     while iRegistro < Arquivo.Count -1 do
     begin
        inc(iRegistro);
        codigo     := Copy(Arquivo[iRegistro],3 ,9);
        descricao  := Copy(Arquivo[iRegistro],19,68);
        dpto       := Copy(Arquivo[iRegistro],1 ,2);
        preco      := Copy(Arquivo[iRegistro],10,15);
        //Como está usando o with, não precisa passar novamente o DM_PRINCIPAL.SQLQ_IMPORTA_MGV
        //para acessar as propriedades do componente
        with DM_PRINCIPAL.SQLQ_IMPORTA_MGV do
        begin
           if Active then
              Close;
           SQL.Clear;
           SQL.Add('insert into produtos(prod_codigo,prod_descricao,prod_dpto,prod_preco) ');
           //Substitui o #34 por quotedStr por terem a mesma função, mas não testei... teria que ver se montou
           //o sql corretamente. Outra coisa, todos os campos que está gravando são realmente strings na tabela
           //destino pra estar enviando entre aspas?
           SQL.Add('values (' + QuotedStr(codigo) + ',' + QuotedStr(descricao) + ',' + QuotedStr(dpto)+','+ QuotedStr(preco)+')');
           //O código abaixo serve apenas pra ver a sql gerada durante o debug
           //Showmessage(SQL.Text);
           try
              ExecSQL;
           except
              on E : Exception do
                 ShowMessage(E.ClassName + ' Ocorreu um erro durante a operação: '+ E.Message);
           end;
        end;//With DM_PRINCIPAL.SQLQ_IMPORTA_MGV
     end;//While iRegistro < Arquivo.Count -1
   finally
     FreeAndNil(Arquivo);
   end;
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Chrnos, usei seu código, ele executou tudo ok porem mesmo assim não estava gravando, ai com um pouco mais de pesquisa coloquei apos executar o sql o comando

 

DM_PRINCIPAL.SQLTransaction1.Commit;

 

ai funcionou!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.