Página 1 de 1

GET para hora

Enviado: 29 Mar 2008 22:13
por ERASMO ANDRIOLI
AMIGOS...

Alguem tem um exemplo de entrada no get para a hora?

Exemplo:

Tenho uma var chamada HORA1 = campo de 4 digitos... alfa...

Ela deve receber a entrada do get no formato "99:99"

Más depois de feita a leitura pelo READ é necessário que a hora digitada exista, por exemplo: se alguem digitar a hora: 26:39 o prog não deverá aceitar. Podemos usar a clausula VALID?

Aguardo informações...

Saudações a agradeço desde já o apoio dos colegas do forum...

Erasmo

Enviado: 29 Mar 2008 22:37
por Maligno
Não existe uma máscara que invoque a funções apropriadas para essa validação. Você terá de usar uma máscara normal (@R 99:99) e usar a cláusula VALID para executar uma função sua de checagem.

Enviado: 29 Mar 2008 23:45
por alaminojunior
Ilustrando a idéia do Maligno....

Código: Selecionar todos

cls
cTime:= space(5)
@ 10,10 get cTime pict "@ 99:99" valid Chk_Time(@cTime)
read

Function Chk_Time(par)
if settime(par+":00",.t.)  // SetTime() é da CATools
   return .t.
else
   alert("nananina")
   return .f.
endif
ou mais enxuto ainda...

Código: Selecionar todos

cls
cTime:= space(5)
@ 10,10 get cTime pict "@ 99:99" valid SetTime(cTime+":00",.t.)
read

Enviado: 30 Mar 2008 11:27
por Pablo César
Outra coisa que acho muito importante, é transformar as horas em TIMETOSEC() da CT.LIB para transformar em segundos. Isto é muito bom para comparar horas com exatidão de uma forma analógica.

Enviado: 30 Mar 2008 11:36
por Maligno
Acho que não precisa, Pablo. O código de teste é bem simples. Algo do tipo:

Código: Selecionar todos

function ValHora(cHora) // formato esperado: "99:99"
return Val(Left(cHora,2)) <= 23 .and. Val(Right(cHora,2)) <= 59
Pelo menos é isso que eu imagino que o Erasmo precisa. :)


Editado: eu tinha invertido os operados lógicos. :)
Editado: eu coloquei um IF desnecessário. :)

Enviado: 30 Mar 2008 11:42
por filizola
se estiver usando "@r 99:99"

get hora pict "@r 99:99" valid(hora<"2360")

Enviado: 30 Mar 2008 12:06
por alaminojunior
Meus caros, podem testar a rotina postada lá em cima, funciona !
Não precisa da máscara "@R", a função SetTime() da Catools pega como parâmetro uma string como "00:00:00", e ela própria já retorna verdadeiro ou falso, no caso de intervalos não aceitos, não precisando portanto de outras funções de checagem, a menos que se queira fazer outras verificações.

Enviado: 30 Mar 2008 12:14
por Maligno
filizola escreveu:se estiver usando "@r 99:99"

get hora pict "@r 99:99" valid(hora<"2360")
Você deu uma solução bem prática, mas que não vai funcionar a contento, infelizmente. Esse VALID retornará TRUE para algo do tipo "2299". Por conta dos segundos limitados a 60, a checagem precisa ser separada.

Enviado: 30 Mar 2008 12:16
por Maligno
alaminojunior escreveu:Não precisa da máscara "@R", a função SetTime() da Catools pega como parâmetro uma string como "00:00:00", e ela própria já retorna verdadeiro ou falso
Nem duvido que funcione. É que se alguém, por algum motivo, resolve não usar a CATools, fica complicado usá-la só por causa de uma função. E como a coisa é simples, uma checagem simples também resolve.

Tela Clipper que mostra a "Hora Atual do Sistema"

Enviado: 30 Mar 2008 14:45
por Manuel Luis Modernel
Muito bom domingo Clipperiano à todos !

Adorei este forum, e por isto virou para mim leitura cotidiana obrigatória.

Peço desculpas sim, de só mostrar exemplos feitos em Summer 87, posto ser o único Clipper do qual conheço alguma coisa.

Foge um pouquinho do tema mais pode ser útil e interessante o exemplo abaixo onde eu mostrava na minha tela (no canto superior direito) a hora atual do sistema atualizada segundo a segundo.

Fiz uma pequena função chamada H() e depois chamava ela a cada GET usado no desenvolvimento do programa como segue:

Código: Selecionar todos

func h
@ 00,71 say time()
hora=time()
return 0

e dai usava assim em todo lugar que pedisse uma atualização, um get, um dbedit em fim em qualquer lugar do programa, assim sempre atualizava e mostrava a hora certa que nem um relogio qualquer.

da seguinte forma

*ver o estoque.dbf geral
FUNC VERDBF

* AQUI EMBAIXO FAZIA MOSTRAR A HORA CERTA NO CANTO DA TELA!!

h() 

save screen
declare cpo[4],tit[4]

cpo[1]=[DESCRI]
cpo[2]=[tamanho]
cpo[3]=[CODIGO]
cpo[4]=[qtdatual]
tit[1]=[DESCRI€ŽO DO PRODUTO]
tit[2]=[NUMERO]
tit[3]=[CODIGO]
tit[4]=[ESTOQUE]
set color to g+/n
@ 04,04,22,75 box boxd
set color to n/bg,w/n,,,n/bg
dbedit(05,05,21,74,cpo,"",.t.,tit)
restore screen
RETURN 0
Era uma "frescurite a mais", mas ficava legal !!!

Get para Hora

Enviado: 30 Mar 2008 15:19
por Manuel Luis Modernel
Nunca gostei de usar "formatos de hora" pre-determinados, dai criava meu jeito próprio.
Hora eu usava sempre como "String" e debulhava ela matematicamente para usar em cálculos (sou engenheiro e não programador hihihi).

vé o trabalho que me dava mais não tinha erro possível !!!

segue uma função que eu usava para Inclusão e Calculos de Horas Extras.

pode criticar a Vontade tá ????

Código: Selecionar todos

func telinche
     sele a
     SET INDEX COD20
     icodigo=space(8)
     inome=space(30)
     idatas=space(8)
     idiasem=space(14)
     ientrou="07:30"           &&space(5)
     isaiu="00:00"             &&space(5)
     imintot=0
     imintot2=0
     ihoras=0
     ihoras2=0
     iminutos=0
     iminutos2=0
     itothora=0
     itothora2=0
     itotminu=0
     itotminu2=0
     ialmoco=90
     do while .t.
        limpa23()
        @ 05,27 clear to 07,52
        @ 07,02 clear to 18,77
        set color to gr+
        @ 07,02,18,77 box boxd
        @ 05,27,07,52 box boxd
        set color to w+/n,n/w,,,w/n
        centra("INCLUSAO DE HORAS EXTRAS",6)
        @ 08,04 say "Codigo do Funcionario.......: "
        @ 09,04 say "Nome do Funcionario.........: "
        @ 10,04 say "Data da Hora Extra..........:                     (data/mes/ano)"
        @ 11,04 say "Dia da Semana ou Feriado ...: "
        @ 12,04 say "Hora de Entrada.............: "
        @ 13,04 say "Hora de Saida...............: "
        @ 14,04 say "Desconto para Almoco/Janta..: "
        set index to
        if repete=0
            GO BOTTOM
        endif
        iCodigo=CODIGO
        inome  =NOME
        idatas =DATAS
        idiasem=DIASEM
        IENTROU="07:30"             &&ENTROU
        SET INDEX COD20
        @ 08,42 SAY iCodigo
        @ 09,42 SAY inome
        @ 10,42 SAY idatas
        @ 11,42 SAY idiasem
        @ 12,42 SAY ientrou
        @ 14,42 say ialmoco
        @ 08,42 get icodigo picture'AA999999'
        read
        IF icodigo=space(8)
           sele b
           save screen
           declare cpo[2],tit[2]
           cpo[1]=[NOME]
           cpo[2]=[CODIGO]
           tit[1]=cpo[1]
           tit[2]=cpo[2]
           limpa23()
           sai()
           @ 09,43,20,77 box boxd
           cb()
           dbedit(10,44,19,76,cpo,"",.t.,tit)
           restore screen
           set color to
           icodigo=codigo
           inome=substr(nome,1,30)
        endif
        sele a
        SET INDEX COD20
        @ 08,42 SAY iCodigo
        @ 09,42 SAY inome
        @ 09,42 get inome picture'@!'
        @ 10,42 get idatas picture'99/99/99'
        read
        j=recno()
        go top
        LOCATE for codigo=icodigo.and.datas=idatas
        if found()
           @ 23,5 say 'achei um'
           if lastkey()=27
              return 0
           endif
*           loop
        endif
        edatas=ctod(idatas)
        z=dow(edatas)
        dia()
        @ 10,42 say edatas pict'XX/XX/XX'
        @ 11,42 say '              '
        @ 11,42 say dia
        @ 12,42 get ientrou picture'99:99'
        @ 13,42 get isaiu picture'99:99'
        @ 14,42 get ialmoco
        read
        aenhora=substr(ientrou,1,2)
        aenminu=substr(ientrou,4,2)
        asaihora=Substr(isaiu,1,2)
        asaiminu=substr(isaiu,4,2)

        eenhora=val(aenhora)
        eenminu=val(aenminu)
        esaihora=val(asaihora)
        esaiminu=val(asaiminu)

        imintot=((esaihora-eenhora)*60+(esaiminu-eenminu))-ialmoco
        ihoras=int(imintot/60)
        iminutos=(imintot/60-int(imintot/60))*60

        IF diasem="SABADO".or.diasem="DOMINGO"
           imintot2 =imintot
           ihoras   =0
           iminutos =0
           ihoras2  =int(imintot2/60)
           iminutos2=imintot2-ihoras2*60
           imintot=0
        ELSE
           if imintot>=510        && aqui ve se tem hora extra
              imintot2=imintot-510
              imintot=510
           endif
           ihoras=int(imintot/60)
           iminutos=int((imintot/60-int(imintot/60))*60)

           ihoras2=int(imintot2/60)
           iminutos2=int((imintot2/60-int(imintot2/60))*60)
           if lastkey()=27.or.icodigo=space(8)
              return 0
           endif
           centra("Confirma Dados <S/N> ?",23)
           conf()
           set color to
           limpa23()
           do case
              case lastkey()=27
                 return 0
              case conf="S"
                 append blank
                 repl codigo with icodigo
                 repl nome with inome
                 repl datas with idatas
                 repl diasem with dia
                 repl entrou with ientrou
                 repl saiu with isaiu
                 repl mintot with imintot
                 repl mintot2 with imintot2
                 repl horas with ihoras
                 repl horas2 with ihoras2
                 repl minutos with iminutos
                 repl minutos2 with iminutos2
                 repl almoco with ialmoco
                 exit
           endcase
        endif
        repete=repete+1
     enddo
     SET COLOR TO
RETURN 0

mais uma em Clipper Summer 87 hihihihi

Enviado: 30 Mar 2008 16:00
por Toledo
Bom, usando o Clipper puro, sem LIBs externas... o exemplo do Maligno é perfeito, mas no exemplo dele tem que alterar o seguinte código:

Código: Selecionar todos

return if(Val(Left(cHora,2)) <= 23 .and. Val(Right(cHora,2)) <= 59
para

Código: Selecionar todos

return (Val(Left(cHora,2)) <= 23 .and. Val(Right(cHora,2)) <= 59)
Abraços,

Enviado: 30 Mar 2008 17:33
por Maligno
Hoje eu to meio zureta mesmo. Penso numa coisa e escrevo outra. Esse IF não tinha nada a ver mesmo. Obrigado pela correção, Toledo.