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

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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 ?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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()
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

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

Mensagem 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
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

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

Mensagem 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.
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

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

Mensagem 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.
Inacio de Carvalho Neto
Responder