Ajuda no access

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.
 
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?
 
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?


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
 
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:
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!


Obrigadissimo
Vou experimentar isso. mas hoje ja não :)
Amanha a tarde ja digo se resolveu a situação ou não...
 
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!

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...
 
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.
 
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 "*").
 
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 "*").

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.
 
Back
Topo