View Full Version : Ajuda no access


ivo_sagres
16-11-2007, 18:09
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.

kzip
16-11-2007, 19:47
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?

ivo_sagres
16-11-2007, 20:14
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

kzip
16-11-2007, 20:45
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:

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

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:


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

4) Uma possivel query seria:


SELECT h1, m1, h2, m2,
TimeSerial([h1],[m1],0)-[h2]/24-[m2]/24/60 +
IIf(TimeSerial([h1],[m1],0)< TimeSerial([h2],[m2],0),1,0) AS Resultado
FROM Tabela;


E está feito!

ivo_sagres
16-11-2007, 20:50
4) Uma possivel query seria:


SELECT h1, m1, h2, m2,
TimeSerial([h1],[m1],0)-[h2]/24-[m2]/24/60 +
IIf(TimeSerial([h1],[m1],0)< TimeSerial([h2],[m2],0),1,0) AS Resultado
FROM Tabela;
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...

Poiel
16-11-2007, 22:55
Existe uma função chamada datediff que penso que dá para fazeres o que pretendes.

ivo_sagres
17-11-2007, 14:31
Existe uma função chamada datediff que penso que dá para fazeres o que pretendes.


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

ivo_sagres
17-11-2007, 15:50
4) Uma possivel query seria:


SELECT h1, m1, h2, m2,
TimeSerial([h1],[m1],0)-[h2]/24-[m2]/24/60 +
IIf(TimeSerial([h1],[m1],0)< TimeSerial([h2],[m2],0),1,0) AS Resultado
FROM Tabela;
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...

kzip
17-11-2007, 23:31
É 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

ivo_sagres
17-11-2007, 23:39
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.

kzip
18-11-2007, 11:38
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 "*").

ivo_sagres
19-11-2007, 19:02
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.