проверка существаования переменной из запроса SQL

1. Manticor 66 14.12.11 16:14 Сейчас в теме
Есть запрос SQL
пишет Ошибка при вызове метода контекста (Fields): Произошла исключительная ситуация (ADODB.Recordset): Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру.
если Рез32.Fields("summa1").Value()<> неопределено

Код
ЗапросSQLВыб32="         
      |IF EXISTS 
      |(select cards_discount.date_end
      | from cards_discount
      |where cards_discount.date_end is  NULL
      |)
      |begin
      |( 
      |Select sum(sum) as summa1
      |From dbo.sales, dbo.cards, dbo.cards_discount        
      |where code_discount_1c82='"+коде_дисконт_1с82+"' and (sales.date >= CONVERT(DATETIME, '"+Формат(Дата(дата_старт),"ДФ=yyyy-MM-dd")+"',102)  and sales.date <= CONVERT(DATETIME, '"+Формат(Дата(дата_енд),"ДФ=yyyy-MM-dd")+"',102) )
      |)
      |End
      |Else
      |begin
      |(Select sum(sum) as summa2
      |From dbo.sales, dbo.cards, dbo.cards_discount
      |where code_discount_1c82='"+коде_дисконт_1с82+"' and (sales.date >= CONVERT(DATETIME, '"+Формат(Дата(дата_старт),"ДФ=yyyy-MM-dd")+"',102))
      |)
      |End";   
                         
   ЗапросВыб32.CommandText = ЗапросSQLВыб32;                             
   Рез32=ЗапросВыб32.Execute();
   
       Если  Рез32.EOF() Тогда
          ФлагЗапросаВыб32=Ложь;
       Иначе
         ФлагЗапросаВыб32 = Истина;

         [B]если Рез32.Fields("summa1").Value()<> неопределено[/B]
            тогда
             сумма1  = Рез32.Fields("summa1").Value(); 
         КонецЕсли;
         
         если Рез32.Fields("summa2").Value()<> неопределено
            тогда
             сумма2  = Рез32.Fields("summa2").Value(); 
         КонецЕсли;
Показать полностью

По ходу запрос не возвращает сумму1- тоесть выполняется 2 условие. как можно проверить что сумма1 есть?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. cool.vlad4 2 14.12.11 16:32 Сейчас в теме
(1) |Select sum(sum) as summa1
|From dbo.sales, dbo.cards, dbo.cards_discount
|where code_discount_1c82='"+коде_дисконт_1с82+"' and (sales.date >= CONVERT(DATETIME, '"+Формат(Дата(дата_старт),"ДФ=yyyy-MM-dd")+"',102) and sales.date <= CONVERT(DATETIME, '"+Формат(Дата(дата_енд),"ДФ=yyyy-MM-dd")+"',102) )
|)
|End
|Else
|begin
|(Select sum(sum) as summa2
|From dbo.sales, dbo.cards, dbo.cards_discount
|where code_discount_1c82='"+коде_дисконт_1с82+"' and (sales.date >= CONVERT(DATETIME, '"+Формат(Дата(дата_старт),"ДФ=yyyy-MM-dd")+"',102))

|)

А чем выделенные фрагменты отличаются?
PS опишите логику sql запроса, если нетрудно. а тока пока он странный...весьма...и весь запрос сводится к простой выборке
Select sum(sum) as summa2
|From dbo.sales, dbo.cards, dbo.cards_discount
|where code_discount_1c82='"+коде_дисконт_1с82+"' and (sales.date >= CONVERT(DATETIME и т.д.
7. cool.vlad4 2 14.12.11 16:39 Сейчас в теме
(1) А все увидел, у меня IE съел часть запроса, потому не было видно
2. MagTux 14.12.11 16:24 Сейчас в теме
В голову сразу попытка приходит, хотя, кажется, есть более тонкие методы.
3. MagTux 14.12.11 16:26 Сейчас в теме
Типа такого варианта:
Попытка
  сумма1  = Рез32.Fields("summa1").Value(); 
Исключение
  сумма2  = Рез32.Fields("summa2").Value(); 
КонецПопытки
8. Manticor 66 14.12.11 17:00 Сейчас в теме
(3) MagTux,
спасибо помогло, возник др вопрос))

ЗапросSQLВыб4="
					|SELECT     top 1 range , discount
					|FROM         discount_size
					|WHERE     (range < '"+СокрЛП( Число(ПерСумм))+"') 
					|order by range desc ";	
										

	ЗапросВыб4.CommandText = ЗапросSQLВыб4;                             
	Рез4=ЗапросВыб4.Execute();
Показать


Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Error converting data type varchar to numeric.
Рез4=ЗапросВыб4.Execute();
5. MagTux 14.12.11 16:34 Сейчас в теме
Select sum(sum) as summa1
и
Select sum(sum) as summa2
6. cool.vlad4 2 14.12.11 16:37 Сейчас в теме
(5) а в чем между ними разница? и там ,и там сумма, условие одно, почему нельзя просто Select sum(sum)
9. MagTux 14.12.11 17:02 Сейчас в теме
WHERE (range < "+Число(ПерСумм)+")
10. MagTux 14.12.11 17:06 Сейчас в теме
Кстати попробуй вообще без WHERE и сравни по времени. У меня есть подозрение, что будет быстрее.
11. Manticor 66 14.12.11 17:10 Сейчас в теме
MagTux пишет:

Кстати попробуй вообще без WHERE и сравни по времени. У меня есть подозрение, что будет быстрее.

тут без опострафов не обойтись- посколку тут число, ругается. Без where это HAVING-ом
12. MagTux 14.12.11 17:14 Сейчас в теме
(11) Кто ругается? range - это же numeric?
13. MagTux 14.12.11 17:19 Сейчас в теме
(11) Я имею в виду вообще без условия.
И вообще по твоему запросу должна выбираться запись с минимальным range.

Вот такой запрос взлетит?

SELECT MIN(range), discount FROM discount_size
14. Manticor 66 14.12.11 17:22 Сейчас в теме
(13) MagTux, тут top выбирает максимальную запиь, ну да не в этом дело, как правильно конвернуть?
15. MagTux 14.12.11 17:25 Сейчас в теме
17. cool.vlad4 2 14.12.11 17:40 Сейчас в теме
(15) numeric - это по сути (10,2) не факт, что сложением получается так как надо сиквелу. например группировки.
16. cool.vlad4 2 14.12.11 17:36 Сейчас в теме
Почему ты уверено не используешь параметры? (хотя я советовал еще в прошлом твоем вопросе).
1. Запрос по сумма какой-то неправильный. Мне кажется его нужно переписать. Сейчас сказать точно не могу. Как бы он выглядил в 1С?
2. Параметры можно передавать либо сбором строки(в том числе и через стрЗаменить и подобные приемчики). Ну нарыватся на ошибки. Можно в запросе конвертить.Например - Convert(numeric,'10') . И получать дополнительное расходование времени на преобразовании .А можно добавлять параметры в ADO.
SQL_команда = Новый COMОбъект("ADODB.Command"); //Команда выполняемая на Скуль
SQL_Выборка = Новый COMОбъект("ADODB.Recordset"); //Выборка зезультата выполненной команды

SQL_команда.ActiveConnection = Connection;
SQL_команда.CommandText = СтрокаКоманды;
SQL_команда.CommandType = ТипКомандыАДО(ТипКоманды);

Для Каждого СтруктураСтрокиПараметра Из МассивПараметров Цикл

ИмяПараметра = СтруктураСтрокиПараметра.ИмяПараметра;
ТипПараметра = СтруктураСтрокиПараметра.ТипПараметра; // "adParamInput"
ЗначениеПараметра = СтруктураСтрокиПараметра.ИмяПараметра;
ТипЗначенияПараметра = СтруктураСтрокиПараметра.ТипЗначенияПараметра; //"adWChar"

Параметр_SQL_команды = SQL_команда.CreateParameter(ИмяПараметра, КонстантаАДО(ТипЗначенияПараметра),
ТипПараметраАДО(ТипПараметра), 9, ЗначениеПараметра);
SQL_команда.Parameters.Append(Параметр_SQL_команды);
КонецЦикла;
Попытка
SQL_Выборка = SQL_команда.Execute();
Исключение
//#Если Клиент Тогда
////Сообщить(ОписаниеОшибки());
//#КонецЕсли
КонецПопытки;
//////////////
////////////////
////////////////
Функция КонстантаАДО(Конст) Экспорт
АдоКонст = НРег(Конст);
Если АдоКонст = "adEmpty" Тогда
Возврат 0;
ИначеЕсли АдоКонст = "adtinyint" Тогда
Возврат 16;
ИначеЕсли АдоКонст = "adsmallint" Тогда
Возврат 2;
ИначеЕсли АдоКонст = "adinteger" Тогда
Возврат 3;
ИначеЕсли АдоКонст = "adbigint" Тогда
Возврат 20;
ИначеЕсли АдоКонст = "adunsignedtinyint" Тогда
Возврат 17;
ИначеЕсли АдоКонст = "adunsignedsmallint" Тогда
Возврат 18;
ИначеЕсли АдоКонст = "adunsignedint" Тогда
Возврат 19;
ИначеЕсли АдоКонст = "adunsignedbigint" Тогда
Возврат 21;
ИначеЕсли АдоКонст = "adsingle" Тогда
Возврат 4;
ИначеЕсли АдоКонст = "addouble" Тогда
Возврат 5;
ИначеЕсли АдоКонст = "adcurrency" Тогда
Возврат 6;
ИначеЕсли АдоКонст = "addecimal" Тогда
Возврат 14;
ИначеЕсли АдоКонст = "adnumeric" Тогда
Возврат 131;
ИначеЕсли АдоКонст = "adboolean" Тогда
Возврат 11;
ИначеЕсли АдоКонст = "aderror" Тогда
Возврат 10;
ИначеЕсли АдоКонст = "aduserdefined" Тогда
Возврат 132;
ИначеЕсли АдоКонст = "advariant" Тогда
Возврат 12;
ИначеЕсли АдоКонст = "adidispatch" Тогда
Возврат 9;
ИначеЕсли АдоКонст = "adiunknown" Тогда
Возврат 13;
ИначеЕсли АдоКонст = "adguid" Тогда
Возврат 72;
ИначеЕсли АдоКонст = "addate" Тогда
Возврат 7;
ИначеЕсли АдоКонст = "addbdate" Тогда
Возврат 133;
ИначеЕсли АдоКонст = "addbtime" Тогда
Возврат 134;
ИначеЕсли АдоКонст = "addbtimestamp" Тогда
Возврат 135;
ИначеЕсли АдоКонст = "adbstr" Тогда
Возврат 8;
ИначеЕсли АдоКонст = "adchar" Тогда
Возврат 129;
ИначеЕсли АдоКонст = "advarchar" Тогда
Возврат 200;
ИначеЕсли АдоКонст = "adlongvarchar" Тогда
Возврат 201;
ИначеЕсли АдоКонст = "adwchar" Тогда
Возврат 130;
ИначеЕсли АдоКонст = "advarwchar" Тогда
Возврат 202;
ИначеЕсли АдоКонст = "adlongvarwchar" Тогда
Возврат 203;
ИначеЕсли АдоКонст = "adbinary" Тогда
Возврат 128;
ИначеЕсли АдоКонст = "advarbinary" Тогда
Возврат 204;
ИначеЕсли АдоКонст = "adlongvarbinary" Тогда
Возврат 205;
Иначе Возврат 0;
КонецЕсли;
КонецФункции

Функция ТипПараметраАДО(Конст) Экспорт
АдоКонст = НРег(Конст);
Если АдоКонст = "adparamunknown" Тогда
Возврат 0;
ИначеЕсли АдоКонст = "adparaminput" Тогда
Возврат 1;
ИначеЕсли АдоКонст = "adparamoutput" Тогда
Возврат 2;
ИначеЕсли АдоКонст = "adparaminputoutput" Тогда
Возврат 3;
ИначеЕсли АдоКонст = "adparamreturnvalue" Тогда
Возврат 4;
КонецЕсли;
КонецФункции

PS ф-ции были на этом сайте, что-то поменял. Справочник по ADO есть где угодно.
18. Manticor 66 14.12.11 17:59 Сейчас в теме
(16) cool.vlad4,
ну это понятно, мне всего лишь нужно чтобы параметр правильно вставлялся. Вот попробовал с каст. та же ерунда

ЗапросSQLВыб4="
|SELECT top 1 range , discount
|FROM discount_size
|WHERE (range < cast('"+перСум+"' as decimal(18,2)) )
|order by range desc ";
19. cool.vlad4 2 14.12.11 18:07 Сейчас в теме
(18) дык, я же написал convert(numeric,твоясумма) и смотри, чтобы сумма была без всяких группировок ,т.е. Формат(твоясумма, "ЧГ=")
ЗЫ Если дробь, то convert(numeric(10,2),твоясумма) и еще у сиквела по умолчанию точка разделитель
20. Manticor 66 15.12.11 12:30 Сейчас в теме
(16) cool.vlad4,
Справочник по ADO есть где угодно.

поделись где лежит?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот