Fórum Laço para executar linha por linha do Memo na Query #465375

30/12/2013

0

Boa noite à todos!

Já sou usuário DevMedia à muito tempo mas é a primeira vez que uso o forum. Estou desenvolvendo uma aplicação para executar comandos sql em tabelas paradox para uso na empresa onde trabalho e estou com uma dúvida em relação ao uso de laço para leitura do Memo. O problema é que ele sempre executa com êxito o script mas ainda sim sai do "try" e executa o "Except", mesmo quando o try é executado sem erros.
Abaixo segue o código do evento do botão:

procedure TFrm_UCT.Bt_ExecutaAtuaPdxClick(Sender: TObject);
var
  I, Linha_memo: Integer;
begin
  if not Assigned(Frm_Processando) then
  begin
    Frm_Processando := TFrm_Processando.Create(Self);
    Frm_Processando.Lb_Aguardando.Caption :=
      'Efetuando comparação estrutural de tabelas.';
    Frm_Processando.Show;
  end;
  Linha_memo := 1;
  while Linha_memo <= Memo_AtuaPdx.Lines.Count do
    // for I := 0 to Memo_AtuaPdx.Lines.Count do
    try
      begin
        screen.cursor := crSQLWait;
        Qry_AtuaPdox.Close;
        Qry_AtuaPdox.DatabaseName := Edt_Base.Text;
        Qry_AtuaPdox.SQL.Clear;
        Qry_AtuaPdox.SQL.Text := (Memo_AtuaPdx.Lines.Strings[Linha_memo]);
        Qry_AtuaPdox.ExecSQL;
        Linha_memo := Linha_memo + 1;
        screen.cursor := crDefault;
      end;
    Except
      begin
        TaskMessageDlg('Atenção!',
          'Ocorreu um erro ao executar o script, verifique a sintaxe SQL do Arquivo AtuaPdx.',
          mtError, [MbOk], 0);
        Frm_UCT.Qry_TbDest.Free;
        screen.cursor := crDefault;
        Break;
        Frm_Processando.Close;
      end;
    end;
  Frm_UCT.Qry_TbDest.Free;
  screen.cursor := crDefault;
  Frm_Processando.Close;
End;


Desde já agradeço.
Att.
Tiago Gomes

Tiago Gomes

Responder

Post mais votado

02/01/2014

Marcos e Leandro, agradeço a ajuda!

Consegui resolver o problema, o código ficou da seguinte forma:
procedure TFrm_UCT.Bt_ExecutaAtuaPdxClick(Sender: TObject);
var
  I, Linha_memo: integer;
begin
  if not Assigned(Frm_Processando) then
  begin
    Frm_Processando := TFrm_Processando.Create(nil);
    Frm_Processando.Lb_Aguardando.Caption :=
      'Atualizando estrutura da base de dados.';
    Frm_Processando.Show;
    Application.ProcessMessages
  end;
  Linha_memo := 0;
  while Linha_memo <= Memo_AtuaPdx.Lines.Count - 1 do
  begin
    try
      try
        begin
          Application.ProcessMessages;
          screen.cursor := crSQLWait;
          Qry_AtuaPdox.Close;
          Qry_AtuaPdox.DatabaseName := Edt_Base.Text;
          Qry_AtuaPdox.SQL.Clear;
          Qry_AtuaPdox.SQL.Add(Trim(Memo_AtuaPdx.Lines.Strings[Linha_memo]));
          Qry_AtuaPdox.ExecSQL;
          inc(Linha_memo);
          screen.cursor := crDefault
        end;
      Except
        begin
          TaskMessageDlg('Atenção!',
            'Ocorreu um erro ao executar o script, verifique a sintaxe SQL do Arquivo AtuaPdx.',
            mtError, [MbOk], 0);
          Break
        end;
      end;
    Finally
      screen.cursor := crDefault;
      // Frm_UCT.Qry_TbDest.Free;
      FreeAndNil(Frm_Processando)
    end;
  end
End;


O fato era que o Tmemo começa com índice " 0", portanto ao usar o laço assim:
while Linha_memo <= Memo_AtuaPdx.Lines.Count - 1 do
, o loop perduraria até o último índice + 1.

Aproveitando o momento, queri perguntar: Para fazer a gravação de campos vocês preferem um TQuery ou um TTable, porque?

Agora vou iniciar o desenvolvimento de um bloco para analisar a sintaxe sql - paradox.
Agradeço e bom 2014!

Tiago Gomes

Tiago Gomes
Responder

Gostei + 1

Mais Posts

31/12/2013

Marcos Saffran

Olá Tiago,

verifique o que é apresentado com o comando:

ShowMessage(Memo_AtuaPdx.Lines.Strings[Memo_AtuaPdx.Lines.Count]);

assim você verificará a última linha do memo.
Responder

Gostei + 0

31/12/2013

Leandro Chiodini

Verifique se alguma mensagem vem na sua variável de erro,
pois quando uma Etrutura try esta dentro de outra,
o try estoura somente no ultimo try...
justamente para isso que serve o try...
da uma verificada pra ver se não ta vindo o erro, mesmo não parando a execução.
Responder

Gostei + 0

31/12/2013

Tiago Gomes

Olá Tiago,

verifique o que é apresentado com o comando:

ShowMessage(Memo_AtuaPdx.Lines.Strings[Memo_AtuaPdx.Lines.Count]);

assim você verificará a última linha do memo.


Boa noite Marcos Alfredo Saffran!
Fiz o teste no laço e também no evento onclick de um botão após carregar o TMemo com as linhas, me surpreendi pois não retorna nenhuma mensagem. Não está contatando a quantidade de itens. Como calcular a quantidades de linhas?
Responder

Gostei + 0

31/12/2013

Tiago Gomes

Verifique se alguma mensagem vem na sua variável de erro,
pois quando uma Etrutura try esta dentro de outra,
o try estoura somente no ultimo try...
justamente para isso que serve o try...
da uma verificada pra ver se não ta vindo o erro, mesmo não parando a execução.


Boa noite Leandro Chiodini!

Só existe este um try - except mesmo. Efetuei o teste, coloquei direto e apareceu o erro da imagem anexada.[img:descricao=Erro ao executar o script sem o Try - Except]http://arquivo.devmedia.com.br/forum/imagem/263493-20131231-205701.jpg[/img]

Desde já agradeço!
Responder

Gostei + 0

31/12/2013

Tiago Gomes

O interessante é que todas as linhas do arquivo txt são executadas com êxito, ou seja os campos são criados com sucesso na tabela, logo após aparece o erro descrito na imagem.

Verifique se alguma mensagem vem na sua variável de erro,
pois quando uma Etrutura try esta dentro de outra,
o try estoura somente no ultimo try...
justamente para isso que serve o try...
da uma verificada pra ver se não ta vindo o erro, mesmo não parando a execução.


Boa noite Leandro Chiodini!

Só existe este um try - except mesmo. Efetuei o teste, coloquei direto e apareceu o erro da imagem anexada.[img:descricao=Erro ao executar o script sem o Try - Except]http://arquivo.devmedia.com.br/forum/imagem/263493-20131231-205701.jpg[/img]

Desde já agradeço!
Responder

Gostei + 0

02/01/2014

Leandro Chiodini

Bom dia,
Amigo, da uma olhada se no teu TXT, nao esta executando a ultima linha com algum erro,
espaço em branco, alguma coluna que esteja com valores errados.
este erro é de banco de dados,
geralmente quando a estrutura esta errada, ou dos comandos,
ou do (insert, update etc..)
Responder

Gostei + 0

02/01/2014

Marcos Saffran

Olá Tiago,

verifique o que é apresentado com o comando:

ShowMessage(Memo_AtuaPdx.Lines.Strings[Memo_AtuaPdx.Lines.Count]);

assim você verificará a última linha do memo.


Boa noite Marcos Alfredo Saffran!
Fiz o teste no laço e também no evento onclick de um botão após carregar o TMemo com as linhas, me surpreendi pois não retorna nenhuma mensagem. Não está contatando a quantidade de itens. Como calcular a quantidades de linhas?


Olá Tiago,
se não retorna nenhuma mensagem é porque a última linha contém espaços, tente ignorar essa última linha.
Responder

Gostei + 0

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

Aceitar