Расширенный поиск с использованием CheckboxList - PullRequest
0 голосов
/ 30 июля 2009

У меня есть расширенный поиск, который мне нужно реализовать для веб-сайта с использованием C # и SQL Server. Вот основная идея:

  1. Пользователь выбирает необходимые критерии поиска - город, штат, почтовый индекс
  2. Пользователь может выбрать дополнительные критерии поиска. Этот критерий поиска является списком флажков. Список флажков привязан к списку критериев с сервера SQL.
  3. Поиск выполняется по всем необходимым критериям поиска, и если был выбран какой-либо дополнительный критерий, элемент должен соответствовать всем дополнительным критериям.

У меня работают необходимые критерии поиска, но я не могу понять, как выполнить необязательные критерии. Проблема заключается в том, что пользователь может выбрать несколько критериев в списке флажков, и все эти элементы должны быть сопоставлены. Мне также нужно реализовать разбиение на страницы и сортировку (что у меня работает), но это означает, что поиск должен происходить в SQL.

Кто-нибудь делал что-то подобное раньше и у него есть идеи по поводу того, как это сделать?

Ответы [ 4 ]

0 голосов
/ 30 июля 2009

Я предполагаю, что у вас есть что-то вроде этого:

  • город (строка)
  • состояние (строка)
  • почтовый индекс (число / строка)
  • необязательные критерии (строковые элементы): для целей этого примера я собираюсь принять программный домен - скажем, что-то вроде телевизионного провайдера. Поэтому примерный вариант: hasExpandedTVPackage, hasHBOpackage и т. Д., Поскольку checkBoxes предоставляют только часть данных, включенных / выключенных bool.

Так, например, у вас есть два флажка на странице: [] Также есть расширенный пакет [] Также есть HBO. и т. д. - в основном «найти всех парней, которые живут в городе, штате, почтовом индексе (и, если, скажем, выбран HBO), а также заплатили за пакет HBO».

Теперь, если вы просто написали SQL самостоятельно, это будет "ВЫБРАТЬ * ОТ ПОЛЬЗОВАТЕЛЕЙ, ГДЕ State = @State AND City = @City AND ZipCode = @ZipCode AND HasHboPackage = 1". Но нам нужно было бы использовать динамический SQL, чтобы соединить это.

Мое предложение состоит в том, чтобы собрать таблицу и создать там дополнительные биты SQL, поэтому все, что вы передаете в хранимый процесс, это идентификаторы выбранных элементов (без передачи входных данных). Пример кода:

DECLARE @Items TABLE
(
    ID INT,
    DisplayName VARCHAR(200),
    SQLStatement VARCHAR(200)
)

INSERT INTO @Items (ID, DisplayName, SQLStatement) VALUES (1, 'Has Expanded Package', 'HasExpandedPackage = 1')
INSERT INTO @Items (ID, DisplayName, SQLStatement) VALUES (2, 'Has HBO Package', 'HasHBOPackage = 1')

SELECT * FROM @Items

DECLARE @City VARCHAR(200)
DECLARE @State VARCHAR(2)
DECLARE @ZipCode VARCHAR(5)
DECLARE @Statement VARCHAR(1000)
DECLARE @SelectedOptions VARCHAR(30)

SET @City = 'Dallas'
SET @State = 'TX'
SET @ZipCode = '12345'
SET @SelectedOptions = '2'

DECLARE @TempOptionsTable TABLE
(
    OptionID VARCHAR(3)
)

DECLARE @Delimiter VARCHAR(1)
DECLARE @StartPosition INT
DECLARE @Length INT
DECLARE @Item VARCHAR(3)

SET @Delimiter = ','

WHILE LEN(@SelectedOptions) > 0
BEGIN
    SET @StartPosition = CHARINDEX(@Delimiter, @SelectedOptions)

    IF @StartPosition < 0
    BEGIN
        SET @StartPosition = 0
    END

    SET @Length = LEN(@SelectedOptions) - @StartPosition - 1

    IF @Length < 0
    BEGIN
        SET @Length = 0
    END

    IF @StartPosition > 0
    BEGIN
        SET @Item = SUBSTRING(@SelectedOptions, 1, @StartPosition - 1)
        SET @SelectedOptions = SUBSTRING(@SelectedOptions, @StartPosition + 1, LEN(@SelectedOptions) - @StartPosition)
    END
    ELSE
    BEGIN
        SET @Item = @SelectedOptions
        SET @SelectedOptions = ''
    END

    INSERT INTO @TempOptionsTable (OptionID) VALUES (@Item)
END

DECLARE @StatementTable TABLE
(
    StatementID INT IDENTITY,
    OptionID INT,
    SQLStatement VARCHAR(200)
)

SELECT * FROM @StatementTable

--SELECT I.* FROM @TempOptionsTable TOT INNER JOIN @Items I ON I.ID = TOT.OptionID

INSERT INTO @StatementTable
SELECT I.ID, I.SQLStatement FROM @TempOptionsTable TOT INNER JOIN @Items I ON I.ID = TOT.OptionID

SELECT * FROM @StatementTable

DECLARE @Iterator INT
DECLARE @MaxIndex INT
DECLARE @TempStatement VARCHAR(200)

SELECT @Iterator = MIN(StatementID) FROM @StatementTable
SELECT @MaxIndex = MAX(StatementID) FROM @StatementTable

SELECT @Iterator, @MaxIndex

SELECT @Statement = 'SELECT * FROM Users WHERE City = ''' + @City + ''' AND State = ''' + @State + ''' AND ZipCode = ''' + @ZipCode + ''''

SELECT @Statement

WHILE @Iterator < (@MaxIndex + 1)
BEGIN
    SELECT @TempStatement = SQLStatement FROM @StatementTable WHERE StatementID = @Iterator

    SET @Statement = @Statement + ' AND ' + @TempStatement

    SET @Iterator = @Iterator + 1
END

SELECT @Statement

--EXEC(@Statement)

Таким образом, все, что вам нужно сделать, это добавить новую запись в таблицу выписок, и вы сразу получите привязку данных и дополнительные функции поиска. Вы должны убедиться, что поля города и почтового индекса правильно очищены, поскольку они могут быть потенциально использованы для внедрения SQL, если это открытые текстовые поля (а не выпадающие списки или что-то в этом роде).

0 голосов
/ 30 июля 2009

Вам придется перебрать коллекцию списков и использовать ее для изменения предложения where.

Конечно, если это приложение не использует абсолютно никаких конфиденциальных данных, а пользователь, которого вы используете для подключения к БД, не имеет абсолютно никакого доступа к конфиденциальным данным, вы должны использовать хранимые процедуры, а не запросы в коде, 1003 *, и вы никогда не должны использовать пользовательский ввод напрямую для построения оператора SQL . Это означает, что вам также придется планировать использование операторов if в ваших хранимых процедурах.

Ваша хранимая процедура будет выглядеть примерно так:

CREATE PROCEDURE [dbo].[SearchProcedure]

@FilterByLoginID bit,
@LoginId varchar(10)
 AS

DECLARE @SqlQuery varchar (250);

SET @SqlQuery = 'Select FirstName, LastName FROM CustomerList'
if @FilterByLoginID = 1
BEGIN
  SET @SqlQuery = @SqlQuery + ' WHERE LoginId = ' + CAST(@LoginID AS varchar(10))

END

Execute(@SqlQuery)

Вот ссылка, которая поможет вам ... http://www.codeproject.com/KB/database/Building_Dynamic_SQL.aspx

0 голосов
/ 30 июля 2009

вы можете выбрать как это

select * from myTable m
where m.optional1==$value or $value==-1
      m.optional2==$value or $value==-1
..

обратите внимание, что «-1» не должно быть допустимым значением в домене.

0 голосов
/ 30 июля 2009

Динамически создайте свой SQL, как показано ниже:

Private Sub LoadData()
    'Initialize first
    grdResults.DataSource = Nothing
    grdResults.DataBind()
    grdResults.Visible = False

    grdResultsRequestedBy.DataSource = Nothing
    grdResultsRequestedBy.DataBind()
    grdResultsRequestedBy.Visible = False

    grdResultsCallDate.DataSource = Nothing
    grdResultsCallDate.DataBind()
    grdResultsCallDate.Visible = False

    btnExportToExcel.Visible = False
    lblNoneFound.Visible = True

    ' We have to include null values when no value for a given field is provided.
    ' The like search "%" does not return rows with null values!!
    Dim strShiftType As String
    If (ddlShiftType.SelectedValue = "<- All ->") Then
        strShiftType = ""
    Else
        strShiftType = " and sr.Shift_Type_ID = " & "'" & ddlShiftType.SelectedValue & "' "
    End If

    ' Only allow good dates
    ' If one of Start or End is populated the other one will get the same value assigned.
    ' This avoids unnecessary entry if you deal with a range of one day only!
    If txtShiftDateRangeStart.Text <> "" And txtShiftDateRangeEnd.Text = "" Then
        txtShiftDateRangeEnd.Text = txtShiftDateRangeStart.Text
    End If
    If txtShiftDateRangeStart.Text = "" And txtShiftDateRangeEnd.Text <> "" Then
        txtShiftDateRangeStart.Text = txtShiftDateRangeEnd.Text
    End If
    Dim strShiftDate As String
    If txtShiftDateRangeStart.Text <> "" And txtShiftDateRangeEnd.Text <> "" And IsDate(txtShiftDateRangeStart.Text) And IsDate(txtShiftDateRangeEnd.Text) Then
        strShiftDate = " and (sr.shift_date between " & "'" & txtShiftDateRangeStart.Text & "' and '" & txtShiftDateRangeEnd.Text & "')"
    Else
        strShiftDate = ""
        txtShiftDateRangeStart.Text = ""
        txtShiftDateRangeEnd.Text = ""
    End If

    Dim strRequestedBy As String
    If (ddlRequestedBy.SelectedValue = "<- All ->") Then
        strRequestedBy = ""
    Else
        strRequestedBy = " and bi.Requested_By = " & "'" & ddlRequestedBy.SelectedValue & "' "
    End If

    Dim txtCallNumberlike As String
    If (txtCallNumber.Text & "%" = "%") Then
        txtCallNumberlike = ""
    Else
        txtCallNumberlike = " and (bi.Call_Number LIKE @CallNumber) "
    End If

    ' Only allow good dates
    ' If one of Start or End is populated the other one will get the same value assigned.
    ' This avoids unnecessary entry if you deal with a range of one day only!
    If txtCallDateRangeStart.Text <> "" And txtCallDateRangeEnd.Text = "" Then
        txtCallDateRangeEnd.Text = txtCallDateRangeStart.Text
    End If
    If txtCallDateRangeStart.Text = "" And txtCallDateRangeEnd.Text <> "" Then
        txtCallDateRangeStart.Text = txtCallDateRangeEnd.Text
    End If
    Dim strCallDate As String
    If txtCallDateRangeStart.Text <> "" And txtCallDateRangeEnd.Text <> "" And IsDate(txtCallDateRangeStart.Text) And IsDate(txtCallDateRangeEnd.Text) Then
        strCallDate = " and (cast(bi.Call_date as datetime) between " & "'" & txtCallDateRangeStart.Text & "' and '" & txtCallDateRangeEnd.Text & "')"
    Else
        strCallDate = ""
        txtCallDateRangeStart.Text = ""
        txtCallDateRangeEnd.Text = ""
    End If

    Dim strDispatcher As String
    If (ddlDispatcher.SelectedValue = "<- All ->") Then
        strDispatcher = ""
    Else
        strDispatcher = " and bi.Dispatcher_ID = " & "'" & ddlDispatcher.SelectedValue & "' "
    End If

    Dim strEmployeeCompletingBillingInquiry As String
    If (ddlEmployeeCompletingBillingInquiry.SelectedValue = "<- All ->") Then
        strEmployeeCompletingBillingInquiry = ""
    Else
        strEmployeeCompletingBillingInquiry = " and bi.Employee_Completing_Billing_Inquiry_ID = " & "'" & ddlEmployeeCompletingBillingInquiry.SelectedValue & "' "
    End If

    ' Only allow good dates
    Dim strWhenCreated As String
    ' If one of Start or End is populated the other one will get the same value assigned.
    ' This avoids unnecessary entry if you deal with a range of one day only!
    If txtWhenCreatedRangeStart.Text <> "" And txtWhenCreatedRangeEnd.Text = "" Then
        txtWhenCreatedRangeEnd.Text = txtWhenCreatedRangeStart.Text
    End If
    If txtWhenCreatedRangeStart.Text = "" And txtWhenCreatedRangeEnd.Text <> "" Then
        txtWhenCreatedRangeStart.Text = txtWhenCreatedRangeEnd.Text
    End If
    If txtWhenCreatedRangeStart.Text <> "" And txtWhenCreatedRangeEnd.Text <> "" And IsDate(txtWhenCreatedRangeStart.Text) And IsDate(txtWhenCreatedRangeEnd.Text) Then
        strWhenCreated = " and (cast(convert(char(10), bi.When_Created, 101) as datetime) between " & "'" & txtWhenCreatedRangeStart.Text & "' and '" & txtWhenCreatedRangeEnd.Text & "')"
    Else
        strWhenCreated = ""
        txtWhenCreatedRangeStart.Text = ""
        txtWhenCreatedRangeEnd.Text = ""
    End If

    Dim strWhoCreated As String
    If (ddlWhoCreated.SelectedValue = "<- All ->") Then
        strWhoCreated = ""
    Else
        strWhoCreated = " and bi.Who_Created = " & "'" & ddlWhoCreated.SelectedValue & "' "
    End If

    ' Only allow good dates
    ' If one of Start or End is populated the other one will get the same value assigned.
    ' This avoids unnecessary entry if you deal with a range of one day only!
    If txtWhenUpdatedRangeStart.Text <> "" And txtWhenUpdatedRangeEnd.Text = "" Then
        txtWhenUpdatedRangeEnd.Text = txtWhenUpdatedRangeStart.Text
    End If
    If txtWhenUpdatedRangeStart.Text = "" And txtWhenUpdatedRangeEnd.Text <> "" Then
        txtWhenUpdatedRangeStart.Text = txtWhenUpdatedRangeEnd.Text
    End If
    Dim strWhenUpdated As String
    If txtWhenUpdatedRangeStart.Text <> "" And txtWhenUpdatedRangeEnd.Text <> "" And IsDate(txtWhenUpdatedRangeStart.Text) And IsDate(txtWhenUpdatedRangeEnd.Text) Then
        strWhenUpdated = " and (cast(convert(char(10), bi.When_Updated, 101) as datetime) between " & "'" & txtWhenUpdatedRangeStart.Text & "' and '" & txtWhenUpdatedRangeEnd.Text & "')"
    Else
        strWhenUpdated = ""
        txtWhenUpdatedRangeStart.Text = ""
        txtWhenUpdatedRangeEnd.Text = ""
    End If

    Dim strWhoUpdated As String
    If (ddlWhoUpdated.SelectedValue = "<- All ->") Then
        strWhoUpdated = ""
    Else
        strWhoUpdated = " and bi.Who_Updated = " & "'" & ddlWhoUpdated.SelectedValue & "' "
    End If

    Dim strIsDeleted As String
    If (ddlIsDeleted.SelectedValue = "<- All ->") Then
        strIsDeleted = ""
    Else
        If ddlIsDeleted.SelectedValue = "False" Then
            strIsDeleted = " and (bi.IsDeleted = 'F' or bi.IsDeleted is null)"
        Else
            strIsDeleted = " and bi.IsDeleted = 'T'"
        End If
    End If

    ' Only allow good dates
    ' If one of Start or End is populated the other one will get the same value assigned.
    ' This avoids unnecessary entry if you deal with a range of one day only!
    If txtWhenDeletedRangeStart.Text <> "" And txtWhenDeletedRangeEnd.Text = "" Then
        txtWhenDeletedRangeEnd.Text = txtWhenDeletedRangeStart.Text
    End If
    If txtWhenDeletedRangeStart.Text = "" And txtWhenDeletedRangeEnd.Text <> "" Then
        txtWhenDeletedRangeStart.Text = txtWhenDeletedRangeEnd.Text
    End If
    Dim strWhenDeleted As String
    If txtWhenDeletedRangeStart.Text <> "" And txtWhenDeletedRangeEnd.Text <> "" And IsDate(txtWhenDeletedRangeStart.Text) And IsDate(txtWhenDeletedRangeEnd.Text) Then
        strWhenDeleted = " and (cast(convert(char(10), bi.When_Deleted, 101) as datetime) between " & "'" & txtWhenDeletedRangeStart.Text & "' and '" & txtWhenDeletedRangeEnd.Text & "')"
    Else
        strWhenDeleted = ""
        txtWhenDeletedRangeStart.Text = ""
        txtWhenDeletedRangeEnd.Text = ""
    End If

    Dim strWhoDeleted As String
    If (ddlWhoDeleted.SelectedValue = "<- All ->") Then
        strWhoDeleted = ""
    Else
        strWhoDeleted = " and bi.Who_Deleted = " & "'" & ddlWhoDeleted.SelectedValue & "' "
    End If

    Dim Parameters_Group_In As String
    Dim Parameters_Effective_Date_In As String
    Parameters_Group_In = "REQUESTEDBY"
    Parameters_Effective_Date_In = Now()

    Dim SelectString As String = ""
    Dim Error_Message As String = ""
    Error_Message = BuildSelectString(SelectString)

    Dim strCommand As String = ""
    If ViewState("Submit") = "Submit" Then
        strCommand += " select " & SelectString
        strCommand += " from "
        strCommand += " ( "
        strCommand += " select convert(Char(10), sr.shift_date, 101) as ShiftDate, "
        strCommand += "       case when st.Shift_Desc is null then '' else st.Shift_Desc end + ' / ' + case when st.Shift_Start_Time is null then '' else st.Shift_Start_Time end + ' / ' + case when st.Shift_End_Time is null then '' else st.Shift_End_Time end + ' / ' + cast(st.Shift_Type_ID as varchar) as ShiftType, "
        strCommand += "       ParamRequestedBy.ParamRequestedByDesc as RequestedBy, "
        strCommand += "       bi.Call_Number as CallNumber, "
        strCommand += "       convert(Char(10), bi.Call_Date, 101) as CallDate, "
        strCommand += "       case when dispatcher.Last_Name is null then '' else dispatcher.Last_Name end + ', ' + case when dispatcher.First_Name is null then '' else dispatcher.First_Name end + ' / ' + cast(dispatcher.Employee_ID as varchar) as Dispatcher, "
        strCommand += "       (Select case when Employee.Last_Name is null then '' else Employee.Last_Name end + ', ' + case when Employee.First_Name is null then '' else Employee.First_Name end + ' / ' + cast(Employee.Employee_ID as varchar) from Employee where Employee.Employee_ID = bi.Dispatcher2_ID) as Dispatcher2, "
        strCommand += "       (Select case when Employee.Last_Name is null then '' else Employee.Last_Name end + ', ' + case when Employee.First_Name is null then '' else Employee.First_Name end + ' / ' + cast(Employee.Employee_ID as varchar) from Employee where Employee.Employee_ID = bi.Dispatcher3_ID) as Dispatcher3, "
        strCommand += "       bi.comments as Comments, "
        strCommand += "       case when completing.Last_Name is null then '' else completing.Last_Name end + ', ' + case when completing.First_Name is null then '' else completing.First_Name end + ' / ' + cast(completing.Employee_ID as varchar) as EmployeeCompletingBillingInquiry, "
        strCommand += "       bi.When_Created as WhenCreated, "
        strCommand += "       case when Who_Created.Last_Name is null then '' else Who_Created.Last_Name end + ', ' + case when Who_Created.First_Name is null then '' else Who_Created.First_Name end + ' / ' + cast(Who_Created.Employee_ID as varchar) as WhoCreated, "
        strCommand += "       bi.When_Updated as WhenUpdated, "
        strCommand += "       case when Who_Updated.Last_Name is null then '' else Who_Updated.Last_Name end + ', ' + case when Who_Updated.First_Name is null then '' else Who_Updated.First_Name end + ' / ' + cast(Who_Updated.Employee_ID as varchar) as WhoUpdated, "
        strCommand += "       case when bi.IsDeleted = 'F' or bi.IsDeleted is null then 'False' else 'True' end as IsDeleted, "
        strCommand += "       bi.When_Deleted as WhenDeleted, "
        strCommand += "       case when Who_Deleted.Last_Name is null then '' else Who_Deleted.Last_Name end + ', ' + case when Who_Deleted.First_Name is null then '' else Who_Deleted.First_Name end + ' / ' + cast(Who_Deleted.Employee_ID as varchar) as WhoDeleted "
        strCommand += "  from billing_inquiries bi "
        strCommand += "       inner      join Shift_Report sr          on bi.Shift_Report_ID                        = sr.Shift_Report_ID "
        strCommand += "       inner      join Shift_Types  st          on sr.Shift_Type_ID                          = st.Shift_Type_ID "
        strCommand += "       inner      join Employee     dispatcher  on bi.Dispatcher_ID                          = dispatcher.employee_id "
        strCommand += "       inner      join Employee     completing  on bi.Employee_Completing_Billing_Inquiry_ID = completing.employee_id "
        strCommand += "       left outer join Employee     Who_Created on bi.Who_Created                             = Who_Created.Employee_ID "
        strCommand += "       left outer join Employee     Who_Updated on bi.Who_Updated                             = Who_Updated.Employee_ID "
        strCommand += "       left outer join Employee     Who_Deleted on bi.Who_Deleted                             = Who_Deleted.Employee_ID "
        strCommand += "       inner      join ( "
        strCommand += "                        select Parameters_ID as ParamRequestedByID, Parameters_Value as ParamRequestedByDesc "
        strCommand += "                          from Parameters_Details pd1, Parameters_Header ph "
        strCommand += "                         where ph.parameters_group  = pd1.parameters_group "
        strCommand += "                           And pd1.parameters_group = @Parameters_Group "
        strCommand += "                           And pd1.parameters_effective_date = "
        strCommand += "                               (select max(pd2.parameters_effective_date) "
        strCommand += "                                  from parameters_details pd2 "
        strCommand += "                                 where pd2.parameters_group           = pd1.parameters_group "
        strCommand += "                                   and pd2.parameters_id              = pd1.parameters_id "
        strCommand += "                                   and pd2.parameters_effective_date <= @Parameters_Effective_Date) "
        strCommand += "                       ) ParamRequestedBy on bi.Requested_By = ParamRequestedBy.ParamRequestedByID "
        strCommand += " where 1=1 "
        strCommand += strShiftType
        strCommand += strShiftDate
        strCommand += strRequestedBy
        strCommand += txtCallNumberlike
        strCommand += strCallDate
        strCommand += strDispatcher
        strCommand += strEmployeeCompletingBillingInquiry
        strCommand += strWhenCreated
        strCommand += strWhoCreated
        strCommand += strWhenUpdated
        strCommand += strWhoUpdated
        strCommand += strIsDeleted
        strCommand += strWhenDeleted
        strCommand += strWhoDeleted
        strCommand += " ) as Details "
    End If

    If ViewState("Submit") = "SubmitRequestedBy" Then
        strCommand += "select ParamRequestedBy.ParamRequestedByDesc as RequestedBy, "
        strCommand += "       count(*) as Count "
        strCommand += "  from billing_inquiries bi "
        strCommand += "       inner      join Shift_Report sr          on bi.Shift_Report_ID                        = sr.Shift_Report_ID "
        strCommand += "       inner      join Shift_Types  st          on sr.Shift_Type_ID                          = st.Shift_Type_ID "
        strCommand += "       inner      join Employee     dispatcher  on bi.Dispatcher_ID                          = dispatcher.employee_id "
        strCommand += "       inner      join Employee     completing  on bi.Employee_Completing_Billing_Inquiry_ID = completing.employee_id "
        strCommand += "       left outer join Employee     Who_Created on bi.Who_Created                             = Who_Created.Employee_ID "
        strCommand += "       left outer join Employee     Who_Updated on bi.Who_Updated                             = Who_Updated.Employee_ID "
        strCommand += "       left outer join Employee     Who_Deleted on bi.Who_Deleted                             = Who_Deleted.Employee_ID "
        strCommand += "       inner      join ( "
        strCommand += "                        select Parameters_ID as ParamRequestedByID, Parameters_Value as ParamRequestedByDesc "
        strCommand += "                          from Parameters_Details pd1, Parameters_Header ph "
        strCommand += "                         where ph.parameters_group  = pd1.parameters_group "
        strCommand += "                           And pd1.parameters_group = @Parameters_Group "
        strCommand += "                           And pd1.parameters_effective_date = "
        strCommand += "                               (select max(pd2.parameters_effective_date) "
        strCommand += "                                  from parameters_details pd2 "
        strCommand += "                                 where pd2.parameters_group           = pd1.parameters_group "
        strCommand += "                                   and pd2.parameters_id              = pd1.parameters_id "
        strCommand += "                                   and pd2.parameters_effective_date <= @Parameters_Effective_Date) "
        strCommand += "                       ) ParamRequestedBy on bi.Requested_By = ParamRequestedBy.ParamRequestedByID "
        strCommand += " where 1=1 "
        strCommand += strShiftType
        strCommand += strShiftDate
        strCommand += strRequestedBy
        strCommand += txtCallNumberlike
        strCommand += strCallDate
        strCommand += strDispatcher
        strCommand += strEmployeeCompletingBillingInquiry
        strCommand += strWhenCreated
        strCommand += strWhoCreated
        strCommand += strWhenUpdated
        strCommand += strWhoUpdated
        strCommand += strIsDeleted
        strCommand += strWhenDeleted
        strCommand += strWhoDeleted
        strCommand += " group by ParamRequestedBy.ParamRequestedByDesc "
        strCommand += " order by ParamRequestedBy.ParamRequestedByDesc "
    End If

    If ViewState("Submit") = "SubmitCallDate" Then
        strCommand += "select DATENAME(year, Call_Date) + ' ' + case when len(cast(month(Call_Date) as varchar)) = 1 then '0' + cast(month(Call_Date) as varchar) else cast(month(Call_Date) as varchar) end as YearMonth, "
        strCommand += "       count(*) as Count "
        strCommand += "  from billing_inquiries bi "
        strCommand += "       inner      join Shift_Report sr          on bi.Shift_Report_ID                        = sr.Shift_Report_ID "
        strCommand += "       inner      join Shift_Types  st          on sr.Shift_Type_ID                          = st.Shift_Type_ID "
        strCommand += "       inner      join Employee     dispatcher  on bi.Dispatcher_ID                          = dispatcher.employee_id "
        strCommand += "       inner      join Employee     completing  on bi.Employee_Completing_Billing_Inquiry_ID = completing.employee_id "
        strCommand += "       left outer join Employee     Who_Created on bi.Who_Created                             = Who_Created.Employee_ID "
        strCommand += "       left outer join Employee     Who_Updated on bi.Who_Updated                             = Who_Updated.Employee_ID "
        strCommand += "       left outer join Employee     Who_Deleted on bi.Who_Deleted                             = Who_Deleted.Employee_ID "
        strCommand += "       inner      join ( "
        strCommand += "                        select Parameters_ID as ParamRequestedByID, Parameters_Value as ParamRequestedByDesc "
        strCommand += "                          from Parameters_Details pd1, Parameters_Header ph "
        strCommand += "                         where ph.parameters_group  = pd1.parameters_group "
        strCommand += "                           And pd1.parameters_group = @Parameters_Group "
        strCommand += "                           And pd1.parameters_effective_date = "
        strCommand += "                               (select max(pd2.parameters_effective_date) "
        strCommand += "                                  from parameters_details pd2 "
        strCommand += "                                 where pd2.parameters_group           = pd1.parameters_group "
        strCommand += "                                   and pd2.parameters_id              = pd1.parameters_id "
        strCommand += "                                   and pd2.parameters_effective_date <= @Parameters_Effective_Date) "
        strCommand += "                       ) ParamRequestedBy on bi.Requested_By = ParamRequestedBy.ParamRequestedByID "
        strCommand += " where 1=1 "
        strCommand += strShiftType
        strCommand += strShiftDate
        strCommand += strRequestedBy
        strCommand += txtCallNumberlike
        strCommand += strCallDate
        strCommand += strDispatcher
        strCommand += strEmployeeCompletingBillingInquiry
        strCommand += strWhenCreated
        strCommand += strWhoCreated
        strCommand += strWhenUpdated
        strCommand += strWhoUpdated
        strCommand += strIsDeleted
        strCommand += strWhenDeleted
        strCommand += strWhoDeleted
        strCommand += " group by DATENAME(year, Call_Date) + ' ' + case when len(cast(month(Call_Date) as varchar)) = 1 then '0' + cast(month(Call_Date) as varchar) else cast(month(Call_Date) as varchar) end "
        strCommand += " order by DATENAME(year, Call_Date) + ' ' + case when len(cast(month(Call_Date) as varchar)) = 1 then '0' + cast(month(Call_Date) as varchar) else cast(month(Call_Date) as varchar) end "
    End If

    Dim Parameters_Hashtable As New Hashtable
    Parameters_Hashtable("@CallNumber") = txtCallNumber.Text & "%"
    Parameters_Hashtable("@Parameters_Group") = Parameters_Group_In
    Parameters_Hashtable("@Parameters_Effective_Date") = Parameters_Effective_Date_In

    Dim dtBillingInquiries As DataTable = DataAccess.GetDataAsDataSet( _
                                              strCommand, _
                                              "BillingInquiries", _
                                              Parameters_Hashtable, _
                                              Error_Message _
                                             ).Tables("BillingInquiries")
    If (Error_Message = "") Then
        If ViewState("Submit") = "Submit" Then
            grdResults.DataSource = dtBillingInquiries
            If dtBillingInquiries.Rows.Count > 0 Then
                grdResults.Visible = True
                grdResults.DataBind()
                lblNoneFound.Visible = False
                btnExportToExcel.Visible = True
            End If
        End If
        If ViewState("Submit") = "SubmitRequestedBy" Then
            grdResultsRequestedBy.DataSource = dtBillingInquiries
            If dtBillingInquiries.Rows.Count > 0 Then
                grdResultsRequestedBy.Visible = True
                grdResultsRequestedBy.DataBind()

                SetGraph(dtBillingInquiries)

                lblNoneFound.Visible = False
                btnExportToExcel.Visible = True
            End If
        End If
        If ViewState("Submit") = "SubmitCallDate" Then
            grdResultsCallDate.DataSource = dtBillingInquiries
            If dtBillingInquiries.Rows.Count > 0 Then
                grdResultsCallDate.Visible = True
                grdResultsCallDate.DataBind()

                SetGraph(dtBillingInquiries)

                lblNoneFound.Visible = False
                btnExportToExcel.Visible = True
            End If
        End If
    Else
        lblMessage.Text = Error_Message
    End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...