Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-10-2008
lKinGl lKinGl is offline
Miembro
 
Registrado: ago 2007
Posts: 333
Poder: 17
lKinGl Va por buen camino
Question Cálculo de alimentación de viáticos

Salu2 amigos foristas

tengo 4 maskedits con 3 edits

estoy tratando de desarrollar un sistema de viáticos

en el maskedit1 pongo fecha de salida
en el maskedit2 pongo hora de salida
en el maskedit3 pongo fecha de retorno
en el maskedit4 pongo hora de retorno

necesito un algoritmo que lleve esta lógica:

en el edit1 deberia dar cuantos desayunos le tocan a pepe
en el eidt2 deberia dar cuantos almuerzos le tocan a pepe y
en el edit3 deberia dar cuantas cenas le tocan a pepe

ejemplo:



si pepe sale el 01/10/2008 a las 9:00am y regresa el 03/10/2008 a las 8:00pm

desayunos=2
almuerzos=3
cenas=3

gracias adelantadas a sus sugerencias
Responder Con Cita
  #2  
Antiguo 01-10-2008
lKinGl lKinGl is offline
Miembro
 
Registrado: ago 2007
Posts: 333
Poder: 17
lKinGl Va por buen camino
Exclamation

se me olvidaba un detalle:

la hora:

Desayuno=8:00am
Almuerzo=12:00m
Cena=6:00pm
Responder Con Cita
  #3  
Antiguo 01-10-2008
Avatar de tcp_ip_es
tcp_ip_es tcp_ip_es is offline
No confirmado
 
Registrado: ago 2003
Ubicación: Madrid
Posts: 635
Poder: 0
tcp_ip_es Va por buen camino
Pues en principio resta los datetimes y multiplica los días enteros que te salgan es decir con tu ejemplo :

3/10/2008 - 1/10/2008 = 2 días *1desayuno, 1comida, 1cena = 2 desayunos 2 comidas y dos cenas

y luego revisa las horas de entrada y llegada.

hora salida/hora llegada
<8am >= 6pm sumar 1desayuno, 1comida, 1cena
<8am >=12am sumar 1desayuno, 1comida
<8am >=8am sumar 1desayuno

en la unit dateutils (>d5) encontrarás funciones de fechas que te serviran....
Responder Con Cita
  #4  
Antiguo 01-10-2008
lKinGl lKinGl is offline
Miembro
 
Registrado: ago 2007
Posts: 333
Poder: 17
lKinGl Va por buen camino
Wink

ok muchas gracias intentaré con dateutils a ver que logro
Responder Con Cita
  #5  
Antiguo 01-10-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
el problema con restar las fechas y multiplicarlas, es que si Pepe sale en la tarde, esa operación igual le asignaría 1 desayuno, lo cuál sería incorrecto.

Yo no utilizaría TMAskEdit para las fechas, sería mejor utilizar TDateTimePIcker. Igual para las horas, nada más cambia la propiedad "Kind"
__________________

Responder Con Cita
  #6  
Antiguo 01-10-2008
lKinGl lKinGl is offline
Miembro
 
Registrado: ago 2007
Posts: 333
Poder: 17
lKinGl Va por buen camino
Exclamation

podrias explicarte mejor contraveneno?

pense que seria bueno con maskedit para filtrar las fechas pero creo que tambien se podria realizar con datatimepicker

pero mi dilema es:

si pepe sale hoy(01/10/2008) a las 3:10pm y llega mañana(02/10/2008) a las 9:20 pm

el 02/10/2008 cumplio el horario total asi que tiene 1 desayuno 1 almuerzo y 1 cena

pero el 01/10/2008 amerita solo 1 cena

creo que estoy en la lógica correcta pero no se como expresarlo con código

gracias adelantadas a sus sugerencias se acepta cualquier método que funcione
Responder Con Cita
  #7  
Antiguo 01-10-2008
lKinGl lKinGl is offline
Miembro
 
Registrado: ago 2007
Posts: 333
Poder: 17
lKinGl Va por buen camino
Exclamation

en relacion a lo que me indica contraveneno hice otro formulario el cual posee lo siguiente:

TDataTimePicker1 = Fecha de Salida
TDataTimePicker2 = Fecha de Retorno
TDataTimePicker3 = Hora de Salida
TDataTimePicker4 = Hora de Llegada
Edit1=Desayunos
Edit2=Almuerzos
Edit3=Cenas
Botón Calcular
Cotón Cerrar

creo que seria bueno calcular la cantidad de horas que hay entre la salida y la llegada dividir entre 24(horas del dia) y lo que sobre serán las últimas horas del dia trabajado incompletamente

pero como lo expreso con código

gracias adelantadas
Responder Con Cita
  #8  
Antiguo 01-10-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Cita:
Empezado por lKinGl Ver Mensaje
creo que seria bueno calcular la cantidad de horas que hay entre la salida y la llegada dividir entre 24(horas del dia) y lo que sobre serán las últimas horas del dia trabajado incompletamente

pero como lo expreso con código
Como te dijeron tienes varías funciones en la unidad DateUtils que te pueden ayudar, con DaysBetween (te da la cantidad de días entre dos fechas), HoursBetween (te da la cantidad de horas entre dos fechas).

Código Delphi [-]
 showmessage(inttostr(DaysBetween(FechaFin, FechaIni)));
 showmessage(inttostr(HoursBetween(FechaFin, FechaIni)));

donde FechaIni y FechaFin, serían tus fechas que ya estan unidas con sus respectivas horas.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #9  
Antiguo 01-10-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Por que no cambias el algoritmo a algo no tan exacto pues es obvio que nadie come ni desayuna exactamente a las mismas horas y más cuando vas de viaje, digamos que sales a las 5:00 AM (obviamente no desayunas) y el viaje tarde 5 horas, llegas a tu destino y no te da tiempo de desayunar poruqe enseguida te pones a trabajar, dan las 3 y ya comes y luego como a las 8 cenas. Técnicamente te correspondía un desayuno (que no pudiste tomar).

Lo más simple y utilizado en casi todos lados es sacar un estimado de cuanto cuesta un día de las tres comidas y usar ese datos sin importar si se utilicen o no. Por ejemplo: supongamos $100 de comidas diarios para un viaje de 3 días, serían $300 y no nos importa si el tipo come a sus horas.

El control se lleva muy simple pues a su regreso el tipo tiene que comprobar $300 en facturas y/o efectivo. Obviamente las comidas que no haga no podrá presentar facturas (bueno teóricamente pq ya sabemos que en esto siempre hacen alguna transa): Esa verificación ya es parte del control interno de la empresa que es una función administrativa.

No es bueno codificar tan precisamente la cuestion de horas y fechas porque en un viaje de trabajo NUNCA se cumplen los horarios y corres el riesgo de que a alguien no le alcance o bien le sobre demasiado, por eso normalmente para viáticos siempre te consideran un % de imprevistos (más o menos un 20%) para esos casos. Nuevamente el control para que no haya desviaciones o malos manejos debe ser administrativo y no sistematizado. Otra cosa, las comidas no valen igual normalmente para un empleado de nivel medio que para un ejecutivo (ve tu a saber por qué, jejeje). Así como el hospedaje y demás, por otro lado hay que considerar que algunos trabajadores normalmente hacen comidas con clientes que obviamente a veces no están programadas sino que salen de improviso...ahi es donde te digo que es muy difícil y peligroso sistematizarlo todo.

Pero bueno, creo que sigo de metiche...solo era un comentario basado en mis experiencias.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #10  
Antiguo 01-10-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
yo estoy de acuerdo con Azid... pero pues cuando el cliente te lo pide...
__________________

Responder Con Cita
  #11  
Antiguo 01-10-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por ContraVeneno Ver Mensaje
... pero pues cuando el cliente te lo pide...
Deberias de asesorarlo bien

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #12  
Antiguo 01-10-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
cierto, cierto... hay que saber cuando decir que no.
__________________

Responder Con Cita
  #13  
Antiguo 02-10-2008
lKinGl lKinGl is offline
Miembro
 
Registrado: ago 2007
Posts: 333
Poder: 17
lKinGl Va por buen camino
Exclamation

jaja creo que ya todos se pusieron en mi contra pues les comento que la empresa tiene una forma de trabajo y es que ellos calculan mediante su hora de llegada a destino que comidas le toca, si les toca hospedaje o no de acuerdo a la cantidad de dias y no creo que acepten cambiar su forma de trabajo por mi, además a las empresas no les interesa dar demás a sus empleados, ejemplo : es ilógico que si yo llego a mi destino a las 6pm me paguen desayuno y almuerzo de ese dia.... (Imaginense si la empresa fuese de 200 empleados y todos llegan a las 6pm a su destino y les pagan desayuno y almuerzo ) se imaginan la pérdida que yo le causaria a la empresa? asi que creo que no deberia tomarme esto tan a la ligera

de igual manera si a un empleado le dan el dinero para el desayuno, la empresa se lava las manos en caso de que el empleado no quiera comer para ahorrarse el dinero ó comer cualquier cosa para lograr el fin antes mencionado
Responder Con Cita
  #14  
Antiguo 02-10-2008
lKinGl lKinGl is offline
Miembro
 
Registrado: ago 2007
Posts: 333
Poder: 17
lKinGl Va por buen camino
asi que me ayudaria muchisimo si alguno de ustedes me indica alguna forma de hacer tal cálculo o alguna idea ....

gracias adelantadas
salu2.___
Responder Con Cita
  #15  
Antiguo 02-10-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
¿ el monto para el desayuno, la comida y la cena es diferente o es el mismo para las tres comidas ?
__________________

Responder Con Cita
  #16  
Antiguo 02-10-2008
lKinGl lKinGl is offline
Miembro
 
Registrado: ago 2007
Posts: 333
Poder: 17
lKinGl Va por buen camino
La unidad tributaria actual es 46 Bs.

Desayuno = 0.4 * Unidad Tributaria
Almuerzo = 1.7* Unidad Tributaria
Cena = 0.4* Unidad Tributaria

con una hoja y un lapiz he sacado los rangos (a ver si sirven de algo) creo que si

Desayuno= (<9:00am) y (<12:00m) y (<6:00pm)
Almuerzo= (>9:00am) y (<12:00m) y (<6:00pm)
Cena= (>9:00am) y (>12:00m) y (<6:00pm)

salu2 y gracias adelantadas
Responder Con Cita
  #17  
Antiguo 02-10-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Pues se tendría que hacer al menos tres cálculos. Uno para determinar cuantas comidas le tocan al primer días, otro para determinar los días (este es el más fácil, daysbetween * 3 comidas por día) y otro para determinar cuantas comidas le corresponden al último día. Sumas y creo que con eso tienes.
__________________

Responder Con Cita
  #18  
Antiguo 03-10-2008
lKinGl lKinGl is offline
Miembro
 
Registrado: ago 2007
Posts: 333
Poder: 17
lKinGl Va por buen camino
Salu2

creo que la mejor forma de desarrollar el algoritmo es la siguiente

Salida: 20/01/2008
Retorno: 25/01/2008

HoraSalida:13:00pm
Hora Retorno:11:00 am

Sacar la diferencia que hay entre salida y retorno

Retorno - Salida = 5 - 2 =3
Por lo tanto

Dias completos= 1Desayuno+1Almuerzo+1Cena


// le resto 2 por que es muy posible que el dia de salida y el dia de retorno no se trabaje completo

AlimentosSalida:24:00-13:00 = 11:00 Horas (Aqui asumir que faltaron 11 horas para culminar el dia)

Por lo tanto Alimentos Salida = 1 Cena

Alimentos Retorno=24:00-11:00 = 13:00

Por lo tanto Alimentos Retorno=1 Almuerzo+1Cena


nota: yo se que para hacer una resta de horas se usa el hoursbetween de la libreria DateUtils, pero no se es como sacar la resta con hora militar

porfa les agradesco su ayuda y gracias adelantadas
__________________
Las cosas o son, o no son...
Responder Con Cita
  #19  
Antiguo 03-10-2008
lKinGl lKinGl is offline
Miembro
 
Registrado: ago 2007
Posts: 333
Poder: 17
lKinGl Va por buen camino
Cool

Problema Resuelto:

Tengo lo siguiente:

MaskEdit1 = Formato(99/99/9999) es la fecha de Salida
MaskEdit2 = Formato(99/99/9999) esl la fecha de Retorno
MaskEdit3 = Formato (99:99) es la Hora de Salida
MaskEdit4 = Formato (99:99) es la hora de Retorno
Combobox1 = am ó pm del dia de salida
Combobox2 = am ó pm del dia de retorno
Edit1 = son los dias completos (que ameritan todas las comidas del dia).
Edit2 = son las horas restantes para que acabe el dia de salida
Edit3 = son las horas restantes para que acabe el dia de retorno
Edit4 = Total desayunos
Edit5 = Total Almuerzos
Edit6 = Total Cena
Button1 = Cálculos
Button2 = Cerrar

Código del Form

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
MaskEdit1.Text:='';
MaskEdit2.Text:='';
MaskEdit3.Text:='';
MaskEdit4.Text:='';
edit1.Text:='';
edit2.Text:='';
edit3.Text:='';
edit4.Text:='0';
edit5.Text:='0';
edit6.Text:='0';
ComboBox1.Text:='am';
ComboBox2.Text:='am';
end;

Código del Boton Calcular
Código Delphi [-]
procedure TForm15.Button1Click(Sender: TObject);
var
Fecha, Horas, Horae:String;
des, dest, almt, cent, alm, cen:Integer;
begin
  des:=0;
  alm:=0;
  cen:=0;
  Fecha := IntToSTr(DaysBetween(StrToDate(MaskEdit2.Text), StrToDate(MaskEdit1.Text)));
  Horas := IntToSTr(HoursBetween(StrToDateTime(MaskEdit3.Text), StrToDateTime('12:00')));
  Horae := IntToStr(HoursBetween(StrToDateTime(MaskEdit4.Text),StrToDateTime('12:00')));
  edit1.Text:=Fecha;
  edit4.Text:='0';

  if ComboBox1.Text='am' then
    begin
      edit2.Text:=IntToStr(StrToInt(Horas)+12);
    end
    else
    begin
      edit2.Text:=IntToStr(StrToInt(Horas));
    end;

  if ComboBox2.Text='am' then
    begin
      edit3.Text:=IntToStr(StrToInt(Horae)+12);
    end
    else
    begin
      edit3.Text:=IntToStr(StrToInt(Horae));
    end;

//Cálculos
if StrToInt(edit2.Text)<=15 then
  begin
    des:=1;
  end;

if StrToInt(edit3.Text)<=15 then
  begin
    des:=des+1;
  end;

//Si Faltan 12 horas para acabarse el dia

if StrToInt(edit2.Text)<=12 then
  begin
    alm:=1;
  end;

if StrToInt(edit3.Text)<=12 then
  begin
    alm:=alm+1;
  end;
//Si Faltan 6 Horas para acabarse el dia
if StrToInt(edit3.Text)<=6 then
  begin
    cen:=1;
  end;

if StrToInt(edit3.Text)<=6 then
  begin
    cent:=cen+1;
  end;

//SALIDAS
dest:=StrToInt(edit1.Text);
almt:=StrToInt(edit1.Text);
cent:=StrToInt(edit1.Text);
edit4.Text:=IntToStr(des+dest);
edit5.Text:=IntToStr(alm+almt);
edit6.Text:=IntToStr(cen+cent);
//FIN DESAYUNOS
end;

Código del Boton Cerrar
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;


jejeje creo que me he ido por algo un tanto complicado pero fué la única forma que me surgio la solución espero que a alguien más le sirva
__________________
Las cosas o son, o no son...

Última edición por lKinGl fecha: 03-10-2008 a las 16:01:16.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Alimentacion de Papel en Epson tmu 200 frankmch Impresión 11 23-11-2011 19:23:22
Calculo con decimales Carlos Arevalo Varios 3 30-07-2008 18:12:27
Integrales (Calculo) D-MO Varios 4 07-09-2006 19:52:53
calculo letra NIE Cabanyaler Varios 3 29-03-2005 12:19:42
Calculo De Totales PETERKANTROPUS Tablas planas 2 25-05-2004 03:06:14


La franja horaria es GMT +2. Ahora son las 17:36:53.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi