1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ajuda no access

Discussão em 'Programação' iniciada por ivo_sagres, 16 de Novembro de 2007. (Respostas: 11; Visualizações: 2950)

  1. ivo_sagres

    ivo_sagres Power Member

    Boas a todos tenho aqui um problema e precisava da vossa ajuda se possível. deram-me uma folha em excel com dados, que eu importei para o access, e o problema é:


    Tive que andar a procura de conseguir concatenar dois campos separados de horas e minutos, porque no excel, os campos estavam separados(ex: hora 15, minutos 50. tinha de ter apenas 15:50) e encontrei estas duas funções seriehora(h,m) e a valorhora(h,m) os campos ficaram como eu queria, agora não sei se são essas as funções apropriadas para fazer essa concatenação.


    E suponho que essas sejam as funções correctas. assim sendo, Preciso de subtrair dois campos em formato de hora (ex: 15:50 - 13:20, ou 2:20 - 23:40 neste ultimo, a hora final é do dia seguinte) como poderei fazer isso?

    Tou a fazer as alterações utilizando as consultas do access, que tb pode ser introduzido codigo em sql. Ajudem-me, ou com codigo sql para fazer essa subtração, ou com uma função access.

    Obrigado pela atenção.
     
  2. kzip

    kzip Power Member

    Não conhecia essas funções, mas em principio a função TimeSerial (seriehora) pode ser usada para o efeito. O chato é que em access o tipo de dados é "data-hora". Quando a soma/subtração passa das 24h, aparece um "dd-mm-aaaa hh:mm:ss".

    O código vai depender da forma como tens os dados organizados. Esses 2 campos estão na mesma tabela? tipo h1,m1 e h2, m2?
     
  3. ivo_sagres

    ivo_sagres Power Member


    yup
    isso mesmo tb ja pensei em deixar assim, e fazer os cálculos assim, mas isso vai dar uma trabalheira, principalmente por causa de algumas horas finais serem do dia a seguir...
    por isso tava a ver se algum me indicava uma função para subtrair as duas horas completas :)
    que a folha de dados se tivesse bem feita, não tinha esses problemas. mas ta uma bela treta...
    porque nas que eu fazia para mim, tinha só a hora inicial e a duração.
    mas estes cromos têm hora inicial e hora final, e o mais chato era que as horas e os minutos tavam separados...

    se tiveres alguma ideia, mesmo fazendo com h1, m1, h2, m2 chuta aí...
    as ideias são bem vindas.
    obg
     
  4. kzip

    kzip Power Member

    ok, então vou dizer aquela que acho ser a solução. Mas o melhor é explicar passo-a-passo, para compreenderes melhor porque é que a função fica tão extensa....

    (escrevo as funções em inglês, porque não sei a correspondência para o access português)

    1) à primeira vista a solução seria:

    Código:
    resultado =  TimeSerial([h1],[m1],0)  -  TimeSerial([h2],[m2],0)
    O problema é que no access quando subtrais uma hora de outra o resultado é numérico, o que engata tudo. depois tinhas de arranjar outra função para converter de numérico para hh:mm....

    2) a solução seria subtrair numérico de uma hh:mm. Assim o access já retorna no formato hh:mm

    Código:
     TimeSerial([h1],[m1],0) - [h2]/24 - [m2]/24/60
    Ou seja, à primeira data diminui-se x horas (h2/24) e y minutos (m2/24/60)

    Isto funcionaria bem..... se não tivesses o problema de datas finais inferiores às iniciais.....

    3) assim, há que compensar essas situações somando mais um dia (para não haver resultados negativos).
    O que há a fazer é validares se data1<data2, se sim então soma mais um dia (24h). Em access esse dia pode representar-se assim:


    Código:
    IIf(TimeSerial([h1],[m1],0) < TimeSerial([h2],[m2],0) , 1 , 0 )
    Agora só falta juntar tudo....

    4) Uma possivel query seria:

    Código:
    [FONT=Courier New]SELECT h1, m1, h2, m2, 
           [COLOR=Navy]TimeSerial([h1],[m1],0)-[h2]/24-[m2]/24/60[/COLOR] + 
           [COLOR=Green]IIf(TimeSerial([h1],[m1],0)< TimeSerial([h2],[m2],0),1,0)[/COLOR] AS Resultado
    FROM Tabela;[/FONT]
    
    E está feito!
     
    Última edição pelo moderador: 17 de Novembro de 2007
  5. ivo_sagres

    ivo_sagres Power Member


    Obrigadissimo
    Vou experimentar isso. mas hoje ja não :)
    Amanha a tarde ja digo se resolveu a situação ou não...
     
  6. Poiel

    Poiel Power Member

    Existe uma função chamada datediff que penso que dá para fazeres o que pretendes.
     
  7. ivo_sagres

    ivo_sagres Power Member


    E como funciona essa função?
    Não encontro a função em lado nenhum...
    Fui a ajuda, mas não a encontro.
    Se puderes dar um exemplo de como se utiliza :)
     
  8. ivo_sagres

    ivo_sagres Power Member

    Ja experimentei e está excelente. Mas só depois de andar as turras com "," e ";" e sempre a dar erro, ja tava a atrofiar... :)
    Mas com calminha lá pus como deve de ser...
    Obrigadinho

    Mas, ja agora tb gostava que o poiel dissesse como funciona essa do datediff, que na consigo encontrar em lado nenhum...

    Um mega obrigado mais uma vez...
     
  9. kzip

    kzip Power Member

    É verdade, na configuração portuguesa como é usada a virgula como ponto decimal "arranjaram" essa solução de o ";" ser o separador de argumentos. :rolleyes:

    O datediff (não sei qual a designação no access português) é uma função interessante pois permite vários tipos diferentes de outputs, mas não resolve o problema colocado.

    Sintaxe: http://www.techonthenet.com/access/functions/date/datediff.php
     
  10. ivo_sagres

    ivo_sagres Power Member

    agora tenho mais um prob.
    tenho umas caixas de combinação, e preciso de ter uns filtros para abrir um formulario

    Tenho aqui o codigo até onde cheguei.

    Dim stDocName As String
    Dim stLinkCriteria As String

    stDocName = "Pescas"

    stLinkCriteria = "[" & Me![cmb1] & "] " & Me![like1] & " '*" & Me![txt1] & "*' " & Me!and1 & " " _
    & "[" & Me![cmb2] & "] " & Me![like2] & " '*" & Me![txt2] & "*' " & Me!and2 & " " _
    & "[" & Me![cmb3] & "] " & Me![like3] & " '*" & Me![txt3] & "*' " & Me!and3 & " " _
    & "[" & Me![cmb4] & "] " & Me![like4] & " '*" & Me![txt4] & "*'"
    DoCmd.OpenForm stDocName, , , stLinkCriteria

    mas aqui no stlinkcriteria, não me lembro como posso fazer uma consulta que em vez de ser o like, seja o < ou > ou seja, conseguir definir um intervalo.

    consegues dar-me mais um empurraozito na direcção certa?

    um abraço.
     
  11. kzip

    kzip Power Member

    Os "wildcards" ( o asterisco que colocas antes e depois de Me![txt1] ) só funcionam com o operador "like", por isso é normal que esteja a falhar com outros operadores ( = , > , < , ... ).

    Tens duas soluções. Ou tiras os "*" e é o user que os coloca manualmente na textbox, ou então por programação verificas se o operador escolhido é o "like" (em caso afirmativo adicionas os "*").
     
  12. ivo_sagres

    ivo_sagres Power Member

    pois, eu já tinha feito isso, mas estava a atrofiar, e não dava.
    tb tive que mudar algumas cenas por causa do nome dos campos terem espaços
    Mas pronto, já esta a funcionar. Não como eu gostava que tivesse, mas faz as procuras todas que são necessárias.
    Mto obrigado pela ajuda.
     

Partilhar esta Página