Имя: Пароль:
1C
1С v8
Запрос в sql из 1с
,
0 untru
 
27.08.11
12:20
Подскажите плиз !
В написанной  обработке такая задача:

у меня идет выполнение запроса конекчусь к базе sql (    Подключение = Новый ComObject("ADODB.Connection");)
далее такой код
 
   ResSQL = Подключение.Execute(Текст);
   Пока ResSQL.EOF=0 Цикл              
       
       Для каждого стр из ResSQL.Fields Цикл
                 //Получаю данные таблицы fields
                 .......
               КонецЦикла
           ResSQL.MoveNext();
       КонецЦикла;


Все отлично.. но вот хочется узнать количество строчек в запросе
тоесть сколько он раз первый цикл пройдет  .. нет ли какого нибудь метода на подобии 1сного .количество()  ???
1 untru
 
27.08.11
12:22
пробовал ResSQL.count()  - программа меня послала)))
2 Рэйв
 
27.08.11
12:23
.Count  без скобок попробуй
3 untru
 
27.08.11
12:26
Нет, не работает  Табло свойства такие показывает.. я так понимаю количество - это не свойство а метод, так?

ResSQL    COMОбъект    COMОбъект
   AbsolutePage    -1    Число
   AbsolutePosition    -1    Число
   ActiveCommand        Неопределено
   ActiveConnection    COMОбъект    COMОбъект
   BOF    Ложь    Булево
   Bookmark    Ошибка чтения значения    
   CacheSize    1    Число
   CursorLocation    2    Число
   CursorType    0    Число
   DataMember    ""    Строка
   DataSource    COMОбъект    COMОбъект
   EOF    Ложь    Булево
   EditMode    0    Число
   Fields    COMОбъект    COMОбъект
   Filter    0    Число
   Index    ""    Строка
   LockType    1    Число
   MarshalOptions    0    Число
MaxRecords    0    Число
PageCount    -1    Число
PageSize    10    Число
Properties    COMОбъект    COMОбъект
RecordCount    -1    Число
Sort    ""    Строка
Source    "EXECUTE [mcc_patero].[dbo].[patero_list_of_invoices] @D1='2011.03.01', D2='2011.03.02'"    Строка
State    1    Число
Status    0    Число
StayInSync    Истина    Булево
4 ненавистник
 
27.08.11
12:32
попробуй RecrordCount(), или зайди в отладчик и посмотри какие свойства есть у твоего объекта ResSQl
5 untru
 
27.08.11
12:34
(4)  у RecrordCount() постоянно -1
свойства я выложил в сообщении (3)
6 untru
 
27.08.11
12:35
и свойства не меняються\... меняеться только содержимое Fields
7 ненавистник
 
27.08.11
12:37
так может у тебя твой запрос не возвращает ни единой строки?
8 untru
 
27.08.11
12:40
(7) точно возвращает
в Fields  -  где моя таблица ()
я получаю своим запросом порядка 1000 строк   их обрабатываю...
все работает хорошо, просто захотелось сделать индикатор загрузки, на основании количества строк
9 ДенисЧ
 
27.08.11
12:43
скорее всего, не получится. У адо глючный recordCount(). Сделай два раза запрос, первый выполняет его и считает count(*), вотрой выполняет и отдаёт данные.
10 AlexNew
 
27.08.11
12:47
(9) А пацаны то не знают. (с)
11 ДенисЧ
 
27.08.11
12:50
(10) судя по всему - действительно не знают.
12 AlexNew
 
27.08.11
12:51
(11) Не кури стлоько.
13 ДенисЧ
 
27.08.11
12:52
(12) сколько?
14 AlexNew
 
27.08.11
12:54
(13) Много.
15 ДенисЧ
 
27.08.11
12:55
(14) Выдыхай. Лучше ответ ТС дай. Если поможет ему, я публично признАю свою неправоту.
16 AlexNew
 
27.08.11
12:59
(17) ResSQL.Fields при чем здесь строчки? С ДНК помочь не могу.
17 AlexNew
 
27.08.11
13:01
(15) Ну, если хочешь
Пока  НЕ ResSQL.EOF()
18 ДенисЧ
 
27.08.11
13:03
(16) причём тут филдсы?
см (5)
19 ДенисЧ
 
27.08.11
13:04
да, и (0) внимательно почитай
а потом (8)
20 untru
 
27.08.11
13:09
(9) ну я думаю это не вариант , ради индекатора в 2 раза дольше загружать систему((
21 AlexNew
 
27.08.11
13:11
Пусть Open вместо Execute поставит. Можно еще почитать...
22 ДенисЧ
 
27.08.11
13:12
(20) Как ваиант - выгружать в временную таблицу. Нагрузки меньше.
(21) а ты таки приведи рабочий примерчик...
23 untru
 
27.08.11
13:17
(21)
{Форма.Форма.Форма(488)}: Ошибка при вызове метода контекста (Open)
   ResSQL = Подключение.Open(Текст);
по причине:
Произошла исключительная ситуация (ADODB.Connection): Операция не допускается, если объект открыт.
24 ДенисЧ
 
27.08.11
13:18
(23) execute убери :-)
25 AlexNew
 
27.08.11
13:19
(24) Признавайся (15)
26 ДенисЧ
 
27.08.11
13:20
(25) не вижу решения, котьорое заработало у ТС. Так что рано.
27 AlexNew
 
27.08.11
13:21
(26) Оно у него может не заработать никогда.
28 ДенисЧ
 
27.08.11
13:22
(27) вот тебе и ответ. Пока не заработает, не (15).
29 untru
 
27.08.11
13:22
(24) Откуда?
если я пишу текст:

Текст = "EXECUTE [mcc_patero].[dbo].[patero_list_of_invoices] @D1='2011.03.01', D2='2011.03.02'"
   
ResSQL = Подключение.Open(Текст);

пишет ошибку (23)  откуда брать EXECUTE ? Из текста?
30 untru
 
27.08.11
13:23
убрать  (опечатка)
31 AlexNew
 
27.08.11
13:23
(28) Не дождусь, не заработает.
32 ДенисЧ
 
27.08.11
13:24
(29) это к (21).
Вон он как упорствует....
33 untru
 
27.08.11
13:25
Ну если уж на то пошло то курить вредно))!
34 ДенисЧ
 
27.08.11
13:25
фу, как пошло :-)
35 AlexNew
 
27.08.11
13:26
Стоп, ты процедуру тащишь? Смотри, что она возвращает.
36 МихаилМ
 
27.08.11
13:28
если не возвращает каунт
значит не подходящий тип курсора.
37 ДенисЧ
 
27.08.11
13:30
А вот и кЭп подтянулся....
38 AlexNew
 
27.08.11
13:31
(36) Надо смотреть, что вообще она возвращает.
39 untru
 
27.08.11
13:32
а теперь 2 признания
1. я завязал с курением
2. я не знаю sql
мне  подсунули процедуру и сказали как ее вызвать: EXECUTE [mcc_patero].[dbo].[patero_list_of_invoices]
дальше я все сделал на интуиции
так как см пункт 2  то (36) - для меня не понятно ибо я не знаю что такое курсор

(38)  я смотрел как уже писал в (3)
40 untru
 
27.08.11
13:36
впринцепи вопрос не актуальный уже ( я просто решил нее делать индикатор)
хотя всеравно интересно реально ли узнать количество
41 AlexNew
 
27.08.11
13:37
Все равно не поможет, хотя бы узнай, что эта процедура возвращает, раз сам посмотреть не можешь.
42 AlexNew
 
27.08.11
13:38
(40) Нее читать как беее?
43 ДенисЧ
 
27.08.11
13:39
(40) я предлжил вариант :-)

а вообще, поиграйся параметрами подключения...
44 AlexNew
 
27.08.11
13:43
(43) Чево???
45 ДенисЧ
 
27.08.11
13:44
(44)
46 ДенисЧ
 
27.08.11
13:44
Use the RecordCount property to find out how many records are in a Recordset object. The property returns -1 when ADO cannot determine the number of records or if the provider or cursor type does not support RecordCount. Reading the RecordCount property on a closed Recordset causes an error.
47 AlexNew
 
27.08.11
13:48
(46) Что это было? К чему?
48 ДенисЧ
 
27.08.11
13:52
(47) к тому, что не всегда recordCount() вернёт количество записей.
49 _Atilla
 
27.08.11
13:59
(0) Попробуй перейти в конец рекордсета.
Потом RecordCount ...
50 AlexNew
 
27.08.11
14:01
(48) Если не подключиться, он вообще по ошибке вывалится. Мы о чем говорим?
51 ДенисЧ
 
27.08.11
14:02
(50) "when ADO cannot determine the number of records or if the provider or cursor type does not support RecordCount."

перевод на русский - 10 евро за слово.
52 Kookish
 
27.08.11
14:11
(9) (46) Вы меня извините, господа, что встреваю в вашу дискуссию, но разве "property" переводится как "метод" а не "свойство"?
53 ДенисЧ
 
27.08.11
14:14
952) нет
54 Kookish
 
27.08.11
14:15
55 Kookish
 
27.08.11
14:15
A Better "Count" Alternative

There is a better way. The problem is that by changing your cursor type or location to something less optimized for speed, is that the code that actually uses the Recordset will suffer, all because you just needed to use the RecordCount property. This is no good. So, a better approach to getting a count? Simple, break it up into two parts. First, use the server to perform the count using a select count(*) from table. Second, open the data using an optimized server-side, read-only, & forward-only Recordset that you'll use for the actual data processing.

It is a little extra work, but the payoff will make it worth it if you have a lot of work to do with the data in the Recordset. Let's look at an example.

Dim objRS

   Set objRS = CreateObject("ADODB.Recordset")
   With objRS
       ' set cursor properties
       .CursorLocation = adUseServer
       .CursorType = adOpenForwardOnly
       ' set lock type
       .LockType = adLockReadOnly
       ' set connection for Recordset
       Set .ActiveConnection = Application.GetNewConnection

       ' Get record count
       .Open "select count(*) from account"
       MsgBox .fields(0).value & " records"

       ' Now close Recordset and reopen with data to be processed
       If .State = adStateOpen Then .Close
       .Open "select account, type from account"

       ' Do some useless processing...
       While Not (.BOF Or .EOF)
             Listbox1.Items.Add .Fields("account").value & ""
             .MoveNext
       Wend
       .Close
   End With
   Set objRS = Nothing    


In that example, I created my Recordset and set up the cursor & lock properties so it is optimized for the heavy processing I was about to perform. I opened the query to count the records, then closed it and reopened the Recordset with the actual data I'll need for the heavy data processing.
56 skigs
 
27.08.11
14:22
(0) ADODB.Command
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший