Problema Urgente

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

Problema Urgente

Mensagem por juniorcamilo »

Amigos tenho um prog Comercial em diversos cliente, so que em um especial tem um problema quando tiro o relatorio de fechamento do caixa, ou seja, vendas do determinado caixa, ele começa a ler os registros em um do while XXX->MOVIMENTO == cMovimento, ai sem explicacao ele sai do do while como c tivesse satisfeita a condição imposta, mas ainda teria pela frente +- uns 2 a 10 resgistro ainda para ler , tipo teria 100 vendas que satisfaça o movimento do caixa no do while so le uns 90 a 95 resgistro dia sim ou semana sim ou nao, tem dia que le tudas os registro outro dia nao le, ja executei passo a passo o prog. e é isso que acontece, ja troquei o arquivo por outro..
Alguem já passou por isso sabe oq é

muito obrigado
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

O problema esta no código:

Mesmo que voce tenha selecionada a area correta, colocado a critica no ponto certo algo pode dar errado, exemplo:

Provavelmente voce esta fazendo uma critica do tipo:

Código: Selecionar todos

do while <Critica>
     ...
enddo
Pode tornar rápido mas se um registro apenas estiver dentro da faixa de dados mas fora da critica a saida será prematura.

Dicas:

1 - Leia a'te o final do arquivo e critique dentro do laço

Código: Selecionar todos

do while .not. eof()
     if <Critica>
        ...
     endif
enddo
2 - Use indices pelo campo que voce usa como critica:

Código: Selecionar todos

NumeroDaOrdemParaCritica := 3
set order to NumeroDaOrdemParaCritica
do while <Critica>
     ...
enddo
3 - Se estiver usando campos com datas use o ESCOPO para filtragem:

Código: Selecionar todos

NumeroDaOrdemPorData := 2
set order to NumeroDaOrdemPorData
OrdScope( 0, dtoc( CampoData ) )
OrdScope( 1, dtoc( CampoData ) )
do while .not. eof()
     ...
enddo
4 - Se quizer filtrar dentro de um espaço de tempo use ESCOPO para filtragem assim:

Código: Selecionar todos

...
@ ..GET ... DesdeAData
@ ..GET ... AteAData
NumeroDaOrdemPorData := 2
set order to NumeroDaOrdemPorData
OrdScope( 0, dtoc( DesdeAData ) )
OrdScope( 1, dtoc( AteAData ) )
do while .not. eof()
     ...
enddo
Desta forma não tem como dar erro, mas verifique o seu codigo e para ter certeza que os dados a serem mostrados estão dentro do requisito para impressão coloque o comando BROWSE() logo após o filtro antes do DO...WHILE para ver o conteudo do que sera apresentado ou a cada registro impresso apresente o conteudo do campo que voce esta criticando. Reveja indices e areas.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

Mensagem por juniorcamilo »

rochinha esqueci de mencionar o arquivo ja esta com o indice correto... o interessante é que só em um determinado lugar que esta com esse problema..
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Então faça um SET FILTER com sua critica e de um BROWSE() para ver o resultado obtido e ai voce encontrara a falha.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

Mensagem por juniorcamilo »

Amigo Fiz o teste com Set filter e da na mesma, parece que uma hora ou outra ele sai do do while sem nenhuma explicação, a maioria dos dias ocorre td bem hora ou outra da prego... o Indice com algum problema causaria isso????
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Pode ser.

Voce poderia criar um indice temporario no momento da feitura do relatorio se for o caso.

Poderia também faz uso do código de seleção de registros que coloquei na sessão código fonte, com ela voce cria uma tabela on-the-fly com os campos que necessita na ordem que quizer e trabalha sobre o conteúdo.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
diogenes_varela
Usuário Nível 3
Usuário Nível 3
Mensagens: 206
Registrado em: 04 Nov 2006 19:33
Localização: Brasília - DF

Mensagem por diogenes_varela »

Tente um
SET FILTER TO
e em seguida
SET FILTER <argumentos>

Pode estar ocorrendo a falha intermitente porque às vezes filtra de um modo e às vezes de outro. Não vejo outra explicação.
Os computadores não sabem o que fazem. Nós, na maioria das vezes, também não...

E disse ao Programador: "Todos os teus programas terão erros e irás corrigi-los até ao fim dos teus dias". Gen. 1:9
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

se tiver indice, ele pode estar quebrado ou se usa alguma clausula para a criação dele, ela pode estar furada.
Sem mais
Wagner Nunes
www.vagucs.com.br
diogenes_varela
Usuário Nível 3
Usuário Nível 3
Mensagens: 206
Registrado em: 04 Nov 2006 19:33
Localização: Brasília - DF

Mensagem por diogenes_varela »

Forneça mais detalhes. Antes disso, verifique:

1. Se não está usando variáveis com nomes iguais aos "nomes de campo" do .DBF, pois estes têm prioridade;

2. Se estiver indexando datas, use a função DTOS. Já tive problema semelhante.

