Página 1 de 1

[RESOLVIDO] CDX Comportamento estranho...

Enviado: 09 Ago 2009 21:24
por Iwasa
Olá caros colegas,
Percebi algo estranho com o RDD CDX.
Estou trabalhando num sistema com 6 bancos de dados abertos simultaneamente.
a sequencia de abertura é a seguinte:

Código: Selecionar todos

PROCEDURE OpenDBF
  SELECT 1
    USE CLIENTES Alias dbCLTS
       Set Index to CLIENTES
  SELECT 2
    USE COBRADOR Alias dbCBRS
       Set Index to COBRADOR
  SELECT 3
    USE PRACAS Alias dbPRCS
       Set Index to PRACAS
  SELECT 4
    USE MESAS Alias dbMESA
       Set Index to MESAS
  SELECT 5
    USE CLASS Alias dbCLASS
       Set Index to CLASS

  SELECT 6
    USE RESCODE Alias dbRSCD
       Set Index to RESCODE

return NIL

Código: Selecionar todos

 USE COBRADOR
   L := 0
     R := RECCOUNT()*2

     nEVERY:=IIF(LASTREC()>=100,INT(LASTREC()/10),INT(LASTREC()/1))
     INDEX ON CODECOB  TAG COB1 TO COBRADOR EVAL CDXPROGRESS("COBRADOR.DBF","COBRADOR.CDX","CODIGO")   EVERY nEVERY=nEVERY
     INDEX ON NOME     TAG COB2 TO COBRADOR EVAL CDXPROGRESS("COBRADOR.DBF","COBRADOR.CDX","NOME")     EVERY nEVERY=nEVERY
     R:=0
    DBCLOSEALL()
O meu problema está na área 2, digitei uns 4 registros, até aqui tudo bem, mas depois que eu reindexo os bancos de dados, sempre apago os indices como a regra manda, qdo volto no módulo de pesquisa sempre some o ultimo registro, mas ele continua gravado no DBF.
Andei fazendo uns testes e me parece que nao está atualizando o segundo campo.
Eu utilizo o dbedit como ajuda de pesquisa indexado pelo campo nome, é exatamente aqui, depois de indexado sempre some o ultimo registro, se eu alterar este ultimo registro(o registro que sumiu) pelo campo NOME ele dá um erro: _DBFCDX 8006 (errro de corrupção de indice) aí me é apresentado a opçao QUIT e DEFAULT, clicando em DEFAULT ele retorna ao programa e volta o registro que tinha sumido. após indexar de novo some novamente o ultimo registro.
Tudo me indica q a chave codecob está sendo atualizado, pois acrescentando registros mesmo após o ultimo ter sumido o código continua aumentando conforme o normal.
Se eu trocar o indice na parte de ajuda de pesquisa COB2(NOME) por COB1(CODIGO) ele apresenta todos os registros sem faltar nenhum, mas é necessário que seja indexado por COB2.

Algum colega já passou por isso antes?
Pesquisei sobre isso, mas o que eu achei nao me ajudou em nada...
Desde já agradeço a atenção.

Re: CDX Comportamento estranho...

Enviado: 09 Ago 2009 23:39
por alxsts
Saudações a todos!

Voce diz estar usando o RDD DBFCDX (não informa a versão do Clipper). Se bem me lembro, utilizando o DBFCDX, quando existe um arquivo dbf e um de índice com o mesmo nome base (o nome sem extensão), o arquivo de índice (.CDX) é aberto automaticamente e voce só precisa selecionar a ordem desejada. Voce está fazendo isso (Ex do teu código: Use Clientes ... Set Index to Clientes). Experimente tirar os Set Index. Talvez resolva...

Re: CDX Comportamento estranho...

Enviado: 10 Ago 2009 00:03
por Iwasa
Olá Alxsts, obrigado por responder..
Me desculpe a minha falha em não informar a versão do clipper, estou usando o clipper 5.3b e Blinker 7.0.
Vou seguir a sua dica, muito obrigado por enquanto!
Abraços.

Re: CDX Comportamento estranho...

Enviado: 10 Ago 2009 00:20
por Iwasa
Tirei o Set Index to, os indices abriram todos, mas continua da mesma forma, nao sei se meu erro está aqui, seleciono a area desta forma:

Código: Selecionar todos

Function DBPOINTER(nSLT, nORD, lPOS)
DbSelectArea(nSLT) ; ORDSETFOCUS(nORD) ; IIf(lPOS==.T., DbGoTop(), IIF(lPOS==.F., DbGoBottom(), IIF(lPOS==NIL, , )))
Return nil
no caso seria selecionado desta forma:

Código: Selecionar todos

DBPOINTER( 2, 1, .F.) //sempe indo para o final do banco de dados
um exemplo do modulo de consulta:

Código: Selecionar todos

FUNCTION CDCOCO()
local aEnv := savenv( 01, 00, 23, 79 ) //VL-Salva o ambiente
private cTitle:="CONSULTA"

//       definicao de teclas
//**************************
setkey(K_PGDN,  {||nil} )
SETKEY(K_PGUP,  {||NIL} )
SETKEY(K_SH_F2, {||RESCODE()} )
SETCURSOR( 1 )


do while .t.
DBPOINTER( 2 , 1 ,.F.)

SETCOLOR( "N+/W,GR+/RB, , , N*/W" )
@ 02,00 clear to 22,79
Frame( 03, 03, 06, 78, cTitle,3,,,"W+/R") //VL-Desenha moldura


vCODECOB        :=SPACE(05)  
vCOBRADOR       :=SPACE(50)

   IF RECLAST()==0
      MsgBox1("NÇO EXISTE REGISTRO!!!")
            set key K_PGDN to
            set key K_PGUP to
            set key K_SH_F2 to
*          ZERAVAR(.f.)
          CLRTED(22)
          RstEnv( aEnv )
          RETURN
  ELSE
      DBPOINTER( 2 , 1 ,.F.)
      vCTRL:=VAL(dbCBRS -> CODECOB)
   ENDIF


@ 04,05 SAY "CODIGO__________:" GET vCODECOB PICTURE "@K 99999" VALID CHKREG(@vCODECOB,vCTRL)
READ

IF LASTKEY()==K_ESC
            set key K_PGDN to
            set key K_PGUP to
            set key K_SH_F2 to
    MENUCOB()
//    ZERAVAR(.f.)
      CLRTED(22)
      RstEnv( aEnv )
      RETURN
  ENDIF

@ 05,05 SAY "NOME____________:" GET vCOBRADOR PICTURE "@!" // VALID vCOBRADOR # SPACE(50)

  IF (vCODECOB=="00000"  )
  READ

      IF LASTKEY()==K_ESC
      RstEnv( aEnv )
      RETURN CDCOCO()
      ENDIF

    IF vCOBRADOR # SPACE(50)
       SET EXACT ON ; dbCBRS->(DBSETORDER(2))
       dbCBRS->(DBSEEK(vCOBRADOR))
     ELSE
         dbCBRS->(DBSEEK(vCOBRADOR))
     ENDIF
    
     IF !FOUND()
              vDBEDIT:=SAVESCREEN(02,01,22,79)
              @ 02,00 clear to 22,79
              Frame( 03, 01, 22, 78, cTitle,3,,,"W+/R") //VL-Desenha moldura
              dbCBRS->(DBSETORDER(2))
              SET EXACT OFF 
              vCOBRADOR:=ALLTRIM(vCOBRADOR)
              dbCBRS->(DBSEEK(vCOBRADOR))
              DBEDIT(04,02,21,77,dbCOLUN,,.T.,dbTITLE,acCABSEPARET,acCOLSEPARET)
              RESTSCREEN(02,01,22,79,vDBEDIT)
              SET EXACT ON
      ENDIF
  ENDIF

        vCODECOB        :=dbCBRS -> CODECOB
        vCOBRADOR       :=dbCBRS -> NOME

/*
        @ 04,23 GET vCODECOB      PICTURE "@K 99999" VALID CHKREG(@vCODECOB,vCTRL)
        @ 05,23 GET vCOBRADOR     PICTURE "@!" VALID vCOBRADOR # SPACE(50)
*/
DO CADGETCOB   //os gets estao numa procedure das duas linhas acima
CLEAR GETS

INKEY(0)

OPC:=MSGBOX2("CONTINUAR A CONSULTAR CADASTRO?","ATEN€ÇO!!!",,"&SIM", "&NÇO",1,2,"W+/B*","B+/W*",)

IF OPC==1
   loop
       elseif OPC==2
            set key K_PGDN to
            set key K_PGUP to
            set key K_SH_F2 to
            MENUCOB()
*                  ZERAVAR(.f.) // apaga variaveis publicas de campo e mensagem de campo
                  CLRTED(22)
                  RstEnv( aEnv )
          exit
        endif
ENDDO
RETURN NIL
Realmente não tenho idéia do que está errado, pois no módulo de clientes funciona normal a diferença é q este módulo está em um arquivo separado. Tipo para clientes seria clientes.prg e para cobradores que é este trecho está no arquivo cobrador.prg

Re: CDX Comportamento estranho...

Enviado: 10 Ago 2009 06:39
por Iwasa
Fiz mais alguns testes, realmente descobri que está dando problema na hora que eu indexo os arquivos novamente...
Os passos que eu segui foram:
1 apaguei o cobrador.dbf e o indice cobrador.cdx com duas chaves codecob e cobrador.
2 adicionei 2 registros...
3 verifiquei o arquivo de indice em formato hex, estava tudo certinho...
4 Indexei o arquivo, apagando os indices e refazendo-os novamente como rotina acima.
5 verifiquei novamente o arquivo de indice em formato hex...
Conclusão: os codigos (codecob) estavam todos, mas a chave-indice (cobrador) estava faltando do ultimo registro digitado.
Não entendi porque está dando problema na indexação...
Muito estranho, acho que deve ser algum bug da biblioteca RDD, na primeira entrada dos dados, ocorre tudo maravilha, é só indexar que dá problema... ele nao indexa o ultimo registro na segunda chave só a primeira chave.
Mas se alguem mais puder dar um toque, agradeço desde jah.

Re: CDX Comportamento estranho...

Enviado: 10 Ago 2009 10:37
por alaminojunior
Iwasa escreveu:estou usando o clipper 5.3b e Blinker 7.0.
Existe uma biblioteca que você precisa linkar em conjunto com as usuais. Verifique se você está adicionando a lib _DBFCDX.LIB ? (É underlineDBFCDX.LIB mesmo !)

Re: CDX Comportamento estranho...

Enviado: 10 Ago 2009 11:11
por Maligno
Se o colega compilou o programa e não houve qualquer erro do tipo "unresolved external", essa biblioteca não é realmente necessária. Ela só faria diferença se fosse incluída no script precedendo alguma outra na ordem de aparecimento, a fim de que certos módulos pudessem ser substituídos pelos dela.

Aliás, aconselho o colega a utilizar a bilioteca SIX. Ela tem mais recursos.

Qual o fonte da função de acompanhamento de progresso da indexação CDXPROGRESS?

Re: CDX Comportamento estranho...

Enviado: 10 Ago 2009 13:47
por gvc
[Iwasa]

Teste isto:

Código: Selecionar todos

use cobrador
index on codecob  tag cob1 to cobrador
index on nome     tag cob2 to cobrador
dbcloseall()

use cobrador index cobrador

dbappend()
cobrador->codcob := '91111' // coloque um código válido
cobrador->nome := 'JOAO DA SILVA' // coloque um nome válido

dbgotop()
dbedit() // veja se aparece o registro "apendado"

dbsetorder(2)
dbgotop()
dbedit() // veja se aparece o registro "apendado"

dbcloseall()
- Vale lembrar que quando estiver trabalhando com arquivo compartilhado, vc deve usar DBCOMMIT e DBUNLOCK, nessa ordem, para forçar a gravação e liberar o registro do arquivo.

Boa sorte. Espero ter ajudado.

Re: CDX Comportamento estranho...

Enviado: 11 Ago 2009 09:23
por Iwasa
Caros colegas, muito obrigado por responderem ao tópico.

Ao colega Alaminojunior, eu inclui essa bibliotca _dbfcdx.lib, todas as libs estão incluidas no script, valeu pelo detalhe.
Ao colega Maligno, sim, é essa funçao cdxprogress q mostra a barra de indexação, ela realmente não influencia em nada, mas andei vendo a biblioteca six do seu site, realmente tem muitos recursos, fiquei realmente espantado tamanho os recursos que possui, mas teria que estudá-las primeiro. Mas achei muito interessante. Vou pegar os documentários e dar uma estudada, talvez eu mude pra essa biblioteca num futuro proximo :) vou postar aqui o codigo da função cdxprogress.
Ao colega gvc, sim, realmente este código funciona, desde que seja somente 1 base de dados. Tenho que ter as 6 bases abertas ao mesmo tempo, pois uma depende da outra, sendo a principal a base de clientes, a tabela de cobradores, praças e outras bases estão diretamente ou indiretamente vinculadas à tabela clientes por códigos. E lembrando que a base clientes é indexada primeiro e não ocorreu nenhum problema, essa base que está dando problema é a segunda base a ser indexada. Vou fazer testes em cada base de dados com cada chave de indice.

Mas vou continuar fazendo testes, e averiguar o motivo disso, de uma coisa eu já sei: o problema está ligado na indexação, quando vou indexar o arquivo novamente. Pois quando eu insiro os dados pela primeira vez, com as dbf's todas vazias, funciona perfeitamente, o problema é extamente na hora que vou indexar pela função de indexar.

1- Fecho todas as bases de dados.
2- Apago todos os indices .cdx.
3- A função inicia o processo de indexação, a função que postei é a segunda base a ser indexada, ela indexa corretamente a primeira chave, que é de código, a segunda chave que é do nome do cobrador, ela não indexa o ultimo registro e se acrescentar mais 1 registro ela indexa esse registro, mas se eu alterar esse registro q não foi indexado, ela até altera mas gera erro 8006 corrupção de indice, mas clicando na opção DEFAULT (QUIT | DEFAULT) ela fica tudo normal. Mas não deixa de ser um problema. Os comandos para indexação estão todos corretos, pela lógica pode tá faltando algum comando, não sei, pode ser que sim ou não, pois como a estrutura CDX é mais complexa que o NTX, pois CDX é um RDD múltiplo, quem sabe...

