Página 1 de 1

Erro DBNTX/1020 Workedarea not indexed

Enviado: 10 Ago 2011 16:06
por raquelreis
Boa Tarde,
Antes de mais nada peço desculpas caso já exista tópicos com minha solução. Achei um tópico com o mesmo assunto, mas não me ajudou muito .

Estou com mais um probleminha em clipper. Creio que devo estar errando em algo relacionado a criação de índices.
Mas vou tentar explicar da melhor forma possível.
Tenho um código que serve para alterar o código dos produtos. Ele está funcionando bem. Porém, há um erro do qual estou tentando corrigir, mas quando uso o comando "seek" dá um erro.
esse é o código normal sem erro:

Código: Selecionar todos

SET DELE ON

CLS

SELE 2
USE CADPOS

p1 := p2 := SPACE(12)
pRESP := SPACE(3)       //recebe confirmacao
p1COR := p1TAM := p2COR := p2TAM := p2ESTATUAL := p1ESTATUAL := ESTATUALN:= SPACE(4)

@ 03,01 TO 20,51

@ 05,10 SAY "MUDAR O CODIGO ----> " GET P1 PICT "@!" VALID !EMPTY(P1)
@ 07,10 SAY "PARA O CODIGO -----> " GET P2 PICT "@!" VALID !EMPTY(P2)
@ 09,10 SAY "Confirma Alteracao (S/N) ?"  GET pRESP PICT "@!" VALID !EMPTY(pRESP)
READ

 IF LASTKEY()=27
   CLOSE ALL
   CLS
   RETURN

 ENDIF
  //condicao confirmacao Sim ou Nao
IF pRESP = "N"
    CLOSE ALL
    CLS
    RETURN
ELSE

  ////////////////
  // CADPOS.DBF //
  ////////////////

  SELE 2  // CADPOS
  GO TOP
  CONTA := 1

  @ 10,01
  @ 10,03 SAY "Aguarde um momento... Atualizando CADPOS.DBF !!!"

  WHILE ! EOF()
        
        @ 12,10 SAY CONTA
         //se nao houver codigo sai //
        IF CODIGO#P1
           SKIP;LOOP
        ELSE
          REPL CODIGO WITH P2
          CONTA++
          SKIP
        ENDIF   
  END   //final dowhile //


  DBCOMMITALL()

  @ 15,06 SAY "* * * ROTINA REALIZADA COM SUCESSO * * *"
  @ 17,06 SAY "A T E N C A O ===> AO ENTRAR NO SISTEMA, INDEXAR TODOS OS ARQUIVOS !!!"
  @ 19,06 SAY "TECLE ALGO PARA CONTINUAR ... "
  INKEY(0)
//Final "if" Sim ou Nao
ENDIF

CLOSE ALL
CLS
RETURN
Porém preciso alterá-lo. Pois se o código novo (p2) já existir, ele deve apenas somar os campos. Ai ele dá o erro: "DBFNTX/1020 WORKAREA NOT INDEXED"

Código: Selecionar todos

SET DELE ON

CLS

SELE 2
USE CADPOS

p1 := p2 := SPACE(12)
pRESP := SPACE(3)       //recebe confirmacao
p1COR := p1TAM := p2COR := p2TAM := p2ESTATUAL := p1ESTATUAL := ESTATUALN:= SPACE(4)

@ 03,01 TO 20,51
@ 04,10 SAY "ALTERADO 10/08/2011"
@ 05,10 SAY "MUDAR O CODIGO ----> " GET P1 PICT "@!" VALID !EMPTY(P1)
@ 07,10 SAY "PARA O CODIGO -----> " GET P2 PICT "@!" VALID !EMPTY(P2)
@ 09,10 SAY "Confirma Alteracao (S/N) ?"  GET pRESP PICT "@!" VALID !EMPTY(pRESP)
READ

 IF LASTKEY()=27
   CLOSE ALL
   CLS
   RETURN

 ENDIF
  //condicao confirmacao Sim ou Nao
IF pRESP = "N"
    CLOSE ALL
    CLS
    RETURN
