Erro DBNTX/1020 Workedarea not indexed

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Erro DBNTX/1020 Workedarea not indexed

Mensagem 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
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Erro DBNTX/1020 Workedarea not indexed

Mensagem 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
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Erro DBNTX/1020 Workedarea not indexed

Mensagem 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
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Erro DBNTX/1020 Workedarea not indexed

Mensagem 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
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Erro DBNTX/1020 Workedarea not indexed

Mensagem 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.
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Erro DBNTX/1020 Workedarea not indexed

Mensagem 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.
►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
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Erro DBNTX/1020 Workedarea not indexed

Mensagem 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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Erro DBNTX/1020 Workedarea not indexed

Mensagem 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. ( :( )
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Erro DBNTX/1020 Workedarea not indexed

Mensagem 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
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Erro DBNTX/1020 Workedarea not indexed

Mensagem 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
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Erro DBNTX/1020 Workedarea not indexed

Mensagem 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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Responder