Foros del Web » Programando para Internet » PHP »

Mas PROBLEMAS CON FECHAS!!!

Estas en el tema de Mas PROBLEMAS CON FECHAS!!! en el foro de PHP en Foros del Web. Mi problema anterior fue solucionado por un amigo del foro! Ahora tengo otras cositas para hacer, respecto a las fechas... Cuando un usuario elije desde ...
  #1 (permalink)  
Antiguo 16/07/2003, 23:14
Avatar de pabloazorin  
Fecha de Ingreso: junio-2003
Ubicación: Pilar, Buenos Aires.
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 1
Mas PROBLEMAS CON FECHAS!!!

Mi problema anterior fue solucionado por un amigo del foro!
Ahora tengo otras cositas para hacer, respecto a las fechas...
Cuando un usuario elije desde los combo-box fecha de salida y del combo-box fecha de llegada (dia, mes y año) automaticamente calcula la cantidad de dias....hasta aca vengo bien...
Ahora lo que necesito hacer es lo siguiente:

1) SALIDA: 5 de marzo del 2003
LLEGADA: 28 de marzo del 2003
Tarifa 1 : del 1 de enero al 20 de marzo (u$s 750 por semana)
Tarifa 2: del 21 de marzo al 3 de junio (u$s 800 por semana)
Yo tendria que calcular desde el 5 al 20 de marzo con la tarifa 1, y desde el 21 al 28 de marzo con la tarifa 2.
Se puede hacer realmente esto? Que me aconsejan que puedo hacer?
Si alguien puede ayudarme, agradecido estare.
Atte
PABLO
__________________
Pablo S. Azorin
[email protected]
  #2 (permalink)  
Antiguo 17/07/2003, 00:56
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 3 meses
Puntos: 5
Bueno... creo que deberás modificar un poco tu código...

1.- Te recomiendo crear una tabla de tarifas

id|nombretarifa|fecha_inicio|fecha_final|tarifa
1|'verano 2003'|20030515|20030801|550
2|'Otoño 2003'|20030802|20031215|480


Despues de eso, deberá hacer algo como esto...


Código PHP:
<?
// Te conectas a la BD

$fecha1=20030727;
$fecha2=20030805;
// Estas fechas son las que traes de los campos...
// Procura que esten en el formato YYYYMMDD

$dif=((strtotime($fecha2))-(strtotime($fecha1)))/86400;
$tarifa=0;
for (
$i=0;$$i<$dif;$i++){
    
$qr_tarifa=mysql_query("select * from tarifas where fecha_inicio>=($fecha1 + interval $i day) and fecha_final<=('$fecha1' + interval $i day)");
    
$rs_tarifa=mysql_fetch_array($qr_tarifa);
    
$tarifa +=$rs_tarifa["tarifa"];
}

echo 
$tarifa;

//Esto te daría como resultado 2,670, ya que son 5 dias de 550 y 4 de 480...
?>

espero que te sirva...
__________________
Manoloweb
  #3 (permalink)  
Antiguo 17/07/2003, 08:00
Avatar de pabloazorin  
Fecha de Ingreso: junio-2003
Ubicación: Pilar, Buenos Aires.
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 1
Ok...muchas gracias.....creo que esto puede servirme.....
Aparte tambien necesitaria tener en una BD fechas en las cuales no hay disponibilidad, por ejemplo el dia 20030518, y que si el usuario esta dentro de ese rango de dias le diga que no hay disponibilidad.....
Me parece que se podria conectar bien con esto que me pasaste, pero estaria bueno que alguno me de una mano con esto tambien.
Gracias
PABLO
__________________
Pablo S. Azorin
[email protected]
  #4 (permalink)  
Antiguo 17/07/2003, 08:35
Avatar de pabloazorin  
Fecha de Ingreso: junio-2003
Ubicación: Pilar, Buenos Aires.
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 1
Cuando hago lo que decis me tira el siguiente error:
Fatal error: Maximum execution time of 30 seconds exceeded in c:\apache\htdocs\hoteles\prueba.php on line 11
Y esa linea es :
$qr_tarifa=mysql_query("select * from tarifas where fecha_inicio>=($fecha1 + interval $i day) and fecha_fin<=('$fecha1' + interval $i day)");
Que puede ser???
Por que se cuelga?
__________________
Pablo S. Azorin
[email protected]
  #5 (permalink)  
Antiguo 17/07/2003, 08:40
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 3 meses
Puntos: 5
Pues no creo que sea necesario hacer otra tabla para las fechas sin servicio... simplemente un registro más en la misma tabla...


id|nombretarifa|fecha_inicio|fecha_final|tarifa|Se rvicio
1|'verano 2003'|20030515|20030801|550|SI
2|'Otoño 2003'|20030802|20031215|480|SI
3|'Fuera de Ser'|20031213|20040201|0|NO

Y puedes cambiar el código mas o menos así...

Código PHP:
<?
// Te conectas a la BD

$fecha1=20030727;
$fecha2=20030805;
// Estas fechas son las que traes de los campos...
// Procura que esten en el formato YYYYMMDD

$dif=((strtotime($fecha2))-(strtotime($fecha1)))/86400;
$tarifa=0;
$mensaje="";
for (
$i=0;$$i<$dif;$i++){
    
$qr_tarifa=mysql_query("select * from tarifas where fecha_inicio>=($fecha1 + interval $i day) and fecha_final<=('$fecha1' + interval $i day)");
    
$rs_tarifa=mysql_fetch_array($qr_tarifa);
    if (
$rs_tarifa["Servicio"]=="NO"){
        
$tarifa=0;
        
$mensaje="Lo sentimos, para algunas fechas seleccionadas no hay servicio, por favor intentelo de nuevo";
        break;
    }
    
$tarifa +=$rs_tarifa["tarifa"];
}
$mensaje=($mensaje=="")?"A continuacion le presentamos la tarifa para las fechas seleccionadas" $mensaje;
echo 
$mensaje;
echo 
"Tarifa total: ".$tarifa;
?>

Bueno parece que eso es todo lo que se me ocurre
__________________
Manoloweb
  #6 (permalink)  
Antiguo 17/07/2003, 11:23
Avatar de pabloazorin  
Fecha de Ingreso: junio-2003
Ubicación: Pilar, Buenos Aires.
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 1
Hola...
Me parece que el error sale de aca:

$qr_tarifa=mysql_query("select * from tarifas where fecha_inicio>=($fecha1 + interval $i day) and fecha_final<=('$fecha1' + interval $i day)");

Porque armo todo bien, como me dijiste, pero me dice:

"A continuacion le presentamos la tarifa para las fechas seleccionadasTarifa total: 0 ?> "

Me parece que no se realiza el select de la tabla por eso tira 0. Puede que haya algun error de sintaxis?
Gracias
PABLO
__________________
Pablo S. Azorin
[email protected]
  #7 (permalink)  
Antiguo 17/07/2003, 11:24
Avatar de pabloazorin  
Fecha de Ingreso: junio-2003
Ubicación: Pilar, Buenos Aires.
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 1
Que funcion cumple la sintaxis:

($fecha1 + interval $i day)

Alguien podria explicarmelo???
Gracias
PABLO
__________________
Pablo S. Azorin
[email protected]
  #8 (permalink)  
Antiguo 17/07/2003, 12:02
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 3 meses
Puntos: 5
Bueno, eso, traducido (o sea cambiando las variables por sus valores) sería algi así:

(2003-05-05 + interval 2 day)

O sea que le suma dos días a la fecha1, y va haciendo ese "loop" para cada uno de los días que estan incluidos en tu reservación...
__________________
Manoloweb
  #9 (permalink)  
Antiguo 17/07/2003, 14:02
Avatar de pabloazorin  
Fecha de Ingreso: junio-2003
Ubicación: Pilar, Buenos Aires.
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 1
Tenes idea porque me tira como valor 0???
Cual sera el problema?
__________________
Pablo S. Azorin
[email protected]
  #10 (permalink)  
Antiguo 17/07/2003, 14:53
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 3 meses
Puntos: 5
Pues no... no tengo idea...

???
__________________
Manoloweb
  #11 (permalink)  
Antiguo 17/07/2003, 16:57
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Hola Pablo,

Me alegra que tu aplicación ya está tomando forma y te sientas cómodo discutiendo los problemas que van apareciendo en el camino. El aprendizaje siempre es muy bonito y más cuando se trata de cosas tan interesantes como la programación... :)

Bueno, en tu caso se me ocurre una solución del siguiente tipo:

Código:
<?php

// Retomemos los valores de los que parte el programa. Las fechas de
// entrada y salida.

$fecha_entrada_dia  = 5;
$fecha_entrada_mes  = 3;
$fecha_entrada_anyo = 2003;

$fecha_salida_dia  = 28;
$fecha_salida_mes  = 3;
$fecha_salida_anyo = 2003;


// Antes de continuar, tomemos la precaucion de "traducir" de una vez
// las fechas a un formato mas comodo.

$fecha_entrada_unix = mktime (0, 0, 0,
                              $fecha_entrada_mes, $fecha_entrada_dia,
                              $fecha_entrada_anyo);

$fecha_salida_unix = mktime (0, 0, 0,
                             $fecha_salida_mes, $fecha_salida_dia,
                             $fecha_salida_anyo);


// Ahora, concentremonos en las tarifas. Para efectos de simplicidad,
// vamos a usar un arreglo, aunque no sea una solucion muy
// flexible. Si se usara este tipo de solucion en una aplicacion real,
// habria que modificar directamente el codigo fuente cada vez que las
// tarifas cambiaran, lo cual no parece muy buena idea. Sin embargo,
// hacer las modificaciones necesarias para adaptar la carga de datos
// desde una fuente externa (como una base de datos relacional) no
// debe resultar dificil.

// A continuacion se presenta un arreglo que contiene la informacion
// de las tarifas, que a su vez se almacenan en arreglos
// asociativos. La informacion que nos importa tener es basicamente:
// valor de la tarifa, fecha en la que empieza a regir, y fecha en la
// que finaliza. Es importante notar que, internamente, vamos a usar
// el valor -1 como indicador de que para un periodo determinado no
// hay disponibilidad de servicio.

// Tambien, por comodidad, hemos asumido que los valores de las
// tarifas son _diarios_. Es decir, una tarifa de $750 por semana, por
// ejemplo, tendria un valor de mas o menos $107 por dia.

$tarifas = array (array ('valor'      => 107,
                         'inicio_dia' => 1,
                         'inicio_mes' => 1,
                         'fin_dia'    => 20,
                         'fin_mes'    => 3),

                  array ('valor'      => 114,
                         'inicio_dia' => 21,
                         'inicio_mes' => 3,
                         'fin_dia'    => 3,
                         'fin_mes'    => 6),

                  array ('valor'      => -1,
                         'inicio_dia' => 4,
                         'inicio_mes' => 6,
                         'fin_dia'    => 10,
                         'fin_mes'    => 6));

// Los valores anteriores, por ejemplo, definen que existen dos
// tarifas; una que se aplica del 1 de Enero al 20 de Marzo y es de
// $107 diarios, otra que se aplica del 21 de Marzo al 3 de Junio y es
// de $114 diarios, y además se define que del 4 de Junio al 10 de
// Junio no hay disponibilidad de servicio.


$num_tarifas = count ($tarifas);  // Es mejor calcular solo una vez el
                                  // numero de tarifas que existe.


