Имя: Пароль:
1C
1С v8
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
51 МихаилМ
 
30.08.13
12:40
GetRows
52 МихаилМ
 
30.08.13
12:41
+(51)
орефков год назад грозился сделать приблуду
v8: GameWithFire на сервере (Управляемое приложение)
53 МихаилМ
 
30.08.13
12:56
напишите хранимую процедуру, которая сериализует выборку в тз
сожмет, и получите через поле типа хранилище значений