Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Запрос из 1С к SQL не 1С. (число прочтений - 12241 )
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #15 - 29. Января 2007 :: 08:16
Печать  
Покажи полный код работы через ТаблицуЗначений, наподобие того, что ты дал в первом сообщении.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #16 - 29. Января 2007 :: 08:19
Печать  
Процедура ЗагрКомпоненту()
    //Загружаем компоненту
    Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "1CPP.DLL")=0 Тогда
       ок=0;
    КонецЕсли;
КонецПроцедуры
//*******************************************
Процедура  Сформировать()
     
     ТЗSQL = СоздатьОбъект("ТаблицаЗначений");
     
     Запрос = "SELECT 
     |    ARTIKLS.ANUMB AS ARTICLE_PROF,
     |    ARTSVST.ASKL1 AS ARTICLE_SKLAD,
     |    ARTSVST.ASKL2 AS ARTICLE_1C,
     |    ARTIKLS.ANAME AS NOMNAME,
     |    ARTSVST.CLPRV AS TARIF_ED_IZM,
     |    COLSLST.CNAME AS CVET_TEKSTURI,
     |    COLSLST.CNAMP AS CVET_ARTICLE,
     |    ARTSVST.CLPRC AS TARIF_OSN_TEKSTURI,
     |    ARTSVST.CLPR1 AS TARIF_VNUTR_TEKSTURI,
     |    ARTSVST.CLPR2 AS TARIF_VNESHN_TEKSTURI,
     |    ARTSVST.CLPRA AS TARIF_DVUHSTORONNEY_TEKSTURI,
     |    GRUPART.MNAME AS NOMGRUPNAME,
     |    GRUPART.MUNIC AS GRUPUNICNOMER,
     |    ARTIKLS.NUNIC AS KATEGORYUNICNOMER,
     |    ARTIKLS.APREF AS KATEGORY,
     |    ARTIKLS.ANAMP AS NOMNAMECONTR,
     |    CORRENC.CNAME AS VALUTE,
     |    CASE
     |        WHEN ARTIKLS.ATYPI = 1 THEN 'пог.м.'
     |        WHEN ARTIKLS.ATYPI = 2 THEN 'м.кв.'
     |        WHEN ARTIKLS.ATYPI = 3 THEN 'шт'
     |        WHEN ARTIKLS.ATYPI = 5 THEN 'компл.'
     |        ELSE 'неизвестно'
     |    END AS ED_IZM
     |
     |   FROM COLSLST
     |   RIGHT OUTER JOIN ARTSVST ON (COLSLST.CNUMB = ARTSVST.CLNUM)
     |   RIGHT OUTER JOIN ARTIKLS ON (ARTSVST.ANUMB = ARTIKLS.ANUMB)
     |   LEFT OUTER JOIN CORRENC ON (ARTIKLS.CNUMB = CORRENC.CNUMB)
     |   LEFT OUTER JOIN GRUPART ON (ARTIKLS.MUNIC = GRUPART.MPREF)
     |";
     
     
     
     Попытка
           ЛокDB = СоздатьОбъект("ODBCDataBase");
     Исключение
           Сообщить(ОписаниеОшибки());
           Сообщить("Компонента 1С++ не обнаружена","!!");
           Возврат;
     КонецПопытки;
     ЛокODBC = СоздатьОбъект("ODBCRecordSet");
     Сообщить("Начало соединения: " + ТекущееВремя());   
     ЛокDB.Соединение("DRIVER={Gemini InterBase ODBC Driver 2.0};uid=SYSDBA;pwd=masterkey;database=C:\ProfSegment\Profstroy3\BASE.gdb");   
     
     Если ЛокDB.ЕстьСоединение() = 1 Тогда
           Сообщить("Конец соединения: " + ТекущееВремя());
     Иначе
           Сообщить(ЛокODBC.ПолучитьОписаниеОшибки());
           Возврат;
     КонецЕсли;
     
     ЛокODBC.УстБД(ЛокDB);
     ТЗSQL = ЛокODBC.ВыполнитьИнструкцию(Запрос, , 1);
     Сообщить("В ТЗSQL находится " + Строка(ТЗSQL.КоличествоСтрок()) + " строк.");
     Сообщить("Конец : " + ТекущееВремя());
     ЗначениеВФайл(КаталогИБ() + "Профстрой", ТЗSQL, 1);
     ЛокDB.Закрыть();
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #17 - 29. Января 2007 :: 08:24
Печать  
Скорость выполнения даже меньше, чем простым перебором...
Начало работы в 10-44 сейчас 11-20 и еще не конец...
  
Наверх
 
IP записан
 
RaiN
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 10
Зарегистрирован: 26. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #18 - 29. Января 2007 :: 08:27
Печать  
KARLSON писал(а) 29. Января 2007 :: 08:19:
....
     
     ЛокODBC.УстБД(ЛокDB);
     ТЗSQL = ЛокODBC.ВыполнитьИнструкцию(Запрос, , 1);
     Сообщить("В ТЗSQL находится " + Строка(ТЗSQL.КоличествоСтрок()) + " строк.");
     Сообщить("Конец : " + ТекущееВремя());
     ЗначениеВФайл(КаталогИБ() + "Профстрой", ТЗSQL, 1);
     ЛокDB.Закрыть();


А где код который выдаёт вот эту красоту?

Код
Выбрать все
Начало соединения: 00:42:54
Конец соединения: 00:42:54
Начало выполнения запроса: 00:42:54
Начало проход по запросу: 00:43:13
100 : 00:43:26
200 : 00:43:26
300 : 00:45:00
400 : 00:45:05
500 : 00:45:10
600 : 00:45:17
...
 

  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #19 - 29. Января 2007 :: 08:31
Печать  
Обработка была возвращена в исходное состояние т.е. без ТЗSQL и восстанавливал в окошке форума.
Эту крастоту в таком контексте не выдаш т.к. не перебора по строкам сразу в ТЗ...
Начало соединения: 10:44:37
Конец соединения: 10:44:37
Начало выполнения запроса: 10:44:37
Конец : 11:19:04
  
Наверх
 
IP записан
 
villy
Senior Member
****
Отсутствует



Сообщений: 287
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #20 - 29. Января 2007 :: 08:31
Печать  
KARLSON ты это сообщение прочитал или воплотил в жизнь?

Arta писал(а) 28. Января 2007 :: 21:08:
KARLSON писал(а) 28. Января 2007 :: 20:29:
Поясните пожалуйста....какие индексы?


так... сперва нужны азы. идешь на www.sql.ru, и читаешь факи.
Индексы нужны на:
COLSLST.CNUMB, ARTSVST.CLNUM
ARTSVST.ANUMB, ARTIKLS.ANUMB
ARTIKLS.CNUMB, CORRENC.CNUMB
ARTIKLS.MUNIC, GRUPART.MPREF


Время выполнения такого запроса при попадении в индекс от силы доля секунды.

  
Наверх
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #21 - 29. Января 2007 :: 08:36
Печать  
Это сообщение прочитал. В жизнь не воплотил т.к. скорость выполнения запроса устраивает 19 сек.
  
Наверх
 
IP записан
 
RaiN
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 10
Зарегистрирован: 26. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #22 - 29. Января 2007 :: 08:37
Печать  
Цитата:
KARLSON ты это сообщение прочитал или воплотил в жизнь?

Arta писал(а) 28. Января 2007 :: 21:08:
KARLSON писал(а) 28. Января 2007 :: 20:29:
Поясните пожалуйста....какие индексы?


так... сперва нужны азы. идешь на www.sql.ru, и читаешь факи.
Индексы нужны на:
COLSLST.CNUMB, ARTSVST.CLNUM
ARTSVST.ANUMB, ARTIKLS.ANUMB
ARTIKLS.CNUMB, CORRENC.CNUMB
ARTIKLS.MUNIC, GRUPART.MPREF


Время выполнения такого запроса при попадении в индекс от силы доля секунды.




Присоединяюсь, т.к. проблема с базой. Если строк в исходных таблица несколько десятков тысяч, то 19 мин. нормальное время выполнения запроса.
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #23 - 29. Января 2007 :: 08:40
Печать  
19 СЕКУНД.
     Сообщить("Начало выполнения запроса: " + ТекущееВремя());
     Если ЛокODBC.Открыть(Запрос) = 0 Тогда
           Сообщить("Запрос не выполнен!", "!!!");
           Возврат;
     //Иначе
     //      Сообщить("В запрос попало " + ЛокODBC.СтрокОбработанно());
     КонецЕсли;
     Если ЛокODBC.ВыборкаОткрыта() = 0 Тогда
           Сообщить("Выборка не открыта", "!!!");
     КонецЕсли;
     
     Сообщить("Начало проход по запросу: " + ТекущееВремя());
