[firebase-br] IBO - erro ao abrir tib_query pela segunda vez

Andrei Luís compuvale.software em gmail.com
Seg Out 31 00:00:41 -03 2016


Boa noite,

IBO 4.9.9
Delphi 2006
Firebird 2.5.6

Estou com um problema aqui que não entendo o que acontece. Num módulo
financeiro, tenho vários checks e edits para filtrar, ao clicar num botão
vou montando a SQL, abaixo parte do código que está no botão filtrar, onde
o problema acontece.

procedure TfFinanceiroFiltro.bFiltraClick(Sender: TObject);
var wWhere:string;
begin
wWhere:='where ';
with dm.qrFinanceiro do
   begin
      if Active then
         begin
            Close;
            Unprepare;
            IB_Transaction.CommitRetaining;
         end;
      SQL.Clear;
      SQL.Text:='SELECT  f.REGISTRO_ID, e.razaosocial, f.NR_DOCUMENTO,
f.SACADO' +
                ', f.CLIENTE_ID, f.DATAEMISSAO, f.OBSERVACAO1,
f.OBSERVACAO2'+
                ', f.VALOR, f.DATAVENCIMENTO, f.datapagamento,
f.planocontas_id ' +
                ', f.BAIXA_BOLETO, f.DATADABAIXA, f.TIPOBOLETO_ID,
f.BASETERRITORIAL_ID' +
                ', tb.tipoboleto, f.marcado, e.endereco, e.cep, c.cidade,
f.baixa_obs, f.contafinanceiro_id,' +
                ' f.meiopagamento, f.nr_cheque '+
                ', f.valor_pago, pc.tipo credito_debito, ' +
                ' case when pc.tipo=''C'' then ''CRÉDITO''' +
                '      when pc.tipo=''D'' then ''DÉBITO'' ' +
                'end credito_debito_desc ' +
                'FROM Financeiro f';
      SQL.Add('left join empresas e on (e.registro_id=f.cliente_id)');
      SQL.Add('left join tipoboleto tb on
(tb.registro_id=f.tipoboleto_id)');
      SQL.Add('join cidades c on (c.registro_id=e.cidade_id)');
      SQL.Add('left join plano_contas pc on
(pc.registro_id=f.planocontas_id)');

      wWhere:='where ';
      ParamCheck := True;

      bFiltra.tag := 0 ;


      if (checkCredito.Checked) and (not checkDebito.Checked) then
         begin
            Sql.Add(wwhere + '(pc.tipo=''C'')');

            wWhere:='and ';
            bFiltra.tag := 1 ;
         end;
      if (not checkCredito.Checked) and (checkDebito.Checked) then
         begin
            Sql.Add(wwhere + '(pc.tipo=''D'')');

            wWhere:='and ';
            bFiltra.tag := 1 ;
         end;

      if checkQuitadas.checked then
         Begin
            if checkEmAberto.checked then
               begin
                  SQL.Add(wwhere + ' ((f.baixa_boleto = '+QuotedStr('T')+')
or (f.baixa_boleto ='+QuotedStr('F')+') or (f.datapagamento is not null))');

               end
            else
               begin
                  SQL.Add(wwhere + ' ((f.baixa_boleto = '+QuotedStr('T')
+') or (f.datapagamento is not null))');

               end;
            wWhere:='and ';
            bFiltra.tag := 1 ;
         end;
      if checkEmAberto.checked then
         Begin
            if not checkQuitadas.checked then
               begin
                  SQL.Add(wwhere + ' ((f.baixa_boleto = '+QuotedStr('F')
+') and (f.datapagamento is null))');

               end;
            wWhere:='and ';
            bFiltra.tag := 1 ;
         end;
      if (checkDataEmissao.Checked) then
         Begin
            SQL.Add(wwhere + ' (f.dataEmissao between :wdataEmissaoInicial
and :wdataEmissaoFinal)');


ParamByName('wDataEmissaoInicial').asDate:=editDataEmissaoInicial.Date;

ParamByName('wDataEmissaoFinal').asDate:=editDataEmissaoFinal.Date;

            wWhere:='and ';
            bFiltra.tag := 1 ;
         end;

      if (checkDataVencimento.Checked) then
         Begin
            SQL.Add(wwhere + ' (f.dataVencimento between
:wdataVencimentoInicial and :wdataVencimentoFinal) ');

ParamByName('wDataVencimentoInicial').asDate:=editDataVencimentoInicial.Date;

ParamByName('wDataVencimentoFinal').asDate:=editDataVencimentoFinal.Date;

            wWhere:='and ';
            bFiltra.tag := 1 ;
         end;


      if (checkRazao.Checked) and (editRazao.text<>'') then
         Begin
            SQL.Add(wwhere + ' (e.razaoSocial containing :wRazao)');
            ParamByName('wRazao').asString:=editRazao.Text;

            wWhere:='and ';
            bFiltra.tag := 1 ;
         end;

       if (checkNrDoc.Checked) and (editNrDoc.text<>'') then
         Begin
            SQL.Add(wwhere + ' (f.Nr_Documento containing :wNrDoc)');
            ParamByName('wNrDoc').asString:=editNrDoc.Text;

            wWhere:='and ';
            bFiltra.tag := 1 ;
         end;

      Open;
   end;
   StatusBar1.Panels[0].Text := inttostr(dm.qrFinanceiro.RecordCount) +'
registros filtrados';
   StatusBar1.Panels[1].Text := 'Valor total: ' +
FormatFloat('###,###,###.00',
qry_tmp.FieldByName('valor_total').AsCurrency);
   label1.Caption:=inttostr(dm.qrFinanceiro.RecordCount) +' registros
filtrados';

   gbDbGrid.Show;
   gbFiltro.Hide;
end;


Quando executa esse código, dou um hide nas opções do filtro
(gbFiltro.Hide) e mostro o grid com o resultado da query, estou usando
TIB_Query. Nesse ponto apresento alguns botões, e um deles volta para o
filtro com o seguinte código:

   gbDbGrid.Hide;
   gbFiltro.Show;
   dm.qrFinanceiro.Close;
   dm.qrFinanceiro.Unprepare;
   dm.qrFinanceiro.IB_Transaction.CommitRetaining;
   dm.qrFinanceiro.params.CleanupInstance;


O problema está agora, se tento filtrar uma segunda vez, com mais campos.
Por exemplo, acabo de fazer um teste da seguinte forma:

Primeira pesquisa, checks marcados: checkQuitadas, checkCredito e
checkRazao. Roda redondo. Volto e desmarco checkRazao e marco checkNrDoc:
tudo certo, sem problema. Volto e marco checkRazao novamente, ficando dessa
vez marcados checkQuitadas, checkCredito, checkRazao e checkNrDoc, aí
aparece o erro isc error code 335544572  invalid cursor reference no
momento em que dou open no TIB_Query. Aí preciso fechar o sistema e abrir
novamente para poder abrir essa query. Já troquei o CommitRetaining por
Commit e deu na mesma.

Mais um fato curioso, se eu abro o sistema, e filtro por todos os campos
que mencionei, não dá erro na primeira vez, mas se altero algum parametros,
o erro acontece.

Alguém tem uma luz pra me dar? Trata-se de um sistema que roda a bastante
tempo, e de repente começou isso. Provável que eu tenha mudado alguma
propriedade que está ocasionando isso.Tenho um módulo semelhante em outro
sistema que não está acontecendo isso.

[]s
Andrei



Mais detalhes sobre a lista de discussão lista