ms-access: отчет, который отображает записи только в течение определенной даты - PullRequest
0 голосов

У меня очень простой отчет, который генерируется только из одной таблицы. один из столбцов в таблице является датой.

Мне нужно, чтобы пользователь отчета мог вводить диапазон дат и отображать данные только между этими датами.

как мне это сделать>?

Ответы [ 3 ]

4 голосов
/ 11 мая 2010

Мне не нравится жесткая привязка параметров или ссылок на формы в источниках записей форм / отчетов, поэтому я бы исправил идею @ Remou вместо этого установить RecordSource в событии OnOpen отчета. То есть сначала откройте форму, соберите значения выбранных дат, а затем вставьте их в предложение where в RecordSource отчета. Примерно так (скопировано из моего реального отчета):

  Dim strRecordSource As String

  DoCmd.OpenForm "dlgDateRange", , , , , acDialog, "ThisYear"
  If IsLoaded("dlgDateRange") Then
     With Forms!dlgDateRange
       If .Tag = "Cancel" Then
          Cancel = True
       Else
          Me.Filter = "[InvoiceDate] Between #" & !txtStart & "# AND #" & !txtEnd & "#"
          Me.FilterOn = True
          Me!lblDateRange.Caption = StrConv(Trim(("from " + varZLStoNull(Format(!txtStart, "mm/dd/yyyy"))) & (" to " + varZLStoNull(Format(!txtEnd, "mm/dd/yyyy")))), vbProperCase)
       End If
     End With
     DoCmd.Close acForm, "dlgDateRange"
  End If

Некоторые комментарии:

  • Диалоговая форма, вызываемая здесь, намного сложнее, чем вам нужно, поскольку она имеет набор предопределенных диапазонов дат, установленных на основе параметра OpenArgs диалоговой формы. Форма выглядит так:

альтернативный текст http://dfenton.com/DFA/examples/DateCriteriaForm.png

Я использую Код выбора даты Stephan Lebans , чтобы позволить пользователю выбирать дату из календаря.

Код для установки диапазонов дат таков, и все, что мне нужно сделать, это передать его в одном из случаев этого ВЫБОРА СЛУЧАЯ:

  Public Sub SetDates(strType As String, ctlStart As Control, ctlEnd As Control)
    Dim dteStart As Date
    Dim dteEnd As Date
    Dim ctl As Control

    Select Case strType
      Case "EndOnly" ' OK
        dteStart = #1/1/1980#
        ctlStart.Enabled = False
        dteEnd = Date
      Case "Trace" ' OK
        dteStart = DateAdd("d", -7, Date)
        dteEnd = DateAdd("d", 7, Date)
      Case "LastWeek" ' OK
        dteStart = Date - Weekday(Date, vbMonday) - 6
        dteEnd = dteStart + 6
      Case "ThisWeek" ' OK
        dteStart = Date - Weekday(Date, vbMonday) + 1
        dteEnd = dteStart + 6
      Case "LastMonth" ' OK
        dteStart = month(DateAdd("m", -1, Date)) & "/01/" & year(DateAdd("m", -1, Date))
        dteEnd = DateAdd("m", 1, dteStart) - 1
      Case "ThisMonth" ' OK
        dteStart = month(Date) & "/01/" & year(Date)
        dteEnd = DateAdd("m", 1, dteStart) - 1
      Case "LastQuarter" ' OK
        dteStart = DateSerial(year(DateAdd("q", -1, Date)), (3 * Format(DateAdd("q", -1, Date), "q")) - 2, 1)
        dteEnd = DateAdd("q", 1, dteStart) - 1
      Case "ThisQuarter" ' OK
        dteStart = DateSerial(year(Date), (3 * Format(Date, "q")) - 2, 1)
        dteEnd = DateAdd("q", 1, dteStart) - 1
      Case "LastYear" ' OK
        dteStart = "01/01/" & year(Date) - 1
        dteEnd = "12/31/" & year(Date) - 1
      Case "ThisYear" ' OK
        dteStart = "01/01/" & year(Date)
        dteEnd = "12/31/" & year(Date)
      Case "LastFY" ' OK
        dteStart = "09/01/" & year(DateAdd("m", 4, Date)) - 2
        dteEnd = DateAdd("yyyy", 1, dteStart) - 1
      Case "ThisFY" ' OK
        dteStart = "09/01/" & year(DateAdd("m", 4, Date)) - 1
        dteEnd = DateAdd("yyyy", 1, dteStart) - 1
      Case "Last3Years" ' OK
        dteStart = "01/01/" & year(Date) - 2
        dteEnd = Date
      Case "BeforeLast3Years" ' OK
        dteEnd = DateValue("01/01/" & year(Date) - 2) - 1
      Case Else
        dteStart = Date
        dteEnd = Date
    End Select
    If ctlStart.Enabled Then
       If dteStart = 0 Then
          ctlStart = Null
       Else
          ctlStart = Format(dteStart, "mm/dd/yyyy")
       End If
    End If
    If ctlEnd.Enabled Then
       If dteEnd = 0 Then
          ctlEnd = Null
       Else
          ctlEnd = Format(dteEnd, "mm/dd/yyyy")
       End If
    End If
    For Each ctl In ctlStart.Parent!optPresetDates.Controls
      If ctl.ControlType <> acLabel Then
         If Replace(ctl.Controls(0).Caption, " ", vbNullString) = strType Then
            ctlStart.Parent!optPresetDates = ctl.OptionValue
            Exit For
         End If
      End If
    Next ctl
    Set ctl = Nothing
  End Sub

Это на самом деле намного больше информации, чем вам нужно, но я хочу подчеркнуть, что вам следует рассмотреть возможность привязки источника данных вашего отчета к параметрам или диалоговой форме.

1 голос
/ 11 мая 2010

Что я хотел бы сделать, это создать запрос, который выбирает все строки в таблице и для поля даты я бы настроил пару параметров. Попробуйте следующее:

  1. Укажите поле даты, например, в дизайне запроса:

    Формат ([YourDateField], "ммм. Дд, гггг")

  2. А по критериям напишите:

    Между форматом ([От], «ммм. Гг, дддд») и Форматом ([До], «ммм. Дд. Гггг»)

Когда вы запускаете запрос, должны появиться два поля ввода с просьбой указать даты From и To в указанном формате.

1 голос
/ 11 мая 2010

Лучшим решением, вероятно, является создание небольшой формы, которая позволяет пользователю вводить даты. Запрос, на котором основан отчет, может затем обратиться к форме:

SELECT f1,f2,f3 FROM Table 
WHERE SomeDate 
BETWEEN Forms!DateSelect!StartDate AND Forms!DateSelect!EndDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...