Página 1 de 2
DbSeek eventualmente não funciona?? Será??
Enviado: 11 Mar 2017 00:23
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
DbSeek eventualmente não funciona?? Será??
Enviado: 11 Mar 2017 11:40
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
DbSeek eventualmente não funciona?? Será??
Enviado: 11 Mar 2017 13:51
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
DbSeek eventualmente não funciona?? Será??
Enviado: 11 Mar 2017 14:11
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?
DbSeek eventualmente não funciona?? Será??
Enviado: 11 Mar 2017 15:58
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.
DbSeek eventualmente não funciona?? Será??
Enviado: 11 Mar 2017 16:02
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
DbSeek eventualmente não funciona?? Será??
Enviado: 11 Mar 2017 18:25
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....
DbSeek eventualmente não funciona?? Será??
Enviado: 11 Mar 2017 20:25
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
DbSeek eventualmente não funciona?? Será??
Enviado: 11 Mar 2017 20:33
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.
DbSeek eventualmente não funciona?? Será??
Enviado: 11 Mar 2017 20:39
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.
DbSeek eventualmente não funciona?? Será??
Enviado: 12 Mar 2017 13:17
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.
DbSeek eventualmente não funciona?? Será??
Enviado: 12 Mar 2017 13:50
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
DbSeek eventualmente não funciona?? Será??
Enviado: 12 Mar 2017 14:45
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
DbSeek eventualmente não funciona?? Será??
Enviado: 12 Mar 2017 15:10
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.
DbSeek eventualmente não funciona?? Será??
Enviado: 12 Mar 2017 16:27
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.