|
Запрос в 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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |