Страницы: 1
RSS
Подавление #Value
 
Народ, знаете как можно подавить появление #value? Поделитесь опытом.
 
еще бы знать где и как оно появляется
 
А если я, например, создал функцию, которая через ADO извлекает значения с базы Access. Тогда, если в базе нет нужной информации, функция возвращает #value. Можно ли как то в функции прописать, чтобы вместо #value ничего не выводилось или выводилось, например, "no data"?
 
{quote}{login=The_Prist}{date=28.10.2010 02:49}{thema=}{post}А что за функция? UDF или еще какая? Мы же не экстрасенсы. Если UDF, то проверять возвращаемые значения - если пусто - значит подменяем на "no data".{/post}{/quote}  
Да, функция UDF:  
Public Function Get_Monthly_IMS(SKU_ID As Integer, Year As Integer, Month As Integer, Market As String)  
 
Dim cnn As New ADODB.Connection  
Dim rs As ADODB.Recordset  
Dim sqlstr As String  
 
cnn.ConnectionString = "бла-бла-бла"  
sqlstr = "бла-бла-бла"  
cnn.Open  
 
Set rs = New ADODB.Recordset  
rs.Open sqlstr, cnn  
Get_Monthly_IMS = rs.Fields(0).Value  
rs.Close  
Set rs = Nothing  
cnn.Close  
Set cnn = Nothing  
End Function  
 
А где прописать проверку (чтобы выводило или ничего, или "no data").
 
{quote}{login=The_Prist}{date=28.10.2010 03:17}{thema=}{post}Public Function Get_Monthly_IMS(SKU_ID As Integer, Year As Integer, Month As Integer, Market As String)  
 
Dim cnn As New ADODB.Connection  
Dim rs As ADODB.Recordset  
Dim sqlstr As String  
 
cnn.ConnectionString = "бла-бла-бла"  
sqlstr = "бла-бла-бла"  
cnn.Open  
 
Set rs = New ADODB.Recordset  
rs.Open sqlstr, cnn  
Get_Monthly_IMS = rs.Fields(0).Value  
rs.Close  
Set rs = Nothing  
cnn.Close  
Set cnn = Nothing  
if isError(Get_Monthly_IMS) then Get_Monthly_IMS = "no data"  
End Function{/post}{/quote}  
 
Не работает. Все равно, если записи в базе данных нет, функция возвращает #Value!
 
{quote}{login=The_Prist}{date=28.10.2010 03:56}{thema=}{post}Значит возвращает это как текст. Вот и пропишите замену:  
 
if Get_Monthly_IMS = "#Value!" then Get_Monthly_IMS = "no data"{/post}{/quote}  
 
Всё равно не работает. Возвращает #Value!. Если тестирую функцию в VB Editor, то при попытке извлечь несуществующую ынформацию выводит следующее окно:  
Run-time error '3021':  
 
Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.  
 
sqlstr - это селект-запрос.    
Може вам ещё какая-то инфа нужна для помощи?
 
{quote}{login=The_Prist}{date=28.10.2010 04:05}{thema=Re: }{post}{quote}{login=The_Prist}{date=28.10.2010 03:56}{thema=}{post}Значит возвращает это как текст. Вот и пропишите замену:  
 
if Get_Monthly_IMS = "#Value!" then Get_Monthly_IMS = "no data"{/post}{/quote}Понял, что именно за ошибка. Возникает здесь:  
 
Get_Monthly_IMS = rs.Fields(0).Value  
 
Думаю у Вас и сессия не закрывается при ошибке, т.к. функция завершается. Попробуйте так:  
Public Function Get_Monthly_IMS(SKU_ID As Integer, Year As Integer, Month As Integer, Market As String)  
 
Dim cnn As New ADODB.Connection  
Dim rs As ADODB.Recordset  
Dim sqlstr As String  
 
cnn.ConnectionString = "бла-бла-бла"  
sqlstr = "бла-бла-бла"  
cnn.Open  
 
Set rs = New ADODB.Recordset  
rs.Open sqlstr, cnn  
On Error Resume next  
Get_Monthly_IMS = rs.Fields(0).Value  
rs.Close  
Set rs = Nothing  
cnn.Close  
Set cnn = Nothing  
if isError(Get_Monthly_IMS) then Get_Monthly_IMS = "no data"  
End Function{/post}{/quote}  
Сейчас попробую
 
{quote}{login=The_Prist}{date=28.10.2010 04:05}{thema=Re: }{post}{quote}{login=The_Prist}{date=28.10.2010 03:56}{thema=}{post}Значит возвращает это как текст. Вот и пропишите замену:  
 
if Get_Monthly_IMS = "#Value!" then Get_Monthly_IMS = "no data"{/post}{/quote}Понял, что именно за ошибка. Возникает здесь:  
 
Get_Monthly_IMS = rs.Fields(0).Value  
 
Думаю у Вас и сессия не закрывается при ошибке, т.к. функция завершается. Попробуйте так:  
Public Function Get_Monthly_IMS(SKU_ID As Integer, Year As Integer, Month As Integer, Market As String)  
 
Dim cnn As New ADODB.Connection  
Dim rs As ADODB.Recordset  
Dim sqlstr As String  
 
cnn.ConnectionString = "бла-бла-бла"  
sqlstr = "бла-бла-бла"  
cnn.Open  
 
Set rs = New ADODB.Recordset  
rs.Open sqlstr, cnn  
On Error Resume next  
Get_Monthly_IMS = rs.Fields(0).Value  
rs.Close  
Set rs = Nothing  
cnn.Close  
Set cnn = Nothing  
if isError(Get_Monthly_IMS) then Get_Monthly_IMS = "no data"  
End Function{/post}{/quote}  
 
Прогресс есть. Теперь функция выводит ноль вместо #Value
 
{quote}{login=The_Prist}{date=28.10.2010 04:14}{thema=Re: Re: Re: }{post}{quote}{login=yavorsky90}{date=28.10.2010 04:12}{thema=Re: Re: }{post}Прогресс есть. Теперь функция выводит ноль вместо #Value{/post}{/quote}Значит надо строку:  
if isError(Get_Monthly_IMS) then Get_Monthly_IMS = "no data"  
заменить на  
if Get_Monthly_IMS = 0 then Get_Monthly_IMS = "no data"  
 
Но для этого надо быть уверенным, что реальные данные не будут иметь значение 0{/post}{/quote}  
К сожалению, могут. Это данные о продажах. Естественно, что продажы могут быть нулевые. Но это не значит, что данных нет.
 
{quote}{login=The_Prist}{date=28.10.2010 04:14}{thema=Re: Re: Re: }{post}{quote}{login=yavorsky90}{date=28.10.2010 04:12}{thema=Re: Re: }{post}Прогресс есть. Теперь функция выводит ноль вместо #Value{/post}{/quote}Значит надо строку:  
if isError(Get_Monthly_IMS) then Get_Monthly_IMS = "no data"  
заменить на  
if Get_Monthly_IMS = 0 then Get_Monthly_IMS = "no data"  
 
Но для этого надо быть уверенным, что реальные данные не будут иметь значение 0{/post}{/quote}  
К сожалению, данные могут уметь нулевое значение (это данные о продажах). Неправильно, что когда продаж не было, то выводится "no data"
 
The_Prist,  
 
Вы просто молодец. Я добился того, чего хотел. Спасибо вам огромное.
 
Продолжаю углублятся в данную тему. Использовал ваш код:    
Public Function Get_Monthly_IMS(SKU_ID As Integer, Year As Integer, Month As Integer, Market As String)  
 
Dim cnn As New ADODB.Connection  
Dim rs As ADODB.Recordset  
Dim sqlstr As String  
 
cnn.ConnectionString = "бла-бла-бла"  
sqlstr = "бла-бла-бла"  
cnn.Open  
 
Set rs = New ADODB.Recordset  
rs.Open sqlstr, cnn  
On Error Resume next  
Get_Monthly_IMS = rs.Fields(0).Value  
rs.Close  
Set rs = Nothing  
cnn.Close  
Set cnn = Nothing  
if err.number <> 0 then Get_Monthly_IMS = ""  
End Function  
 
изменив при этом, чтобы вместо "no data" ничего не выводилось. Но вот новая проблема. Если я хочу, например, просуммировать те значейки, в которых находится моя формула (которая ничего не выводит), то получаю #Value!, хотя по идее должен был бы быть ноль.
 
{quote}{login=yavorsky90}{date=29.10.2010 10:40}{thema=}{post}Продолжаю углублятся в данную тему. Использовал ваш код:    
Public Function Get_Monthly_IMS(SKU_ID As Integer, Year As Integer, Month As Integer, Market As String)  
 
Dim cnn As New ADODB.Connection  
Dim rs As ADODB.Recordset  
Dim sqlstr As String  
 
cnn.ConnectionString = "бла-бла-бла"  
sqlstr = "бла-бла-бла"  
cnn.Open  
 
Set rs = New ADODB.Recordset  
rs.Open sqlstr, cnn  
On Error Resume next  
Get_Monthly_IMS = rs.Fields(0).Value  
rs.Close  
Set rs = Nothing  
cnn.Close  
Set cnn = Nothing  
if err.number <> 0 then Get_Monthly_IMS = ""  
End Function  
 
изменив при этом, чтобы вместо "no data" ничего не выводилось. Но вот новая проблема. Если я хочу, например, просуммировать те значейки, в которых находится моя формула (которая ничего не выводит), то получаю #Value!, хотя по идее должен был бы быть ноль.{/post}{/quote}  
формула типа =D1+D2+D3+D4 вернет н\значение  
формула типа =сумм(D1:D4) Вернет результат суммы  
при условии что в диапазоне суммирования присутствует строка нулевой длинны  
т.е.  
выполнение этого условия  
if err.number <> 0 then Get_Monthly_IMS = ""  
 
возможно в этом причина
Спасибо
 
Cуммирую D1+D2+D3 (вернея суммирование я указал для примера, у меня там похожая формула, которая считает точность прогноза).  
Проверил, если использовать формулу суммы, то все ок.    
 
Может мне надо, чтобы функция возвращала не строку нулевой длины, а вообще ничего, чтобы это "ничего" нормально использовалось в формулах? Но как это в коде указать?
 
{quote}{login=The_Prist}{date=29.10.2010 10:59}{thema=}{post}if err.number <> 0 then Get_Monthly_IMS = Empty{/post}{/quote}  
А теперь функция выводит 0 (а это не совсем верно, как я уже выше указывал).  
The_Prist, я вас уже, наверное достал, но должно же быть решение...
 
{quote}{login=yavorsky90}{date=29.10.2010 11:10}{thema=Re: }{post}{quote}{login=The_Prist}{date=29.10.2010 10:59}{thema=}{post}if err.number <> 0 then Get_Monthly_IMS = Empty{/post}{/quote}  
А теперь функция выводит 0 (а это не совсем верно, как я уже выше указывал).  
The_Prist, я вас уже, наверное достал, но должно же быть решение...{/post}{/quote}  
ну я же Вам писал , что вот так можно избежать ошибок со строками нулевой длинны  
=СУММ(B1)+ СУММ(B5)  
возможно есть и другие решения
Спасибо
 
Спасибо, использовал оба замечания. Про =СУММ(B1)+ СУММ(B5) сначала не понял, но этот способ реально помог. получилась формула:  
=IF(ISNUMBER(E29);IF(ABS((SUM(D29)-SUM(E29))/SUM(D29))<1;1-ABS((SUM(D29)-SUM(E29))/SUM(D29));0);1)  
Считает нормально. Подскажите ещё, пожалуйста, как сделать, чтобы этот алгоритм выполнялся при проверке двух ячеек (Е29 и D29) на IsNumber. Пробовал вот так:  
=IF(ISNUMBER(D29:E29);IF(ABS((SUM(D29)-SUM(E29))/SUM(D29))<1;1-ABS((SUM(D29)-SUM(E29))/SUM(D29));0);1)  
но возвращает 1. Видимо так нельзя. Как тогда проверить две ячейки?
Страницы: 1
Читают тему
Наверх