Rotina para comparar duas datas

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Vandi
Usuário Nível 2
Usuário Nível 2
Mensagens: 83
Registrado em: 16 Set 2011 23:26
Localização: Brasilia-DF

Rotina para comparar duas datas

Mensagem por Vandi »

Bom dia,
Volto a pedir a ajuda dos mestres dêsse forum, pois não me resta outra saída.
A situação é bem simples. Preciso comparar duas datas, se forem diferentes ->rotina1, se forem iguais ->rotina2.

Acontece que uma data eu pego de um arquivo através de FieldGet() e a outra eu entro com ela em uma variável.
Já fiz vários testes, chego a visualizar as duas datas com msginfo() antes da comparação mas, mesmo as duas estando idênticas, o programa não atende a condição estabelecida.
Alguém poderia me disponibilizar uma pequena rotina com êsses parâmetros para que eu veja onde estou errando?

Agradecimentos,

Gilvandi
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Rotina para comparar duas datas

Mensagem por sygecom »

Olá Gilvandi,
Post como você está usando que fica mais fácil de dar a dica olhando para o código.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Rotina para comparar duas datas

Mensagem por alxsts »

Olá!
Vandi escreveu: Preciso comparar duas datas, se forem diferentes ->rotina1, se forem iguais ->rotina2.
Se as duas variáveis forem do tipo Date, é super simples:

Código: Selecionar todos

IF dDate1 != dDate2
   Rotina1()
Else
   Rotina2()
Endif
Para facilitar, poste o teu código.
[]´s
Alexandre Santos (AlxSts)
Vandi
Usuário Nível 2
Usuário Nível 2
Mensagens: 83
Registrado em: 16 Set 2011 23:26
Localização: Brasilia-DF

Rotina para comparar duas datas

Mensagem por Vandi »

Boa tarde,

Segue abaixo o código da minha rotina.
Antes, quero dizer para desculparem o estilo arcaico do meu código. Acontece que não sou um profissional da área, nunca tive tempo para me aprofundar no assunto. Sempre desenvolví pequenas rotinas em clipper para meu próprio uso que me atenderam bem.

Após enviar o pedido de ajuda ao forum, dei umas mexidas e alguma coisa mudou. Mesmo assim, envio o código pois o mesmo está com um erro de lógica e talvez vcs possam me dar uma ajuda.
Trata-se de um arquivo <TotForne> com os campos (pgttCodi, pgttData e pgttValo), rescpectivamente C, D e N.
A partir de uma data entrada em uma variável, monto mais 06 datas, formando, então, 07 datas,
Quero pesquisar no arquivo se estas datas constam no mesmo para cada <pgttCodi>, pois, se constarem é pq tem valor gravado do campo <pgttValo>.
Com isso então, eu mostro na tela:

-------------------------------------------------------------------------------------------------------------------------
Fornecedor | data1 | data1 | data1 | data1 | data1 | data1 | data1 |
-------------------------------------------------------------------------------------------------------------------------
Fornec nro 01 | 541,20 | 0,00 | 169,40 | 25,00 | 0,00 | 0,00 | 240,00 |
-------------------------------------------------------------------------------------------------------------------------

Código: Selecionar todos

*---------------------------------------------------------------------------------------
Function MontarGrade(oDataInicial)
*---------------------------------------------------------------------------------------

   Private CodiForn[1000],nDia[7]
   Private nValor01[1000],nValor02[1000],nValor03[1000],nValor04[1000]
   Private nValor05[1000],nValor06[1000],nValor07[1000]
   Private antes,nCtd:=0,vNdia:=1,_nDia:='',mValor:=SPACE(08),arqData:=SPAC(10),varData:=SPAC(10)

   nDia[1]:=CTOD(oDataInicial)+0
   nDia[2]:=CTOD(oDataInicial)+1
   nDia[3]:=CTOD(oDataInicial)+2
   nDia[4]:=CTOD(oDataInicial)+3
   nDia[5]:=CTOD(oDataInicial)+4
   nDia[6]:=CTOD(oDataInicial)+5
   nDia[7]:=CTOD(oDataInicial)+6

   SELECT TOTFORNE
   OrdSetFocus( 'nCodiData' )   // indexado por c¢digo+data

   TOTFORNE->(DbGoTop())

   antes:=SPAC(04)

   DO WHILE!Eof()

        nCtd=nCtd+1

        If TOTFORNE->pgttCodi#antes
             antes:=TOTFORNE->pgttCodi
        EndIf

        CodiForn[nCtd]:=TOTFORNE->pgttCodi

        Do While TOTFORNE->pgttCodi==antes

            mValor='nValor'+StrZero(vNdia,2)

            If DTOS(TOTFORNE->(FieldGet(2))) != DTOS(nDia[vNdia])
                 mValor[nCtd]=TOTFORNE->pgttValo
            Else
                 mValor[nCtd]=0.00
            EndIf

            vNdia=vNdia+1
            If vNdia>7
                 Exit
            EndIf
            TOTFORNE->(DbSkip())
        EndDo
        TOTFORNE->(DbSkip())
   EndDo

// MostraNaTela()

RETURN

Antecipadamente meus agradecimentos a todos,

Gilvandi
Editado pela última vez por Pablo César em 24 Mai 2012 16:52, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Rotina para comparar duas datas

Mensagem por alxsts »

Olá!

Dei uma simplificada no teu código. Não sei se faz exatamente o que você quer mas, acho que dará uma ideia.

Código: Selecionar todos

*---------------------------------------------------------------------------------------
Function MontarGrade(oDataInicial)
*---------------------------------------------------------------------------------------
LOCAL aInfo
LOCAL dDtInicio, dDtFim
LOCAL i
LOCAL nTotGer
LOCAL nTotVal
LOCAL antes

TOTFORNE->( OrdSetFocus( 'nCodiData' ), DbGoTop() ) // indexado por c¢digo+data

aInfo   := {}
nTotGer := 0
nTotVal := 0
dDtInicio := oDataInicial          // assume que oDataInicial seja do tipo date
dDtFim := oDataInicial + 6       // acrescenta 6 dias

DO WHILE TOTFORNE->( !Eof() )

    antes:=TOTFORNE->pgttCodi

    DO While TOTFORNE->pgttCodi==antes .And. TOTFORNE->( !Eof() )

        If ( TOTFORNE->pgttData >= dDtInicio ) .And. (TOTFORNE->pgttData <= dDtFim )
           IF TOTFORNE->pgttValo > 0
              AAdd( aInfo, { TOTFORNE->pgttCodi, TOTFORNE->pgttData, TOTFORNE->pgttValo } ) 
           EndIf
        Endif   

        nTotVal += TOTFORNE->pgttValo
        
        TOTFORNE->(DbSkip())
    EndDo
    
    AAdd( aInfo, { antes, 'TOTAL', nTotVal } ) 

    nTotGer += nTotVal
    nTotVal := 0
EndDo

AAdd( aInfo, { "", 'TOTAL GERAL', nTotGer } )

// MostraNaTela()

Não se esqueça de usar a tag [ code ] ( botão Code na janela "Postar uma Resposta") quando for postar código fonte.
Editei para corrigir a inicialização de variáveis e sintaxe.
[]´s
Alexandre Santos (AlxSts)
Responder