|
ComОбъект. Быстрый способ загрузки результата запроса в ТЗ | ☑ | ||
---|---|---|---|---|
0
Любопытная
30.08.13
✎
11:38
|
Здравствуйте.
Имеется задача получить данные из сторонней БД на SQL. Для этого имеется запрос к этой БД и подключение к ней же через COM. Запрос на выходе дает 140 с гаком тысяч строк, которые тупым перебором в цикле заполняют ТЗ для дальнейшей обработки. Внимание вопрос: способы избавиться от тупого перебора есть? Так чтоб разом COMОбъект каким-то невероятным способом слить в ТЗ. Заранее признательна всем ответившим :) З.Ы. изначальный запрос обязательно переработаю. Потом как-нибудь) |
|||
1
Kreont
30.08.13
✎
11:39
|
РезультатТЗ = ЗапросОЛЕ.Выполнить().Выгрузить();
|
|||
2
Heckfy
30.08.13
✎
11:39
|
Запрос.выполнить().Выгрузить() не...
|
|||
3
Kreont
30.08.13
✎
11:40
|
(1) а сори у тебя не к 8-ке ОЛЕ :(
|
|||
4
Wobland
30.08.13
✎
11:40
|
решение для связки 1С-1С
ТаблицаПродаж=КОМ.ПолучитьТаблицуПродаж(ДатаНачала, ДатаОкончания); стрТаблицаПродаж=КОМ.ЗначениеВСтрокуВнутр(ТаблицаПродаж); ТЗ=ЗначениеИзСтрокиВнутр(стрТаблицаПродаж); |
|||
5
Rie
30.08.13
✎
11:43
|
(0) ComSafeArray - не поможет?
|
|||
6
Любопытная
30.08.13
✎
11:43
|
(1) У меня не Запрос в результате, у меня ComОбъект
|
|||
7
Wobland
30.08.13
✎
11:43
|
+(4) мой КОМ умел представить свою ТЗ в строковом виде. твой - видимо, нет. предлагаю предаться унынию
|
|||
8
ДенисЧ
30.08.13
✎
11:43
|
Существует такая вещь, как GameWithFire (внешняя компонента, бесплатная). Там есть метод выгрузки запроса в ТЗ.
|
|||
9
dk
30.08.13
✎
11:44
|
цепляемся к 1с 7.7 (с установленный 1С++)
обращаемся из 7.7 к внешней БД через 1c++ получаем ТЗ в 7.7 )) |
|||
10
Любопытная
30.08.13
✎
11:47
|
(9) Мне проще 5 минут подождать))
|
|||
11
Любопытная
30.08.13
✎
11:47
|
(5)Это что за зверь?
|
|||
12
H A D G E H O G s
30.08.13
✎
11:48
|
(10) 5 минут - это слишком долго. Подозреваю копрокот.
|
|||
13
H A D G E H O G s
30.08.13
✎
11:48
|
Но не вини себя. Ты просто девочка, им - простительно.
|
|||
14
Любопытная
30.08.13
✎
11:50
|
(13) Ты правильно подозреваешь. Скуль возвращает 145 тысяч строк, которые в отчете превращаются в 145 без тысяч. Но запрос к скулю писала не я, а какой-то великий гуру.
|
|||
15
H A D G E H O G s
30.08.13
✎
11:51
|
(14) Отчет - это ПостроительОтчета на основании ИсточникаДанных ?
|
|||
16
arsik
гуру
30.08.13
✎
11:51
|
(14) Я так полагаю, что разбираться с запросом к скулю, что бы возвращало сразу 145, вы не хотите?
|
|||
17
Любопытная
30.08.13
✎
11:51
|
(13) СКД
|
|||
18
Любопытная
30.08.13
✎
11:52
|
(16) Хочу. Но я же девочка, я же не умею)
|
|||
19
Rie
30.08.13
✎
11:52
|
(11) Если COMОбъект умеет возвращать значения в виде массива (например, Excel это умеет).
|
|||
20
Rie
30.08.13
✎
11:52
|
(18) Так показала бы запрос!
|
|||
21
Любопытная
30.08.13
✎
11:53
|
ТекстЗапроса = "SELECT
|ChequePos.ChequeId | ,ChequePos.Code | ,ChequeDisc.DiscType | ,Perc = (case (SUBSTRING(ChequeDisc.CardNumber,1,4)) | when '0417' then '3' | When '7896' then '3' | when '2541' then '10' | when '3800' then '15' | when '4000' then '15' | when '0125' then 'Роса 10' | when '0325' then 'Роса 5' | else '0' | end) |,GoodsGroup4_1.GroupName as group1 |,SUM(ChequePos.summa) AS summa |,SUM(ChequeDisc.DiscSumm) AS discsumma |FROM GoodsGroup4 AS GoodsGroup4_1 INNER JOIN | GoodsGroup4 ON GoodsGroup4_1.Id = GoodsGroup4.ParentId INNER JOIN | Goods4 ON GoodsGroup4.Id = Goods4.GroupId INNER JOIN | (ChequePos LEFT OUTER JOIN | ChequeDisc ON ChequePos.Id = ChequeDisc.PosId) INNER JOIN | ChequeHead ON ChequePos.ChequeId = ChequeHead.Id ON Goods4.Code = ChequePos.Code |Where ChequeHead.OperDay between 20130101 and 20130131 |GROUP BY ChequePos.Code,ChequeDisc.DiscType,SUBSTRING(ChequeDisc.CardNumber,1,4),ChequePos.ChequeId, GoodsGroup4_1.GroupName |--ORDER BY GoodsGroup4_1.GroupName"; |
|||
22
Любопытная
30.08.13
✎
11:54
|
Где-то что-то с группировками не так.
|
|||
23
arsik
гуру
30.08.13
✎
11:55
|
(18) Тогда шагом марш к плите, щи, пеленки и все такое.
|
|||
24
dk
30.08.13
✎
11:57
|
а переделываешь во что?
|
|||
25
Любопытная
30.08.13
✎
11:57
|
(23) :-Р
Я на мяско в щи кто мне денег даст? Ты обеспечивать будешь. Не уходите от темы |
|||
26
Alex375
30.08.13
✎
11:58
|
А теперь, что делается с результатом покажи :)
|
|||
27
Любопытная
30.08.13
✎
11:58
|
(24)там, как я понимаю нет группировки по группе. или не по группе... в общем, потом это преобразуется так:
ВЫБРАТЬ Таблица.ChequeId КАК НомерЧека, Таблица.Code КАК Код, Таблица.DiscType КАК ТипКарты, Таблица.Perc КАК Перц, Таблица.group1 КАК Группа1, Таблица.Summa КАК СуммаПродаж, Таблица.DiscSumma КАК СуммаДисконт, Таблица.SES ПОМЕСТИТЬ ВТ_Врем ИЗ &ВТ_Таблица КАК Таблица ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Врем.Группа1, СУММА(ВЫБОР КОГДА ВТ_Врем.Перц = "Роса 10" ТОГДА ВТ_Врем.СуммаПродаж ИНАЧЕ 0 КОНЕЦ) КАК Роса10Покупки, СУММА(ВЫБОР КОГДА ВТ_Врем.Перц = "Роса 10" ТОГДА ВТ_Врем.СуммаДисконт ИНАЧЕ 0 КОНЕЦ) КАК Роса10Скидка, СУММА(ВЫБОР КОГДА ВТ_Врем.Перц = "Роса 5" ТОГДА ВТ_Врем.СуммаПродаж ИНАЧЕ 0 КОНЕЦ) КАК Роса5Покупки, СУММА(ВЫБОР КОГДА ВТ_Врем.Перц = "Роса 5" ТОГДА ВТ_Врем.СуммаДисконт ИНАЧЕ 0 КОНЕЦ) КАК Роса5Скидка, СУММА(ВЫБОР КОГДА ВТ_Врем.Перц = "Роса 3" ТОГДА ВТ_Врем.СуммаПродаж ИНАЧЕ 0 КОНЕЦ) КАК Покупки3Процента, СУММА(ВЫБОР КОГДА ВТ_Врем.Перц = "Роса 3" ТОГДА ВТ_Врем.СуммаДисконт ИНАЧЕ 0 КОНЕЦ) КАК Дисконт3Процента, СУММА(ВЫБОР КОГДА ВТ_Врем.Перц = "10" ТОГДА ВТ_Врем.СуммаПродаж ИНАЧЕ 0 КОНЕЦ) КАК Покупки10Процентов, СУММА(ВЫБОР КОГДА ВТ_Врем.Перц = "10" ТОГДА ВТ_Врем.СуммаДисконт ИНАЧЕ 0 КОНЕЦ) КАК Дисконт10Процентов, СУММА(ВЫБОР КОГДА ВТ_Врем.Перц = "15" ТОГДА ВТ_Врем.СуммаПродаж ИНАЧЕ 0 КОНЕЦ) КАК Покупки15Процентов, СУММА(ВЫБОР КОГДА ВТ_Врем.Перц = "15" ТОГДА ВТ_Врем.СуммаДисконт ИНАЧЕ 0 КОНЕЦ) КАК Дисконт15Процентов, СУММА(ВЫБОР КОГДА ВТ_Врем.ТипКарты = "1048576" ТОГДА ВТ_Врем.СуммаПродаж ИНАЧЕ 0 КОНЕЦ) КАК Покупки25Часов, СУММА(ВЫБОР КОГДА ВТ_Врем.ТипКарты = "1048576" ТОГДА ВТ_Врем.СуммаДисконт ИНАЧЕ 0 КОНЕЦ) КАК Дисконт25Часов, СУММА(ВЫБОР КОГДА ВТ_Врем.ТипКарты = "256" ТОГДА ВТ_Врем.СуммаПродаж ИНАЧЕ 0 КОНЕЦ) КАК ИтогоДисконтПокупки, СУММА(ВЫБОР КОГДА ВТ_Врем.ТипКарты = "256" ТОГДА ВТ_Врем.СуммаДисконт ИНАЧЕ 0 КОНЕЦ) КАК ИтогоДисконт, СУММА(ВЫБОР КОГДА ВТ_Врем.ТипКарты ЕСТЬ NULL ТОГДА ВТ_Врем.СуммаПродаж ИНАЧЕ 0 КОНЕЦ) КАК ПокупкиБезСкидки, ВТ_Врем.SES ИЗ ВТ_Врем КАК ВТ_Врем СГРУППИРОВАТЬ ПО ВТ_Врем.Группа1, ВТ_Врем.SES |
|||
28
Rie
30.08.13
✎
11:59
|
Обращаешься к SQL через ADO?
|
|||
29
Alex375
30.08.13
✎
12:00
|
Все это можно в SQL перенести. Не особо сложно.
|
|||
30
Любопытная
30.08.13
✎
12:01
|
(29) верю! Но запуталась в 5 таблицах БД.
|
|||
31
Alex375
30.08.13
✎
12:02
|
Только вот что за поле "ses"? Откуда оно? В SQL такого не вижу.
|
|||
32
Любопытная
30.08.13
✎
12:02
|
(28) да
|
|||
33
Любопытная
30.08.13
✎
12:02
|
(31) адрес БД на сервере. Техническое поле, для вас оно не имеет никакого значения. Заполняется в цикле
|
|||
34
Rie
30.08.13
✎
12:03
|
(32) Тогда COMSafeArray можно использовать для получения результата - у ADODBRecordset есть метод GetRows.
Вот только потом этот массив - всё равно перебирать. |
|||
35
Любопытная
30.08.13
✎
12:05
|
(34) почему все равно перебирать? И какой тогда в этом смысл?
|
|||
36
Гефест
30.08.13
✎
12:13
|
Излови этого гуру и заставь переписать запрос. Или сама перепиши
|
|||
37
Любопытная
30.08.13
✎
12:15
|
(36)а то вы гуру не знаете. Вы же сами первым делом - "дура, сама виновата". Вот и сижу сама :)
Ладно, я все поняла. Спасибо за помощь |
|||
38
Alex375
30.08.13
✎
12:17
|
стукни в аську - я тебе запрос по SQL скину. Посмотришь - вдруг получится )
|
|||
39
Rie
30.08.13
✎
12:17
|
(37)
Возьми второй запрос (1С-овский). Перепиши по-английски. Двойные кавычки замени на одинарные. И название временной таблицы сделай латиницей. В первый запрос перед FROM добавь INTO #НазваниеТвоейВременнойТаблицыЛатиницей |
|||
40
Rie
30.08.13
✎
12:17
|
+(39) И выполни всё это в SQL
|
|||
41
Любопытная
30.08.13
✎
12:20
|
(39) не вывозит 1С временные таблицы. Этот вариант рассматривался вчера.
|
|||
42
Любопытная
30.08.13
✎
12:21
|
||||
43
Гефест
30.08.13
✎
12:22
|
(41) Причем тут 1С? Он тебе предлагает все в скуле сделать
|
|||
44
ДенисЧ
30.08.13
✎
12:22
|
SET NOCOUNT ON
|
|||
45
Rie
30.08.13
✎
12:23
|
(42) А не надо его закрывать. Создаёшь соединение - 1 (Одно). И в нём выполняешь запросы.
|
|||
46
Любопытная
30.08.13
✎
12:24
|
(45) вот сейчас не поняла вообще)
В общем, выкинула лишнее из скульного запроса, получила 243 строки в результате. Приемлимо) |
|||
47
Wobland
30.08.13
✎
12:25
|
(46) лемо
|
|||
48
romansun
30.08.13
✎
12:25
|
+1 к скулю
манипулировать ТЗ в 150 тыщ строк - это само по себе косячно, т.е. архитектурная ошибка (46) ура :) |
|||
49
Любопытная
30.08.13
✎
12:27
|
(47) тебе отдельное спасибо :)
(48) я вообще не поняла, что там к чему. Каким образом соотносятся дисконтные карты с продажами и как получаются суммы... Да и черт с ним. Пусть сами разбираются, раз рассказывать не хотят |
|||
50
Serginio1
30.08.13
✎
12:32
|
v8: Запрос SQL
см 31 |
|||
51
МихаилМ
30.08.13
✎
12:40
|
GetRows
|
|||
52
МихаилМ
30.08.13
✎
12:41
|
+(51)
орефков год назад грозился сделать приблуду v8: GameWithFire на сервере (Управляемое приложение) |
|||
53
МихаилМ
30.08.13
✎
12:56
|
напишите хранимую процедуру, которая сериализует выборку в тз
сожмет, и получите через поле типа хранилище значений |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |