Имя: Пароль:
1C
 
Помогите понять RecordSet.RecordCount() - всегда выдает -1
0 Drock
 
02.10.08
16:53
query = "
       |SELECT category_id
       |FROM jos_vm_category WHERE category_id='"+Выборка.Код+"'";
        RSIDProduct.CursorType = 3;
       RSIDProduct.Open(query, Connection);

       Если RSIDProduct.RecordCount()= 0 Тогда        

Собственно вот кусок запроса к скл, по А. Михайлову, выставил курсортайп =3, однако рекордсет упорно дает количество полей -1
1 smaharbA
 
02.10.08
16:57
MoveFirst ?
2 smaharbA
 
02.10.08
16:58
хотя RSIDProduct.RecordCount это не поля... или я не въехал
3 Drock
 
02.10.08
16:59
Это количество записей в результате запроса
4 Drock
 
02.10.08
16:59
по идее
5 Ns33
 
02.10.08
17:00
-1 = Не может быть определено.

MSDN про CRecordset:

"The total number of records is only known after the user has moved beyond the last record...To count the records yourself, call MoveNext repeatedly until IsEOF returns nonzero."

Вкратце: до конца промотай.
6 Drock
 
02.10.08
17:05
(5) можно ссылку
7 Ns33
 
02.10.08
17:08
8 Drock
 
02.10.08
17:08
Произошла исключительная ситуация (ADODB.Recordset): BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись.
9 smaharbA
 
02.10.08
17:09

   РекордСет=СоздатьОбъект("ADODB.Recordset");
   Рекордсет.Open("select spid,dbid,
   |DateTime=replace(replace(cast(day(login_time) as char(3))+cast(month(login_time) as char(3))+cast(year(login_time) as char(5))+datename(hh,login_time)+' '+datename(mi,login_time)+' '+datename(ss,login_time)+' '+datename(ms,login_time),'  ',' '),' ',','),
   |[Дата]=login_time,
   |[Секунды]=3600*datename(hh,login_time)+60*datename(mi,login_time)+datename(ss,login_time),
   |Время_действия=replace(replace(cast(day(last_batch) as char(3))+cast(month(last_batch) as char(3))+cast(year(last_batch) as char(5))+datename(hh,last_batch)+' '+datename(mi,last_batch)+' '+datename(ss,last_batch)+' '+datename(ms,last_batch),'  ',' '),' ',','),
   |ComputerName=hostname,hostprocess,program_name
   |from master.dbo.sysprocesses
   |where dbid=db_id('"+База+"') and spid<>@@spid
   |order by spid;",Кон,3,1,1);
10 Ns33
 
02.10.08
17:11
(8) ? Обычный перебор сделай.

Хотя тут они жульничают, вы пробегите до конца, а мы вам посчитаем записи.
11 Drock
 
02.10.08
17:12
RSIDProduct.EOF()=Истина;

смотрю в отладке, после выполнения запроса
Так же как и BOF
12 ДенисЧ
 
02.10.08
17:12
(11) Значит, пусто
13 Drock
 
02.10.08
17:18
Что то не выходит каменный цветок :(
14 Serg_1960
 
02.10.08
17:30
Если RSIDProduct.EOF()=Истина И RSIDProduct.BOF()=Истина Тогда
  Сообщение("Вот, блин, опять запрос неверно составил - ничего не находит");
КонецЕсли;
15 Drock
 
02.10.08
21:30
(14) Как ни странно часть правды тут есть

Если (НЕ= RSIDProduct.EOF()) И (НЕ RSIDProduct.BOF()) Тогда
  Сообщение("В результате запроса таки есть данные");
КонецЕсли;
16 shachneff
 
02.10.08
22:56
Сталкивался с такой проблемой около года назад, все уже забыл. Остался только код - привожу целиком.


Функция УстановитьПодключениеКБазеДанных() Экспорт
   
   Попытка
       Connection = Новый COMОбъект("ADODB.Connection");
       Catalog = Новый COMОбъект("ADOX.Catalog");
       
       Если ПолучитьСтрокуПодключения() Тогда
           Catalog.ActiveConnection = СокрЛП(СтрокаПодключения);
           Connection.Open(СокрЛП(СтрокаПодключения));
       Иначе
           Connection = Неопределено;
           Catalog = Неопределено;
           ОтладочноеСообщение("Не удалось найти строку подключения к БД", СтатусСообщения.Важное);
           Возврат Ложь;
       КонецЕсли;
   Исключение
       Connection = Неопределено;
       Catalog = Неопределено;
       ОтладочноеСообщение();
       Возврат Ложь;
   КонецПопытки;        
   
   Возврат Истина;
   
КонецФункции

Функция ОтменитьПодключениеКБазеДанных() Экспорт
   
   Попытка
       Connection.Close();
       Connection = Неопределено;
       Catalog = Неопределено;
   Исключение
       Connection = Неопределено;
       Catalog = Неопределено;
       ОтладочноеСообщение();
       Возврат Ложь;
   КонецПопытки;
           
   Возврат Истина;
   
КонецФункции

//-------------------------------------------------------------------------
Функция ВыполнитьЗапросSQL(ТекстЗапроса, RecordSet = "") // Новый
   
   Попытка
       
       ТЗ_Запроса = Новый ("ТаблицаЗначений");
       
       Command = Новый COMОбъект("ADODB.Command");
       Command.ActiveConnection = Connection;
       Command.CommandText = ТекстЗапроса; // текст надо фильтровать на недопустимые символы        
       
       RecordSet = Новый COMОбъект("ADODB.RecordSet");
       RecordSet = Command.Execute(); //Выполнение и получение набора данных
       
       // Проверка на пустой результат
       Если RecordSet.EOF() Тогда
           // и убрать за собой в памяти
           RecordSet = Неопределено;
           Command = Неопределено;
           ОтладочноеСообщение("Запрос не вернул ни одной строки", СтатусСообщения.Важное);
           Возврат 0;  // ошибка
       КонецЕсли;
       
       // Инициализируем колонки
       Для НомерКолонки = 0 По RecordSet.Fields.Count-1 Цикл
           СтрЗагл = СтрЗаменить(RecordSet.Fields.Item(НомерКолонки).Name,"-","_");
           Пока Не ТЗ_Запроса.Колонки.Найти(СтрЗагл) = Неопределено Цикл
               СтрЗагл = СтрЗагл + "_";
           КонецЦикла;
           ТЗ_Запроса.Колонки.Добавить(СтрЗагл,,RecordSet.Fields.Item(НомерКолонки).Name, 15);
       КонецЦикла;        
       
       // Перебор данных
       RecordSet.MoveFirst();                
       Пока RecordSet.EOF() = 0 Цикл
           СтрокаТаблицыЗначений = ТЗ_Запроса.Добавить();
           Для НомерКолонки = 0 По RecordSet.Fields.Count-1 Цикл
               СтрокаТаблицыЗначений[НомерКолонки] = RecordSet.Fields(RecordSet.Fields.Item(НомерКолонки).Name).Value;
               Если ТипЗНЧ(СтрокаТаблицыЗначений[НомерКолонки]) = Тип("Число") Тогда
                   СтрокаТаблицыЗначений[НомерКолонки] = СтрЗаменить(Формат(СтрокаТаблицыЗначений[НомерКолонки], "ЧРГ = '+'"),"+","");
               КонецЕсли;                
           КонецЦикла;
           RecordSet.MoveNext();  
           #Если Клиент Тогда
               Состояние("Обработано строк в запросе: " + ТЗ_Запроса.Количество());
           #КонецЕсли
       КонецЦикла;
       
       RecordSet.Close(); // После того, как набор записей уже не нужен, его нужно закрыть        
       // и убрать за собой в памяти
       RecordSet = Неопределено;
       Command = Неопределено;
       
       Возврат ТЗ_Запроса;    // запрос успешно отработал    
       
   Исключение
       
       // и убрать за собой в памяти
       RecordSet = Неопределено;
       Command = Неопределено;
       ОтладочноеСообщение();
       Возврат 0;  // ошибка
       
   КонецПопытки;
   
КонецФункЦии
17 shachneff
 
02.10.08
22:58
(16) Самое интересное - код не работает, если использовалась одна из двух разных строк подключения. Вот правильная (рабочая):

СтрокаПодключения = "Provider=MSDASQL.1;Password=123456;Persist Security Info=True;User ID=exch;Data Source=TradeX";
18 Semeon555777
 
03.10.08
01:20
Намудрили
Надо чтобы курсор был статический
и тогда RecordCount будет возвращать количество записей
Connection = Новый COMОбъект ("ADODB.Connection");    
Connection.CursorLocation= 3;
Закон Брукера: Даже маленькая практика стоит большой теории.