Начало выполнения запроса: 00:42:54
Начало проход по запросу: 00:43:13
  
Наверх
 
IP записан
 
RaiN
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 10
Зарегистрирован: 26. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #24 - 29. Января 2007 :: 08:43
Печать  
KARLSON писал(а) 29. Января 2007 :: 08:40:
19 СЕКУНД.
     Сообщить("Начало выполнения запроса: " + ТекущееВремя());
     Если ЛокODBC.Открыть(Запрос) = 0 Тогда
           Сообщить("Запрос не выполнен!", "!!!");
           Возврат;
     //Иначе
     //      Сообщить("В запрос попало " + ЛокODBC.СтрокОбработанно());
     КонецЕсли;
     Если ЛокODBC.ВыборкаОткрыта() = 0 Тогда
           Сообщить("Выборка не открыта", "!!!");
     КонецЕсли;
     
     Сообщить("Начало проход по запросу: " + ТекущееВремя());
Начало выполнения запроса: 00:42:54
Начало проход по запросу: 00:43:13



И какой код дальше?
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #25 - 29. Января 2007 :: 08:44
Печать  
В первом посте
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #26 - 29. Января 2007 :: 08:50
Печать  
Я ничего не понял. Перечел с момента моего последнего поста и ничего не понял.
то запрос выполняется с 10:44 до 11:20, то 19 секунд. То устраивает, то нет...

Данные с сервера получил? За 19 сек? Это тебя устраивает? /меня бы не устроили такие тормоза/
В чем проблема теперь?
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос из 1С к SQL не 1С.
Ответ #27 - 29. Января 2007 :: 08:52
Печать  
И зачем ты пользуешь:
ЛокODBC.Открыть(Запрос), ЛокODBC.ВыборкаОткрыта()?

Я нужный код тебе написал. Остается его только доделать под выгрузку и все.
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #28 - 29. Января 2007 :: 08:58
Печать  
Он скорее всего(т.к. если закрыть в ТаскМанагере FBSERV.exe ТЗSQL выйдет с тем количеством строк  которое успела получить) везде выполняется 19 секунд.

Только если мы не грузим в ТаблицуЗначений можно узнать за сколько выполнился запрос т.к. запрос выполняется, а потом начинается процесс получения данных (Который и тормозит т.е. ~34 минуты).


ЛокODBC.Открыть(Запрос);
~19 сек.
Пока ЛокODBC.След() = 1 Цикл
и т.д.

При методе
ТЗSQL = ЛокODBC.ВыполнитьИнструкцию(Запрос, , 1);
Запрос выполняется и начинается заполнение ТЗSQL и я не могу сказать время выполнения запроса т.к. 1С в это время висит
  
Наверх
 
IP записан
 
KARLSON
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 27. Января 2007
Re: Запрос из 1С к SQL не 1С.
Ответ #29 - 29. Января 2007 :: 09:00
Печать  
Я воспользовался Вашим советом, но ничего не поменялось

    Попытка
          ЛокDB = СоздатьОбъект("ODBCDataBase");
     Исключение
          Сообщить(ОписаниеОшибки());
          Сообщить("Компонента 1С++ не обнаружена","!!");
          Возврат;
     КонецПопытки;
     ЛокODBC = СоздатьОбъект("ODBCRecordSet");
     Сообщить("Начало соединения: " + ТекущееВремя());   
     ЛокDB.Соединение("DRIVER={Gemini InterBase ODBC Driver 2.0};uid=SYSDBA;pwd=masterkey;database=C:\ProfSegment\Profstroy3\BASE.gdb");    
     
     Если ЛокDB.ЕстьСоединение() = 1 Тогда
          Сообщить("Конец соединения: " + ТекущееВремя());
     Иначе 
          Сообщить(ЛокODBC.ПолучитьОписаниеОшибки());
          Возврат;
     КонецЕсли; 
     
     ЛокODBC.УстБД(ЛокDB);
     ТЗSQL = ЛокODBC.ВыполнитьИнструкцию(Запрос, , 1); 
Выполняется такое же количество времени...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать