Página 1 de 2
Problema Urgente
Enviado: 15 Nov 2006 19:12
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
Enviado: 15 Nov 2006 21:05
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:
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
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.
Enviado: 16 Nov 2006 00:32
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..
Enviado: 16 Nov 2006 01:55
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.
Enviado: 16 Nov 2006 09:36
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????
Enviado: 16 Nov 2006 09:42
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.
Enviado: 16 Nov 2006 11:18
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.
Enviado: 16 Nov 2006 11:58
por vagucs
se tiver indice, ele pode estar quebrado ou se usa alguma clausula para a criação dele, ela pode estar furada.
Enviado: 16 Nov 2006 12:58
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.
Enviado: 17 Nov 2006 08:01
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 ...
Enviado: 17 Nov 2006 09:15
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
Enviado: 17 Nov 2006 09:37
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.
Enviado: 17 Nov 2006 09:41
por diogenes_varela
Mas porque isso só ocorreria nesse cliente? Um erro desses iria aparecer em todos.
Enviado: 17 Nov 2006 10:14
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???
Enviado: 17 Nov 2006 14:47
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