Página 1 de 2
FIltro manual por data para ser visualizado pelo achoice....
Enviado: 06 Mar 2008 16:52
por rangelssilva
Caros amigos clipeiros fiz um filtro "manual" para funcionar da sgeuinte maneira...
Fdatapag1:=ctod(" / / ")
Fdatapag2:=Date()
Depois dos dados serem pedidos em uma tela faço o seguinte:
If xdatapag>=Fdatapag1 .and. xdatapag<=Fdatapag1
Adiciono os elementos no vetor para exibição na tela....
mas acontece que com essa comparação todos os registros são mostrados, inclusive fora do intervalo digitado..... (xdatapag e o campo do DBF)
endif
Alguem conhece algum comando para comparar datas, e verificar se é maior ou menor, etc... assim consigo jogar no filtro somente os registros que preciso....
Obrigado e até a próxima...
:'(
Re: FIltro manual por data para ser visualizado pelo achoice
Enviado: 06 Mar 2008 17:33
por Pablo César
Fdatapag1:=ctod(" / / ")
Fdatapag2:=Date()
Se você tiver que comparar datas e uma delas estiver em branco, qualquer outra data vai ser sempre maior que a que está em branco. Portanto, você não deve permitir que o usuário a deixe em branco caso deseje filtrar algo, do contrário vai listar todas as datas é claro.
Na sua mensagem você mencionou que seu código estaria assim:
Eu tinha suposto que xdatapag é uma variável cujo conteúdo proveniente do DBF e Fdatapag1 e Fdatapag2 são variáveis que o usuário define como periódo a ser alcançado. Mas observe que você está mencionando duas vezes a mesma variável Fdatapag1. No entanto mais embaixo você diz:
todos os registros são mostrados, inclusive fora do intervalo digitado..... (xdatapag e o campo do DBF)
Você diz utiliza a variável xdatapag e o campo do DBF. Mas estes não são os mesmos ? Exemplifique melhor dando os nomes aos campos especialmente quando você define as variáveis, mas coloque o bloco de código com a opção "CODE" da edição do fórum para entender melhor com edentações.
Enviado: 06 Mar 2008 23:32
por rangelssilva
Eu exemplifiquei errado....
If xdatapag>=Fdatapag1 .and. xdatapag<=Fdatapag2
aadd.......
endif
Onde xdatapag é o campo do DBF.... e Fdatapag1 e fdatapag2 são as variáveis com dados definidos pelo usuário....
Ou seja deve entrar no "IF" e adicionar o registro somente se xdatapag estiver dentro do intervalo digitado pelo usuário... (FdataPag1, Fdatapag2)
fDatapag1=10/01/08
fDatapag2=15/01/08
somente aparecerá no achoice os registros entre as data definidas acima.... Não sei se meu erro foi na comparação...
Acho que agora ficou mais claro....
Obrigado até o momento...
Atenciosamente,
Rangel.

Enviado: 07 Mar 2008 09:11
por Pablo César
Aparentemente estaria certo. O único que tenho que te alertar é quanto ao uso do:
SET DATE TO BRITISH // Só para o caso de você transformar caracter para data no formato brasileiro dd/mm/aa
SET DATE CENTURY // Para trabalhar com 4 dígitos que é mais seguro
Quem sabe não esteja alí a raíz do seu problema. Porque sem isso muito provável que as datas onde estão como: 10/01/08 sejam na verdade interpretados como: 10/01/1908 e não 10/01/2008.
O campo xdatapag, é do tipo DATA mesmo ou tipo caracter ? (este é um dado muito importante).
Enviado: 08 Mar 2008 08:31
por rangelssilva
Bom Dia, Amigos clipeiros
Estou usando Set date to british e o campo xdatapag do DBF é do tipo data mesmo?
Tem algum transformação que ue deva fazer? vou pensar na possibilidade de trabalhar com ano de 4 digitos......
Aguardo a próxima dica, quando possível para eu dar manutenção no meu sistema e arrumar isso....
Valeu galera....
Tenham um ótimo fim de semana...

Enviado: 08 Mar 2008 08:48
por Toledo
Olha, teoricamente teria que dar certo... passe aqui a parte do seu código fonte onde você faz esta comparação entre as datas, assim vai ficar mais fácil descobrir o que está acontecendo.
Abraços,
Enviado: 08 Mar 2008 09:45
por Pablo César
Teoricamente existe a possibilidade de que pela falta do SET CENTURY ON, esteja mal interpretando as datas na hora de converter de CTOD() ou até mesmo na máscaras das variáveis Fdatapag1 e Fdatapag2 nos GET. Daí o sistema interpreta em vez de ser ano 2008 como 1908.
Mas seria interessante ver o código caso não fosse este o problema. è só colocar o SET CENTURY ON e ver.
Enviado: 08 Mar 2008 22:16
por rubens
Voce tá usando set epoch
tente colocar set epoch to 1930
pode ser isso que está acontecendo .. o Pablo falow set cent on .. mas o set cent on só vai te dar o ano com 4 digitos.. se voce nao colocar set epoch to 1930 (por exemplo) o /08 vai ser entendido mesmo como 1908 e vai mostrar todos os registros...
Enviado: 09 Mar 2008 10:26
por Pablo César
Tens razão Rubens, o SET CENTURY ON não é o suficiente se for trabalhar com dois dígitos para o ano. Como neste caso de atribuir a variável CTOD("10/01/08"), então o SET EPOCH é necessário. Principalmente se a entrada de dados foi feita sem essas definições de ambiente, pode ser que no proprio BD as datas estejam gravadas como 1908 e não 2008 (como por exemplo). Então aconselho a verificar o BD exibindo os dados com o DBU centuriado (hihihi, inventei uma nova palavra) para ver se as datas estão corretas com 4 dígitos.
O mais seguro, na minha opinião, é trabalhar com os quatro dígitos:
CTOD("10/01/2008") daí pode trabalhar com qualquer data.
Enviado: 09 Mar 2008 11:42
por Maligno
Acho que fica mais fácil usar DTOS() de uma vez.

Enviado: 10 Mar 2008 11:59
por gvc
Fdatapag1:=ctod(" / / ")
Fdatapag2:=Date()
If xdatapag>=Fdatapag1 .and. xdatapag<=Fdatapag2
(aadd)
end
{xdatapag>=Fdatapag1}
Pelo seu código, qualquer data que o sujeito entrar é maior que a data vazio.
Vc pode tentar:
{If empty(xdatapag) .or. xdatapag<=Fdatapag2}
Data de pagamento vazia ou até o dia de hoje.
Boa sorte. Espero ter ajudado.
Enviado: 11 Mar 2008 16:36
por rangelssilva
BOa TArde, Amigos clipeiros
Eu tentei de diversas formas e nada coloquei set epoch to 1940 e comecei a trabalhar com 4 digitos.......
O filtro não seleciona o intervalo digitado pelo usuário. EU precisava que fosse adicionado no achoice somente os rehistros que satisfaçam a seguinte condição:
Diferente de branco. ctod(" / / ") ( ano com 4 digitos)...... entre 2 periodos selecionados....ex: de 10/01/2008 a 15/02/2008.. OU seja será mostrado no achoice, somente os registros que tiverem data de pagamento preenchidas e que estiverem dentro do período acima......
// Variáveis do Filtro
Fdatapag1:=ctod(" / / ")
Fdatapag2:=Date()
// campo do DBF
xdatapag
Vejam o codigo
If xdatapag <> ctod(" / / ") .and. xdatapag>=Fdatapag1 .and. xdatapag<=Fdatapag2
(aadd)
end
Tentei de várias formas e nada...... Alguem tem mais alguma solução.......

Enviado: 11 Mar 2008 16:53
por Maligno
Não entendo porque não funcionou. Mas você tentou usar algo do tipo do código abaixo?
Código: Selecionar todos
if !Empty(DTOS(xdatapag)) .and. DTOS(xdatapag) >= DTOS(Fdatapag1) .and. DTOS(xdatapag) <= DTOS(Fdatapag2)
bla bla bla...
end
Enviado: 11 Mar 2008 18:25
por Toledo
Coloque aqui o seu código fonte, assim vai ficar mais fácil descobrir onde está o problema.
Com certeza existe algum erro neste seu código, pois teoricamente teria que dar certo.
Abraços,
Enviado: 11 Mar 2008 18:29
por Maligno
Tirou as palavras do meu teclado.
Aliás, aproveitando o ensejo, um apelo a todos os colegas com problemas do tipo: deu erro? Poste qual é a mensagem de uma vez. Código não funciona? Mostre o trecho do código. Assim fica mais fácil ajudar.