Тема: Как работать с параметрами выборки

Пришлите, пожалуйста, примерчик, как программно задать значения параметров выборки!
Я пытался сделать выборку с параметрами для размещения на форме, а потом устанавливать их из скрипта, но это каждый раз приводило к Run-Time Error.
Вот я и не пойму - то ли баг в TDMS с заданием свойства TDMSQuery.Parameter, то ли я что-то не так делаю.

Вот, как я пытался это сделать:

    Dim MyQuery
    Set MyQuery = ThisApplication.Queries("QUERY_MyQry")
    MyQuery.Parameter("Param_Name") = ThisForm.Attributes("ATTR_Name").Value

ЗЫ: А вообще можно так делать?  :) После изменения параметров запрос выборки будет автоматически выполнен и результат выборки с новыми параметрами будет отображен на форме?

Re: Как работать с параметрами выборки

Slava.Coder.Vrn пишет:

ЗЫ: А вообще можно так делать?  :) После изменения параметров запрос выборки будет автоматически выполнен и результат выборки с новыми параметрами будет отображен на форме?

Можно и это работает. При нажатии кнопки на форме ввода вызывается событие:

Sub OnClick_BUTTON_SHOW_FOUND()
    Set DictionaryFlagErrorShow=ThisApplication.Dictionary
    DictionaryFlagErrorShow("FLAG_ERROR_SHOW_FOUND") = not DictionaryFlagErrorShow("FLAG_ERROR_SHOW_FOUND")
    call Form_BeforeShow(ThisForm, ThisObject)
End Sub

В Form_BeforeShow происходит перерисовка контролов.

В самой выборке тоже прописывается обработчик:

Sub Query_BeforeExecute(Query, Obj, Cancel)
    Query.Permissions = SysAdminPermissions
    if not Obj Is Nothing then 
        ThisApplication.ExecuteScript "CMD_LIBRARY", "QUERY_PROGRAM_ERROR_PARAM_BY_FLAG", Query, Obj
    End If
End Sub

в "CMD_LIBRARY", "QUERY_PROGRAM_ERROR_PARAM_BY_FLAG" происходит установка парамеров выборки:

Sub QUERY_PROGRAM_ERROR_PARAM_BY_FLAG(Query, Obj)
    Query.Permissions=SysAdminPermissions
    
    ParamStr = ""
    'Set Query = ThisApplication.Queries("QUERY_PROGRAM_ERROR")

    Set DictionaryFlagErrorShow=ThisApplication.Dictionary
'msgbox Obj.Description
'msgbox Query.SysName
    Query.Parameter("PARAM_PROGRAM_PREFIX")=Obj.Attributes("ATTR_PROGRAM_PREFIX").Value

    If DictionaryFlagErrorShow("FLAG_ERROR_SHOW_FOUND")=True Then
        If ParamStr<>"" then ParamStr = ParamStr & " OR "
        ParamStr = ParamStr & """" & ThisApplication.Statuses("STATUS_ERROR_FOUND").Description & """"
    End If
    
    If DictionaryFlagErrorShow("FLAG_ERROR_SHOW_SEND")=True Then
        If ParamStr<>"" then ParamStr = ParamStr & " OR "
        ParamStr=ParamStr & """" & ThisApplication.Statuses("STATUS_ERROR_SEND").Description & """"
    End If
    
    If DictionaryFlagErrorShow("FLAG_ERROR_SHOW_FIXED")=True Then
        If ParamStr<>"" then ParamStr = ParamStr & " OR "
        ParamStr=ParamStr & """" & ThisApplication.Statuses("STATUS_ERROR_FIXED").Description & """"
    End If
    
    If DictionaryFlagErrorShow("FLAG_ERROR_SHOW_AWAITING")=True Then
        If ParamStr<>"" then ParamStr = ParamStr & " OR "
        ParamStr=ParamStr & """" & ThisApplication.Statuses("STATUS_ERROR_AWAITING").Description & """"
    End If

    If DictionaryFlagErrorShow("FLAG_ERROR_SHOW_DELETED")=True Then
        If ParamStr<>"" then ParamStr = ParamStr & " OR "
        ParamStr=ParamStr & """" & ThisApplication.Statuses("STATUS_ERROR_DELETED").Description & """"
    End If 

    If     ParamStr="" Then     ParamStr="NULL"
    
    Query.Parameter("PARAM_ERROR_STATUS")=ParamStr 
End Sub

(изменено: Slava.Coder.Vrn, 23 марта 2007г. 18:15:58)

Re: Как работать с параметрами выборки

Вот, в силу своих способностей написал следующее:

Код формы:

Sub OnClick_BUTTON_Find()
    Dim Dict
    Set Dict = ThisApplication.Dictionary
    Dict("DoSearch") = True
    Dict("SearchParam_Name") = ThisForm.Attributes("ATTR_Name").Value
    Call Form_BeforeShow(ThisForm, ThisObject)
End Sub

Sub Form_BeforeShow(Form, Obj)
    Dim Dict
    Set Dict = ThisApplication.Dictionary
    If Not Dict("DoSearch") Then
        Dict("SearchParam_Name") = Empty
    End If
End Sub

Sub Form_BeforeClose(Form, Obj, Cancel)
    Dim Dict
    Set Dict = ThisApplication.Dictionary
    Dict("DoSearch") = False
    Dict("SearchParam_CompanyName") = Empty
End Sub

Код для запроса:

Sub Query_BeforeExecute(Query, Obj, Cancel)
    Dim Dict
    Set Dict = ThisApplication.Dictionary
    If Dict("DoSearch") And (Dict("SearchParam_Name") <> Empty) Then
        Query.Parameter("PARAM_Name") = Dict("SearchParam_Name")
    Else
        Query.Parameter("PARAM_Name") = ""
    End If
End Sub

Однако, наблюдается следующая особенность - если находятся записи, удовлетворяющие условиям выборки, то все работает как и ожидается. Но если таких записей нет - отображается результат предыдущей выборки.
Что я делаю не так?

Re: Как работать с параметрами выборки

наблюдается следующая особенность - если находятся записи, удовлетворяющие условиям выборки, то все работает как и ожидается. Но если таких записей нет - отображается результат предыдущей выборки.

Так что скажете?

(изменено: Slava.Coder.Vrn, 4 апреля 2007г. 21:55:24)

Re: Как работать с параметрами выборки

Я тут ошибся немного в написании скрипта. Параметр ведь часть SQL-запроса, а параметры надо брать в кавычки. Только и вот вы правильно ли написали???

ParamStr = ParamStr & """" & ThisApplication.Statuses("STATUS_ERROR_FOUND").Description & """"

???
Там же ж вроде одинарные используются. Я написал так:

Sub OnClick_BTN_FIND()
    Dim Dict
    Set Dict = ThisApplication.Dictionary
    Dict("SearchParam_Name") = ThisForm.Attributes("ATTR00003089").Value
    Call Form_BeforeShow(ThisForm,ThisObject)
End Sub

Sub Form_BeforeShow(Form, Obj)
End Sub
Sub Query_BeforeExecute(Query, Obj, Cancel)
    Dim Dict
    Dim Param
    Set Dict = ThisApplication.Dictionary
    If Not IsEmpty(Dict("SearchParam_Name")) Then
        If Dict("SearchParam_Name") <> "" Then _
                Param = Chr(39) & Dict("SearchParam_Name") & "*" & Chr(39)
    End If
    If Param <> "" Then
        Query.Parameter("PARAM0") = Param
    Else
        Query.Parameter("PARAM0") = Chr(39) & "*" & Chr(39)
    End IF
    MsgBox "Выборка с параметром - " & Query.Parameter("PARAM0")
    Dict("SearchParam_Name") = ""
End Sub

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

Вот наглядное пособие

Post's attachments

Query_Search.rar 170.23 Кб, 31 скачиваний с 2007-04-04 

You don't have the permssions to download the attachments of this post.

Re: Как работать с параметрами выборки

Ошибка известна, надеемся что скоро поправят   :rolleyes:

(изменено: Slava.Coder.Vrn, 5 апреля 2007г. 14:00:54)

Re: Как работать с параметрами выборки

Ок.
А как все-таки правильно? Так

ParamStr = ParamStr & """" & ThisApplication.Statuses("STATUS_ERROR_FOUND").Description & """"

или так

Param = Chr(39) & Dict("SearchParam_Name") & "*" & Chr(39)

Т.е. кавычки все-таки двойные или одинарные? По моим наблюдениям нужно одинарные ставить.
А то тут писали, что этот пример в хелп войдет. Я волнуюсь за правильность  :)

Re: Как работать с параметрами выборки

Slava.Coder.Vrn пишет:

Ок.
А как все-таки правильно? Так

ParamStr = ParamStr & """" & ThisApplication.Statuses("STATUS_ERROR_FOUND").Description & """"

или так

Param = Chr(39) & Dict("SearchParam_Name") & "*" & Chr(39)

Т.е. кавычки все-таки двойные или одинарные? По моим наблюдениям нужно одинарные ставить.
А то тут писали, что этот пример в хелп войдет. Я волнуюсь за правильность  :)

Я вообще пишу без кавычек и пока что всё работает.

Re: Как работать с параметрами выборки

Кстати, посмотрел подробнее, с двойными вообще не работает

Re: Как работать с параметрами выборки

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

Пока что ошибка осталась. Только выглядит она по-другому. Теперь "столбцы" выборки пустые (раньше они оставались заполненными), но строчки (объекты) присутствуют

Re: Как работать с параметрами выборки

Кстати уже поправлено.
Теперь если нет объектов то и строчки пустые, вне зависимости от результатов предыдущего выполнения запроса.