// A continuacion, y solo "por si las moscas", vamos a definir una
// variable que sera utilizada como el valor por defecto de la tarifa
// en aquellos dias que no hacen parte de ninguno de los intervalos
// definidos en $tarifas.

$tarifa_por_defecto = 100;


// Ahora si, vamos a calcular la tarifa total. El ciclo que se
// presenta a continuacion podria recibir ciertos retoques con fines
// de optimizacion, pero su apariencia actual se debe a que por ahora
// preferimos la legibilidad y la simpleza a la eficacia.

$tarifa_total = 0;  // La tarifa inicia en ceros.


// La comparacion aqui es un "menor o igual" ya que se desea contar el
// periodo entre fecha de entrada y fecha de salida con estos dias
// inclusive. Recuerde tambien que 86400 es aproximadamente la
// cantidad de segundos que hay en un dia.

for ($dia = $fecha_entrada_unix; $dia <= $fecha_salida_unix; $dia += 86400) {

    // Busquemos una tarifa que se aplique en el dia que estamos analizando

    // Inicialmente, no se ha encontrado ninguna tarifa
    // aplicable. (Resulta un poco obvio, dado que no hemos analizado
    // ninguna todavia).

    $tarifa_encontrada = false; 

    for ($i = 0; $i < $num_tarifas; $i++) {

        // Usamos los anyos de las fechas de entrada y salida para las
        // tarifas tambien.

        $tarifa_inicio_unix = mktime (0, 0, 0,
                                      $tarifas[$i]['inicio_mes'],
                                      $tarifas[$i]['inicio_dia'],
                                      $fecha_entrada_anyo);

        $tarifa_fin_unix = mktime (0, 0, 0,
                                   $tarifas[$i]['fin_mes'],
                                   $tarifas[$i]['fin_dia'],
                                   $fecha_salida_anyo);

        if ($dia >= $tarifa_inicio_unix and $dia <= $tarifa_fin_unix) {

            // Se ha encontrado una tarifa aplicable. La vida es
            // bella.
            $tarifa_encontrada = true;

            if ($tarifas[$i]['valor'] == -1)
                print "<strong>Atencion:</strong> no hay disponibilidad " .
                    "de servicio para la fecha " . date ('j-n-Y', $dia) .
                    "<br />\n";

            else
                $tarifa_total += $tarifas[$i]['valor'];


            break;
        }
    }


    // Si no hubo una tarifa aplicable, no temais! La tarifa por
    // defecto viene al rescate.

    if (! $tarifa_encontrada)
        $tarifa_total += $tarifa_por_defecto;
}


// Finalmente, la respuesta que todos esperabamos.

print "La tarifa total es \$$tarifa_total\n";


// Eso fue todo. Este ejemplo muestra un mensaje de advertencia por
// cada dia que hace parte del periodo a estudiar y para el que no hay
// disponibilidad de servicio. Puede que no sea buena idea contar con
// ese comportamiento, pero por otra parte, puede que el usuario lo
// piense dos veces antes de volver a seleccionar periodos de tiempo
// en los que no hay servicio... :)

?>
Espero que los comentarios que he puesto te faciliten la digestión de este ejemplo. Sin embargo, ten en mente que casi siempre es más importante la habilidad de entender los algoritmos y sentencias de un programa leyendo el código mismo, en lugar de sus comentarios.

Saludos.
  #12 (permalink)  
Antiguo 17/07/2003, 17:04
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 3 meses
Puntos: 5
Leonardop... en lugar de usar code usa php, y se verá así:

Código PHP:
<?php

// Retomemos los valores de los que parte el programa. Las fechas de
// entrada y salida.

$fecha_entrada_dia  5;
$fecha_entrada_mes  3;
$fecha_entrada_anyo 2003;

$fecha_salida_dia  28;
$fecha_salida_mes  3;
$fecha_salida_anyo 2003;


// Antes de continuar, tomemos la precaucion de "traducir" de una vez
// las fechas a un formato mas comodo.

$fecha_entrada_unix mktime (000,
                              
$fecha_entrada_mes$fecha_entrada_dia,
                              
$fecha_entrada_anyo);

$fecha_salida_unix mktime (000,
                             
$fecha_salida_mes$fecha_salida_dia,
                             
$fecha_salida_anyo);


// Ahora, concentremonos en las tarifas. Para efectos de simplicidad,
// vamos a usar un arreglo, aunque no sea una solucion muy
// flexible. Si se usara este tipo de solucion en una aplicacion real,
// habria que modificar directamente el codigo fuente cada vez que las
// tarifas cambiaran, lo cual no parece muy buena idea. Sin embargo,
// hacer las modificaciones necesarias para adaptar la carga de datos
// desde una fuente externa (como una base de datos relacional) no
// debe resultar dificil.

// A continuacion se presenta un arreglo que contiene la informacion
// de las tarifas, que a su vez se almacenan en arreglos
// asociativos. La informacion que nos importa tener es basicamente:
// valor de la tarifa, fecha en la que empieza a regir, y fecha en la
// que finaliza. Es importante notar que, internamente, vamos a usar
// el valor -1 como indicador de que para un periodo determinado no
// hay disponibilidad de servicio.

// Tambien, por comodidad, hemos asumido que los valores de las
// tarifas son _diarios_. Es decir, una tarifa de $750 por semana, por
// ejemplo, tendria un valor de mas o menos $107 por dia.

$tarifas = array (array ('valor'      => 107,
                         
'inicio_dia' => 1,
                         
'inicio_mes' => 1,
                         
'fin_dia'    => 20,
                         
'fin_mes'    => 3),

                  array (
'valor'      => 114,
                         
'inicio_dia' => 21,
                         
'inicio_mes' => 3,
                         
'fin_dia'    => 3,
                         
'fin_mes'    => 6),

                  array (
'valor'      => -1,
                         
'inicio_dia' => 4,
                         
'inicio_mes' => 6,
                         
'fin_dia'    => 10,
                         
'fin_mes'    => 6));

// Los valores anteriores, por ejemplo, definen que existen dos
// tarifas; una que se aplica del 1 de Enero al 20 de Marzo y es de
// $107 diarios, otra que se aplica del 21 de Marzo al 3 de Junio y es
// de $114 diarios, y además se define que del 4 de Junio al 10 de
// Junio no hay disponibilidad de servicio.


$num_tarifas count ($tarifas);  // Es mejor calcular solo una vez el
                                  // numero de tarifas que existe.


// A continuacion, y solo "por si las moscas", vamos a definir una
// variable que sera utilizada como el valor por defecto de la tarifa
// en aquellos dias que no hacen parte de ninguno de los intervalos
// definidos en $tarifas.

$tarifa_por_defecto 100;


// Ahora si, vamos a calcular la tarifa total. El ciclo que se
// presenta a continuacion podria recibir ciertos retoques con fines
// de optimizacion, pero su apariencia actual se debe a que por ahora
// preferimos la legibilidad y la simpleza a la eficacia.

$tarifa_total 0;  // La tarifa inicia en ceros.


// La comparacion aqui es un "menor o igual" ya que se desea contar el
// periodo entre fecha de entrada y fecha de salida con estos dias
// inclusive. Recuerde tambien que 86400 es aproximadamente la
// cantidad de segundos que hay en un dia.

for ($dia $fecha_entrada_unix$dia <= $fecha_salida_unix$dia += 86400) {

    
// Busquemos una tarifa que se aplique en el dia que estamos analizando

    // Inicialmente, no se ha encontrado ninguna tarifa
    // aplicable. (Resulta un poco obvio, dado que no hemos analizado
    // ninguna todavia).

    
$tarifa_encontrada false

    for (
$i 0$i $num_tarifas$i++) {

        
// Usamos los anyos de las fechas de entrada y salida para las
        // tarifas tambien.

        
$tarifa_inicio_unix mktime (000,
                                      
$tarifas[$i]['inicio_mes'],
                                      
$tarifas[$i]['inicio_dia'],
                                      
$fecha_entrada_anyo);

        
$tarifa_fin_unix mktime (000,
                                   
$tarifas[$i]['fin_mes'],
                                   
$tarifas[$i]['fin_dia'],
                                   
$fecha_salida_anyo);

        if (
$dia >= $tarifa_inicio_unix and $dia <= $tarifa_fin_unix) {

            
// Se ha encontrado una tarifa aplicable. La vida es
            // bella.
            
$tarifa_encontrada true;

            if (
$tarifas[$i]['valor'] == -1)
                print 
"<strong>Atencion:</strong> no hay disponibilidad " .
                    
"de servicio para la fecha " date ('j-n-Y'$dia) .
                    
"<br />\n";

            else
                
$tarifa_total += $tarifas[$i]['valor'];


            break;
        }
    }


    
// Si no hubo una tarifa aplicable, no temais! La tarifa por
    // defecto viene al rescate.

    
if (! $tarifa_encontrada)
        
$tarifa_total += $tarifa_por_defecto;
}


// Finalmente, la respuesta que todos esperabamos.

print "La tarifa total es \$$tarifa_total\n";


// Eso fue todo. Este ejemplo muestra un mensaje de advertencia por
// cada dia que hace parte del periodo a estudiar y para el que no hay
// disponibilidad de servicio. Puede que no sea buena idea contar con
// ese comportamiento, pero por otra parte, puede que el usuario lo
// piense dos veces antes de volver a seleccionar periodos de tiempo
// en los que no hay servicio... :)

?>
__________________
Manoloweb
  #13 (permalink)  
Antiguo 17/07/2003, 17:35
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Esperando no importunar con esta información fuera de tema...

Te agradezco mucho la recomendación, Manoloweb. Ya había notado esta característica de los foros, sin embargo pienso que prefiero el uso de la etiqueta code sobre php ya que,

* Aparentemente la etiqueta php inserta una línea en blanco después de cada línea de código, y a pesar de que el código luce definitivamente mejor en colores, no quisiera que a expensas de este detalle, todo el código termine ocupando el doble de espacio

* Sería grandioso que así como este foro ofrece una etiqueta para darle un formato más amable al código escrito en PHP, también ofreciera etiquetas similares para otras clases de código... c, perl, lisp, etc. Si existiesen o fuera posible siquiera contribuir esta característica al código del foro, yo estaría muy interesado en saber más al respecto. Pero ya que por ahora eso no está disponible, hasta donde tengo entendido, siento como si de alguna forma le estuviera dando cierta preferencia al código de PHP, idea que, aunque absurda, lo sé, no me agrada mucho. Soy un animal de costumbres e "ideas religiosas" exóticas... :)

Así que ya ves, espero no ofender a las personas que quisieran encontrar todo el código escrito en PHP bajo estas etiquetas. Un cordial saludo.
  #14 (permalink)  
Antiguo 17/07/2003, 17:43
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 3 meses
Puntos: 5
Je je... pues lo de insertar una linea en blanco, al menos en mi maquina se ve normal...

Y con respecto a por que se le da preferencia al codigo PHP en esto del coloreado, es porque estos foros estan hechos con PHP, y PHP tiene una función interna que sirve para colorear la sintaxis PHP...

highlight_string($texto);

Así que no es que alguien le haya dedicado tiempo a ello, sino que simplemente usaron algo que ya estaba hecho...

Saludos!
__________________
Manoloweb
  #15 (permalink)  
Antiguo 17/07/2003, 19:52
Avatar de pabloazorin  
Fecha de Ingreso: junio-2003
Ubicación: Pilar, Buenos Aires.
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 1
Amigos...
Ya esta casi todo listo.....
Pero todavia sigo teniendo complaciones y espero que alguien pueda darme una mano!

Cuando elijo:
Fecha Ida: 10/05/2003
Fecha Vuelta: 24/06/2003
Por ejemplo, si en los dias 30 y 31 de mayo no habia disponibilidad, funciona todo perfecto...me dice que no hay disponibilidad para esos dias y listo......
El problema esta, cuando por ejemplo, pongo como fecha de ida la misma anterior, pero a la fecha de vuelta la pongo como 05/01/2004.....osea, le cambio el año......me calcula bien el precio, pero NO ME AVISA que el 30 y 31 de mayo no hay disponibilidad...
En caso anterior si lo hacia, pero cuando cambia el año no....
Donde esta el error?

Saludos y muchas gracias......mas que nada a Leonardop y a Manoloweb....dos colaboradores importantisimos en el desarrollo de mi trabajo. Gracias a ustedes!
PABLO
__________________
Pablo S. Azorin
[email protected]
  #16 (permalink)  
Antiguo 17/07/2003, 20:55
Avatar de pabloazorin  
Fecha de Ingreso: junio-2003
Ubicación: Pilar, Buenos Aires.
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 1
Al realizar una sumatoria de fechas, me da como resultado
244.04166666667
Como hago para que solamente salga la parte entera del numero?
__________________
Pablo S. Azorin
[email protected]
  #17 (permalink)  
Antiguo 17/07/2003, 21:12
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 3 meses
Puntos: 5
?? Y como es que haces la sumatoria? si todos los valores de tiempo son integros???
__________________
Manoloweb
  #18 (permalink)  
Antiguo 18/07/2003, 13:52
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Qué tal, amigos...

¡Qué bien que hayas encontrado un fallo en el código, Pablo! Cuando uno dispone del código de una aplicación que piensa que funciona bien, y de repente aparece un bug inesperado, casi siempre es motivo de celebración, creo yo. En ocasiones la oportunidad que se presenta ahí para estudiar y aprender algo nuevo es mucho más alta que en la actividad regular de escribir código nuevo que no se ha probado aun.

(Por supuesto, no es motivo de celebración cuando la aplicación en cuestión es crítica y opera sobre situaciones de verdadera importancia... A veces los errores de programación pueden costar empleos, pero es mucho más grave cuando cuestan vidas, por ejemplo...)

En fin, he probado la situación que describes y me he dado cuenta que el problema ha sido mi descuido a la hora de operar con los periodos de las tarifas. Por pereza, cualidad que muchas veces resulta útil al escribir software, en este caso el programa no puede realizar cálculos precisos cuando los periodos de tiempo incluyen "saltos" de año.

La solución sería incluir campos para el valor de año, en los arreglos asociativos de las tarifas:

Código:
$tarifas = array (array ('valor'       => 107,
                         'inicio_dia'  => 1,
                         'inicio_mes'  => 1,
                         'inicio_anyo' => 2003,
                         'fin_dia'     => 20,
                         'fin_mes'     => 3,
                         'fin_anyo'    => 2003),

                  array ('valor'      => -1,
                         'inicio_dia' => 30,
                         'inicio_mes' => 5,
                         'inicio_anyo' => 2003,
                         'fin_dia'    => 31,
                         'fin_mes'    => 5,
                         'fin_anyo'    => 2003));

Y luego emplearlos acordemente:

Código:
        $tarifa_inicio_unix = mktime (0, 0, 0,
                                      $tarifas[$i]['inicio_mes'],
                                      $tarifas[$i]['inicio_dia'],
                                      $tarifas[$i]['inicio_anyo']);

        $tarifa_fin_unix = mktime (0, 0, 0,
                                   $tarifas[$i]['fin_mes'],
                                   $tarifas[$i]['fin_dia'],
                                   $tarifas[$i]['fin_anyo']);
Sobre tu última inquietud, el valor con punto decimal que quieres usar como entero, una opción es que le apliques un "moldeamiento de tipos" (o type casting en Inglés). Un ejemplo de esto sería:

Código:
<?php
$real = 244.04166666667;  // Valor real cualquiera

$entero = (int) $real;  // Realizando "type casting"

print "El valor $real moldeado a entero es $entero";
?>
Saludos.
  #19 (permalink)  
Antiguo 18/07/2003, 15:49
Avatar de pabloazorin  
Fecha de Ingreso: junio-2003
Ubicación: Pilar, Buenos Aires.
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 1
Bueno...ahora si todo funciona perfectamente.....
Vamos avanzando un poco...... y cada vez......queremos mas...no?
Lo que tengo ahora es lo siguiente:

Las tarifas y los intervalos de ellas, supongamos que son fijos. Hasta aca todo viene bien....
Lo que hariamos ahora, es que las fechas en las cuales "no hay disponibilidad" sean dinamicas, osea, sean tomadas de una base de datos.
Espero novedades.
Gracias.
PABLO
__________________
Pablo S. Azorin
[email protected]
  #20 (permalink)  
Antiguo 18/07/2003, 18:18
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Bueno, el código para cargar la información de una base de datos externa debe resultar más o menos directo. La idea fundamentalmente es: (a) ejecutar la consulta correspondiente a la base de datos, y (b) iterar para cada fila retornada (la cual debe tener los datos de cada tarifa) e ir añadiendo esa información al arreglo $tarifas.

Si la base de datos que usas es MySQL por ejemplo, podría ser algo como:

Código:
$tarifas = array ();  // El arreglo inicia vacio, para luego ser
                      // llenado desde la base de datos.

$consulta = mysql_query ("SELECT * FROM tabla_de_tarifas;");

while ($fila = mysql_fetch_array ($consulta, MYSQL_ASSOC))
    array_push ($tarifas, array ('valor'       => $fila['valor'],
                                 'inicio_dia'  => $fila['inicio_dia'],
                                 'inicio_mes'  => $fila['inicio_mes'],
                                 'inicio_anyo' => $fila['inicio_anyo'],
                                 'fin_dia'     => $fila['fin_dia'],
                                 'fin_mes'     => $fila['fin_mes'],
                                 'fin_anyo'    => $fila['fin_anyo']));
La cuestión puede variar mucho dependiendo de cómo has diseñado las tablas en tu base de datos, pero creo que puedes ver la idea del asunto. Si encuentras algún inconveniente, por favor indícanos el diseño de tu base de datos para poder estudiar el problema más cómodamente. :) Saludos.
  #21 (permalink)  
Antiguo 19/07/2003, 16:13
Avatar de pabloazorin  
Fecha de Ingreso: junio-2003
Ubicación: Pilar, Buenos Aires.
Mensajes: 41
Antigüedad: 20 años, 10 meses
Puntos: 1
Por favor, vease
http://www.palace-resorts-cancun.com/question.jpg
Gracias!
__________________
Pablo S. Azorin
[email protected]
  #22 (permalink)  
Antiguo 19/07/2003, 21:38
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 21 años, 8 meses
Puntos: 8
pabloazorin
Con respecto a ese interlineado que se te hace cuando usas el coloreado PHP de estos foros es porque usas Netscape, Mozilla o algo paracido ¿no?

Ese error lo reporté hace bastente tiempo en el foro de administracion e inclusive detecte el problema y propuse las soluciones. Pero por aquellos lados: ni bola...
http://www.forosdelweb.com/showthrea...hreadid=123804

por alguna razon las imágenes que capturé es ese momento no se ven:
aqui estan los links:
http://purohumor.webcindario.com/ie.png
http://purohumor.webcindario.com/ns.png


Si ese no era el problema, bue, no se...
Te dejo con Manoloweb (suerte con el preyctito candidato a proyectaso)y leonardop para que sigan solucionando tu problema.

Salduos!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:22.