ELSE

  ////////////////
  // CADPOS.DBF //
  ////////////////

  SELE 2  // CADPOS
  GO TOP
  CONTA := 1

  @ 10,01
  @ 10,03 SAY "Aguarde um momento... Atualizando CADPOS.DBF !!!"

  WHILE ! EOF()
        
        @ 12,10 SAY CONTA
         //se nao houver codigo sai //
        IF CODIGO#P1
           SKIP;LOOP
        ENDIF
        * //PROCURA CODIGO 2
        SELE CADPOS       
        SEEK P2           
        IF FOUND()    // SE ENCONTRAR RECEBE OS VALORES
           p2COR := COR
           p2TAM := TAMANHO
           p2ESTATUAL := ESTATUAL           
          SEEK P1   // PROCURA CODIGO 1
          IF FOUND()    // SE ENCONTRAR RECEBE OS VALORES
              p1COR := COR
              p1TAM := TAMANHO
              IF p2COR = p1COR .AND. p2TAM = p1TAM   // CONDIÇÃO COR E TAMANHO DEVEM SER IGUAIS
                 ESTATUALN := p1ESTATUAL + p2ESTATUAL   // SE FOR IGUAL, ESTATUAL DEVE SOMAR ESTATUAL DO CODIGO 1 COM CODIGO 2                 
                 REPL CODIGO WITH P2   // MUDA O CODIGO
                 REPL ESTATUAL WITH ESTATUALN    // MUDA O ESTATUAL
                 CONTA++
                 SKIP              
              ENDIF                  
          ENDIF   
        ELSE
          REPL CODIGO WITH P2  // APENAS MUDA O CODIGO
          CONTA++
          SKIP
        ENDIF   
  END   //final dowhile //


  DBCOMMITALL()

  @ 15,06 SAY "* * * ROTINA REALIZADA COM SUCESSO * * *"
  @ 17,06 SAY "A T E N C A O ===> AO ENTRAR NO SISTEMA, INDEXAR TODOS OS ARQUIVOS !!!"
  @ 19,06 SAY "TECLE ALGO PARA CONTINUAR ... "
  INKEY(0)
//Final "if" Sim ou Nao
ENDIF

CLOSE ALL
CLS
RETURN

Erro DBNTX/1020 Workedarea not indexed

Enviado: 10 Ago 2011 16:58
por raquelreis
Pessoal Alterei o código , mas está dando o mesmo erro.
Estou reindexando os arquivos. Mas sempre dá o erro

Código: Selecionar todos

WHILE ! EOF()
        
        @ 12,10 SAY CONTA
         //se nao houver codigo sai //
        IF CODIGO#P1
           SKIP;LOOP
        ENDIF
        * //PROCURA CODIGO 2
        SELE CADPOS       
        SEEK CODIGO           
        IF CODIGO = P2    // SE ENCONTRAR CODIGO IGUAL
           p2COR := COR
           p2TAM := TAMANHO
           p2ESTATUAL := ESTATUAL           
                IF CODIGO = P1   // PROCURA CODIGO 1, SE ENCONTRAR RECEBE VALORES
                  p1COR := COR
                  p1TAM := TAMANHO
                  p1ESTATUAL := ESTATUAL
                    IF p2COR = p1COR .AND. p2TAM = p1TAM   // CONDIÇÃO COR E TAMANHO DEVEM SER IGUAIS
                      ESTATUALN := p1ESTATUAL + p2ESTATUAL   // SE FOR IGUAL, ESTATUAL DEVE SOMAR ESTATUAL DO CODIGO 1 COM CODIGO 2                 
                      REPL CODIGO WITH P2   // MUDA O CODIGO
                      REPL ESTATUAL WITH ESTATUALN    // MUDA O ESTATUAL
                      CONTA++
                      SKIP
                    ENDIF                
                ENDIF                  
          
        ELSE
          REPL CODIGO WITH P2  // APENAS MUDA O CODIGO
          CONTA++
          SKIP
        ENDIF   
  END

Erro DBNTX/1020 Workedarea not indexed

Enviado: 10 Ago 2011 19:22
por alxsts
Olá!

Para usar o comando SEEK ou a função DbSeek(), você tem que ter um índice aberto na área onde deseja efetuar a pesquisa.

A menos que você use DBFCDX com SET AUTOPEN ativado (não creio que seja o caso), terá que abrir o índice. Exemplo:

Código: Selecionar todos

Use Cliente Shared New
Set index to CliCod
If ! DbSeek( Str( 123, 6 ) )
   Alert( "codigo inexistente" )
Endif

Erro DBNTX/1020 Workedarea not indexed

Enviado: 11 Ago 2011 04:55
por Jairo Maia
Olá Raquel,

No outro tópico, lembro que vc deixou claro que consegue identificar qual indice pertence a qual arquivo. Neste caso, acho que ajudaria a todos se vc informasse qual indice está indexado pelo campo CODIGO.

Vc tem acesso aos fontes, mas para facilitar, compile o exemplo abaixo e informe o nome do BD, neste caso CADPOS, depois digite cada indice pertencente a ele, para encontrar qual informa a chave como CODIGO. Creio que ficará mais fácil para todos.

Estou enviando um exemplo com o RDD DBFNTX, se seus arquivos de indices tem outra extensão, diferente de .NTX, informe para ajustar o exemplo para aquele RDD.

Vc pode compilar assim: CL NomeExemplo, não digite a extensão se optar a usar CL.

Código: Selecionar todos

Local cDbf := Space( 8 ), cNtx
Clear Screen
While Lastkey() # 27

 cDbf := PadR( StrTran( cDbf, ".DBF"), 8 )
 cNtx := Space( 8 )
 
 @ 3, 2 Say "Nome dos arquivos SEM EXTENSAO:"
 @ 5, 2 Say "Nome do Dbf...: " Get cDbf Pict "@K!" Valid !Empty( cDbf )
 @ 7, 2 Say "Nome do Indice: " Get cNtx Pict "@!" Valid !Empty( cNtx )
 Read

 If LastKey() = 27
  Exit
 EndIf

 cDbf := AllTrim( cDbf ) + ".DBF"
 cNtx := AllTrim( cNtx ) + ".NTX"

 If !File( cDbf ) .Or. !File( cNtx )
  Alert( "Conjunto Nao Encontrado!" )
  cDbf := cNtx := Space( 8 )
  Loop
 Else
  Use ( cDbf ) Index ( cNtx )
  Alert( "Chave do Indice: " + cNtx + " => " + IndexKey() )
 EndIf
EndDo
Return Nil

Erro DBNTX/1020 Workedarea not indexed

Enviado: 11 Ago 2011 09:17
por raquelreis
Bom dia!

Muito obrigado pela ajuda de todos!

Jairo, eu não consegui entender bem essa questão de indices. Tenho acesso ao código fonte do sistema sim.
E pelo que percebi aqui, os dbf tem indices com o mesmo nome. EX: nome1.dbf e nome1.ntx.
Mas no caso do CADPOS, eu tenho dois arquivos ntx: CADPOS1.ntx e CADPOS2.ntx.
Usei o seu programa, e digitei "nome do dbf: CADPOS" e "Nome do Indice: CADPOS1" exibiu a seguinte mensagem:
"CHAVE DO INDICE CADPOS1.NTX => CODIGO+STR(COR,3) + STR(TAMANHO,2)" e
depois digitei: "nome do dbf: CADPOS" e "Nome do Indice: CADPOS2" exibiu a seguinte mensagem:
"CHAVE DO INDICE CADPOS2.NTX => CODBARRA".

Essa informação ajuda? Estou olhando outros códigos que utilizam o CADPOS e em nenhum momento vi o código SET INDEX <nomeIndex> usando o CADPOS.

Estou bem confusa.

Agradeço desde já pela ajuda.

Erro DBNTX/1020 Workedarea not indexed

Enviado: 11 Ago 2011 10:33
por asimoes
Raquel,

Faça uma modificação na sua rotina no inicio altere a abertura do dbf acrescentantado o que está em vermelho.


SELE 2
USE CADPOS ALIAS CADPOS
SET INDEX DO CADPOS1, CADPOS2

No trecho que tem:

SELE CADPOS
SET ORDER TO 1 //Se vai usar a chave "CODIGO+STR(COR,3) + STR(TAMANHO,2)"
SEEK CODIGO
IF CODIGO = P2 ...

Faça o teste e nos retorne.

Erro DBNTX/1020 Workedarea not indexed

Enviado: 11 Ago 2011 11:22
por Jairo Maia
Olá Raquel,

Ajuda muito. Está começando a ficar claro. Vc tem dois indices, um com chave composta: CODPOS1.NTX, e outro com chave única: CODPOS2. Não tem um indice apenas com o campo CODIGO. Se usar um SET EXACT OFF até pode se trabalhar com ele. Mas acho melhor criar nesta rotina especifica um terceiro indice somente com o campo CODIGO.
Esclareça o seguinte:

1- Com que frequência esta rotina será usada?
2- Vc definiu o tamnho de P1 e P2 como sendo 12. O campo CODIGO no DBF tem tamanho 12? Se vc não tem certeza, abra o CADPOS pelo DBU e verifique.
3- Se existir o campo P1, o que acontece?
4- Se não existir o que acontece?
5- Quando o usuario digita o P1 e P2, o que ele digita? É um código próprio ou o código de barras?

Sei que seu código foi postado, mas não fica claro por ele. Esclareça tipo assim: 1- tal, 2 tal, etc.. Precisamos saber que tratamento vc quer dar aos códigos que vc solicita ao usuário.
raquelreis escreveu:eu não consegui entender bem essa questão de indices
Quando vc finalizar esta rotina acho que ficará claro o papel de indices.

Erro DBNTX/1020 Workedarea not indexed

Enviado: 11 Ago 2011 12:05
por raquelreis
Bom dia,

Jairo respondendo suas perguntas.
Jairo Maia escreveu:1- Com que frequência esta rotina será usada?
Esse rotina não é usada frequentemente. Mas é usada para mudar o código dos produtos, pois o código é formado por codigo do fabricante + codigo do produto.
Jairo Maia escreveu:Vc definiu o tamnho de P1 e P2 como sendo 12. O campo CODIGO no DBF tem tamanho 12?
Sim, o código precisa ter tamanho 12 (dígitos)
Jairo Maia escreveu:Se existir o campo P1, o que acontece? ... Se não existir o que acontece?
Sempre existe o P1, pois é o código que desejo mudar. Porém se não existir (usuario digitar valor errado) exibe mensagem de erro.
Jairo Maia escreveu:Quando o usuario digita o P1 e P2, o que ele digita? É um código próprio ou o código de barras?
O usuário digita o código, que é um código próprio de 12 dígitos (fabricante+produto). Ex: Código Fabricante: 54 / Código produto: 02, logo o usuário deve digitar: 000000005402.
Jairo Maia escreveu:Precisamos saber que tratamento vc quer dar aos códigos que vc solicita ao usuário.
Por exemplo, tenho o mesmo produto com o seguinte código: 000000000002 e 000000005402. Preciso que o produto 000000000002 tenha agora o código informando o fabricante 000000005402.
Minha 1ª rotina realiza isso. Mas cria dois registro do mesmo produto.
Preciso que quando já existir o "P2", verifica a cor e tamanho se forem o mesmo apenas some a quantidade de estoque de P1 + P2 (ESTATUAL) e exclua o P1.

Acho q fui confusa...

