Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Problema super misterioso em tratamento com datas


Humm

Question

então tenho um codigo pra fazer resumo do movimento financeiro..

tenho um form onde eu defino a data inicial e a data final do que será pesquisado e um botao pra gerar a saida do resultado:

Private Sub BT_PRINT_Click()
        Dim conn As ADODB.Connection
        Dim cmd As ADODB.Command
        Dim rs As ADODB.Recordset

        Set conn = CurrentProject.Connection
        Set cmd = New ADODB.Command
        cmd.ActiveConnection = conn
        
        cmd.CommandText = "SELECT Format([DT_HR],""dd/mm/yyyy"") AS DATA, FORMAS_PGTO.FORMA, Sum(PEDIDOS_PGTOS.Val) AS TOTAL " & _
        "FROM (PEDIDOS_PGTOS INNER JOIN PEDIDOS ON PEDIDOS_PGTOS.COD_PED = PEDIDOS.COD_PED) INNER JOIN FORMAS_PGTO ON PEDIDOS_PGTOS.FORMA = FORMAS_PGTO.COD_FORMA " & _
        "GROUP BY Format([DT_HR],""dd/mm/yyyy""), FORMAS_PGTO.FORMA " & _
        "HAVING (((Format([DT_HR],""dd/mm/yyyy"")) BETWEEN #" & Me.DT_IN & "# AND #" & Me.DT_OUT & "#)) " & _
        "ORDER BY Format([DT_HR],""dd/mm/yyyy"") DESC , FORMAS_PGTO.FORMA"
        Set rs = cmd.Execute
        
        port = DLookup("[prnport]", "app")
        fanta = DLookup("[fant]", "config")
        
        If rs.BOF And rs.EOF Then
            MsgBox "Não existe movimento no período selecionado!", vbInformation, "Extratos e Movimentos"
            GoTo SAIR
        End If
        
        
        'Open port For Output As #1
        
        Debug.Print fanta
        Debug.Print "------------------------------------------------"
        Debug.Print "               RESUMO DE MOVIMENTO              "
        Debug.Print "------------------------------------------------"
        Debug.Print "PERIODO: DE " & Format(Me.DT_IN, "DD/MM/YY") & " ATÉ " & Format(Me.DT_OUT, "DD/MM/YY")
        Debug.Print ""
        
        rs.MoveFirst
        DATAV = rs("data")
        datac = rs("data")
        Do While Not rs.EOF
            If rs("data") = DATAV Then
                Debug.Print rs("data")
                Do While datac = DATAV
                    Debug.Print Replace(rs("FORMA") & Space(32 - Len(rs("FORMA")) + Len(Format(rs("TOTAL"), "CURRENCY"))), " ", ".") & Format(rs("TOTAL"), "CURRENCY")
                    rs.MoveNext
                    If rs.EOF Then
                        GoTo TERMINA
                    End If
                    datac = rs("DATA")
                Loop
            Else
                T_DIA = DLookup("[DTOTAL]", "FEC_T_DIA", "[DATA] = " & "#" & DATAV & "#")
                Debug.Print "TOTAL" & Replace(Space(43 - Len(Format(T_DIA, "CURRENCY"))), " ", ".") & Format(T_DIA, "CURRENCY")
                Debug.Print " "
                DATAV = rs("data")
            End If
        Loop
TERMINA:
        T_DIA = DLookup("[DTOTAL]", "FEC_T_DIA", "[DATA] = " & "#" & DATAV & "#")
        Debug.Print "TOTAL" & Replace(Space(43 - Len(Format(T_DIA, "CURRENCY"))), " ", ".") & Format(T_DIA, "CURRENCY")
        
        FORMA_TG = DLookup("[TG]", "FEC_TG_FORMA")
        Debug.Print ""
        Debug.Print "TOTAL GERAL DO PERIODO" & Replace(Space(26 - Len(Format(FORMA_TG, "CURRENCY"))), " ", ".") & Format(FORMA_TG, "CURRENCY")
        Debug.Print "IMPRESSO EM " & Now()
        'Close #1
SAIR:
        cmd.ActiveConnection.Close

        Set rs = Nothing
        Set cmd = Nothing
        Set conn = Nothing
End Sub
pra evitar gastar papel nos testes, to usando debug.print pra ver o resultado.. então, olha essa: nas tabelas de dados, tenho movimentos em apenas 3 datas.. 21/07/2011 22/07/2011 24/07/2011 se eu seleciono entre 01/07/2011 e 31/07/2011 da esse resultado:
Restaurante La Fazendinha
------------------------------------------------
               RESUMO DE MOVIMENTO              
------------------------------------------------
PERIODO: DE 01/08/11 ATÉ 31/08/11

24/07/2011
DINHEIRO................................R$ 50,00
TOTAL...................................R$ 50,00

22/07/2011
DINHEIRO................................R$ 50,00
VISA....................................R$ 25,00
TOTAL...................................R$ 75,00

21/07/2011
CHEQUE..................................R$ 33,00
DINHEIRO................................R$ 17,00
TOTAL...................................R$ 50,00

TOTAL GERAL DO PERIODO.................R$ 175,00
IMPRESSO EM 11/08/2011 10:05:11

não deveria acontecer isso.. pois no mes 08 não tem movimento.

se eu seleciono 01/07/2011 e 01/08/2011 ele diz que não há movimento, sendo que existe..

se eu seleciono somente as datas que tem, ele da o retorno certo..

porque a sql ora funciona ora não?

Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

então, já percebi o seguinte.. como o campo é do tipo data e no formato data geral( data e hora ) eu sempre converto antes quando so quero a data..

mas ao converter, percebi que o access deixa de entender que o tipo do valor é data e acha que é texto

testei isso numa consulta simples.. tambem dava o mesmo erro.. mas ao usar a funcao cdate(format(dt_hr;"dd/mm/yyyy")) para obrigar o valor formatado a ser do tipo data, a consulta passou a funcionar.. pois está tratando dados como formato data e não texto.

tentei fazer o mesmo na sql do vba mas não surtiu efeito algum.

não entendi o q é esse adDBdate pode dar um exemplo?

Link to comment
Share on other sites

  • 0

Um exemplo aí

Option Compare Database
Option Explicit

Private numero_amostra As String
Private data_amostra As Date

Private conn As ADODB.Connection
Private cmd As ADODB.Command
Private prm As ADODB.Parameter

Private Sub Class_Initialize()

Set conn = CurrentProject.Connection
Set cmd = New ADODB.Command
cmd.ActiveConnection = conn
cmd.NamedParameters = True

End Sub

Private Sub Class_Terminate()

cmd.ActiveConnection.Close

Set cmd = Nothing
Set conn = Nothing
Set prm = Nothing

End Sub

Public Property Let LetAmostra(NumeroAmostra As String)

numero_amostra = UCase(NumeroAmostra)

End Property

Public Property Let LetDataAmostra(DataAmostra As Date)

data_amostra = Format(DataAmostra, "mm/dd/yyyy")

End Property

Public Sub Salvar()

cmd.CommandText = "INSERT INTO t_Amostra(Amostra, Data_Amostra) VALUES(@Amostra, @Data_Amostra)"

Set prm = cmd.CreateParameter(Name:="@Amostra", Type:=adVarChar, Size:=13, Direction:=adParamInput, Value:=numero_amostra)
cmd.Parameters.Append prm

Set prm = cmd.CreateParameter(Name:="@Data_Amostra", Type:=adDBDate, Direction:=adParamInput, Value:=data_amostra)
cmd.Parameters.Append prm

On Error GoTo Erro

cmd.ActiveConnection.BeginTrans
cmd.Execute
cmd.ActiveConnection.CommitTrans

Sair:
    Exit Sub

Erro:
    cmd.ActiveConnection.RollbackTrans
    Resume Sair

End Sub

Public Function Recuperar() As ADODB.Recordset

cmd.CommandText = "SELECT TA.Amostra, TA.Data_Amostra FROM t_Amostra AS TA ORDER BY TA.Amostra"

Set Recuperar = cmd.Execute()

End Function

Link to comment
Share on other sites

  • 0

Deveria sim funcionar, experimente fazer uma consulta com o seu código então execute-a. Como o access aceita o português quando for fazer a consulta utilize o formato([suaData],"data abreviada") no modo design, depois de executar caso dê certo abra a consulta em modo sql e copie o codigo para utilizar no seu procedimento.

Link to comment
Share on other sites

  • 0

eu sempre faço isso por preguiça de montar a sql manualmente..

e eu já percebi que:

1) consultas que tem como FROM outra consulta, ou seja, query da query, não funcionam no VBA.. ele só aceita como source tabelas.

2) se você tiver aspas na SQL, vai ter q duplica-las no codigo.. exemplo: format(campo,""dd/mm/yy"")..

3) calculos com datas so funcionam no formato mm/dd/yyyy..

4) se você em algum momento renomear na query um campo do tipo DATA, esse campo passa a ser do tipo texto. exemplo:

SELECT Format(DATA,"DD/MM/YY") AS DATA_ABR FROM

então o valor de DATA_ABR apesar de vir no formato especificado, passa a ser do tipo texto.

deve-se usar a função Cdate() antes para converter a saida da função format() para o tipo data:

SELECT Cdate(Format(DATA,"DD/MM/YY")) AS DATA_ABR FROM

=)

Edited by Humm
Link to comment
Share on other sites

  • 0

Na verdade um SELECT de uma consulta é um SELECT FROM SELECT

Ex: SELECT T.Aprovado FROM (SELECT IIF(TB.Nota >= 60, 'Aprovado', 'Reprovado') AS Aprovado FROM TabelaBoletim AS TB) AS T"

Na SQL você num precisa colocar 2x", você usa aspas simples (como o exemplo alí)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...