PDA

Ver la Versión Completa : Evaluar una consulta o un campo.


Telemaco
13-08-2004, 11:21:25
Hola estoy intentado pasar una aplicacion que hice en delphi a php, en la cual debe poder fichar cada empleado cada vez que entra o sale de la oficina, en principio la entrada y salida matutina y la entrada y salida vespertina. Para ello he utilizado el servidor Sql Server 2000 que tengo instalado y el php5, junto con Apache.

Tengo una tabla que se llama fichaje con las siguientes columnas:

USER, FECHA, H1, H2, H3, H4 , TF

user- > usuario que ficha
Fecha -> el dia que lo hace
h1,h2,h3,h4 -> cada una de las horas a las que se controla el fichaje
Tf -> tipo de fichaje que realiza (jornada normal, jornada reducida...etc)

mi problema es el siguiente

habia pensado en controlar el fichaje de la siguiente manera:



<?php
// variables globales
$usr = $HTTP_GET_VARS[ 'usr' ];
$pwd = $HTTP_GET_VARS[ 'pwd' ];
$tf = $HTTP_GET_VARS[ 'TFichajes' ];
// variables locales

$fecha= date("j-n-Y");
$hora= date("h:i");

echo ( "$usr,$pwd,$tf");
// conexión con el servidor atraves de un ODBC
$conex = @odbc_connect( "localserver", "" ,"", SQL_CUR_USE_ODBC );
if ( ! $conex )
{
echo (" ERROR 1: No contesta el servidor. <p>");
return;
}

$consulta = " select * from Fichaje where niwin = '$usr' and fecha = '$fecha'";
$consult = @odbc_exec( $conex, $consulta );
$rdo_consulta = @odbc_result (
if ( )
{
echo ( "Primer fichaje del dia" );
// primer fichaje
$f1= "insert into Fichaje values ('$usr','$fecha','$hora','NULL','NULL','NULL','$tf')";
$ejec_f1 = @odbc_exec( $conex, $f1 );
if ( ! $ejec_f1)
{
echo ("ERROR 2: Resultado vacio en la consulta <p>");
return;
}
odbc_free_result ( $ejec_f1 );
}
else
{ // ya ha fichado almenos una vez
echo ("Ya has fichado una vez, almenos. <br>");
$f2 = " select * from Fichaje where niwin = '$usr' and fecha = '$fecha' and h1 is not null ";
echo ("$f2<br>");
$ejec_f2 = @odbc_exec ( $conex, $f2);
if ( ! $ejec_f2 )
{ // no ha fichado por segunda vez
$ficha = " update Fichaje set h2 = '$hora' where niwin = '$usr' and fecha = '$fecha' ";
echo ("$ficha<br>");
$ejec_ficha = @odbc_exec( $conex, $ficha );
if ( ! $ejec_ficha)
{
echo ("ERROR FICHAJE: Error al fichar por segunda vez <p>");
return;
}
odbc_free_result ($ejec_ficha);
odbc_free_result ( $ejec_f2 );
}
else
{ // ha fichado como minimo 2 veces hoy
echo (" Ya has fichado como minimo dos veces <br>");
$f3 = " select * from Fichaje where niwin = '$usr' and fecha '$fecha' and h2 is not null ";
$ejec_f3 = @odbc_exec ($conex, $f3);
if ( ! $ejec_f3 )
{
// ha fichado 2 veces, modifico el fichaje para añadir el tercer fichaje
$ficha3 = "update Fichaje set h3 = '$hora' where niwin = '$usr' and fecha = '$fecha' ";
$ejec_ficha3 = @odbc_exec ( $conex, $ficha);
if ( ! $ejec_ficha3 )
{
echo ("ERROR FICHAJE: Error al fichar por tercera vez <p>");
return;
}
odbc_free_result ($ejec_f3);
}
else
{
// si llego aqui es pq solo me queda por hacer un ultimo fichaje
echo ("Ya has fichado 3 veces y solo te queda esta ultima <br>");
$ficha4 = "update Fichaje set h5 = '$hora' where niwin = '$usr' and fecha = '$fecha' ";
$ejec_ficha4 = @odbc_exec ( $conex, $ficha );
if ( ! $ejec_ficha4 )
{
echo (" ERROR FICHAJE: Error al fichar por cuarta vez <p>");
return;
}
odbc_free_result ($ejec_ficha4);
}
}


}


// liberación de los cursores y cierre de la conexión
odbc_free_result ( $consulta);
odbc_free_result ( $f1 );
odbc_close( $conex );
?>


Pero me da problemas, ya que siempre me dice que el segundo fichaje ya lo he hecho y es mentira, creo que el problema es que no he utilizado la sentencia correcta para evaluar si la expresión es cierta o no (es decir, si no hay ninguna anotación en "h2" pues entonces deberia devovler un nulo la variable $f2, pero no es asi).

Por lo cual me gustaria que me ayudariais, odbc_result es una opción mejor para controlar el valor de un campo en un momento determinado? creeis que deberia cambiar la forma de controlar los fichajes?

bueno cualquier ayuda sera bien recibida.

Gracias y perdonar por lo largo del hilo.;)

Emilio
20-08-2004, 00:27:40
Yo diría que ese if ( ) que tienes para que te entre en el primer fichaje del día te está traicionando, prueba a cambiarle esa condición nula por otra que fuerce su evaluación.