(изменено: Алёна Краснощёка, 25 марта 2016 10:34:53)

Тема: Проверка на пустоту именованного объекта

Добрый день! Подскажите, пожалуйста, как проверить результат запроса на пустоту?

У меня есть именованный объект (Запрос) с именем "Запрос1", обращение к результату запроса происходит в функции. Если "Запрос1" не вернет ни одной записи, как об этом узнать?

Следующие проверки не дают результатов:

          
    If TCSRpt.RptFunc.IsNameExists("Запрос1") Then
        Result = TCSRpt.RptFunc.GetNamedValue("Запрос1")
          
        If IsNull(Result) Then
            MsgBox("IsNull()")
        End If

        If IsEmpty(Result) Then
            MsgBox("IsEmpty()")
        End If

        If Result = null Then
            MsgBox(" = null")
        End If

        If Result Is null Then
            MsgBox(" Is null")
        End If

        If Result Is Empty Then
            MsgBox(" Is Empty")
        End If 

    End If ' If TCSRpt.RptFunc.IsNameExists("Запрос1")

Re: Проверка на пустоту именованного объекта

Функция

TCSRpt.RptFunc.GetNamedValue()

всегда возвращает строку если объект существует, иначе вызывает исключение.

Проверить на пустую строку (если ее тип Строка) можно так:

If Result = "" Then 
End If

Или

If Result = Empty Then 
End If

Чтобы узнать тип переменной, можно использовать функции:

VarType() и/или TypeName()

Например проверить что тип переменной "строка":

If VarType(varName) = VarType("") Then
End If

Re: Проверка на пустоту именованного объекта

Виктор Бебякин пишет:

GetNamedValue  возвращает строку если объект существует

В моей версии TCSApiHelp написано что GetNamedValue ( PropertyGet )   Возвращает: Variant.

Виктор Бебякин пишет:
If Result = "" Then 
End If


If Result = Empty Then 
End If

При таких попытках выводится ошибка [Exception(Exception)->Несоответствие типа

If CStr(Result) = "" Then 
End If

If CStr(Result) = Empty Then 
End If

При таких попытках выводится ошибка [Exception(Exception)->Несоответствие типа: 'CStr'

Проверки не отрабатывают...

Re: Проверка на пустоту именованного объекта

Я имел ввиду что функция возвращает строку в случае выполнения (если запрос найден и в нем нет ошибок).
В вашем случае надо проверить возвращаемый тип

If VarType(Result) = VarType("") Then
 'Можно использовать Result как строку
End If

или

MsgBox TypeName(Result)

а также можно поставить ловушку

On Error resume Next
Result = TCSRpt.RptFunc.GetNamedValue("Запрос1")
if err then MsgBox err.Description
On Error Goto 0
Спасибо сказали: Алёна Краснощёка1

(изменено: Алёна Краснощёка, 26 марта 2016 12:41:19)

Re: Проверка на пустоту именованного объекта

Ошибка возникает не здесь

Result = TCSRpt.RptFunc.GetNamedValue("Запрос1")

Здесь возвращается пустое значения с типом TypeName(Result) = Variant()
А при последующей работе с этим результатом.

Например

tmp  = "(" + Result + ")" 

Как поступать в таком случае? Правильно ли я  понимаю, что можно только с помощью перехвата ошибки?

Result1 = TCSRpt.RptFunc.GetNamedValue("Запрос1")
Result2 = TCSRpt.RptFunc.GetNamedValue("Запрос2")

On Error resume Next
  tmp  = "(" + Result1  + "/" + Result2 + ")"
If err then 
    tmp  = " "
Else
    tmp  = "(" + Result1  + "/" + Result2 + ")"
End If
On Error Goto 0

или так

tmp  = ""

If TypeName(Result1) = TypeName("") Then
    If TypeName(Result2) = TypeName("") Then

        tmp  = "(" + Result1  + "/" + Result2 + ")"

    End If ' If TypeName(Result1) = TypeName("") Then
End If ' If TypeName(Result1) = TypeName("") Then

Re: Проверка на пустоту именованного объекта

Здесь возвращается пустое значения с типом TypeName(Result) = Variant()

Непонятно как у вас получается

TypeName(Result) = Variant()

У меня

TypeName(Result) = Empty

в случае исключения (ошибка в запросе), иначе всегда строка, даже если запрос пустой. Попробуйте задать значение переменной Result до обращения к запросу. И желательно объявлять переменные до использования

  Dim Result ' as String 
  Result = "" 'инициализация переменной
  If TCSRpt.RptFunc.IsNameExists("Запрос1") Then
    Result = TCSRpt.RptFunc.GetNamedValue("Запрос1")
    Result = TypeName(Result) 'тип "Строка" даже в случае исключения
  End If

tmp  = "(" + Result + ")"

Так писать не желательно, лучше так:

tmp  = "(" & Result & ")"

Если необходимо проверить вернул ли запрос данные, то лучше работать через "IReporterRecordSet"

  Dim Result
  if TCSRpt.RptFunc.HasRptRecordSet("Запрос1") then 'если запрос существует, то
    Dim rs 'as IReporterRecordSet
    Set rs = TCSRpt.RptFunc.GetOpenedRptRecordSet("Запрос1", True) ' открываем запрос
    call rs.MoveFirst ' встаем на первую запись
    if rs.IsEof then 
      Result = "Нет данных"
    else ' получаем значение по индексу или имени (FieldByName())
      Result = rs.FieldByIndex(0).AsSafeString ' всегда строка, независимо от типа данных
    end if
  End if
Спасибо сказали: Алёна Краснощёка1

Re: Проверка на пустоту именованного объекта

В запросе ошибок нет, возвращает значение параметра номенклатуры  но не у каждой номенклатуры он внесен, поэтому иногда бывает пустой результат) У меня Windows XP, может это влияет на тип результата в пустом запросе...

Ясно, спасибо, буду работать через "IReporterRecordSet" и с таким способом соединения строк:

tmp  = "(" & Result & ")"

В самой функции переменные я объявляю, просто не стала здесь писать.