Se não resolver, mais detalhes.
Os computadores não sabem o que fazem. Nós, na maioria das vezes, também não...

E disse ao Programador: "Todos os teus programas terão erros e irás corrigi-los até ao fim dos teus dias". Gen. 1:9
Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

Mensagem por juniorcamilo »

Amigos o prog. esta correto com tds os possiveis erros que vcis disserao checados, sei que somente em um determinado cliente meu que esta dando este erro, erro que nao é toda hora quando fecha o caixa, mas sim hora ou outra. Nos demais clientes que possuo este erro nao da. o Rel. sai totalmente certo.. blz ...
Avatar do usuário
kiko
Usuário Nível 3
Usuário Nível 3
Mensagens: 145
Registrado em: 08 Jul 2004 15:24
Localização: Cianorte

Mensagem por kiko »

isso ta com cara de while perdendo o ponto...
imagine a seguinte situação:

Código: Selecionar todos

Select Caixa
Set Order to 1
seek DTOS(dCxaIni)
do while Caixa->cx_data <= dCxaFim .and. !eof()
   <codigo>
   .
   .
   .
   Select Cliente
   Set Order to 1
   seek Caixa->cx_clie
   .
   .
   .
   skip
enddo
isso vai baguncar o relatorio, pois o laço principal esta no arquivo de caixa, porem, no meio do codigo, vc seleciona um outro banco de dados e faz o <skip>, porem no arquivo errado. isso bagunça tudo....
corrigindo o exemplo acima, ficaria:

Código: Selecionar todos

Select Caixa
Set Order to 1
seek DTOS(dCxaIni)
do while Caixa->cx_data <= dCxaFim .and. !eof()
   <codigo>
   .
   .
   .
   Select Cliente
   Set Order to 1
   seek Caixa->cx_clie
   .
   .
   .
   Select Caixa
   skip
enddo
voce tambem disse que isso acontece apenas em um cliente. o seu relatorio pode ter algum parametro que apenas aquele cliente esta utilizando, por isso apenas nele que aparece esse erro....

tente isso tambem...obrigado e ate a proxima
diogenes_varela
Usuário Nível 3
Usuário Nível 3
Mensagens: 206
Registrado em: 04 Nov 2006 19:33
Localização: Brasília - DF

Mensagem por diogenes_varela »

juniorcamilo escreveu:Amigos o prog. esta correto com tds os possiveis erros que vcis disserao checados, sei que somente em um determinado cliente meu que esta dando este erro, erro que nao é toda hora quando fecha o caixa, mas sim hora ou outra. Nos demais clientes que possuo este erro nao da. o Rel. sai totalmente certo.. blz ...
Posta o trecho onde o erro acontece, é o único jeito.
Os computadores não sabem o que fazem. Nós, na maioria das vezes, também não...

E disse ao Programador: "Todos os teus programas terão erros e irás corrigi-los até ao fim dos teus dias". Gen. 1:9
diogenes_varela
Usuário Nível 3
Usuário Nível 3
Mensagens: 206
Registrado em: 04 Nov 2006 19:33
Localização: Brasília - DF

Mensagem por diogenes_varela »

Mas porque isso só ocorreria nesse cliente? Um erro desses iria aparecer em todos.
Os computadores não sabem o que fazem. Nós, na maioria das vezes, também não...

E disse ao Programador: "Todos os teus programas terão erros e irás corrigi-los até ao fim dos teus dias". Gen. 1:9
Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

Mensagem por juniorcamilo »

Eu estou usando alias..
ENT->(Dbsetorder(01))
NOT->(Dbsetorder(05))
NOT->(dBSeek(cControle,.t.))
do while NOT->NROCAX == cControle .and. NOT->(!eof())
........
........
ENT->(dBSeek(NOT->NRONOTA,.t.))
do while NOT->NRONOTA == ENT->NRONOTA .and. ENT->(!Eof()
...........
..........
ENT->(dBSkip())
enddo
.............
NOT->(dBSkip())
enddo

usando indice NTX será que seria hora de mudar de Indice????
qual o melhor? e de que maneira mais facil mudaria???
Avatar do usuário
kiko
Usuário Nível 3
Usuário Nível 3
Mensagens: 145
Registrado em: 08 Jul 2004 15:24
Localização: Cianorte

Mensagem por kiko »

entao, foi o que eu falei ali...um erro (grosseiro) desses, aconteceria em todos os clientes, nao apenas em um....
mas, o relatorio do nosso colega pode ter algum parametro pra entrar em um determinado laço que apenas um cliente usa. algo tipo um relatorio de caixa que pode sair a relação de vendas do dia, ou nao, dependendo do que o usuario informar...
mas eh um caso especifico...
o mais certo eh o nosso amigo postar o codigo dele para nossa apreciação, para podermos ajudar com mais segurança...fica no campo do "achismo" nao eh uma boa coisa...hehehehehehe
Responder