FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour (Solucionado resta de horas) Como validar retardo ...
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
(Solucionado resta de horas) Como validar retardo ...
Posted: Fri May 16, 2014 09:03 PM
Hola buenas tardes como estan, aqui de nuevo con una pregunta sencilla, o no tan sencilla.
Como puedo validar el tiempo con 15 minutos de tolerancia, o convertir 15 minutos a hora time(), u otro metodo de funcion.

1.- Por ejemplo en el sistema hora de entrada de empleado 9:00 am
2.- En otro campo con 15 minutos de tolerancia...
3.- O sumarle time + 15 minutos y me de suma de 9:15 am, cual seria la instruccion y validar si time() > 9:15 am como ejemplo

Como puedo validar despues de 9:16 am, me valide, MsgAlert("Retardo de entrada")...esta es la intruccion, pero no le hallo forma :

Code (fw): Select all Collapse
cEntr := "9:00 am" // Variable dato en DBF como hora entrada 聽 聽 聽 聽Caracter 聽// aqui validar su hora de entrada 
聽nTole := 15 聽 聽 聽 聽// variable dato en DBF 15 minutos de tolerancia Numerico 聽 聽 聽 聽 聽// Aqui validar 15 minutos de tolerancia 

聽IF TIME() > STR(nTole) 聽// Aqui con la funcion TIME() "9:16 am" que ya se paso 15 minutos de tolerancia de entrada...
聽 聽 聽MsgAlert("Retardo de entrada...")
聽ENDIF


Espero sus comentarios, ejemplos, ayuda que me puedan ayudar con esta validacion u o condicion.

Saludos .!
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Como validar retardo despues de 15 minutos tolerancia...
Posted: Sat May 17, 2014 03:22 AM
Hola.
Algo rapido, chapucero, pero talvez te sirve de guia.
Code (fw): Select all Collapse
LOCAL nEntrConToler := 555   //09:15 = 9*60=540 + 15 = 555 minutos
local nEntRetraso   := Val(substr(time(),1,2))*60 + val(substr(time(),4,2))
if nEntRetraso > nEntrConToler
   MsgInfo("Castigo por retraso de "+Str(nEntRetraso-nEntrConToler)+" minutos")
endif

Saludos.
Francisco J. Alegr铆a P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
Re: Como validar retardo despues de 15 minutos tolerancia...
Posted: Sun May 18, 2014 01:46 AM
FranciscoA wrote:Hola.
Algo rapido, chapucero, pero talvez te sirve de guia.
Code (fw): Select all Collapse
LOCAL nEntrConToler := 555 聽 //09:15 = 9*60=540 + 15 = 555 minutos
local nEntRetraso 聽 := Val(substr(time(),1,2))*60 + val(substr(time(),4,2))
if nEntRetraso > nEntrConToler
聽 聽MsgInfo("Castigo por retraso de "+Str(nEntRetraso-nEntrConToler)+" minutos")
endif

Saludos.



Gracias por tu interes de siempre Francisco,el resultado si me da a tu ejemplo sencillo.
Pero...quisiera que desde mi campo lunes,martes.miercoles,etc etc , y dependiendo de horario de sea matutino, vespertino y nocturno me convirtiera la variable de "09:00:00 am" a "09:20:00 am" me dijera diferencia minutos de retardo desde las 9 am, pero pasado de mas de 25 minutos,que me dijera ya no puede checar entrada..a lo que me refiero es sumar desde el inicio de entrada menos la diferencua de retardo,y eso que con la varariable ,la estoy declarando solo caracter y no con time() ...y validar con mas de 25 minutos ya no te deje checar tu entrada...es algo asi con esa rutina....BUENO YO CREO QUE SI SERIA CON TIME(),DESPUES DEL TIEMPO TRANSCURRIDO DESDE LA ENTRADA DE CHECADOR DE RELOJ, O SEA LA VARIABLE DESDE QUE LA CONFIGURO MATUTINO cHoraEntrada:="09:00: am" hasta el tiempo transcurrido despues de la tolerancia de 15 minutos o sea "09:15 am" y de ahi contar que desde "09:016 am" diferencia de minutos de retardo, pero tipo caracter, pero si sumandole diferencia transcurrido de retardo....
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
Re: Como validar retardo despues de 15 minutos tolerancia...
Posted: Sun May 18, 2014 05:13 PM
ACC69 wrote:
FranciscoA wrote:Hola.
Algo rapido, chapucero, pero talvez te sirve de guia.
Code (fw): Select all Collapse
LOCAL nEntrConToler := 555 聽 //09:15 = 9*60=540 + 15 = 555 minutos
local nEntRetraso 聽 := Val(substr(time(),1,2))*60 + val(substr(time(),4,2))
if nEntRetraso > nEntrConToler
聽 聽MsgInfo("Castigo por retraso de "+Str(nEntRetraso-nEntrConToler)+" minutos")
endif

Saludos.



Gracias por tu interes de siempre Francisco,el resultado si me da a tu ejemplo sencillo.
Pero...quisiera que desde mi campo lunes,martes.miercoles,etc etc , y dependiendo de horario de sea matutino, vespertino y nocturno me convirtiera la variable de "09:00:00 am" a "09:20:00 am" me dijera diferencia minutos de retardo desde las 9 am, pero pasado de mas de 25 minutos,que me dijera ya no puede checar entrada..a lo que me refiero es sumar desde el inicio de entrada menos la diferencua de retardo,y eso que con la varariable ,la estoy declarando solo caracter y no con time() ...y validar con mas de 25 minutos ya no te deje checar tu entrada...es algo asi con esa rutina....BUENO YO CREO QUE SI SERIA CON TIME(),DESPUES DEL TIEMPO TRANSCURRIDO DESDE LA ENTRADA DE CHECADOR DE RELOJ, O SEA LA VARIABLE DESDE QUE LA CONFIGURO MATUTINO cHoraEntrada:="09:00: am" hasta el tiempo transcurrido despues de la tolerancia de 15 minutos o sea "09:15 am" y de ahi contar que desde "09:016 am" diferencia de minutos de retardo, pero tipo caracter, pero si sumandole diferencia transcurrido de retardo....



Alguien mas ha hecho algo parecido, entrada y salida de personal con codigo de barras...y con validacion de 15 minutos de retardo y restarle el tiempo de entrada de retardo con caracter "09:00:00 am" menos 09:16:00 am con diferencia de 1 minuto de retardo ???

Saludos
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Como validar retardo despues de 15 minutos tolerancia...
Posted: Mon May 19, 2014 04:30 AM
Francisco J. Alegr铆a P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Como validar retardo despues de 15 minutos tolerancia...
Posted: Mon May 19, 2014 04:57 PM
Yo tengo un sistema de control de personal con acceso por medio de un programa con tarjetas de codigos de barra.
En mi caso, cada empleado tiene definido el horario de entrada limite (pero es facil aplicar ya que es comparar dos datos tipo string)
Te paso la funci贸n que calcula las horas extras (en valores enteros). Tal vez te sirva.
Code (fw): Select all Collapse
// cEntra es la hora de entrada
// cSale es la hora de salida
// nJornada es el total de horas que debe trabajar en esa jornada
STATIC FUNCTION HorasExtras(cEntra,cSale,nJornada)
LOCAL nHoras := 0, nHora1, nHora2
聽 聽 聽 聽 聽 聽nHora1 := VAL(LEFT(cEntra,1,2)) * 60 + VAL(SUBSTR(cEntra,4,2))
聽 聽 聽 聽 聽 聽nHora2 := VAL(LEFT(cSale ,1,2)) 聽* 60 + VAL(SUBSTR(cSale,4,2))
聽 聽 聽 聽 聽 聽IF cSale < cEntra
聽 聽 聽 聽 聽 聽 聽 nHora2 := nHora2 + 24 * 60
聽 聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽 聽nHoras := (nHora2 - nHora1) / 60 - nJornada 聽 聽 聽 聽 聽
RETURN nHoras

Recuerda que el valor te lo devuelve en horas (en forma decimal) por lo tanto 1:30 hs = 1.5
O sea que con el mismo criterio, la llegada tarde podrias consultarla asi:
Code (fw): Select all Collapse
IF HorasExtras(cFichada,cFechaLim,0) > 0.25
聽 聽MsgInfo("Llego tarde")
ENDIF

Obviamente hay muchos mas controles que puedes hacer, como que pasa si falta una fichada, si los dias son h谩biles, feriados, no laborables, etc.
Pero esto es un punta, que espero te sirva
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
Re: Como validar retardo despues de 15 minutos tolerancia...
Posted: Tue May 20, 2014 02:53 PM
cmsoft wrote:Yo tengo un sistema de control de personal con acceso por medio de un programa con tarjetas de codigos de barra.
En mi caso, cada empleado tiene definido el horario de entrada limite (pero es facil aplicar ya que es comparar dos datos tipo string)
Te paso la funci贸n que calcula las horas extras (en valores enteros). Tal vez te sirva.
Code (fw): Select all Collapse
// cEntra es la hora de entrada
// cSale es la hora de salida
// nJornada es el total de horas que debe trabajar en esa jornada
STATIC FUNCTION HorasExtras(cEntra,cSale,nJornada)
LOCAL nHoras := 0, nHora1, nHora2
聽 聽 聽 聽 聽 聽nHora1 := VAL(LEFT(cEntra,1,2)) * 60 + VAL(SUBSTR(cEntra,4,2))
聽 聽 聽 聽 聽 聽nHora2 := VAL(LEFT(cSale ,1,2)) 聽* 60 + VAL(SUBSTR(cSale,4,2))
聽 聽 聽 聽 聽 聽IF cSale < cEntra
聽 聽 聽 聽 聽 聽 聽 nHora2 := nHora2 + 24 * 60
聽 聽 聽 聽 聽 聽ENDIF
聽 聽 聽 聽 聽 聽nHoras := (nHora2 - nHora1) / 60 - nJornada 聽 聽 聽 聽 聽
RETURN nHoras

Recuerda que el valor te lo devuelve en horas (en forma decimal) por lo tanto 1:30 hs = 1.5
O sea que con el mismo criterio, la llegada tarde podrias consultarla asi:
Code (fw): Select all Collapse
IF HorasExtras(cFichada,cFechaLim,0) > 0.25
聽 聽MsgInfo("Llego tarde")
ENDIF

Obviamente hay muchos mas controles que puedes hacer, como que pasa si falta una fichada, si los dias son h谩biles, feriados, no laborables, etc.
Pero esto es un punta, que espero te sirva


Hola buenos dias, gracias a todos los que me respondieron por este sencillo codigo, que yo hacia mal, que no me restaba la fecha,por ser tipo caracter,pero ya funciono, gracias cmsoft por el interes de esta rutina, y por lo que comentas tienes desarollado sistema entrada y salida, con codigo de barras, yo anbude buscando por el foro, pero ya no funciona el link, no se si alguien me pueda proporcionar la clase de codigo de barras actualizado y un ejemplo sencillo, de como crear dando de alta codigo de barras e imprimirlo y leer por escaner, estaba pensando en hacer lo mas sencillo de entrada con codigo y clave de usuario.

Saludos y buen dia. y les agradezco de nuevo por la ayuda y el interes.

Atte: Adrian C. C.
acc69@hotmail.com
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Como validar retardo despues de 15 minutos tolerancia...
Posted: Wed May 21, 2014 03:59 AM
Hola Adrian:
Para la entrada de datos, no necesitas nada, ya que si elijes un scanner con emulador de teclado, lo que hace es emular que el usuario ingresa los d铆gitos que tiene el c贸digo de barras de la tarjeta personal del empleado.
Para la impresi贸n de las tarjetas con c贸digos de barras, lo mejor ser铆a elegir un FONT Interleave 2 of 5, una tipograf铆a que imprima c贸digos de barra. Entonces, lo que defines en un obtejo PRINTER es el font apropiado y listo.
Aca te dejo un ejemplo de impresi贸n de carnet y la funci贸n que arma el c贸digo de barras
Code (fw): Select all Collapse
***********************************
** Emision de tarjeta personal
// base es la tabla de personal que viene como parametro
STATIC FUNCTION Tarjeta(base)
LOCAL oPrn, oFont1, oFont2, nCol, nRow, i, mfoto,;
      mbarra, mtama1, mtama2, mtama5
// Busco los tam帽os de letra para cada font en una 
// tabla que guardo los valores 
USE fuentes ALIAS "datos" NEW
mtama1 := datos->tama1
mtama2 := datos->tama2
mtama5 := datos->tama5
close datos
// La foto del empleado la tengo guardada en una 
// carpeta FOTOS con el codigo de empleado completado con ceros
mfoto   := "FOTOS\" + STRTRAN(STR((base)->codigo ,8)," ","0") + ".BMP"
// El codigo de barras lo armo con la funcion CodigoBarra
// que arma el conjunto de pares que la tipografia puede 
// mostrar (siempre tiene que ser par el nro de digitos)
// Los () de inicio y fin son necesarios para delimitar el codigo
mbarra  := "("+CodigoBarra( STRTRAN(STR((base)->codigo ,6)," ","0") )+")"
// Defino los distintos tipos de letra
     DEFINE FONT oFont1 NAME "TAHOMA" SIZE mtama1, mtama1*2
     DEFINE FONT oFont2 NAME "Interleaved 2of5 Text" SIZE mtama4, mtama4*2
PRINT oPrn NAME "Tarjeta" PREVIEW
   // Divido la hora en 72 lineas x 80 Columnas
   nRow = oPrn:nVertRes() / 72
   nCol = oPrn:nHorzRes() / 80
   PAGE
     // Imprimo un logo de la empresa para el carnet
     oPrn:SayBitmap(7,nCol*20,"LOGOCARN.BMP",mtama5/5,mtama5/5)
     oPrn:SayBitmap(nRow*2,nCol*24,mfoto,mtama5+mtama5/3,mtama5)
     oPrn:Say(nRow*2,nCol*5,oApp:nomb_emp,oFont1)
     oPrn:Say(nRow*4,nCol*5,"Legajo Nro.:"+STR((base)->codigo),oFont1)
     oPrn:Say(nRow*5,nCol*5,(base)->nombre,oFont1)
     oPrn:Say(nRow*6,nCol*5,"Categoria: "+;
          IF(cate04->(DBSEEK((base)->categoria)),cate04->nombre,""),oFont1)
     oPrn:Say(nRow*7,nCol*5,"Direccion: "+(base)->direccion,oFont1)
     oPrn:Say(nRow*8,nCol*5,"D.N.I: "+STR((base)->dni),oFont1)
     oPrn:Say(nRow*9,nCol*5,"Fecha Ingreso: "+DTOC((base)->fechaing),oFont1)
     oPrn:Say(nRow*10,nCol*5,mbarra,oFont2)
   ENDPAGE
ENDPRINT
RELEASE FONT oFont1
RELEASE FONT oFont2
RETURN nil

************************************
** Codigo de barra de un numero
STATIC FUNCTION CodigoBarra( x )
LOCAL i, bar := {}, j := 0, bar1 := {}, cBarr := ""
   FOR i := 48 TO 97
       AADD(bar ,CHR(i))
       AADD(bar1,STRTRAN(STR(j,2)," ","0"))
       j++
   NEXT i
   FOR i := 192 TO 241
       AADD(bar,CHR(i))
       AADD(bar1,STRTRAN(STR(j,2)," ","0"))
       j++
   NEXT i
FOR j := 1 TO LEN(x)-1 STEP 2
    i := ASCAN(bar1,SUBSTR(x,j,2))
    cBarr := cBarr + bar[i]
NEXT j
RETURN cBarr

Espero te sirva!
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
Re: Como validar retardo despues de 15 minutos tolerancia...
Posted: Wed May 21, 2014 04:51 PM
cmsoft wrote:Hola Adrian:
Para la entrada de datos, no necesitas nada, ya que si elijes un scanner con emulador de teclado, lo que hace es emular que el usuario ingresa los d铆gitos que tiene el c贸digo de barras de la tarjeta personal del empleado.
Para la impresi贸n de las tarjetas con c贸digos de barras, lo mejor ser铆a elegir un FONT Interleave 2 of 5, una tipograf铆a que imprima c贸digos de barra. Entonces, lo que defines en un obtejo PRINTER es el font apropiado y listo.
Aca te dejo un ejemplo de impresi贸n de carnet y la funci贸n que arma el c贸digo de barras
Code (fw): Select all Collapse
***********************************
** Emision de tarjeta personal
// base es la tabla de personal que viene como parametro
STATIC FUNCTION Tarjeta(base)
LOCAL oPrn, oFont1, oFont2, nCol, nRow, i, mfoto,;
聽 聽 聽 mbarra, mtama1, mtama2, mtama5
// Busco los tam帽os de letra para cada font en una 
// tabla que guardo los valores 
USE fuentes ALIAS "datos" NEW
mtama1 := datos->tama1
mtama2 := datos->tama2
mtama5 := datos->tama5
close datos
// La foto del empleado la tengo guardada en una 
// carpeta FOTOS con el codigo de empleado completado con ceros
mfoto 聽 := "FOTOS\" + STRTRAN(STR((base)->codigo ,8)," ","0") + ".BMP"
// El codigo de barras lo armo con la funcion CodigoBarra
// que arma el conjunto de pares que la tipografia puede 
// mostrar (siempre tiene que ser par el nro de digitos)
// Los () de inicio y fin son necesarios para delimitar el codigo
mbarra 聽:= "("+CodigoBarra( STRTRAN(STR((base)->codigo ,6)," ","0") )+")"
// Defino los distintos tipos de letra
聽 聽 聽DEFINE FONT oFont1 NAME "TAHOMA" SIZE mtama1, mtama1*2
聽 聽 聽DEFINE FONT oFont2 NAME "Interleaved 2of5 Text" SIZE mtama4, mtama4*2
PRINT oPrn NAME "Tarjeta" PREVIEW
聽 聽// Divido la hora en 72 lineas x 80 Columnas
聽 聽nRow = oPrn:nVertRes() / 72
聽 聽nCol = oPrn:nHorzRes() / 80
聽 聽PAGE
聽 聽 聽// Imprimo un logo de la empresa para el carnet
聽 聽 聽oPrn:SayBitmap(7,nCol*20,"LOGOCARN.BMP",mtama5/5,mtama5/5)
聽 聽 聽oPrn:SayBitmap(nRow*2,nCol*24,mfoto,mtama5+mtama5/3,mtama5)
聽 聽 聽oPrn:Say(nRow*2,nCol*5,oApp:nomb_emp,oFont1)
聽 聽 聽oPrn:Say(nRow*4,nCol*5,"Legajo Nro.:"+STR((base)->codigo),oFont1)
聽 聽 聽oPrn:Say(nRow*5,nCol*5,(base)->nombre,oFont1)
聽 聽 聽oPrn:Say(nRow*6,nCol*5,"Categoria: "+;
聽 聽 聽 聽 聽 IF(cate04->(DBSEEK((base)->categoria)),cate04->nombre,""),oFont1)
聽 聽 聽oPrn:Say(nRow*7,nCol*5,"Direccion: "+(base)->direccion,oFont1)
聽 聽 聽oPrn:Say(nRow*8,nCol*5,"D.N.I: "+STR((base)->dni),oFont1)
聽 聽 聽oPrn:Say(nRow*9,nCol*5,"Fecha Ingreso: "+DTOC((base)->fechaing),oFont1)
聽 聽 聽oPrn:Say(nRow*10,nCol*5,mbarra,oFont2)
聽 聽ENDPAGE
ENDPRINT
RELEASE FONT oFont1
RELEASE FONT oFont2
RETURN nil

************************************
** Codigo de barra de un numero
STATIC FUNCTION CodigoBarra( x )
LOCAL i, bar := {}, j := 0, bar1 := {}, cBarr := ""
聽 聽FOR i := 48 TO 97
聽 聽 聽 聽AADD(bar ,CHR(i))
聽 聽 聽 聽AADD(bar1,STRTRAN(STR(j,2)," ","0"))
聽 聽 聽 聽j++
聽 聽NEXT i
聽 聽FOR i := 192 TO 241
聽 聽 聽 聽AADD(bar,CHR(i))
聽 聽 聽 聽AADD(bar1,STRTRAN(STR(j,2)," ","0"))
聽 聽 聽 聽j++
聽 聽NEXT i
FOR j := 1 TO LEN(x)-1 STEP 2
聽 聽 i := ASCAN(bar1,SUBSTR(x,j,2))
聽 聽 cBarr := cBarr + bar[i]
NEXT j
RETURN cBarr

Espero te sirva!



Gracias cmsfot, por tu interes, entonces no es necesario tener la clase de barcode o barlib, que con eso es mas que suficiente, ahora en caso que no tuviera escaner con emulador de teclado, ahi si a fuerzas usaria la clase, segun yo supongo,de todas maneras no tengo escaner para hacer pruebas,espero conseguir uno prestado y a ver que sale .

Saludos de antemano cmsoft, gracias de nuevo.

acc69@hotmail.com
Posts: 632
Joined: Tue Dec 12, 2006 07:34 PM
Re: (Solucionado resta de horas) Como validar retardo ...
Posted: Wed May 21, 2014 08:46 PM
ACC69 wrote:Hola buenas tardes como estan, aqui de nuevo con una pregunta sencilla, o no tan sencilla.
Como puedo validar el tiempo con 15 minutos de tolerancia, o convertir 15 minutos a hora time(), u otro metodo de funcion.

1.- Por ejemplo en el sistema hora de entrada de empleado 9:00 am
2.- En otro campo con 15 minutos de tolerancia...
3.- O sumarle time + 15 minutos y me de suma de 9:15 am, cual seria la instruccion y validar si time() > 9:15 am como ejemplo

Como puedo validar despues de 9:16 am, me valide, MsgAlert("Retardo de entrada")...esta es la intruccion, pero no le hallo forma :

Code (fw): Select all Collapse
cEntr := "9:00 am" // Variable dato en DBF como hora entrada 聽 聽 聽 聽Caracter 聽// aqui validar su hora de entrada 
聽nTole := 15 聽 聽 聽 聽// variable dato en DBF 15 minutos de tolerancia Numerico 聽 聽 聽 聽 聽// Aqui validar 15 minutos de tolerancia 

聽IF TIME() > STR(nTole) 聽// Aqui con la funcion TIME() "9:16 am" que ya se paso 15 minutos de tolerancia de entrada...
聽 聽 聽MsgAlert("Retardo de entrada...")
聽ENDIF


Espero sus comentarios, ejemplos, ayuda que me puedan ayudar con esta validacion u o condicion.

Saludos .!


Gracias solucionado la resta de horas y tolerancia de entrada.

Continue the discussion