Ajuda "bug"

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

Ajuda "bug"

Mensagem por raquelreis »

Boa Tarde á todos.

Problemas se resolvem e outros aparecem, hehe.

Estou há cerca de 2 dias com o mesmo código (simples) porém não consigo fazer.
Já revisei a lógica e não acho erro (testei). Gostaria que vcs pudessem me ajudar.
Lembrando, sou nova em programação.

Problemas:
* Estou executando uma rotina (ajuda de Jairo) para mudar o codigo de um produto. Porém quando eu somo o estado de estoque, no primeiro campo encontrado ele soma 1(um) a mais. EX: produto001( estoque1 = 2 / estoque2 = 3, estoque2 = estoque2 + estoque1 = 5). Porém na minha rotina ele encontra 6. produto002 ( estoque1 = 4 / estoque2 = 3, estoque2 = estoque2 + estoque1 = 7). Como é possível?
* Se por exemplo, na minha tabela tem 3 produtos (001,002,003). Sendo 001 -> estoque = 0, cor = 2, tam = 0 / 002 -> estoque = 1, cor = 3, tam = 0 e 003 -> estoque = 2, cor = 5, tam = 0. Quando executo pela 1ª vez a rotina ele só muda o codigo dos campos que possuem estoque 0 (zero). Se eu executar pela 2ª vez ele muda o codigo dos outros produtos, porém no primeiro produto ele cai no problema descrito acima.
vcs tem ideia do que pode ser?
Desde já agradeço!

Código: Selecionar todos

CLS 
SET DELE ON 

@ 5,2 Say "Aguarde... Criando indice Temporário."
USE CADPOS 
INDEX ON CODIGO TO CADPOS3 

CLOSE ALL 
USE CADPOS 
SET INDEX TO CADPOS1.NTX, CADPOS2.NTX, CADPOS3.NTX 

CLS // limpa a tela

p1COR := p1TAM := p2COR := p2TAM := NIL
p1ESTATUAL := 0

@ 03,01 TO 11,51

 P1 := P2 := SPACE(12)
 pRESP := SPACE(2)   //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" 
  CLOSE ALL
  CLS
  RETURN
 ENDIF

 SET ORDER TO 3
 SEEK P1 
 IF !FOUND() 
  ALERT( "ERRO! Código " + P1 + " Não encontrado!" )
   
 ENDIF
 
 WHILE CODIGO = P1
    p1COR := COR 
    p1TAM := TAMANHO 
    p1ESTATUAL := ESTATUAL 
    lParidade := .F. 
    SEEK P2 
      IF FOUND() 
        WHILE CODIGO = P2 
          IF COR = p1COR .AND. TAMANHO = p1TAM 
            REPL ESTATUAL WITH ESTATUAL + p1ESTATUAL 
            lParidade := .T.
            ALERT("Código Alterado com sucesso!")            
          ENDIF
         SKIP
         ENDDO
      ENDIF 
    SEEK P1
      IF lParidade = .F. 
        REPL CODIGO WITH P2 
        ALERT("Código Alterado com sucesso!")
        SKIP;LOOP 
      ELSE 
        DELE 
      ENDIF
  loop    
  ENDDO
  DBCOMMITALL()
  

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

Ajuda "bug"

Mensagem por Jairo Maia »

Olá Raquel,
raquelreis escreveu:produto001( estoque1 = 2 / estoque2 = 3, estoque2 = estoque2 + estoque1 = 5). Porém na minha rotina ele encontra 6.
Matemática é ciência exata, isso todos sabemos. Estou achando que vc tem códigos duplicados nesta tabela e com valores diferentes.

Vamos tentar um debug: Abaixo da linha 44 do código que vc postou, coloque o seguinte:

Código: Selecionar todos

nPosiRec := RecN()
Abaixo da linha 51, acrescente o seguinte:

Código: Selecionar todos

@ 15, 2 Say "Código: " + P2  // mostra o codigo a alterar
@ 16, 2 Say "Tamanho p1ESTATUAL: " + Str( p1ESTATUAL ) // mostra o estoque do código 1
@ 17, 2 Say "Tamnho ESTATUAL : " + Str( ESTATUAL )  // mostra o estoque do código 2
@ 18, 2 Say "Posição do registro P1: " + Str( nPosiRec )  // mostra posição do registro P1 (importante)
Inkey( 0 )  // depois que anotar as informações, pressione algo.
Depois, repita a operação, e anote tudo novamente. Então, rode esta rotina:

Código: Selecionar todos

Cls
Use CADPOS
Browse()
Return
Veja que no canto superior direito, mostra a posição em que está o cursor. Então, vá para a posição de cada registro que vc anotou, Veja que (eu acho) que são posições diferentes, acho que tem código repetido. Tente fazer isso e veja o que vc vê.
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

Ajuda "bug"

Mensagem por raquelreis »

Amigos, mais uma vez agradeço a ajuda de todos.
Consegui resolver o problema, porém não sei como, hehe.
Apenas mudei de arquivo. O código que havia mandado para vcs era apenas uma parte do codigo principal.
Apenas separei o codigo.

Muito obrigada!
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Responder