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 14-03-2014
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 20
amadis Va por buen camino
Exclamation TMS Planner - Reserva de habitaciones

Estimados este hilo tiene relación con este hilo de Anubis del año 2007, tema FECHAS EN RESERVAS

El tema aquí es si alguien puede aportar ejemplo o guía de como representar en un TMSDBplanner las reservas de habitaciones.

En el hilo antes mencionado Egostar demuestra conocimiento en dicho componente por lo que acudo a su llamado.

De los ejemplos actuales de tms http://www.tmssoftware.com/site/planner.asp#samples

El demo Nº 26 aparenta ser lo que se requiere, Pero no logro comprender como proceder en el llenado del tplanner.

los datos a representar están contenidos en una tabla, como bien Delphius menciona en el hilo arriba mencionado
Cita:
Delphius Dijo: Yo lo veo así: Mantener en una tabla, tal vez llamada reservas. Otra tabla habitación. Entre ellas veo una relación 1-M: una habitación tiene muchas reservas.
Bueno, en la tabla reserva tendría un campo FechaReserva, FechaEntrada y un campo CantidadNoches.
Este último campo es un entero... y lo que guardará es la cantidad de noches que estará reservada.
A esa misma tabla le agregaría dos campos
Código Delphi [-]
 IDcliente: integer; habitación: integer;

Entonces en el Tplanner deberiamos tenes como columnas los días de cada mes y como filas los Nº de habitación.
Y proceder a rellenar con los datos de la tabla reservas, que contienen Nº de habitación, fechaentrada + cantidadnoches(duracion del período a representar) y Nº de cliente.

Creo que la forma de usar el tmsplanner seria por periodos, entonces, estariamos mostrando en pantalla unos diria yo 35-40 días no más de eso por comodidad al visualizar. Yo diría 5 dias antes de una fecha X y de allí 31 días adelante.

Intento realizar esto con el componente TDBPlanner1 y DBperiodsource1 asociado al anterior.

El problema es ver como pasar los datos del datasource a estos anteriores, por lo visto tienen propiedades para asignar los campos pero no doy en la tecla. Y en el ejemplo que mencionaba antes lo hace vía código pero tampoco logro que funcione.

Alguna idea?
Responder Con Cita
  #2  
Antiguo 14-03-2014
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Caramba!!! como pasa el tiempo, no recuerdo como funcionan los TMS, no se dio el proyecto y terminé por abandonar la parte de reservaciones.

Lo que si recuerdo es que los TMS se relacionan directamente con una tabla con características específicas, recuerdo que requieren de un campo de fecha y hora, pero necesito darle un vistazo al código, veré si aún lo conservo en alguno de mis respaldos.

Saludos
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #3  
Antiguo 14-03-2014
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 20
amadis Va por buen camino
Será un buen aporte si encuentras algo.

Ese componente parece muy muy completo y potente. Vieno los ejemplos en funcionamiento son alucinantes.

Pero el tema es hacerlo funcionar. ya que manejan muchas propiedades.

Saludos
Responder Con Cita
  #4  
Antiguo 14-03-2014
el-mono el-mono is offline
Miembro
 
Registrado: abr 2008
Ubicación: Lules
Posts: 176
Poder: 17
el-mono Va por buen camino
Hola Amadis.

Yo particularmente uso estos componentes para mi aplicación, la utilizo específicamente para dar los turnos a los pacientes.

http://www.proyectoanamnesis.com.ar/...rsion-283.html


Que es lo que necesitas, si tenes una pregunta puntual así te contesto porque ando con poquito tiempo últimamente.
Responder Con Cita
  #5  
Antiguo 14-03-2014
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 20
amadis Va por buen camino
Será algo similar a lo que hiciste en los turnos.

Como columnas tengo los dias y como filas los nº de habitacion

entonces, en el mismo dia puedo tener varias habitaciones (filas ocupadas). Fijate en el post original que describo las tablas y lo que retendo lograr.
El problema es como tomar los datos de la tabla y visualizarlos en el Tdbplanner.
Responder Con Cita
  #6  
Antiguo 14-03-2014
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Estimado amadis:

Yo también utilizo los TMSDbPlanner para asignar horas a pacientes. Los compré hace más de 3 años y aún me da problemas.
Estos componentes están pensados para relacionar días con horas, ya que los campos requeridos en la tabla (StartTime y EndTime) para visualizar en el planner son de tipo date/time.
La conexión del DbPlanner debes realizarla con el componente TDBxxxSource que elijas y este último con el DataSource conectado a tu tabla, debiendo especificar en este componente, en el inspector de objetos, las propiedades StartTimeField, EndTimeField, KeyField, NotesField y eventualmente ResourceField de tu tabla.
Tienen el inconveniente que cuando crece mucho la Tabla de la BD a la que se encuentran conectados, los procesos con el Planner se hacen muy lentos, para lo cual es mejor cargar el planner con Querys especificos o utilizando filtros.
Ojalá esto te sirva de algo.
Deberás armarte de paciencia con este componente, ya que no es fácil de utilizar y configurar.

Salu2
Responder Con Cita
  #7  
Antiguo 15-03-2014
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Estimado amadis:

Coloco este mensaje aquí en el foro, por si a alguien más que use TMSDBPlanner pudiera servirle.
Revisé el demo 26 y si activas las propiedades AutoCreateOnSelect y AutoEditOnAutoInsert en ItemSelection puedes ingresar nuevos Items y editarlos.
Para eliminar los Items creados, click en el Item y tecla suprimir.
Ojalá te sirva

Salu2
Responder Con Cita
  #8  
Antiguo 15-03-2014
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 20
amadis Va por buen camino
Lightbulb Poner en funcionamiento el TDBplanner

Amigos, he logrado el resultado que buscaba.

Aquí una muestra de como queda.

Los componentes utilizador fueron además de lo visible a simple vista.

TDbplanner y DBPeriodSource. Conectado a un query que se actualiza desde el ComboBox (TplannerDBDatepicker) que esta abajo a la izquierda,

Dando parámetros mediante propiedades:

El dbperiodSource lo vinculé a la query reservas mediante las propiedades:

Datasource -> a un query o tabla.
Keyfield y resourcefield -> al ID de la tabla reservas
StartimeField -> campo con fecha de llegada
EndtimeField -> campo (calculado) entrada + estadía = fecha de salida
SubjectField y NotesField -> campos de tipo texto, pueden variar el orden segun quieran. En uno puse un calculado del Nombre del cliente y en el otro Observaciones.

Formateando el TDBPlanner

Display -> modifica propiedades de visualización del encabezado que tiene las fechas.
Sidebar -> modifican propiedades del encabezado que tiene las fechas.
Sidebar -> RotateOnTop: da vuelta el nombre de los dias para cuando la SideBar es ubicada arriba como en este caso.
Header -> propiedades de titulos de la barra encabezados de la izquierda (Nº habit).

Eso es todo lo básico a nivel de Diseño.

En cuanto a código luego de cada cambio en la tabla/query hay que refescar(rellenar el Planner)

Para eso en los eventos onchange lo hacemos con este procedimiento (tomado del Demo Nº 26 del componente)

Código Delphi [-]
procedure llenarplanner();
Var
  PlannerPosition : Integer;
begin
  DBPeriodSource1.Active := false;


  DBPeriodSource1.StartDate := cbfecha.date - 5;
  DBPeriodSource1.EndDate := cbfecha.date + 31;

  Qr.first;

  PlannerPosition := 0;
  While NOT Qr.Eof Do      // con esto pone titulo en headers (barra de la izquierda)
  Begin
    With DBPeriodSource1.ResourceMap.Add Do
    Begin
       ResourceIndex :=   qrcodigo.value; //campo clave de reservas
       PositionIndex :=   qrIDhabit.Value-1;// aqui -1 porque el ID de habitacion inicia en 1 y el header inicia en 0
       DisplayName :=  qrhabit.Value; // calculado con nombre de habitacion
    End;
    Qr.Next;
  End;

  DBPeriodSource1.NumberOfResources := Qr.RecordCount-1; // ajuste de indices

  DBPeriodSource1.Active := true;

end;

Todo esto es lo básico para hacer funcionar el componente. Se agradece a todos los que participaron de este hilo y al moderador del foro.
Y cualquier aporte que puedan hacer será util para la posteridad

Me tomé el trabajo de explicar como poner en marcha este componente porque es muy bueno y si bien trae documentación,en el manual y ejemplos se ve complicado ya que no mencionan mucho sobre como asignar las propiedades en tiempo de diseño.
Y una vez que se tenga una guía ya es más simple.

Esto fue aplicado para visualizar reservas de habitaciones.A lo largo de un período de tiempo X distribuido en distintas habitaciones.
Los amigos Radenf y el-Mono Por lo que comentan lo han utilizado para visualizar un Dia con todos los horarios para asignar turnos.

Por lo que en los casos de ellos las propiedades asignadas deben ser otras, y en lugar de usar el TDBPeriodSource seguramente usaron TDBDaySource

Última edición por marcoszorrilla fecha: 18-03-2014 a las 19:36:45.
Responder Con Cita
  #9  
Antiguo 15-03-2014
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Te felicito amadis por haber logrado finalmente tu objetivo.
Aprendí un montón de cosas con este hilo, que seguramente me serán de utilidad en algún proyecto.
La gran ventaja (o desventaja, según cómo se mire) de usar el componente TMSDBPlanner es que justamente posee cientos de opciones de configuración y múltiples efectos visuales que pueden personalizarse.

Salu2 y gracias
Responder Con Cita
  #10  
Antiguo 17-03-2014
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Estimado amadis:

Si quieres perfeccionar tu código encontré el que permite insertar nuevos ítems asociado a la acción que tú elijas.
El código que adjunto te permite realizar la inserción de una nueva reserva al hacer doble click en el ítem seleccionado.
Debes poner en False la propiedad AutoCreateOnSelect.

Código Delphi [-]
procedure TForm1.DBPlanner1PlannerDblClick(Sender: TObject; Position, FromSel,
FromSelPrecise, ToSel, ToSelPrecise: Integer);
begin
with DBPlanner1.CreateItemAtSelection do
DBPlanner1.Items.DBItem.Update;
end;

Ojalá te sirva
Salu2
Responder Con Cita
  #11  
Antiguo 17-03-2014
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 20
amadis Va por buen camino
Justo hoy temprano estaba trabajando en eso.

Lo primero queme interesaba era modificar una reserva lo que hago con esto

Código Delphi [-]
procedure TFHabitDisp.DBPlanner1ItemDblClick(Sender: TObject;
  Item: TPlannerItem);
begin
if messagedlg('¿Modificar reserva?',Mtconfirmation, [mbyes,mbno],0) =mryes
  then
    begin
       datos.tReservas.Locate('codigo',dbplanner1.Items.Selected.DBKey, []);
       FPrincipal.ModificarReserva.Execute;// action manager
    end;
Llenarplanner;

end;

Recién probé tu código pero cre crea un conflicto con el que cité antes para modificar.
Ya que al crear un nuevo item desde el planner el ITEM no tiene ningún DBKEY.

Lo que me serviría y todavía n oencontré la forma es que al hacer doble click en un casillero del planner vacío, OBTENER LA FECHA de ese casillero,
entonces luego lanzo la acción de agregar una reserva a la tabla y luego del post refresco el planner.
Responder Con Cita
  #12  
Antiguo 17-03-2014
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
El código que coloqué crea automáticamente el KeyField de la Tabla. Debe estar en false la propiedad AutoIncKey del DBPeriodSource.
Para modificar las reservas lo más simple es arrastrar el margen del item asignado, en estado de edición, hasta el día que se requiera, pudiendo incrementar o disminuir los días de reserva, ya que esa es una de las gracias del TDBPlanner.
Yo los cambios los he asignado al PopUpMenu, donde tengo las opciones de eliminar una reserva, asignarla con cambio de color o definirla con otro color, con los siguientes códigos:

Para marcarla como asignada:

Código Delphi [-]
procedure TForm1.Asignada1Click(Sender: TObject);
begin
dbplanner1.PopupPlannerItem.Color := clWhite;
dbplanner1.PopupPlannerItem.Update;
FillPlanner;
end;

Para marcarla com reservada:

Código Delphi [-]
procedure TForm1.Reservada1Click(Sender: TObject);
begin
dbplanner1.PopupPlannerItem.Color := $00C6FFC6;
dbplanner1.PopupPlannerItem.Update;
FillPlanner;
end;

Para eliminarla:

Código Delphi [-]
procedure Pulsar(Key: Byte);
begin
keybd_event(Key, 0, 0, 0);
keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
end;

Código Delphi [-]
procedure TForm1.Eliminar1Click(Sender: TObject);
begin
Pulsar(VK_DELETE);
end;

Ojalá te sirva. Yo me he entretenido bastante con esto ya que lo hago por hobby.
Salu2
Responder Con Cita
  #13  
Antiguo 17-03-2014
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 20
amadis Va por buen camino
Bueno en mi caso tuve que poner en TRUE la propiedad AutoIncKey del DBPeriodSource para que me funcionen los pasos siguientes

Para agregar una nueva reserva, lo hago con doble click en el casillero de inicio, luego uso el codigo que sugeriste para el dobleclick

Código Delphi [-]
procedure TForm1.DBPlanner1PlannerDblClick(Sender: TObject; Position, FromSel,
FromSelPrecise, ToSel, ToSelPrecise: Integer);
begin
with DBPlanner1.CreateItemAtSelection do
DBPlanner1.Items.DBItem.Update;

// luego de que el planner me cree el nuevo registro,

  datos.tReservas.Locate('codigo',dbplanner1.Items.Selected.DBKey, []);// lo ubico
  FPrincipal.ModificarReserva.Execute; /// y aqui lo pongo en edit y muestro un form de edicion para indicar cliente y otros datos
 Llenarplanner; //fillplanner
end;

En un popup, tambien tengo las opciones de agregar , modificar y eliminar.

En cuando a extender fechas desde el planner lo tengo desactivado y como solo lectura para evitar errores (cambios sin darse cuenta);

Lo que me estaría faltando lograr al llenar al planner es lo siguiente:
Tener en pantalla todos los Nº de habitaciones inclusive las vacías. Porque por ej si ven en la imagen que pude en uno de los post anteriores, tengo en pantalla H1 y H2 que son las únicas habitaciones que tienen reservas. Pero falta el resto de las habitaciones que no poseen reserva en ese período.

Creco que al momento de llenar el planner habría que recorrer la tabla habitaciones rellenando el titulo de las filas con cada Nº / nombre de habitación existente.
Responder Con Cita
  #14  
Antiguo 17-03-2014
el-mono el-mono is offline
Miembro
 
Registrado: abr 2008
Ubicación: Lules
Posts: 176
Poder: 17
el-mono Va por buen camino
Amadis como va.

Mira para el caso que planteas el componente tiene una propiedad que se llama Resource... que vendria a ser como el numero de columna si cuando creas un item y logras identificar sobre que Recurso/ Nro de columna lo hicieron luego el planner solo lo levanta y asigna a quien corresponda.
Responder Con Cita
  #15  
Antiguo 17-03-2014
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Las habitaciones disponibles las puedes obtener como señala el-mono o bien incluyéndolas en la tabla MeetingRooms del Demo 26 o cómo se llame en tu programa.
En el demo 26 este es la porción de código del FillPlanner que realiza esa acción:

Código Delphi [-]
While NOT ADOTable2.Eof Do
Begin
With DBPeriodSource1.ResourceMap.Add Do
Begin
ResourceIndex := ADOTable2.FieldByName('ID').AsInteger;
PositionIndex := PlannerPosition;
DisplayName := ADOTable2.FieldByName('Name').AsString;
inc(PlannerPosition);
End;
ADOTable2.Next;
End;
ADOTable2.Close;
DBPeriodSource1.NumberOfResources := PlannerPosition;
DBPeriodSource1.Active := true;
ADOTable1.Active := true;
end;

Por lo que has señalado veo que estás usando el DBPlanner sólo para mostrar información, cuando la idea es que permita múltiples funciones en tiempo de ejecución, que faciliten los procesos que requiera el usuario (Ingresar, eliminar, modificar, cambiar estados, repetir y un largo etc.)

Salu2

Última edición por radenf fecha: 17-03-2014 a las 17:59:45.
Responder Con Cita
  #16  
Antiguo 17-03-2014
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 20
amadis Va por buen camino
Gracias Radenf, había mal interpretado el proceso llenado.

Si revisas mas arriba, mi error era que estaba llenando el RESOURCE desde la misma tabla de RESERVAS, por eso tenía solamente las habitaciones con reservas.
Responder Con Cita
  #17  
Antiguo 17-03-2014
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Cualquier cosa en la que pueda ayudarte me sentiré encantado, porque yo he aprendido quizás más que tú.
Salu2
Responder Con Cita
  #18  
Antiguo 22-03-2014
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 20
amadis Va por buen camino
Amigos, alguien ha cambiado el color de un item en el momento de llenado del planner?

Sería usando las propiedades que compartió el amigo Radenf para marcar los items.

Código Delphi [-]
dbplanner1.PopupPlannerItem.Color := $00C6FFC6;
dbplanner1.PopupPlannerItem.Update;

la cuestión es en el procedimiento de LLENADO (fillplanner) interceptar por ej una variable numerica ESTADO,
y aplicar un case para que pinte de color distinto cada estado (si esta reservado, pendiente, ocupado, etc).

Última edición por amadis fecha: 22-03-2014 a las 15:21:47.
Responder Con Cita
  #19  
Antiguo 22-03-2014
Avatar de radenf
radenf radenf is offline
Miembro
 
Registrado: oct 2007
Ubicación: Viña del Mar,Chile
Posts: 608
Poder: 17
radenf Va por buen camino
Exactamente amadis, con ese código le asignas el color a los ítems seleccionados y su valor es guardado en la Tabla de la BD, en el campo Color.
El código, como te había señalado, está asignado a las diferentes acciones del PopUpMenu (Asignada, Reservada, Bloqueada, etc.).
Aquí tienes un ejemplo:



Salu2

Última edición por radenf fecha: 22-03-2014 a las 16:22:25.
Responder Con Cita
  #20  
Antiguo 22-03-2014
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 20
amadis Va por buen camino
Redenf

¿y de esa forma se rellena solo del color que corresponde?

Como seria un ejemplo de codigo.

Yo con los dbgrids, en tiempo de diseño comprobaba el valor de un campo y si el valor es X pintaba de un color, si es otro, de otro.

Me cuesta salir de las viejas estructuras.

El codigo que mencionabas lo he usado para marcar pero NO TENGO CAMPO COLOR, en que tabla iria?.

Por eso pensaba de la forma que explicaba en los post anteriores y en este. Revisar que estado tiene la reserva en momento de llenar el planner y ahi pintar de color que sea
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
tsm Planner ayuda omarson Varios 2 28-04-2012 00:10:00
Componente PLANNER Jose Manuel Varios 0 24-09-2008 17:39:52
Reserva de memoria... andresenlared Varios 5 05-02-2008 22:13:36
reserva memoria c++ halizia C++ Builder 1 25-04-2006 18:09:52
Sacar habitaciones libres por dia - Problema consulta SQL- VRO Firebird e Interbase 0 01-09-2005 11:12:22


La franja horaria es GMT +2. Ahora son las 18:32:45.


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