Página 2 de 2

localização e posicionamento do browse usando ADO/recordset

Enviado: 15 Nov 2024 08:17
por JoséQuintas
Nunca vi isto

Código: Selecionar todos

SET MAX_JOIN_SIZE=1111111111111
Isso é pra definir quantidade máxima de registros na consulta ?

localização e posicionamento do browse usando ADO/recordset

Enviado: 15 Nov 2024 08:47
por JoséQuintas
Acho que vou desistir de tentar entender.

Código: Selecionar todos

novaconsado("select * from tarsequencias where id>0",,,,,,,,55,"[ENTER] - marca *; [DEL]-apaga registro","fu_tarsequencias")
...
function novaconsado(sql,or,modo,coluna,prov,nTop1,nTop2,nBottom1,nBottom2,cRodape,func_usuario)
..
            retorno=&(func_usuario)(sql)
Passa pra função de usuário o texto do select, não faz sentido.
Não estou disposto a tentar entender o conjunto, vai levar muito tempo.

Bom....

Se está incluindo/alterando/excluindo informações no servidor, precisa chamar oRs:Requery() pra consulta conter as atualizações.
Isso é equivalente a fazer outro select, mas é mais rápido.

E nesse caso, e também se está alterando a posição dentro do recordset, precisa do oBrowse:RefreshAll() antes de retornar ao Browse.

Se for apenas alteração no registro atual, oBrowse:refreshCurrent() seria suficiente.

Tente imaginar que são três coisas diferentes:
1) uma é sua consulta, e o registro atual da consulta
2) outra é a situação no servidor, que conforme a situação vai ficar diferente da consulta atual
3) outra é a situação do browse na tela, que considera o registro atual como a linha atual, e se mexer na posição, desconfigura o browse

Com base nisso, vai olhar sua rotina e o que acontece em cada parte.
Se atualizou o (2) vai precisar atualiar o (1) oRs:Requery(), e também atualizar (3) o browse oBrowse:RefreshAll()
Se atualizou o (2) apenas o registro atual, atualizar o (1) oRs:Requery(), no (3) browse só precisa atualizar esse registro oBrowse:RefreshCurrent()
Se mexeu na posição de (1), vai ter que atualizar (3) o browse geral oBrowse:RefreshAll()

localização e posicionamento do browse usando ADO/recordset

Enviado: 15 Nov 2024 21:59
por alxsts
Olá!

Não vou me aprofundar na análise do teu código pois é uma tarefa inglória. Sei que não é programador profissional por isto não vou dizer que é horrível. Mas pode melhorar

Apague as linhas 193 até 201 e no lugar coloque o código abaixo. Creio que vá funcionar.

Código: Selecionar todos

oTbrowse:goTop():forceStable()

While Empty( Eval(  oTBrowse:getcolumn(1):block ) )
   oTBrowse:down():forceStable()
   If oTBrowse:hitbottom()
      EXIT
   Endif
Enddo
Edit: apagar linhas 193 até 201

localização e posicionamento do browse usando ADO/recordset

Enviado: 15 Nov 2024 22:51
por cjp
Pessoal, resolvido o problema com a sugestão do alxsts. Muito obrigado a todos.

Vou responder às demais mensagens apenas para informação:
Vixe, muita calma nessa hora.
A velha história de 2 tabelas em uma.
Tem delete na mesma tabela que tá fazendo browse.

E mais de um servidor, o que é esquisito.

Vai precisar também refresh na consulta ADO, mas preciso entender melhor esse fonte.



Neste caso, salvo engano meu, não tem 2 tabelas em uma. Até tenho isso em uma outra tabela antiga, que ainda não consegui arrumar, mas nesta não, é uma tabela bem simples (apenas 3 campos).

Uso sim mais de um servidor. E a função de browse é genérica para várias tabelas, e por isso passo pra ela a informação de em qual servidor está a tabela. Mas neste caso específico, a tabela está em um deles apenas.




Nota: imagino que esse fonte é apenas um agrupamento de outros fontes pra poder postar, e no aplicativo não se trata de um único fonte.
Não, não é o caso.


Isso é pra definir quantidade máxima de registros na consulta ?
Sim. Isto foi necessário para uma das tabelas, que tem muitos registros. Mas não é o caso desta aqui em questão.


Passa pra função de usuário o texto do select, não faz sentido.
Realmente não fazia sentido e não era necessário. Já suprimi.


Não estou disposto a tentar entender o conjunto, vai levar muito tempo.

Bom....

Se está incluindo/alterando/excluindo informações no servidor, precisa chamar oRs:Requery() pra consulta conter as atualizações.
Isso é equivalente a fazer outro select, mas é mais rápido.

E nesse caso, e também se está alterando a posição dentro do recordset, precisa do oBrowse:RefreshAll() antes de retornar ao Browse.

Se for apenas alteração no registro atual, oBrowse:refreshCurrent() seria suficiente.

Tente imaginar que são três coisas diferentes:
1) uma é sua consulta, e o registro atual da consulta
2) outra é a situação no servidor, que conforme a situação vai ficar diferente da consulta atual
3) outra é a situação do browse na tela, que considera o registro atual como a linha atual, e se mexer na posição, desconfigura o browse

Com base nisso, vai olhar sua rotina e o que acontece em cada parte.
Se atualizou o (2) vai precisar atualiar o (1) oRs:Requery(), e também atualizar (3) o browse oBrowse:RefreshAll()
Se atualizou o (2) apenas o registro atual, atualizar o (1) oRs:Requery(), no (3) browse só precisa atualizar esse registro oBrowse:RefreshCurrent()
Se mexeu na posição de (1), vai ter que atualizar (3) o browse geral oBrowse:RefreshAll()
Ainda estou tentando entender bem a classe TBrowse. A maior parte deste código é cópia do código que vc postou tempos atrás, e muita coisa eu não sei explicar bem. Mas funciona.
Entendi o que vc disse, e estou tentando aprender isto melhor.

localização e posicionamento do browse usando ADO/recordset

Enviado: 16 Nov 2024 07:32
por JoséQuintas
Achei que era multitabela por conta disto
Dá a impressão de que exclui mais de um registro.

Código: Selecionar todos

         @ 20,5 say "Confirma exclusão deste registro?"get conf pict "@!"
         read
         if conf="S"
            exqado("delete from tarsequencias where id="+alltrim(str(nId)),3)
            if pegadado("tarefa","tarsequencias","id="+alltrim(str(nId+1)))="Bíblia" .and. pegadado("marcacao","tarsequencias","id="+alltrim(str(nId+1)))#"*"
               exqado("delete from tarsequencias where id="+alltrim(str(nId+1)),3)
            endif
            do while .t.
               nId=pegadado("id","tarsequencias","id>"+alltrim(str(nId))+" and tarefa='"+cTar+"'")
              if hb_isnumeric(nId)
                  exqado("delete from tarsequencias where id="+alltrim(str(nId)),3)
                  if pegadado("tarefa","tarsequencias","id="+alltrim(str(nId+1)))="Bíblia" .and. pegadado("marcacao","tarsequencias","id="+alltrim(str(nId+1)))#"*"
                     exqado("delete from tarsequencias where id="+alltrim(str(nId+1)),3)
                  endif
              else
                 exit
               endif
            enddo
         endif
         return 1
       endif

localização e posicionamento do browse usando ADO/recordset

Enviado: 16 Nov 2024 09:44
por JoséQuintas
Sim. Isto foi necessário para uma das tabelas, que tem muitos registros. Mas não é o caso desta aqui em questão.
Voltando nisso.

Veja com atenção qual é a situação, e se dá pra otimizar.
Se tem muito registro, sinal de que está usando muita informação e muito servidor.
Não pode considerar normal, enquanto não esgotar as opções de otimizar.
O servidor SQL procura otimizar, mas não faz milagre, às vezes precisa de ajuda.

Quando faz um JOIN, ele pode multiplicar as tabelas.
SELECT A JOIN B JOIN C, se cada tabela tem 1.000 registros, se não definir direito, o servidor vai trabalhar com 1.000.000.000, um bilhão de registros.
Isso seria o extremo, deixar de colocar filtros ou deixar de indicar relacionamentos.

localização e posicionamento do browse usando ADO/recordset

Enviado: 18 Nov 2024 01:33
por cjp
Achei que era multitabela por conta disto
Dá a impressão de que exclui mais de um registro.
Sim, exclui também o registro seguinte, mas não é multitabela não.


Voltando nisso.

Veja com atenção qual é a situação, e se dá pra otimizar.
Se tem muito registro, sinal de que está usando muita informação e muito servidor.
Não pode considerar normal, enquanto não esgotar as opções de otimizar.
O servidor SQL procura otimizar, mas não faz milagre, às vezes precisa de ajuda.

Quando faz um JOIN, ele pode multiplicar as tabelas.
SELECT A JOIN B JOIN C, se cada tabela tem 1.000 registros, se não definir direito, o servidor vai trabalhar com 1.000.000.000, um bilhão de registros.
Isso seria o extremo, deixar de colocar filtros ou deixar de indicar relacionamentos.
Entendo.
Na verdade só fiz isso porque estava dando algum problema no browse antes, apenas nessa tabela grande. E alguém me recomendou resolver assim. E realmente resolveu.
Eu nem uso JOIN. Não sei porque estava dando problema. E também não sei porque isso resolveu. Mas resolveu.


Outro detalhe curioso: vc mencionou que isto não fazia sentido: retorno=&(func_usuario)(sql). E realmente não me parece fazer sentido passar o sql para a função de usuário, até porque a função de usuário nem mesmo recebe a variável, e muito menos usa ela.
Mas, estranhamente, depois que tirei a variável, todo o browse passou a dar erro:
Ocorreu o erro: Error BASE/1003 Varißvel nÒo existe: FU_AULAS
Erro estranho, porque FU_AULAS, neste exemplo, é o nome da função de usuário, não é variável (se bem que o nome da função de usuário é passado como variável para a função novaconsado).

Coloquei de volta a passagem, pra parar de dar erro. Mas não entendi.