Página 1 de 1

Erro na manipulação de arquivo de dados

Enviado: 15 Set 2010 13:38
por ticommsc
Sou novo no clipper e preciso resolver um esquema aqui.
Na hora que chega na impressao dos produtos ele pega o codcupom e imprime ate o final do Banco de Dados, ele teria que retorna ao item 2 do produto O codigo esta em negrito no final onde esta o erro.

Código: Selecionar todos

! cls
set exclusive off
set date british
set century on

codcupom=space(06)
clicod=space(06)
prodcod=space(06)
vrazaoso=space(40)
vcodcli=space(6)
vcgc=space(18)
venderec=space(35)
vbairro=space(20)
vcep=space(8)
vcidade=space(20)
vetelfon=space(11)
vestado=space(2)
vinscrica=space(14)
wdata=date()
wtime=time()

do while .t.
   select 1
   use stkmovv
   set index to stkmov3

   select 2
   use crcli
   set index to ntxcli

   select 3 
   use stkparam

   select 4
   use stkmaste
   set index to stkmaste
   
   nnf=space(06)
   select 3
   nnf=seqnf
   codcupom=space(06)
   @ 01,01 clear to 24,79
   @ 10,15 say "DIGITE O CUPOM FISCAL: " get codcupom pict "999999"
   read
   if lastkey () = 27
      clear
      exit
   endif
   
   select 1
   find (codcupom)
   clicod=codcli

   select 2
   find (clicod)
   vrazaoso=razaosoc
   vcgc=cgc
   venderec=endereco
   vbairro=bairro
   vcep=cep
   vcidade=cidade
   vtelefon=telefone
   vestado=estado
   vinscrica=inscricao
  
   nnf=nnf+1
      
   select 3
   lock()
   replace seqnf with nnf
   unlock
   
   clear
   set device to printer
   @ prow(),pcol() say chr(27)+chr(64)
   setprc(0,0)
   @ prow(),pcol() say chr(27)+chr(48)
   @ prow(),pcol() say chr(27)+"C"+chr(68)
   @ prow(),pcol() say chr(27)+"M"+chr(15)
   @ prow(),pcol() say chr(27)+"Q"+chr(120)
   @ prow() ,00 say " " 
   @ prow() ,69 say "XX"
   @ prow() ,94 say strzero(nnf,6,0)+chr(10)+chr(10)+chr(10)+chr(10)+chr(10)
   @ prow() ,02 say "VENDA"
   @ prow() ,35 say "5102"+chr(10)+chr(10)+chr(10)
   @ prow() ,00 say vrazaoso+" "+left(clicod,5)+"-"+right(clicod,1)
   @ prow() ,68 say vcgc
   @ prow() ,95 say dtoc(wdata) +CHR(10)+CHR(10)
   @ prow() ,00 say venderec 
   @ prow() ,58 say vbairro
   @ prow() ,79 say vcep
   @ prow() ,95 say dtoc(wdata)+chr(10)+chr(10)
   @ prow() ,00 say vcidade
   @ prow() ,45 say vtelefon
   @ prow() ,63 say vestado
   @ prow() ,70 say vinscrica
   @ prow() ,95 say time()+chr(10)+chr(10)+chr(10)
   
  [b] select 1
   seek (codcupom)
   do while !eof()
      @ prow() ,00 say descricao
      codprod=codigoprod
      select 4
      seek (codprod)
      if found()
         @ prow() ,53 say cod_trib
         @ prow(), 58 say unidestoq
         @ prow(), 72 say prvvmn_v pict "9999.9999"
         @ prow(), 104 say alicmest pict "99"
         select 1
      endif
      @ prow(), 63 say qtdsaida pict "9999999.9"
      @ prow(), 89 say vlvencruz pict "99999999.99"
      @ prow(), pcol() say chr(10)
      skip
   enddo[/b]   
   set printer to lpt1
   set device to screen
enddo


---
Nota da Moderação (Maligno):
O título do tópico foi alterado. O anterior, "Ajuda no fonte abaixo", em nada ajuda na identificação do tópico, o que contraria as regras do fórum, que pedem um título objetivo. Leia as regras aqui. Dê especial atenção ao artigo 8.

Re: Ajuda no fonte abaixo

Enviado: 15 Set 2010 14:18
por rochinha
Amiguinho,

Quando postar seu codigo coloque-o dentro das tags CODE para facilitar a visualização.

Código: Selecionar todos

select 1
seek (codcupom)
do while !eof()
    @ prow() ,00 say descricao
    codprod=codigoprod
    select 4
    seek (codprod)
    if found()
       @ prow() ,53 say cod_trib
       @ prow(), 58 say unidestoq
       @ prow(), 72 say prvvmn_v pict "9999.9999"
       @ prow(), 104 say alicmest pict "99"
       select 1
    endif
    @ prow(), 63 say qtdsaida pict "9999999.9"
    @ prow(), 89 say vlvencruz pict "99999999.99"
    @ prow(), pcol() say chr(10)
    skip
enddo
Tenho pra mim que voce deseja imprimir "O CUPOM" e não todos.

Para tal voce deverá fazer o SEEK no arquivo pai e SE encontra-lo fazer o SEEK no arquivo filho e SE encontrar iniciar o LOOP.

Ainda dentro deste LOOP voce deve fazer a critica para que o mesmo atue somente nos registros filhos que fazem referencia ao pai.

Exemplos:

Código: Selecionar todos

select 1
seek (codcupom)
if found() // Se encontrei o registro PAI continuo
   select 4
   seek (codprod)
   if found() // Se encontrei o(s) registro(s) filho(s), continuo
       do while !eof()
           if codprod <> codcupom // Se filho nao for deste pai...
              skip // ...pula para o proximo registro
              loop // e reinicia o loop de onde parou
           endif
           ...Imprime dados
           skip
       enddo
   endif
   ...
Outro método:

Código: Selecionar todos

select 1
seek (codcupom)
if found() // Se encontrei o registro PAI continuo
   select 4
   seek (codprod)
   if found() // Se encontrei o(s) registro(s) filho(s), continuo
       do while codprod = codcupom // Se filho nao for deste pai...
           ...Imprime dados
           skip
       enddo
   endif
   ...

Re: Ajuda no fonte abaixo

Enviado: 15 Set 2010 15:02
por ticommsc
rochinha obrigado pela atenção mas ainda nao resolveu meu problema...

no 1 codigo >>> ele pegou somente o 1 produto do cupom fiscal

e no 2 codigo >>> nao retornou denhum produto.


deixa eu exemplicar os dbf...

seguinte o dbf é composto da seguinte forma:

stkmovv >>>>> movimento vendas

codcupom codproduto vlvendaunit vlvendatotal
000001 000002 1,00 2,00 >>>>>>>>>>>>mesmo cupom fiscal com diversos produtos
000001 002122 2,52 2,52
000001 212222 3,01 9,03



stkmaste >>>>> dbf de produtos onde estao cadastrado o restante das informações que preciso dos produtos...

codigoprod descricao cod_trib
000005 lapis 00
000010 caneta 04


PRECISO JUNTAR AS INFORMACOES DAS 2 TABELAS.....


mais uma vez obrigado...

Re: Ajuda no fonte abaixo

Enviado: 15 Set 2010 15:29
por SandroBelarmino
Pelo que entendi do seu problema, e vi no seu codigo, voce precisa mudar 2 coisas:
Primeiro: a linha 13, onde volta pro dbf de movimentação (select 1) voce precisa colocar pra fora do endif da linha 14
Segundo: no laço do while !eof() que voce faz no banco de movimentação, se voce tem gravado todos os cupons, voce tem que colcocar uma condição para verificar se o cupom não é mais o que voce procurou, para sair do laço, por isso ele está indo até o final do arquivo.

Sandro.

Re: Ajuda no fonte abaixo

Enviado: 15 Set 2010 15:55
por ticommsc
sandro...


ainda nao deu, mesmo assim obrigado pelo atenção

Re: Ajuda no fonte abaixo

Enviado: 15 Set 2010 16:14
por ticommsc
Pelo amor de DEUS, estou perdendo os poucos neuronios que tenho....
hehehehehehehehe!!!!

ONDE ESTOU ERRANDO?????????? PLEASE...

Código: Selecionar todos

! cls
set exclusive off
set date british
set century on

codcupom=space(06)
clicod=space(06)
prodcod=space(06)
vrazaoso=space(40)
vcodcli=space(6)
vcgc=space(18)
venderec=space(35)
vbairro=space(20)
vcep=space(8)
vcidade=space(20)
vetelfon=space(11)
vestado=space(2)
vinscrica=space(14)
wdata=date()
wtime=time()

do while .t.
   select 1
   use stkmovv
   set index to stkmov3

   select 2
   use crcli
   set index to ntxcli

   select 3 
   use stkparam

   select 4
   use stkmaste
   set index to stkmaste
   
   nnf=space(06)
   select 3
   nnf=seqnf
   codcupom=space(06)
   @ 01,01 clear to 24,79
   @ 10,15 say "DIGITE O CUPOM FISCAL: " get codcupom pict "999999"
   read
   if lastkey () = 27
      clear
      exit
   endif
   
   select 1
   find (codcupom)
   clicod=codcli

   select 2
   find (clicod)
   vrazaoso=razaosoc
   vcgc=cgc
   venderec=endereco
   vbairro=bairro
   vcep=cep
   vcidade=cidade
   vtelefon=telefone
   vestado=estado
   vinscrica=inscricao
  
   nnf=nnf+1
      
   select 3
   lock()
   replace seqnf with nnf
   unlock
   
   clear
   set device to printer
   @ prow(),pcol() say chr(27)+chr(64)
   setprc(0,0)
   @ prow(),pcol() say chr(27)+chr(48)
   @ prow(),pcol() say chr(27)+"C"+chr(68)
   @ prow(),pcol() say chr(27)+"M"+chr(15)
   @ prow(),pcol() say chr(27)+"Q"+chr(120)
   @ prow() ,00 say " " 
   @ prow() ,69 say "XX"
   @ prow() ,94 say strzero(nnf,6,0)+chr(10)+chr(10)+chr(10)+chr(10)+chr(10)
   @ prow() ,02 say "VENDA"
   @ prow() ,35 say "5102"+chr(10)+chr(10)+chr(10)
   @ prow() ,00 say vrazaoso+" "+left(clicod,5)+"-"+right(clicod,1)
   @ prow() ,68 say vcgc
   @ prow() ,95 say dtoc(wdata) +CHR(10)+CHR(10)
   @ prow() ,00 say venderec 
   @ prow() ,58 say vbairro
   @ prow() ,79 say vcep
   @ prow() ,95 say dtoc(wdata)+chr(10)+chr(10)
   @ prow() ,00 say vcidade
   @ prow() ,45 say vtelefon
   @ prow() ,63 say vestado
   @ prow() ,70 say vinscrica
   @ prow() ,95 say time()+chr(10)+chr(10)+chr(10)
   
   select 1
   seek (codcupom)
   codprod=codigoprod
   if found()
        do while !eof()
        @ prow() ,00 say descricao
        select 4
        seek (codprod)
        if codprod <> codcupom
            skip
            loop
         endif
         @ prow() ,53 say cod_trib
         @ prow(), 58 say unidestoq
         @ prow(), 72 say prvvmn_v pict "9999.9999"
         @ prow(), 104 say alicmest pict "99"
         select 1
         @ prow(), 63 say qtdsaida pict "9999999.9"
         @ prow(), 89 say vlvencruz pict "99999999.99"
         @ prow(), pcol() say chr(10)
         skip
         enddo
    endif
   set printer to lpt1
   set device to screen
enddo

Re: Ajuda no fonte abaixo

Enviado: 15 Set 2010 17:18
por rochinha
Amiguinho,

Bastei bater o olho e ver o erro!

Código: Selecionar todos

   select 1
   seek (codcupom)
   codprod=codigoprod
   if found()
        do while !eof()
        @ prow() ,00 say descricao
        select 4
        seek (codprod)
        if codprod <> codcupom
            skip
            loop
         endif
         @ prow() ,53 say cod_trib
         @ prow(), 58 say unidestoq
         @ prow(), 72 say prvvmn_v pict "9999.9999"
         @ prow(), 104 say alicmest pict "99"
         select 1
         @ prow(), 63 say qtdsaida pict "9999999.9"
         @ prow(), 89 say vlvencruz pict "99999999.99"
         @ prow(), pcol() say chr(10)
         skip
         enddo
    endif
Voce esa dando loop no estoque.

Veja, voce so tem dois arquivos que interessam vendas e estoque.

Código: Selecionar todos

   select 1
   seek (codcupom)
   codprod=codigoprod
   if found()
        do while codprod=codigoprod // Faz enquanto os codigos forem identicos
             @ prow() ,00 say descricao
             select 4 // Seleciona estoque
             seek (codprod)
             if found()
                 @ prow() ,53 say cod_trib
                 @ prow(), 58 say unidestoq
                 @ prow(), 72 say prvvmn_v pict "9999.9999"
                 @ prow(), 104 say alicmest pict "99"
             endif
             select 1
             @ prow(), 63 say qtdsaida pict "9999999.9"
             @ prow(), 89 say vlvencruz pict "99999999.99"
             @ prow(), pcol() say chr(10)
             skip
         enddo
   endif

Re: Ajuda no fonte abaixo

Enviado: 15 Set 2010 19:46
por clrod
Olá

É o problema de usar número ao invés de nome da tabela.

Muita gente acha que escrever código legível é bobagem, mas tá um um exemplo que atrapalha muito.

Procure usar nomes ao invés de números para indicar o que está sendo feito/usado. Existem várias coisas nesse código que pode failmente causar confusão ao mais experiente programador.

T+

Re: Ajuda no fonte abaixo

Enviado: 29 Set 2010 15:40
por pedagogica
Desculpe, não ter retornando antes, é que tive problemas com minha conta "ticommsc" aqui no forum, pois nao conseguia recuperar a senha e nem logar, tentava criar outra conta, mas mesmo assim também sem sucesso.

Problema resolvido.


obrigado a Todos.