Mas agradeço a Ajuda, ahh já estou conseguindo buscar o código. Estou tentando melhorar a lógica. ( :( )

Erro DBNTX/1020 Workedarea not indexed

Enviado: 11 Ago 2011 13:40
por Jairo Maia
Olá Raquel,

Veja se isto pode lhe ajudar.
Caso houver algum erro na compilação, tente corrigir, se não conseguir informe. Procurei escrever com atenção, mas as vezes escapa algo. Analise, e se possivel teste, e veja se ajuda:

Código: Selecionar todos

CLS // limpa a tela
SET DELE ON // registros excluidos NÃO serão vistos

@ 5,2 Say "Aguarde... Criando indice Temporário."
USE CADPOS  // abre o banco de dados
INDEX ON CODIGO TO CADPOS3  // cria o indice CADPOS3 indexado pelo campo CODIGO

CLOSE ALL // fecha tudo. poderia usar ADDITIVE, mas vamos manter a ordem inicial
USE CADPOS // reabre o arquivo
SET INDEX TO CADPOS1.NTX, CADPOS2.NTX, CADPOS3.NTX  // precisa abrir todos para atualizar se excluir

CLS // limpa a tela

p1COR := p1TAM := p2COR := p2TAM := p2ESTATUAL := p1ESTATUAL := ESTATUALN:= NIL

@ 03,01 TO 11,51

DO WHILE .T.

  P1 := P2 := SPACE(12)
  pRESP := SPACE(1)       //recebe confirmacao

  @ 05,10 SAY "MUDAR O CODIGO ----> " GET P1 PICT "@!" VALID !EMPTY(P1)
  @ 07,10 SAY "PARA O CODIGO -----> " GET P2 PICT "@!" VALID !EMPTY(P2)
  @ 09,10 SAY "Confirma Alteracao (S/N) ?"  GET pRESP PICT "@!" VALID !EMPTY(pRESP)
  READ

  IF LASTKEY()=27 .OR. pRESP = "N"  // pressionou ESC ou não confirmou
    CLOSE ALL
    CLS
    RETURN  // sai da rotina ...
  ENDIF

  SET ORDER TO 3  // seleciona o indice com a chave CODIGO
  SEEK P1  // procura P1
  IF !FOUND() // se não achou...
    ALERT( "ERRO! Código " + P1 + " Não encontrado!" )
    LOOP // volta daqui mesmo e pede outro código
  ENDIF

  p1COR := COR  // guarda cor
  p1TAM := TAMANHO  // guarda tamanho
  p1ESTATUAL := ESTATUAL  // guarda estoque atual

  lParidade := .F. // vai informar se houver paridade
  SEEK P2 // verifica se existe P2
  IF FOUND() // se achou...
    WHILE CODIGO = P2  // vamos encontrar a paridade
      IF COR = P1COR .AND. TAM = P1TAM  // confere. é este, vamos atualizar o estoque
        REPL ESTATUAL WITH ESTATUAL + P1ESTATUAL // atualiza o estoque
        lParidade := .T.  // encontrou paridade
        EXIT // sai do laço
      ENDIF
    ENDDO
  ENDIF

  SEEK P1 // localiza P1
  IF lParidade = .F. // se lparidade .f., não encontrou P2 ou a paridade, então...
    REPL CODIGO WITH P2  // apenas muda o codigo
  ELSE // se não...
    DELE  // apaga o resistro com codigo P1
  ENDIF

ENDDO
CLOSE ALL
CLS
RETURN
Editado às 15:45:
Raquel, Fiz uma correção. Se vc não conseguiu compilar, copie novamente e tente compilar. Estava faltando fechar um IF / ENDIF

Erro DBNTX/1020 Workedarea not indexed

Enviado: 11 Ago 2011 16:17
por raquelreis
Boa Tarde,

Jairo, me desculpe não ter avisado antes.
Mas quando copiei seu código já havia notado o "SET DELE OFF" e a falta de um "endif" na compilação e já havia concertado. Sua ajuda está sendo de grande valia.
Mas refiz todo o seu código, e mesmo assim ele não está funcionando, pelo menos aqui.
Digito os valores e etc... porém ele não exibe nada e o meu DOS(Prompt) trava. E não modifica o meu dbf.
Mas vi que estava indo pelo caminho errado, mas agora já tenho uma base melhor e estou tentando ak.
Qualquer coisa aviso.

Thank's

Erro DBNTX/1020 Workedarea not indexed

Enviado: 11 Ago 2011 16:33
por Jairo Maia
Olá Raquel,

Sim. Isto está acontecendo pq ele entra em LOOP permanente neste laço:

Código: Selecionar todos

WHILE CODIGO = P2  // vamos encontrar a paridade 
   IF COR = P1COR .AND. TAM = P1TAM  // confere. é este, vamos atualizar o estoque 
      REPL ESTATUAL WITH ESTATUAL + P1ESTATUAL // atualiza o estoque 
      lParidade := .T.  // encontrou paridade 
      EXIT // sai do laço 
   ENDIF 
ENDDO 
Colque um SKEEP que esqueci e não consegui ver:

Código: Selecionar todos

WHILE CODIGO = P2  // vamos encontrar a paridade 
   IF COR = P1COR .AND. TAM = P1TAM  // confere. é este, vamos atualizar o estoque 
     REPL ESTATUAL WITH ESTATUAL + P1ESTATUAL // atualiza o estoque 
     lParidade := .T.  // encontrou paridade 
     EXIT // sai do laço 
   ENDIF 
   SKIP // Faltou este comando... Desculpe!
ENDDO 
Colocando o SKIP entre o ENDDO e ENDIF, ele dará sequência.