DbSeek eventualmente não funciona?? Será??

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

Moderador: Moderadores

Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

DbSeek eventualmente não funciona?? Será??

Mensagem por fladimir »

Pessoal, acho q de tanta lógica estou ficando ilógico...

Coisas q parecem não terem sentido ou eu q não tenho o conhecimento necessário... vejam a situação abaixo:

Código: Selecionar todos

Use Clientes alias Clientes Shared New
DbSetIndex('Clientes')
Clientes->(OrdSetFocus(1)) // Ordem de Codigo

ConRec->( DBGOTOP() )
WHILE ConRec->( !EOF() )
   Clientes->( ORDSETFOCUS(1) )
   if Clientes->( !DBSEEK(ConRec->Codigo) )
      if !CriaCliente(ConRec->Codigo, ConRec->Nome, ConRec->Prazo)
         ConRec->( DBSKIP() )
         LOOP
      endif
   endif
...
END

//------------------------------------------------------------------------------
static function CriaCliente(cCodigo, cNome, nPrazo) 
   if empty(cNome)
      return .F.
   endif
   Clientes->( dbAppend() )
   Clientes->Codigo     := cCodigo
   Clientes->Nome       := cNome
   Clientes->Prazo := nPrazo
   Clientes->( LiberaReg() )
return .T.


********************************
procedure LiberaReg()
	goto RecNo()
        dbcommit()  
	dbSkip( 0 ) // dica Quintas topic 16174
	unlock
return

Hj no cliente praticamente toda a tabela de clientes quintuplicou os nomes, ou seja, toda vez q emitiu o relatorio pra cada vez criou um copia de cada cliente com conta em aberto.

Então não é a primeira vez q percebo q parece q o DBSeek não obedece o indice mesmo ele estando setado.

Ai reindexa o sistema e funciona... mas como saber se o índice esta realmente funcionando? Será q estou viajando na maionese... alguém q entende bem como funciona os indices, indexar / reindexar poderia explicar?

Hj eu reindexo o sistema somente na virada de mês e qdo atualiza a versão, fora isto não.

[] ´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

DbSeek eventualmente não funciona?? Será??

Mensagem por asimoes »

O RDD é CDX OU NTX ?

SET AUTOPEN ON OU OFF ?

Fladimir,

Você pode fazer também uma função que leia o os campos que você precisa do DBF para um vetor e depois é só pesquisar nesse vetor, é só uma idea
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Euclides
Usuário Nível 3
Usuário Nível 3
Mensagens: 154
Registrado em: 12 Mai 2007 14:07
Localização: São Paulo, Capital

DbSeek eventualmente não funciona?? Será??

Mensagem por Euclides »

Olá!
Como já disse aquele grande guru, o Padre Quevedo, "ISSO NÂO ECZISTE!!"
O dbseek funciona desde os tempos do DBASE II.
Quando isso acontece comigo eu faço:

Código: Selecionar todos

   cSeek := <a expressão p/ o seek> 
   if dbseek(cSeek)
   ... (processamento)
   else
     ? cSeek
     ? alias()
     ? indexkey() 
     ? indexord() 
   endif

Aí eu descubro se andei mudando de área, index order ou só estou usando uma expressão errada para o dbseek.
SEMPRE funcionou (espero que funcione também)
É claro que no seu caso, vai ter que fazer mais testes porque está fazendo uma ação para !dbseek(...). Mas a filosofia é a mesma. Vai ter que testar tudo isso antes de fazer o append.
T+, Euclides
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

DbSeek eventualmente não funciona?? Será??

Mensagem por fladimir »

Colegas, obrigado pela atenção...

Alexandre, uso DBFCDX e Set AutoOpen (conferi pelo DEBUG) esta TRUE, não defino ele no sistema então deve ser o default dele.

Euclides penso como vc mas nesta parte de índices as vezes me confundo, penso q falta algum conhecimento q posso estar deixando passar desapercebido, igual comentei q indexo 1 vez ao mês, será q isto não pode prejudicar? Qual a maneira mais correta referente ao entendimento de indexação?
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

DbSeek eventualmente não funciona?? Será??

Mensagem por asimoes »

Fladimir,

Indices CDX tem que ter o cuidado quando faz a reindexação, o ideal é SET AUTOPEN OFF e fazer SET INDEX TO INDICE onde precisa abrir o dbf.

Na indexação antes de indexar:

1 - deletar todos indices .CDX
2 - fazer um pack all
3 - copiar o dbf para um temporário (criar estrutura e fazer append from)
4 - apagar o dbf de trabalho e renomear o temporário para o dbf de trabalho
5 - Indexar

Isso é somente uma sugestão.

Eu uso HBNETIO / CDX e nunca mais tive problemas com indices.

Isso em uma rede local.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

DbSeek eventualmente não funciona?? Será??

Mensagem por rubens »

Fladimir quando você indexa você apaga o CDX? É muito óbvio mas é nestes momentos que deixamos passar as coisas mais básicas...

Tá acontecendo em todos os clientes? ou ó em determinado cliente ou só em determinado sistema operacional?
Tá em rede?
Provavelmente tudo isso você já se questionou ou verificou mas....

Eu particularmente gosto do teste de lógica começando do verdadeiro, as vezes você consegue visualizar mais claro o problema... não indicação de que seja isso... mas nessa hora qualquer questionamento bobo é válido né...

Veja também que depos do

Clientes->( ORDSETFOCUS(1) )
Você não colocou o dbgotop() e já mandou um dbseek() acho que o problema pode estar aí...


Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

DbSeek eventualmente não funciona?? Será??

Mensagem por Nascimento »

tive isso quando era com .ntx mais com cdx nunca tive este tipo de problema
mais atente para uma coisa, qual a maneira que vc esta indexando e qual a maneira que vc esta procurando

vc tem que indexar e pesquizar da mesma forma tipo:

se vc indexar str(123,5)
vc tem que procurar

seek str(123,5)

se vc indexar strzero(123,5)

tambem vc tem que procurar por

seek strzero(123,5)

pode ser isso ou em algum momento o seu sistema esta mudando a ordem do indice....
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

DbSeek eventualmente não funciona?? Será??

Mensagem por JoséQuintas »

Tô estranhando o OrdSetFocus(), ele aceita número?

Prefiro usar o jeito tradicional nos fontes.

Código: Selecionar todos

   Use Clientes alias Clientes Shared New
   SET INDEX TO clientes

   SELECT CONREC
   GOTO TOP
   DO WHILE ! Eof()
      IF ! Encontra( conrec->Codigo, "CLIENTES", "indnum" )
         IF ! CriaCliente(ConRec->Codigo, ConRec->Nome, ConRec->Prazo)
            SKIP
            LOOP
         ENDIF
      ENDIF
   ...
   ENDDO

STATIC FUNCTION CriaCliente( cCodigo, cNome, nPrazo )  

   LOCAL nSelect := Select()
   
   IF Empty( cNome )
      RETURN .F.
   ENDIF
   SELECT clientes
   RecAppend()
   REPLACE ;
      clientes->Codigo WITH cCodigo, ;
      clientes->Nome WITH cNome, ;
      clientes->Prazo WITH nPrazo
   RecUnlock()
   SELECT ( nSelect )

   RETURN .T.

FUNCTION RecUnlock()

   SKIP 0 // dica Quintas topic 16174
   UNLOCK

   RETURN NIL
   
FUNCTION Encontra( xChave, cAlias, cTag )

   LOCAL nSelect := Select(), cOrdSetFocus, lFound, nRecNo
   
   SELECT ( Select( cAlias ) )  // Atenção: comando SELECT, e função Select()
   cOrdSetFocus := OrdSetFocus( cTag )
   SEEK xChave
   lFound := ! Eof()
   nRecNo := RecNo()
   ordSetFocus( cOrdSetFocus )
   GOTO ( nRecNo )
   SELECT ( nSelect ) // Atenção: comando SELECT
   
   RETURN lFound

FUNCTION RecAppend()

   APPEND BLANK // sua rotina
   
   RETURN NIL
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

DbSeek eventualmente não funciona?? Será??

Mensagem por JoséQuintas »

Acabei até encontrando este post:

https://pctoledo.org/forum/viewto ... =4&t=10119

Mas eu usava SIXCDX, e sempre usei como caractere, mesmo usando x := OrdSetFocus()
Não sei se depende da RDD.
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

DbSeek eventualmente não funciona?? Será??

Mensagem por JoséQuintas »

Ai reindexa o sistema e funciona... mas como saber se o índice esta realmente funcionando? Será q estou viajando na maionese... alguém q entende bem como funciona os indices, indexar / reindexar poderia explicar?
Um acréscimo: deveria estar com todos os índices abertos para serem atualizados.
Justamente essa é a vantagem do CDX, porque abre todos os índices e conta somente como um índice aberto, e evita problemas de atualizar índices por não estar aberto algum deles.
No Clipper isso é uma vantagem grande, por causa do limite de arquivos abertos.
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
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

DbSeek eventualmente não funciona?? Será??

Mensagem por fladimir »

Obrigado pessoal pelas ponderações...

De cada 1 pude tirar pontos importantes para re-analisar

Alexandre, faço conforme vc mencionou, sobre apagar, pack, temporario, append from etc etc... somente a questão do AUTOPEN q difere, vou mudar já q é mais indicado (tinha lido em outro lugar tb sobre isto)
Sobre a sugestão do HBNETIO, eu confundo com o LetoDB, ainda não sei bem qual usar (diferenças em relação a 1 e outro etc), testei com o LetoDB do fork e funcionou, apenas terei q fazer uma mudança em relação ao FOR dos indices, q não são poucos, então estou testando por fora bem bem pra ver se encaro a mudança e nesse interim quero me aprofundar e testar o HBNETIO, acredito q tb vai ajudar.

Rubens, não faço o DBGOTOP pra mandar pro inicio antes da pesquisa, pq o DBSeek simples faz um dbgotop() antes... faça um teste semelhante ao abaixo pra ver:

Código: Selecionar todos

   Use Tabela Alias Tabela
   Index on Codigo To Tabela
   dbgobottom()
   if DBSEEK( '123') //--> Mesmo tendo indo antes pro final o DbSeek começa a pesquisa do inicio.
      Alert( 'Achou')
   endif

Nascimento, sobre o q pesquisar estar de acordo com o indice é fundamental, obrigado por lembrar

Quintas, OrdSetFocus aceita Número, apesar de qdo mudei uma época pra SQLRDD via xHarbour tive q trocar tudo pra caracter, talvez seja melhor usar a TAG/Caracter ao inves de numero pq se acompanhamos via DEBUG se fazemos ? OrdSetFocus(numero) da diferente o retorno de OrdSetFocus("Nome") apesar de funcionar, o retorno diferente q é estranho.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


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

DbSeek eventualmente não funciona?? Será??

Mensagem por JoséQuintas »

Sobre a sugestão do HBNETIO, eu confundo com o LetoDB, ainda não sei bem qual usar (diferenças em relação a 1 e outro etc)
Também sempre confundi.
O Itamar postou a explicação do Prmezek sobre a diferença entre os dois.
O lettodb age mais como servidor de dbfs, e o hbnetio apenas faz uma comunicação entre terminal/servidor.
É como se o hbnetio trocasse os carros que transportam dados por carros de fórmula 1.
E o lettodb trocasse por aviões, sem necessidade de estrada.

https://pctoledo.org/forum/viewto ... 42&t=18083
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/
Euclides
Usuário Nível 3
Usuário Nível 3
Mensagens: 154
Registrado em: 12 Mai 2007 14:07
Localização: São Paulo, Capital

DbSeek eventualmente não funciona?? Será??

Mensagem por Euclides »

Boa tarde pessoal!
Eu ia 'passar direto' nesta, como lá passei em outras vezes... (aqui e em outros sites)
MAS NÂO RESISTI!!! (desculpem)
PÕ!!... estamos falando de um 'mísero' dbseek()... numa situação de "que se tem processa e que se não tem cria e processa".
...e vem neguinho falar de netio, letdb, autoopen, "reindexar não sei quando" e outras coisa que se li, jé nem lembro mais...
Se o dbseek não achou... é porque não está lá, ou é porque não fizeram o dbseek do jeito que deveria ser feito.
(os motivos eu já apresentei antes)
Só para informação (para os que estão lendo isto aí ainda...)
EU NÃO FAÇO REINDEXAÇÂO PROGRAMADA DE INDEXES. (nem diário, nem mensal, nem o ...)
Há mais de DÉCADAS que ouço isto e sempre considerei POG (programação orientada a gambiarra)
Eu faço a verificação dos índices (que é mais rápido e pode ser feita on-line). Se achar algo errado, é claro refaço os índices
(mas isto é assunto para outro 'post')
Tenham um bom fim de semana.
Euclides
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

DbSeek eventualmente não funciona?? Será??

Mensagem por fladimir »

Euclides vc esta certo no sentido de DbSeek faz isso e ponto, agora pra mim o assunto de indexação/reindexação/SET AUTOPEN não era totalmente claro, com isto a dúvida pairava em poder estar afetando e quis aproveitar o problema pra tentar entender mais do CONTEXTO em geral sobre índices.

Sua opinião é totalmente válida e agradeço.
...e vem neguinho falar de netio, letdb, autoopen, "reindexar não sei quando" e outras coisa que se li, jé nem lembro mais...
Isto ocorreu pq como expliquei acima além da dúvida do Dbseek já coloquei sobre minha falta de clareza sobre o contexto de índices em geral e alguns colegas auxiliaram nisto, sinto talvez ter "esparramado" um pouco o foco.

Eu faço a verificação dos índices (que é mais rápido e pode ser feita on-line). Se achar algo errado, é claro refaço os índices
(mas isto é assunto para outro 'post')
Achei interessante isto, se puder passar o link ou criar um post sobre o assunto agradeço.
Tenham um bom fim de semana.
Obrigado e igualmente Euclides.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

DbSeek eventualmente não funciona?? Será??

Mensagem por asimoes »

Euclides disse
...e vem neguinho falar de netio, letdb, autoopen, "reindexar não sei quando" e outras coisa que se li, jé nem lembro mais...
Rapaz acho que você tá no fórum errado, aqui todos tentam ajudar uns aos outros.

Outra coisa que você disse:
Eu faço a verificação dos índices (que é mais rápido e pode ser feita on-line). Se achar algo errado, é claro refaço os índices
(mas isto é assunto para outro 'post')
Rapaz mostra aqui mesmo como você faz, aproveita que o assunto pode ajudar outros colegas.

Se o seu método é tão eficaz assim a prova de corrupção, estamos todos interessados em ver.

Assim penso eu.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder