** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Cargo de precio según fechas
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Cargo de precio según fechas

 Responder Responder
Autor
Mensaje
Parche Ver desplegable
Habitual
Habitual


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 91
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Parche Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Cargo de precio según fechas
    Enviado: 08/Abril/2019 a las 12:38
Hola,

Imaginamos cuatro habitaciones, con entrada 1/4/19 y salida 5/4/19. Ahora un botón de comando que carga el día al hacer click en todas las habs.

Si ningún cliente paga, al presionar el botón se carga el día 1/4 en todas las habs. (si estamos en el primer día actual).

Hasta ahí está hecho pues mediante recordsets y tipo de habs./personas/régimen se carga bien.

Ahora un cliente paga dos noches y otro la primera noche. Al hacer click para el cargo diario sólo debería cargar las dos habs. que quedan.

Ahí estoy atascado.

Creo que debe haber un dato si/no en la tbReservas que se marque según si el día que se quiera esté cargado previamente o no.

En un form de Reservas, tengo la opción de cargo directo con: FechaEntrada y FechaSalida y botón de cargar. He pensado que ahí debe estar el asunto pero no se como conseguir esto.

Si hago un cargo en ese form según el ejemplo anterior: E/1-4 S/3-4 (2 noches) los días 1 y 2 deben estar según no se que procedimiento dehabilitados con un boolean para cuando recorra el cargo diario automático lo salte y no cargue el día, pero que esté habilitado para cuando llegue el día 3 y 4 (dos noches si el cte. no paga) que sí se cargue automático (al hacer click en el botón diario).

Gracias y saludos. Espero haberme explicado bien.


Editado por Parche - 08/Abril/2019 a las 12:39
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: en línea
Puntos: 5066
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita mounir Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 08/Abril/2019 a las 14:33
Hola!

Para poder ayudar se necesita saber como tines diseñada la aplicación.
Un Saludo.
Arriba
Parche Ver desplegable
Habitual
Habitual


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 91
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Parche Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 09/Abril/2019 a las 13:14
Hola,

Bueno es muy extenso el código y no quiero de momento molestar.

La idea ya está dicha. Sigo haciendo pruebas.

Si quereis cerrar el hilo bien si no lo tengo en cuenta para decir si lo he solucionado.

Gracias y saludos.
Arriba
Parche Ver desplegable
Habitual
Habitual


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 91
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Parche Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 10/Abril/2019 a las 13:04
Hola de nuevo:

Estoy haciendo pruebas y no paso de aquí:

En tbDetReservas he agregado tres campos: Desde (fecha inicio carga precio)-Hasta(fecha fin carga precio)-fHoy(fecha de ayer: date-1).

En un evento Cargar en frmDetReservas, cargo las fechas y las añaden bien en un subformulario de este form a una consulta (ConDetReservas) donde tb. están añadidos los tres campos nuevos.

Si hago cargo manual de una fecha o pongo otro concepto (bar, restaurante, etc.) no completa los cargos, pq. sólo quiero que la consulta refleje el cargo manual en el evento click del botón Cargar (entre fechas dicho antes).

Utilizo un dFirst y dLast para conseguir la última fecha mayor de carga incial y final (pq. puedo haber cargado con el evento Grabar varios días anteriores).

Tras esto:

Function CompruebaDisponibilidad2() As Boolean

On Error Resume Next

Dim iUltimo

Dim iPrimero

Dim Rst As DAO.Recordset

    Set Srec = CurrentDb.OpenRecordset("select * from tbDetReservas")

    With Srec

     iUltimo = DLast("hasta", "tbDetReservas", "desde<>null")

     iPrimero = DFirst("desde", "tbDetReservas", "desde<>null")       

   '----------------------------------------------------------------

Set Rst = CurrentDb.OpenRecordset("SELECT * FROM ConDetReservas WHERE IdOcupacion <> " & !IdOcupacion & " AND Habitacion = '" & !Habitacion & "'" & _

" AND ((fhoy BETWEEN #" & Format(!desde, "mm/dd/yyyy") & "# AND #" & _

Format(DateAdd("d", -1, !hasta), "mm/dd/yyyy") & "#) OR (DateAdd('d', -1, hasta) BETWEEN #" & Format(!desde, "mm/dd/yyyy") & _

"# AND #" & Format(DateAdd("d", -1, !hasta), "mm/dd/yyyy") & "#)Or fhoy < #" & Format(DateAdd("d", -1, !hasta), "mm/dd/yyyy") & _

"# AND (DateAdd('d', -1, Hasta) > #" & Format(!desde, "mm/dd/yyyy") & "#))")


If Not Rst.EOF And Not Rst.BOF Then

MostrarMensaje ("Cargo duplicado: " & !Habitacion & Chr(13) & Chr(13) & _

    CompruebaDisponibilidad2 = False

Else

    CompruebaDisponibilidad2 = True

End If

Rst.Close

Set Rst = Nothing

End With

End Function
   '----------------------------------------------------------------

... El caso que siempre me sale: CompruebaDisponibilidad2 = False. Y eso no puede ser.

Desde      Hasta       fHoy
-----       ------     -------
01/04/19  03/04/19  02/04/19 -> CompruebaDisponibilidad2 = False

... pero ....


Desde      Hasta       fHoy
-----       ------     -------
01/04/19  03/04/19  03/04/19 -> CompruebaDisponibilidad2 = False: También sale False!!! o poniendo Hasta: 02/04/19 igual False.


Gracias por vuestro tiempo y saludos.



Arriba
Parche Ver desplegable
Habitual
Habitual


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 91
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Parche Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Abril/2019 a las 23:11

Nada, sigo atascado.

He hecho muchas pruebas y nada.

TODOS LOS DATOS HAN SIDO MODIFICADOS.

Creo que la cuestión está en que ConDetReservas contiene varios IdDetReservas que son los días previamente cargados desde el botón Cargar del frmDetReservas.

Esos IdDetReservas si han sido cargados con el botón Cargar crea la fecha Desde (inicial) y Hasta (Final). Si anoto un cargo manual (bar, Rte, etc. Incluso otro cargo) en el FrmDetReservas no se crean esas fechas Desde-Hasta (sí los cargos en la consulta ConDetReservas) pq. Quiero que al comparar fechas (entre éstas) sólo tenga en cuenta si las he creado desde el botón Cargar (pq. El Cargo Automático Diario –CAD- sólo tiene en cuenta esos rangos y es más, cuando creo cargos desde ese botón Cargar todos se cambian con esas últimas fechas para que el CAD sólo permita búsqueda entre esas fechas).

Enlace a parte de las tablas y consulta implicada: https://www.dropbox.com/s/qcypuoycbr6919v/Entre%20Fechas.rar?dl=0

Enlace al frmDetReservas:

https://www.dropbox.com/s/987zvbyec1wpozx/FrmDetReservas.jpg?dl=0

 (Hay varias variables que son Globales

 

Botón Cargar:

 

Private Sub cmdCargo_Click()

On Error GoTo Err_cmdCargo_Click

 

Call CargoFiltrodias 'aqui -> carga los días entre fechas:FDesde – Fhasta

 

Me.FDesde = Null

Me.FHasta = Null

Me.cmdCerrar.SetFocus

Exit_cmdCargo_Click:

    Exit Sub

Err_cmdCargo_Click:

    MsgBox Err.Description

    Resume Exit_cmdCargo_Click

End Sub

‘---------------------------------------------------------------------------

 

CargoFiltrodias:

 

Public Sub CargoFiltrodias()

On Error Resume Next

'Cargo de todos los días.

    Dim PedidoReq As Integer, contador As Integer

    Dim Rst As DAO.Recordset, db As DAO.Database

    Dim Departamento As Variant

    Dim SecuenciaTrans As Integer, DifDias As Integer, IntDias As Integer

    Dim sCargo As Boolean

    'Si no hay datos en las fechas

If IsNull(Me.FDesde) Or IsNull(Me.FHasta) Then

MostrarMensaje ("Es necesario una fecha DESDE y HASTA")

Me.FDesde = Null

Me.FHasta = Null

Me.cmdCargo.SetFocus

Exit Sub

Else

'---------------------------------------------------------

    Set db = CurrentDb()

    Set Rst = db.OpenRecordset("ConDetReservas")

DifDias = DateDiff("d", [FDesde], [FHasta])

 

     sCargo = Confirmación("Días para cargar: " & DifDias & Chr(13) & Chr(13) & _

        "¿Quieres continuar?")

        If sCargo Then

    For SecuenciaTrans = 1 To DifDias

       With Rst

        .AddNew

        !IdOcupacion = Me.IdOcupacion

        !desde = Me.FDesde

       !hasta = Me.FHasta

       

                'Convierte las fechas desde y hasta en último cargo de fechas

              '--------------------------------------------------

        Set sFra = CurrentDb.OpenRecordset("select * from ConDetReservas where idocupacion=" & Me.IdOcupacion)

            Do Until sFra.EOF

            'sFra.MoveLast

            sFra.Edit

           ' If !IdDetReservas > 0 Then

            sFra!desde = !desde 'Me.FDesde

            sFra!hasta = !hasta 'Me.FHasta

            '!fHoy = Date - 1

            sFra.Update

            sFra.MoveNext

            'End If

            Loop

        sFra.Close: Set sFra = Nothing

          '--------------------------------------------------

        '!fHoy = Date - 1

        !IdServ = 1

        '--------------------------------------------------

CARGA DE PRECIOS, ETC. QUE ESTÁ BIEN Y ES MUY EXTENSO       

        '--------------------------------------------------

        Set sExiste = CurrentDb.OpenRecordset("select * from tbservicios")

        If sExiste.EOF = False Then 'si hay registros

        'Como el IVA es el mismo...

        !IVA = sExiste!IVA

        !IVAinc = False

        !Cantidad = 1

        !FechaCargo = DateAdd("d", SecuenciaTrans, [FDesde] - 1)

       

        sExiste.Close: Set sExiste = Nothing

        End If

    '--------------------------------------------

    Dim sValor As String

 

    sValor = Nz(DMax("iddetreservas", "tbdetreservas"), 0) + 1

        If sValor = 1 Then

        sValor = !IdDetReservas

        DoCmd.RunCommand acCmdSaveRecord 'Grabamos el registro

        End If

   !IdDet = sValor

  'End If

    '---------------------------------------------

        .Update

        End With

       

    Next SecuenciaTrans

            Else 'scargo

           

            Me.FDesde = Null

            Me.FHasta = Null

            'Me.cmdCargo.SetFocus

            Me.FDesde.SetFocus

                Rst.Close

                Set db = Nothing

                Set Rst = Nothing

        Exit Sub

        End If 'scargo

       

    End If 'campos con fechas

    Rst.Close

    Set db = Nothing

    Set Rst = Nothing

 

    Me.SubfrmDetReservas.Requery

End Sub

‘---------------------------------------------------------------------------------------

Después de cargar las fechas en otro formulario digamos general, está en botón CAD:

 

Private Sub cmdCargoAutormaticoDiario_Click()

On Error Resume Next

 

Dim CargoDiario As Boolean

Dim sFechaOcupada As String

Dim Rst As DAO.Recordset

Dim bCargo As Boolean

CargoDiario = Confirmación("¿Quieres cargar el día : " & Date - 1 & " a las habitaciones?")

 

If CargoDiario Then

Set sExiste = CurrentDb.OpenRecordset("select * from tbReservas where alta=true")

 

If sExiste.EOF = False Then 'si hay registros

 

   Do Until sExiste.EOF

 

   'Si es AF.3000 que salte al siguiente

    If sExiste!Habitacion = 3000 Then

    'Exit Sub

    sExiste.MoveNext

    End If

  

   'Si la fecha de salida es igual a hoy salta al siguiente

   If sExiste!FechaSalida = Date - 1 Then

   sExiste.MoveNext

   'Exit Sub

   End If

 

      MsgBox "Id: " & sExiste!IdOcupacion

     

      IdOcupa = sExiste!IdOcupacion

             '------------------------------------------------------------------

   

          'Antes de insertar un nuevo registro comprobamos que esté libre la habitación en esos dias

          'En caso contrario abortamos

            If CompruebaDisponibilidad2 = False Then

            MsgBox "Está cargado."

            'Exit Sub

            Else

            MsgBox "No cargado."

            End If

    '------------------------------------------------------------------

    '----------------------------------------------------------------

    Set Srec = CurrentDb.OpenRecordset("select * from ConDetReservas")

    With Srec

 

    'If .EOF = true Then 'si no hay registros - hayan o no hay que anotar los nuevos

    .AddNew

    '!idDetReservas - autonumérico

    !IdOcupacion = sExiste!IdOcupacion

    !Habitacion = sExiste!Habitacion

    !Regimen = sExiste!Regimen

    !NumPersonas = sExiste!NumPersonas

   

        !FechaEntrada = sExiste!FechaEntrada

    !FechaSalida = sExiste!FechaSalida

    !FechaCargo = Date - 1

    '------------------------------------------------------------------

        'Globales

    Hab = !Habitacion

    'IdOcupa = !IdOcupacion

    FDesde = !desde

    FHasta = !hasta

    FCargo = !FechaCargo

        '--------------------------------------------------

CARGA DE PRECIOS, ETC. QUE ESTÁ BIEN Y ES MUY EXTENSO       

        '--------------------------------------------------

    '!PrecioVta = sExiste!PrecioFijado

    !Cantidad = 1

    !IVAinc = False

            '--------------------------------------------------

        Set sSelecc = CurrentDb.OpenRecordset("select * from tbservicios")

        If sSelecc.EOF = False Then 'si hay registros

        'Como el IVA es el mismo para todos...

        !IVA = sSelecc!IVA

        End If

        sSelecc.Close: Set sSelecc = Nothing

    '--------------------------------------------

   ' !FechaCargo = Date - 1

    !IdCte = sExiste!IdCte

    '!Cliente = sExiste!Nombre & " " & sExiste!Apellido1 & " " & sExiste!Apellido2

    '''!FechaEntrada = sExiste!FechaEntrada

    '''!FechaSalida = sExiste!FechaSalida

   ' !PrecioServ = sExiste!PrecioFijado

    !CIF = sExiste!CIF

    !Tipo = sExiste!Tipo

    !IdDet = !IdDetReservas

    .Update

   

    'End If 'Srec

    End With

    Srec.Close: Set Srec = Nothing

    '----------------------------------------------------------------

   sExiste.MoveNext

   Loop

 

End If

sExiste.Close: Set sExiste = Nothing

 

MostrarMensaje ("Cargos diarios completados.")

Else 'CargoDiario

'MostrarMensaje ("Cargos diarios anulados.")

End If

 

End Sub

 

‘------------------------------------------------------------------------------

… Antes de agregar comprueba con: CompruebaDisponibilidad2 que no hayan duplicados:

 

Function CompruebaDisponibilidad2() As Boolean

Dim Rst As DAO.Recordset

    Set Srec = CurrentDb.OpenRecordset("select * from tbDetReservas where idocupacion = " & IdOcupa)

    With Srec

   '----------------------------------------------------------------

Set Rst = CurrentDb.OpenRecordset("SELECT * FROM ConDetReservas WHERE IdOcupacion <> " & !IdOcupacion & " AND Habitacion = '" & !Habitacion & "'" & _

" AND ((fhoy BETWEEN #" & Format(!desde, "mm/dd/yyyy") & "# AND #" & _

Format(DateAdd("d", -1, !hasta), "mm/dd/yyyy") & "#) OR (DateAdd('d', -1, hasta) BETWEEN #" & Format(!desde, "mm/dd/yyyy") & _

"# AND #" & Format(DateAdd("d", -1, !hasta), "mm/dd/yyyy") & "#)Or fhoy < #" & Format(DateAdd("d", -1, !hasta), "mm/dd/yyyy") & _

"# AND (DateAdd('d', -1, Hasta) > #" & Format(!desde, "mm/dd/yyyy") & "#))")

If Not Rst.EOF And Not Rst.BOF Then

MostrarMensaje ("Cargo duplicado: " & !Habitacion & Chr(13) & Chr(13) & _

    CompruebaDisponibilidad2 = False

Else

    CompruebaDisponibilidad2 = True

End If

Rst.Close

Set Rst = Nothing

End With

End Function

   '----------------------------------------------------------------

En el ejemplo: La consulta ConDetReservas  CompruebaDisponibilidad2 dice que está cargado (cuando debe ser true – no cargado – pues fhoy es igual a: 11/04/19 y entre Desde-Hasta (8 y 9/4) no está el 11/4.

 

Arriba
Parche Ver desplegable
Habitual
Habitual


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 91
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Parche Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 21/Abril/2019 a las 12:38
Hola,

Mi gozo en un pozo... sigo atascado aquí:

.....

Set sExiste = CurrentDb.OpenRecordset("select * from tbReservas where fechaentrada <  #" & Format(CDate(sfecha), "mm/dd/yy") & "# and alta=true")

If sExiste.EOF = False Then

   Do Until sExiste.EOF

             '------------------------------------------------------------------
  
    Set sSelecc = CurrentDb.OpenRecordset("select * from TbCargosAutoma where hab = '" & sExiste!Habitacion & "'")

    If sSelecc.EOF = False Then
   
    If sSelecc!Hab = sExiste!Habitacion Then


Dim rst1 As DAO.Recordset
Set rst1 = CurrentDb.OpenRecordset("select * from TbCargosAutoma where Hab= '" & sExiste!Habitacion & "'" & _
" AND fhoy Between #" & Format(sSelecc!Desde, "mm/dd/yyyy") & "# And #" & _
Format(DateAdd("d", -1, sSelecc!Hasta), "mm/dd/yyyy") & "#)")

If Not rst1.EOF And Not rst1.BOF Then
MsgBox "No hay datos"
Else
MsgBox "hay datos"
End If
rst1.Close: Set rst1 = Nothing
....

Donde TbCargosAutoma tiene cuatro campos: Hab,Desde,Hasta y fHoy que se nutre de un frmDetReservas que carga bien los cuatro campos.

Siempre me sale que no hay datos, cuando mediante el Until recorre habitaciones donde fhoy está entre Desde y Hasta y debería decir que hay datos.

Gracias y saludos.


Editado por Parche - 22/Abril/2019 a las 18:46
Arriba
Parche Ver desplegable
Habitual
Habitual


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 91
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Parche Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 2 horas 47 minutos a las 20:13
Hola,

Gracias a todos por vuestro interès.

Ahora se puede cerrar el hilo.


Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 4906
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita emiliove Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 2 horas 11 minutos a las 20:49
¿Y la solución fue?

Saludos.
Arriba
Parche Ver desplegable
Habitual
Habitual


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 91
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Parche Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 1 hora 57 minutos a las 21:03
Hola,

Fue satisfactoria. Gracias por todo vuestro apoyo, no podía haberlo logrado sin el.

Saludos.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable