2012-02-15 4 views
1

Возможно, кто-нибудь поможет мне с этим запросом Access, который я пытаюсь создать?Использование даты начала и окончания даты в запросе доступа

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

PROJECT Jan  Feb  Mar 
AAAAA  7  28  2 

... и т.д., где цифры являются днями проекта, рассчитанные на основе даты начала и дату окончания , Например, в приведенном выше запросе, проект AAAAA будет иметь дату начала 24/01/2012 и дату окончания 02/03/2012

Пожалуйста, может кто-то наставит меня о том, как достичь этого?

Большое спасибо!

+0

, когда у вас есть «Янв 7», как ваш проект может начинаться с '24/01/2012' ??? –

+0

'7' означает 7 дней в январе, с 24 января по 31 января (хотя я считаю это как 8 дней :). –

+0

@FahimParkar, потому что у проекта есть 7 дней усилий в январе, поскольку он начался 24-го ... – user1046016

ответ

0

Предлагает Вам посмотреть на кроссе-запросах: http://www.databasedev.co.uk/crosstab_queries.html

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

Ваши шаги что-то вроде:
1 таблица диапазонов дат в месяц
2 начальной и конечной даты высчитывает на проект в месяц

Select p.projectName, md.monthNumber, 
Case when p.startDate < md.startDate then md.startDate 
When p.startDate < md.endDate then p.startDate else p.endDate 
, case when p.endDate > md.endDate then md.endDate 
When p.endDate > md.startDate then p.endDate else md.startdate end 
From @projects p 
Inner join @monthDates md on p.startDate <= md.endDate and p.endDate > md.startDate 

В Access Я думаю, что IIF является эквивалентом ДЕЛУ?

Необходимо отрегулировать вышеизложенное в зависимости от того, как вы хотите считать первые/последние дни месяца (если проект заканчивается на 31-м, он рассчитывается в сторону jan или ему нужно продолжать 1-го февраля и т. Д.), Но его достаточно, чтобы вы начали.

Наконец, вы используете кросс-таблицу Access, чтобы преобразовать ее в требуемый формат, делая вычитание даты между датами начала и окончания проекта в месяц.

1

Я создал таблицу календаря, чтобы сделать это легче справиться. Я включил код для двух процедур, которые я использовал (CreateTable_calendar и LoadCalendar) ниже. Я добавил поле «work_day» в таблицу календаря, если вы хотите ограничить количество дней только рабочими днями вашей организации в каждом месяце. Если это так, вам нужно соответствующим образом скорректировать предложение WHERE. А также сбросьте значения work_day для каждой даты календаря, если мой выбор не соответствует вашим.

В любом случае, я оставлю эти детали для вас, чтобы разобраться. Без корректировки работы и нерабочих дней этот запрос возвращает набор результатов, который, я думаю, вы хотите.

TRANSFORM Count(sub.the_date) AS CountOfProjectDays 
SELECT sub.Project_name 
FROM 
    (
     SELECT 
      p.Project_name, 
      MonthName(Month(c.the_date),-1) AS month_name, 
      c.the_date 
     FROM Projects AS p, tblCalendar AS c 
     WHERE 
      c.the_date >= [p].[start_date] 
      And c.the_date <= [p].[end_date] 
     ORDER BY p.Project_name 
    ) AS sub 
GROUP BY sub.Project_name 
PIVOT sub.month_name 
    In ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", 
     "Aug", "Sep", "Oct", "Nov", "Dec"); 

Примечания:

  1. Я использовал список названий месяцев после PIVOT, чтобы заставить порядок столбцов. Без этого списка столбцы будут представлены в алфавитном порядке по имени месяца. Сократите этот список, если вам не нужны/нужны столбцы для всех 12 месяцев.
  2. Этот подход должен работать, когда все даты относятся к одному календарному году. Если вы хотите иметь дело с диапазоном дат, который охватывает более одного года ... у вас есть еще больше работы.:-)

Сделайте таблицу календаря:

Public Sub CreateTable_calendar() 
    Const cstrTable As String = "tblCalendar" 
    Dim cn As Object 
    Dim strSql As String 
    Set cn = CurrentProject.Connection 

    On Error Resume Next 
    cn.Execute "DROP TABLE " & cstrTable & ";" 
    If Err.Number <> 0 Then 
     Debug.Print Err.Description 
    End If 
    On Error GoTo 0 

    strSql = "CREATE TABLE " & cstrTable & " (" & vbCrLf & _ 
     "the_date DATETIME CONSTRAINT pkey PRIMARY KEY," & vbCrLf & _ 
     "work_day YESNO," & vbCrLf & _ 
     "CONSTRAINT midnite_only CHECK " & _ 
     "(the_date = DateValue(the_date))" & vbCrLf & _ 
     ");" 
    Debug.Print strSql 
    cn.Execute strSql 

    Set cn = Nothing 
End Sub 

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

Public Sub LoadCalendar(Optional ByVal pYear As Integer) 
    Const cstrTable As String = "tblCalendar" 
    Dim db As DAO.Database 
    Dim dte As Date 
    Dim intYear As Integer 
    Dim rs As DAO.Recordset 
    Dim strMsg As String 

On Error GoTo ErrorHandler 

    intYear = IIf(pYear = 0, Year(Date), pYear) 
    dte = DateSerial(intYear, 1, 1) 

    Set db = CurrentDb 
    Set rs = db.OpenRecordset(cstrTable, dbOpenTable, dbAppendOnly) 

    Do While Year(dte) = intYear 
     rs.AddNew 
     rs!the_date = dte 
     rs!work_day = Not (Weekday(dte) = vbSunday Or _ 
      Weekday(dte) = vbSaturday) 
     rs.Update 
     dte = dte + 1 
    Loop 
    rs.Close 

ExitHere: 
    On Error GoTo 0 
    Set rs = Nothing 
    Set db = Nothing 
    Exit Sub 

ErrorHandler: 
    strMsg = "Error " & Err.Number & " (" & Err.Description _ 
     & ") in procedure LoadCalendar" 
    MsgBox strMsg 
    GoTo ExitHere 
End Sub 

Редактировать: Календарь зарезервированное слово. См. Problem names and reserved words in Access. Я не заметил этого, пока не осмотрел мою базу данных с мистером Брауном Database Issue Checker Utility. Поэтому я изменил календарь имен на tblCalendar в этом ответе. И я настоятельно рекомендую эту утилиту. В дополнение к выявлению проблем с зарезервированными словами, он может сообщить вам о многих других проблемах с потенциальными проблемами.

Смежные вопросы