Página 1 de 2

DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 06 Mai 2011 02:19
por Alexandre Silva
POis é.. eu sei DBFNSX/1012 é corrupcao no arquivo..
no caso apareceu especificamente em ordprod2.nsx . causando uma série de problemas..
e nao tenho como voltar pra versao clipper 16 bits

O arq ordem de producao, é um dos mais usados no sistema..testei para ver se o dbf esta ok parece 100%
nao há caracteres estranhos..esse dbf nao tem campos memo..

Claro que apagando e recriando os indices, fica certo, mas acabou acontecendo de novo..no mesmo dia.
Ja repassei todas a rotinas, o proprio GAS abre o arquivo e os indices..
nao deveria ter corrupcao..
Alguma dica, ???!! alguma lib a mais que posso usar, ou flag na compilacao..
Uso o HB2.1 com hbmk2


Estou usando o RDD NSX no harbour, usando o lib do gaspro, adaptada..
Até algum tempo o harbour nao tinha suporte as esses indices.. nao é isso ?
era recomendado usar CDX... Entao nao sei se os NSX sao 100%
eu apenas faço o seguinte, no começo do sistema:

Código: Selecionar todos


function main()
# include "info_ind.ch"  // inicializa constantes manifestas
# include "INF_PUBL.ch"  // contem variaveis publicas
# include "hbgtinfo.ch"   //  Hb_GTInfo(HB_GTI_MOUSESTATUS, .f. )  // mouse off
*--
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_ES850C
Request dbfnsx
Rddsetdefault("dbfnsx")
Dbsetdriver("dbfnsx")
REQUEST DESCEND, MTAB, VUF, VDV2, VCGC, NMES, VHORA, EXT

Tenho quase 200 dbf, e só esse da Ordem producao. deu problema..
se fosse problema da funcao daria para todos
Funcao que abre os arquivos no GASPRO

Código: Selecionar todos

/*
   Sintaxe: USEARQ( <ExpC> [,ExpL1] [,ExpN1], [,ExpN2] [,ExpL2] )
   Funcao.: Abre arquivo de dados e seus ¡ndices associados
              ExpC  = nome do arquivo
              ExpL1 = .t. abre modo exclusivo
              ExpN1 = num de vezes que sera tentada a abertura
              ExpN2 = tempo em segundos entre as tentativas de abertura
              ExpL2 = .t. abre associando os ntx
   Retorna: .t. se abriu o arquivo
*/
FUNC USEARQ(db_,use_ex,n_tent,t_tent,com_ntx)
LOCAL op_sis, qt_ind, p_, drv_dbf, p_sempre, v_r, msg,;
      ind01, ind02, ind03, ind04, ind05, ind06
n_tent=IF(n_tent=NIL,0,n_tent)
t_tent=IF(t_tent=NIL,1,t_tent)
com_ntx=IF(com_ntx=NIL,.t.,com_ntx)
use_ex=IF(use_ex=NIL,.f.,use_ex)
p_sempre=(n_tent=0)
n_ant=n_tent
v_r=.f.
op_sis=EVAL(qualsis,db_)                           // obtem subscricao do DBF no vetor Sistema
IF op_sis>0                                        // tem drives
   drv_dbf=sistema[op_sis,O_ARQUI,O_DIR_DBF]       // drive de dados
   drv_ntx=sistema[op_sis,O_ARQUI,O_DIR_NTX]       // drive dos indices
ELSE                                               // nao tem drives, pega default
   drv_dbf=drvdbf                                  // drive de dados
   drv_ntx=drvntx                                  // drive dos indices
ENDI
IF "\" $ db_                                       // verifica se passou diretorio + arquivo
   p_=RAT("\",db_)
   drv_dbf=LEFT(db_,p_)                            // pega diretorio passado e
   db_=SUBS(db_,p_+1)                              // o nome do arquivo
ENDI
IF EMPTY(SELECT(db_))                              // o arquivo nao esta' em uso, vamos abri-lo...
   db_f=drv_dbf + db_
   SELE 0                                          // seleciona proxima area livre

   #ifdef COM_REDE
      msgt="OUTRO USURIO ACESSANDO|O ARQUIVO "+db_
      DO WHIL n_tent>=0 .OR. p_sempre              // tenta abrir o aruivo n vezes ou p/ sempre
         IF use_ex                                 // tenta abrir com exclusividade
            USE (db_f) EXCLUSIVE
         ELSE                                      // tenta abrir compartilhado
            USE (db_f) SHARED
         ENDI
         IF ! NETERR()                             // abriu sem problemas
            v_r=.t.
            EXIT
         ENDI
         DBOX("Tentando abrir|"+;                  // avisa usuario, espera n_tent
              IF(p_sempre,"(NŽO","(ESC")+;         // segundos para tentar novamente
              " cancela)",15,,t_tent,,msgt)
         n_tent-=t_tent
         IF !p_sempre .AND. LASTKEY()=K_ESC        // se nao for para sempre e quer
            EXIT                                   // cancelar, nao tenta abrir mais
         ENDI
      ENDD
      CLEA TYPEAHEAD                               // limpa o buffer do teclado
      IF ! v_r                                     // se nao conseguiu abrir o arquivo
         RETU (.f.)                                // retorna falso
      ENDI
   #else
      USE (db_f)                                   // abre o arquivo
   #endi

   IF com_ntx                                      // abre arquivo com os indices
      IF op_sis=0                                  // se o arquivo e' externo ao sistema...
         v_r=AT(".",db_)                           //  tira extensao do arquivo
         n_t_x=IF(v_r>0,LEFT(db_,v_r-1),db_)       //  caso exista
         nt_x=drv_dbf+LEFT(n_t_x,7)+"1"            //  verifica se existe arquivo
         IF FILE(nt_x+EXTENSAO())                  //  se existir indice com nome xxx1.ntx,
            SET INDE TO (nt_x)                     //   vamos usa-lo
            DBSETORDER(1)
         ELSE                                      //  se nao procura
            nt_x=drv_dbf+LEFT(n_t_x,7)             //  indice com
            IF FILE(nt_x+EXTENSAO())               //  nome xxx.ntx, usa
               SET INDE TO (nt_x)
               DBSETORDER(1)
            ENDI
         ENDI
      ELSEIF LEN(sistema[op_sis,O_INDIC])>0        // senao, abre indices segundo vetor sistema
         qt_ind=LEN(sistema[op_sis,O_INDIC])
         ind01=sistema[op_sis,O_ARQUI,O_DIR_NTX]+sistema[op_sis,O_INDIC,1]
         IF qt_ind=1
            SET INDE TO (ind01)
         ELSE
            ind02=sistema[op_sis,O_ARQUI,O_DIR_NTX]+sistema[op_sis,O_INDIC,2]
            IF qt_ind=2
               SET INDE TO (ind01), (ind02)
            ELSE
               ind03=sistema[op_sis,O_ARQUI,O_DIR_NTX]+sistema[op_sis,O_INDIC,3]
               IF qt_ind=3
                  SET INDE TO (ind01), (ind02), (ind03)
               ELSE
                  ind04=sistema[op_sis,O_ARQUI,O_DIR_NTX]+sistema[op_sis,O_INDIC,4]
                  IF qt_ind=4
                     SET INDE TO (ind01), (ind02), (ind03), (ind04)
                  ELSE
                     ind05=sistema[op_sis,O_ARQUI,O_DIR_NTX]+sistema[op_sis,O_INDIC,5]
                     IF qt_ind=5
                        SET INDE TO (ind01), (ind02), (ind03), (ind04), (ind05)
                     ELSE
                        ind06=sistema[op_sis,O_ARQUI,O_DIR_NTX]+sistema[op_sis,O_INDIC,6]
                        IF qt_ind=6
                           SET INDE TO (ind01), (ind02), (ind03), (ind04), (ind05), (ind06)
                        ENDI
                     ENDI
                  ENDI
               ENDI
            ENDI
         ENDI
         DBSETORDER(1)
      ENDI
   ENDI
ELSE
   SELE SELECT(db_)                                // arquivo ja' estava aberto
ENDI
RETU .t.                                           // deu tudo certo...


Uma coisa que percebi no harbour é que quando se abre um arquivo, mesmo que só para consultas
deve-se abrir todos os indices. senao dá problema eu faço isso..

Alguem ai que esta migrando do GASPRO para Harbour usa NSX ou foi para o CDX ?

DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 06 Mai 2011 18:50
por Alexandre Silva
Acabei localizando a rotina que gera o problema...
Esse processo é realizado na expedica, chao de fabrica, micro com Windows XP
Alguma dica.. o Arq.Orprod é aberto com todos os indices normalmente..

Código: Selecionar todos

 ..
   SELE ORDPROD
   SET ORDER TO 1
   SEEK STR(vcodop,06,00)
   IF BLOREG(0,.5)   // era bloreg(3,.5)
      vttpares:=spares('P')   // nao abre arquivos
      vlido:=spares('L')      // nao abrea arquivos
      
      if vlido>=vttpares  // se completou OP, passa de G/S para 'E'
         REPLA SITUACAO WITH 'E'  // expedicao pronta
         ** comeco do erro
         ** esse campo SITUACAO FAZ PARTE DA CHAVE ORDPROD2.NSX 
         ** Que é o indice que fica corrompido
      endif

      COMMIT  // <===== erro 1012 corrupcao sistema cai..
      UNLOCK
   endif
   .
   .


   Function BLOREG(xArg1,xArg2)
   Local xVar1,xVar2,xVar3,xVar4
   xArg1:= IIf(PCount() = 0,0,xArg1)
   xArg2:= IIf(PCount() < 2,1,xArg2)
   xVar1:= xArg1 = 0
   xVar2:= xArg1
   xVar3:= .F.
   xVar4:= nextkey()
   Do While (xArg1 >= 0 .AND. LastKey() # 27 .OR. xVar1)
      If (RLock())
         xVar3:= .T.
         Exit
      EndIf
      dbox("Tentando bloquear|"+IIf(xVar1,"(NŽO","(ESC")+" cancela)",15,Nil,xArg2,Nil,"OUTRO USUARIO ACESSANDO|O REGISTRO")
      xArg1:= xArg1-xArg2
   EndDo
   If (xVar4 == 0)
      Clear Typeahead
   EndIf
   Return xVar3
* situacao dos indices arq.ORDPROD.DBF, deveriam estar com a mesma data e HORA ! :(Neg

Código: Selecionar todos

06/05/2011  17:39           184.320 ORDPROD1.nsx
07/05/2011  13:38           156.672 ORDPROD2.nsx
07/05/2011  13:38           198.656 ORDPROD3.nsx
07/05/2011  13:38           150.528 ORDPROD4.nsx
06/05/2011  17:39           330.752 ORDPROD5.nsx

DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 07 Mai 2011 13:46
por Jairo Maia
Olá Alexandre,

O arquivo BLOREG() da lib está ok. Não tem nenhuma relação com o erro.

Voce alterou de 3 tentativas de .5 segundos para permanente, o que ocorria antes?

Não conheço a função SPARES(), nunca criei uma situação que ela fosse gerada no gas. O que faz essa função que vc envia o "P" eo "L"?

Sei que se vc tentar gravar um conteudo diferente do typo do campo, acorre o erro DBFNSX/1020, e corrupção de arquivo o erro DBFNSX/1012. Mas vc verificou se o campo SITUACAO é mesmo caracter?

Vc verificou se o setor que o arquivo está usando no HD, não está corrompido? Uma forma de verificar isso, é não apagar o arquivo para recrialo, mas renomear para que o proximo indice a ser criado ocupe outros setores.

COMMIT, força a gravação dos dados da memória no arquivo. Em ambiente de rede isto permite que as informalçoes fiquem disponíveis imediatamente na rede.

DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 07 Mai 2011 13:56
por Alexandre Silva
Mudei o bloreg de 3 para 0 porque era o unico bloreg difente no Prg, todos estavam 0,0.5
A funcao spares() é funcao minha para contar pares, nao abre outros arquivos apenas soma os pares da ordem de producao parametro P. e soma os que foram lidos parametro L.
O campo situacao é caracter...
Essa rotina funcionava perfeitamente no clipper...
poderia ser algo relaciona a memoria ?? voce viu o outro topico que postei ? essa aplicacao em GASPRO, no harbour esta usando mais de 30% da CPU no meu micro, no cliente chega a 70 %
Essas duas estacoes que leem os pares na expedicao sao Windows XP.

DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 07 Mai 2011 15:25
por Jairo Maia
Alexandre,
Alexandre Silva escreveu:poderia ser algo relaciona a memoria ?? voce viu o outro topico que postei ? essa aplicacao em GASPRO, no harbour esta usando mais de 30% da CPU no meu micro, no cliente chega a 70 %
Essas duas estacoes que leem os pares na expedicao sao Windows XP.
Não sei dizer se pode ter relação com memória, creio que não. Aliás, não sei se tem relação o uso de CPU com uso de memória.

Vc tentou fazer uma compilação sem ser no modo incremental? Se não tentou, faça um backup antes da pasta toda, apenas por segurança. Vc pode zipar o conteúdo dela num arquivo na mesma pasta.

Para fazer uma compilação global, remova de seu arquivo projeto.hbp a linha -inc

Quanto ao erro da impressora que vc havia citado, acho que ficou resolvido. Baixe o arquivo em anexo, e substitua a função ERROMSG() em sua lib, e veja se funciona.

As linhas acrescentadas estão quase no fim da função entre asteriscos.

DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 07 Mai 2011 16:48
por Alexandre Silva
Obrigado pelo fucao do tratamento de erro da Impressora.. alem disso acrescentei no inicio do sistema
drvporta=''' em vez de LPT1, isso coloca a opcao de Arquivo/Video como default.
Para fazer uma compilação global, remova de seu arquivo projeto.hbp a linha -inc
Para a versao final no cliente eu compilo com -rebuild, que força a compilacao de todos os PRG..
fiz com -inc e dá o mesmo efeito..

To fazendo varios ajustes para ver se para o erro de corrupcao.. essa é a prioridade, senao o sistem nao pode
trabalhar.. esta rodando ha 4 dias, mas continua dando o erro e eu faço a reconstrucao do indice..
(fiz tb o que vc disse de renomear)...

O seu aplicativo usa muita CPU ??
vc usa -compr=def ? para dimuir o exec final.

DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 08 Mai 2011 11:27
por Jairo Maia
Olá Alexandre,
Alexandre Silva escreveu:O seu aplicativo usa muita CPU ??
Com o mouse habilitado, o gerenciador de tarefas mostra uso de 100%. Mas com muita diferença da aplicação em 16bits. Em 16, é praticamente impossível abrir qualquer coisa no windows, seja o internet explorer, outlook, etc. Em Harbour, navego no windows sem nenhum problema.

Mas pra vc desencanar, faça o seguinte teste:
1- Feche todos os programas
2- abra o gerenciador de tarefas
3- abra o seu navegador
4- se sua pagina inicial não tem gifs, abra http://www.folha.uol.com.br/

Aqui chega a quase 80%. Observe que cada vez que muda uma foto, oscila entre 55 e 80%. Mas se vc ficar movimentando o mouse sobre algum link de reportagem, ao mudar a foto chega a quase 100%, ou seja, não acho que uso de CPU seja preocupação. Acredito que importante é o uso de memória, e ai é tranquilo.
Alexandre Silva escreveu:vc usa -compr=def ? para dimuir o exec final.
Não uso. Me parece que apenas diminui o tamanho do arquivo executável. Não vi nada ainda que isso tenha influência na performance do aplicativo. Se há não conheço, algum colega poderia informar.

Apenas por curiosidade, vc viu isso? É de 5/Junho/2010, acho que vale a pena ver:
http://www.mail-archive.com/harbour@har ... 14581.html
Use a opção Thread e leia a mensagem seguinte também.

DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 09 Mai 2011 11:43
por Alexandre Silva
é... o erro continua dando..vou mudar para CDX..

DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 09 Mai 2011 12:33
por Jairo Maia
Olá Alexandre,

Vc poderia postar o código da função SPARES()? Como já aprendemos, Harbour é mais exigente que o Clipper. Se vc puder postar o código desta função, talvez algum colega consiga ver algo que vc não está conseguindo ver.

DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 09 Mai 2011 19:10
por Alexandre Silva
Agradeco muito o interesse,mas tenho certerza que nao é esse o erro.. essa funcao só conta o numero de pares da propria Ordem de producao que esta passando na expedicao... sempre retorna um numero..
E essa altura nao sei se é este o ponto que vai gerar o erro.., pois hoje vi o erro acontecer na leitura da Ordem de Producao quando fazia a NF, que é outra rotina.. Mesmo indice ordprod2.nsx

Entao o indice já podia estar 'corrompido', e quando fizer o proximo replace ai cai ...
Nao sei mais o que fazer ..

Código: Selecionar todos

*------------------------------------
* conta numero de pares
*------------------------------------
function spares(vmodo,varq)
if valtype(vmodo)='U'
   vmodo:='P'
endif
if valtype(varq)='U'
   varq:=0  // arquivo esta selecionado
endif
vmodo:=upper(vmodo)
if vmodo='P'  // do pedido
   if varq=0
      RETU P33+P34+P35+P36+P37+P38+P39+P40+P41+P42+P43+P44 // pedido ou arq corrente
   elseif varq=1
      RETU ordprod->P33+ordprod->P34+ordprod->P35+ordprod->P36+;
           ordprod->P37+ordprod->P38+ordprod->P39+ordprod->P40+;
           ordprod->P41+ordprod->P42+ordprod->P43+ordprod->P44
   endif
ELSEIF VMODO='A'  // em atelie
   if varq=0
      RETU A33+A34+A35+A36+A37+A38+A39+A40+A41+A42+A43+A44  // atelie
   elseif varq=1
      RETU ordprod->A33+ordprod->A34+ordprod->A35+ordprod->A36+;
           ordprod->A37+ordprod->A38+ordprod->A39+ordprod->A40+;
           ordprod->A41+ordprod->A42+ordprod->A43+ordprod->A44
   endif
ELSEIF VMODO='L'  // lidos direto ou apor voltar do atelie
   if varq=0
      RETU L33+L34+L35+L36+L37+L38+L39+L40+L41+L42+L43+L44  // lido
   elseif varq=1
      RETU ordprod->L33+ordprod->L34+ordprod->L35+ordprod->L36+;
           ordprod->L37+ordprod->L38+ordprod->L39+ordprod->L40+;
           ordprod->L41+ordprod->L42+ordprod->L43+ordprod->L44
   endif
ELSEIF VMODO='S' // saida parc
   RETU S33+S34+S35+S36+S37+S38+S39+S40+S41+S42+S43+S44  // saiu
ELSEIF VMODO='F'  // fatura
   RETU F33+F34+F35+F36+F37+F38+F39+F40+F41+F42+F43+F44 // faturado
ELSE
   RETU  0
ENDIF


DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 09 Mai 2011 22:11
por sygecom
É difícil de analisar assim, tem como gerar uma rotina reduzida que agente possa compilar e que demonstre o problema ?

DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 09 Mai 2011 23:07
por Alexandre Silva
Ola.
O sistema é imenso.. quase 200 prg quase 300 dbf..fica inviavel postar todas a rotinas que envolvem a OP
O indice ordprod2 tem como chave cod_prod+IMPRESA (ambos campos caracter um com tamanho 14 ou outro 1)
outro indice é o ordprod3 IMPRESSA+codigo da OP como chave...
e indice 4 ordprod4 Codcli+IMPRESSA
*
O campo se chama é IMPRESSA, porque antigamente era usado apenas para marcar se a ordem de producao, era impressa ou nao.. hoje usamos para o situacao da OP ( A=Em Atelier, G=Gerada F=Fatuda, etc)
Entao tb procurei para ver ser tinha a palavra "impressa" usada com outra finalidade..nao achei nada.. Imagino que o Harbour nao tenha essa palavra como reservada.. to desconfiando de tudo..

Na rotina em anexo.. esta acontecendo algo bem estranho..
Quando o indice esta corrompido o sistema ainda consegue se posicionar e entrar no loop de contagem.. mas o valor contado é bem menor que o real.. eu chego no cliente faço a opcao de refazer os indices, rodo de novo e da um valor bem maior.
Ou seja o indice, corrompido, não necessariamente faz o sistema cair.. nesse caso é apenas uma leitura na OP.. o que faz o sistema cair é quando alguma rotina vai atualizar o campo IMPRESSA (situacao), ai dá o erro 1012

Código: Selecionar todos


*------------------------------------------------
* pega dados para giro da producao sit R*GSA
*--------------------------------------------
function girodbf()
local getlist:={},cur_atual,vdata:=date(),vhora:='0500'
local vpares:=0,z,vfalta
PRIV tem_borda:=.t., op_menu:=VAR_COMPL, l_s:=15, c_s:=20, l_i:=19, c_i:=60
PRIV tela_fundo:=SAVESCREEN(0,0,MAXROW(),79),vdias:=7
cur_atual:=setcursor()
SETCOLOR(drvtittel)
vr_memo=NOVAPOSI(@l_s,@c_s,@l_i,@c_i)     // pega posicao atual da tela
CAIXA(mold,l_s,c_s,l_i,c_i)               // monta caixa da tela
@ l_s+2,c_s+02 SAY " Data Giro.:            Dias:"
SETCOLOR(drvcortel)
set cursor on
cod_sos=56
SETCOLOR(drvcortel+","+drvcorget+",,,"+corcampo)
@ l_s+2,c_s+14 GET vdata valid(valdtgiro('I',vdata))
@ l_s+2,c_s+31 GET vdias pict '99' valid(vdias>=1 .and. vdias<=99)
READ
IF LASTKEY()=K_ESC
   RETU
ENDI
IF !USEARQ("GIRO",.f.,10,1)
   RETU
ENDI
IF !USEARQ("ORDPROD",.f.,10,1)
   RETU
ENDI
SELE ORDPROD
for z:=1 to 5
    if z=1
       vsit:='R'
    elseif z=2
       vsit:='*'
    elseif z=3
       vsit:='G'
    elseif z=4
       vsit:='S'
    elseif z=5
       vsit:='A'
    endif
    vpares:=0
    sele ordprod
    set order to 3  // impressa+ordprod
    dbseek(vsit)
    if eof()
       DBOX("Nao encontrou OP em Situacao:"+vsit,,,,,"ATENCAO!")
    endif
    do while impressa=vsit .and. !eof()
       if vsit='A'  // ateli
          vpares+=spares('A') // que estao no atelie
       elseif vsit $ 'GS'
          vfalta:=spares('P')-spares('L')
          vpares+=vfalta
       else
          vpares+=spares()
       endif
       dbskip()
    enddo
    if vpares>=0
       SELE GIRO
       set order to 1
       dbseek(dtos(vdata)+vsit)
       if eof()
          BLOREG(0,.5)
          APPEND BLANK
          repla data with vdata,situacao with vsit, hora with vhora,;
          pares with vpares, dias with vdias, chave with ano4(vdata)+vsit
       else
          BLOREG(0,.5)
          repla hora with vhora,;
          pares with vpares,dias with vdias
       endif
       UNLOCK
       COMMIT
    endif
next
rest scre from tela_fundo
retu

Outra coisa que tá me deixando preocupado.. no gas tem a opcao de trabalhar com CDX, entao escolhi esta opcao mas a indexacao fica muito parecida com o NSX, se um arquivo tinha 5 indices, NSX, continua com 5 indices CDX..
O GAS pelo que vi nao trabalha com TAG, se fosse assim, teria apenas 1 aquivo CDX para cada arquivo DBF.

A aplicacao esta rodando nesse formato CDX, (no meu micro), só nao sei se vai ficar mais estavel que os NSX

DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 10 Mai 2011 07:30
por sygecom
Olá Alexandre,
Eu mudaria duas coisas no seu código, primeiro colocaria o COMMIT antes do UNLOCK que é o mais correto no meu ponto de vista, e segundo não travaria um registro para logo em seguida dar um APPEND BLANK, acho que nessa você deve está ficando com algum registro preso sem necessidade. Outra coisa que eu usava em DBF mas não uso mais no POSTGRESQL era dar um SET TO ORDER 0 antes do APPEND BLANK, isso foi uma dica que peguei pela internet e eu usava para deixar a gravação mais rápida.

DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 10 Mai 2011 10:33
por Jairo Maia
Olá Alexandre,

Obrigado por aceitar a dica e publicar a função SPARES(). Também concordo, não tem nada a ver. Não muda ARQUIVO, nem ORDEM e sequer movimenta o pointer.
Alexandre Silva escreveu:Quando o indice esta corrompido o sistema ainda consegue se posicionar e entrar no loop de contagem.. mas o valor contado é bem menor que o real.. eu chego no cliente faço a opcao de refazer os indices, rodo de novo e da um valor bem maior.
Ou seja o indice, corrompido, não necessariamente faz o sistema cair..
Você já verificou também o DBF? Se há problema no DBF, também pode ocorrer exatamente o que vc disse. Se ainda não fez, analise o DBF para saber se não há algo nele. Já tive situação que um registro com problema no banco de dados não causava erro para criar o indice, mas somente quando era atualizado.

Não sei se é o caso, mas vale perguntar: Você não esta usando nenhum recurso como TRIM, RTRIM, ALLTRIM ou STR, que possa mudar o tamanho do campo, está? Isso não pode para gerar o indice. Causa corrupção.
Alexandre Silva escreveu:Outra coisa que tá me deixando preocupado.. no gas tem a opcao de trabalhar com CDX, entao escolhi esta opcao mas a indexacao fica muito parecida com o NSX, se um arquivo tinha 5 indices, NSX, continua com 5 indices CDX..
O GAS pelo que vi nao trabalha com TAG, se fosse assim, teria apenas 1 aquivo CDX para cada arquivo DBF.
Também acho que o Gas não tem essa opção, e não conheço o Rdd DBFCDX, escolhi NSX, pq muitos colegas afirmam que é o melhor Rdd, e também pq vi uma vantagem em relação aos campos memos, ele também é compactado, enquanto em NTX não (embora já estou convencido que memo é uma "porcaria", mas ainda tenho esses campos)

Vou pegar carona na dica do Leonardo, apenas para fazer um comentário sobre APPEND. Quando vc usa APPEND BLANK, se o arquivo está compartilhado, ele automaticamente bloqueia o novo registro, até que se use COMMIT ou DbCommit(), que salva os dados e libera os registros bloqueados pelo APPEND. (COMMIT grava os dados de todas as áreas que tenham dados ainda não salvos, enquanto DbCommit() grava os dados apenas da área selecionada), assim, não necessita usar BLOREG, e quanto ao UNLOCK, use somente se vc bloqueou algum registro antes.
NOTA: Isso não tem possibilidade de provocar o problema que vc está enfrentando, são apenas dicas.

DBFNSX/1012 corrupcao no arq de indice NSX

Enviado: 10 Mai 2011 11:29
por Alexandre Silva
Você não esta usando nenhum recurso como TRIM, RTRIM, ALLTRIM ou STR, que
Sim, uso o STR para o codigo do cliente, e para o codigo da Ordem producao, mas sao campos com tamanho fixo.
indice 1 str(codop,6)
indice 2 codprod+IMPRESSA ( codprod caracter)
indice 3 Impressa+str(codop,6)
indice 4 str(codcli,5)+impresa

Se ainda não fez, analise o DBF para saber se não há algo nele
O que vc recomenda para analise.. ?
Quando vc usa APPEND BLANK, se o arquivo está compartilhado, ele automaticamente bloqueia o novo registro,
Vejam abaixo, rotina tipica no GasPro, sempre que faz append o registro é bloqueado...

Código: Selecionar todos

#ifdef COM_REDE
      GO BOTT                       // vamos bloquear o final do
      SKIP                             // arq para que nehum outro
      BLOREG(0,.5)              // usuario possa incluir
   #endi

   APPEND BLANK                // inclui reg em branco no dbf
   FOR i=1 TO FCOU()        
      msg=FIEL(i)                
      rep[i]=M->&msg.    
      REPL &msg. WITH rep[i]       
   NEXT

   #ifdef COM_REDE
      UNLOCK              // libera o registro e
      COMMIT             // forca gravacao
   #else
      IF RECC()-INT(RECC()/20)*20=0       // a cada 20 registros
         COMMIT                    // digitados forca gravacao
      ENDI
   #endi
Também acho que o Gas não tem essa opção, e não conheço o Rdd DBFCDX
Em rotinas especiais.. quase no final..usar driver de RDD , na versao 4.0o tem DBFCDX. mas nao sei, como disse nao usam TAG..

COMMIT grava os dados de todas as áreas que tenham dados ainda não salvos, enquanto DbCommit() grava os dados apenas da área selecionada)
Sempre achei que commit e dbcommit() fossem a mesma coisa, grava dados da area que esta aberta...enquanto dbcommitAll(), grava de todas a areas
Analogamente: SKIP, DBSKIP() , APPEND DBAPPEND(), UNLOCK, DBUNLOCK, os primeriors era do dbase III, ai quando lançaram o clipper, a CA mudou alguns nomes.