Vou ver se consigo resolver essa parada, se conseguir volto a postar os resultados, pois alguém pode passar por algo parecido e ficando documentado aqui no nosso fórum já é uma ajuda legal pra algum colega nosso e até um acréscimo de conhecimento pra alguém.

Caros colegas muito obrigado por enquanto :{

Re: CDX Comportamento estranho...

Enviado: 11 Ago 2009 09:44
por Iwasa
Esta função é conhecida por todos, eu acho, eu adaptei pra ele rodar melhor limitando a barra a 100%, pq às vezes ele ultrapassava o limite de 100% dependendo da divisão, pq como o arquivo de indice é multiplo entao as vezes dependendo da quantidade de registros e indices, estourava os 100%.
Me inspirei nos códigos exemplos do TOYA.
A função, como prometido:

Código: Selecionar todos

//******** FUNCAO CDXPROGESS **
//*****************************
function  CDXPROGRESS(cFBASE, cIDXFILE, cTAG)
local CX, II
local cTITLE:= "Evolu‡Æo da Indexa‡Æo"

L++ //contador
    IF L=1

   //win(00, 00, 00, 00, cTITLE, cCORTITLE, cCORFRAME, lSOMBRA)  //VL-Desenha moldura
   win(09, 13, 16, 66, cTITLE,"W+/B","b/w*",.f.)  //VL-Desenha moldura
   //FRAME( 00, 00, 00, 00, cTITULO, nTITULOALIGN, nESTILOFRAME, cCORFRAME, cCORTITULO)
   Frame(13,14, 15,65,,,3,"N+/w*",)
   @ 14,15 SAY REPLICATE(" ", 50)color "w+/w*"
   ENDIF

   @ 10, 15 say "Arquivo de  dados: " +cFBASE   +space(10) color " n/w* "
   @ 11, 15 say "Arquivo de indice: " +cIDXFILE +space(10) color " n/w* "
   @ 12, 15 say "TAG de indice    : " +cTAG     +space(10) color " n/w* "

    CX:=INT(((L/R)*100)/2)
    iif(R=0,cx:=50,)
         if CX <= 50
         @ 14,15 SAY REPLICATE(chr(219), CX) color " GR+/GR* "
         endif
    II := STR(CX*2,3)+'% conclu¡do'
       if VAL(II) <=100
       @ 15,15 SAY PADC(II,50,'Ä') color 'n+/W*'
       endif


     RETURN NIL

Re: CDX Comportamento estranho...

Enviado: 11 Ago 2009 09:56
por Maligno
Conforme o manual, a função avaliada, e que serve normalmente para acompanhar o progresso da indexação, deve retornar um valor lógico e não NIL, como está agora. Se retornar falso, por exemplo, ele pára a indexação. Portanto, você está enganado. Ela tem influência na indexação sim. Veja um trecho do help:

"Indexing stops if the EVAL condition returns false (.F.)"

Logo,...

Re: CDX Comportamento estranho...

Enviado: 11 Ago 2009 10:21
por Iwasa
Caro Maligno, valeu pelo toque... vou mudar aki e ver se resolve o problema :))
Obrigadão pelo toque...

Re: CDX Comportamento estranho...

Enviado: 11 Ago 2009 10:38
por Iwasa
Caro Maligno, resolveu, muito obrigado mesmo pela sua preciosa dica e obrigado ao pessoal do fórum.

VALEEEEEEEUUUUUUUUU, :)) :{

ps: Tava desesperado :%

Re: [RESOLVIDO] CDX Comportamento estranho...

Enviado: 11 Ago 2009 12:54
por Maligno
Fico contente que tenha resolvido o problema. Desconfiei da função de acompanhamento de progresso justamente porque a indexação do RDD CDX, ao que me consta (uso a SIX), não dá problema algum. É bem estável. E às vezes a solução é mais simples do que imaginamos. :)

O interessante é que internamente o avaliador do bloco externo, apesar de precisar de um retorno booleano, não reclama (run-time) do retorno NIL. E como é um bloco externo, jamais daria erro em compile-time. É um típico bug lógico.

Re: [RESOLVIDO] CDX Comportamento estranho...

Enviado: 11 Ago 2009 13:11
por Iwasa
Contente fiquei eu Maligno :))
Jamais desconfiaria que fosse aquele NIL o problema de tudo isso...
Mais uma vez muito obrigado Maligno. :{