Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Помогите сделать простой запрос! (число прочтений - 5060 )
Dmb-dima
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 12. Ноября 2009
Помогите сделать простой запрос!
12. Ноября 2009 :: 08:59
Печать  
Я только учусь делать прямые запросы, нужна помошь.

Есть справочник, нужно с помощью запроса выбрать все элементы!

Что делаю: пишу

БД = СоздатьОбъект("OLEDBData");  
Каталог = ?(Прав(КаталогИБ(), 1) = "\", Лев(КаталогИБ(), СтрДлина(КаталогИБ()) - 1), КаталогИБ());

Рез = БД.Соединение("
           |Provider=VFPOLEDB.1;
           |Set Deleted=Yes;
           |Null = Yes;
           |Exclusive = No;
           |SourceType = DBF;
           |Data Source=" + КаталогИБ() + ";
           |Mode=ReadWrite;
           |Extended Properties="""";
           |User ID="""";
           |Password="""";
           |Mask Password=False;
           |Collating Sequence=MACHINE;
           |DSN=""""");
           
Запрос = СоздатьОбъект("ODBCRecordset");

ТекстЗапроса = "
|Спр.Code as Код,
|Спр.Descr as Наименование
|FROM
|SC12 as Спр";

ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);

Все прроходит нормально, соединение происходит, но на ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса) возникает ошибка : База данных не установлена

Что я делаю неправильно: 1Срр.dll есть, драйвер FoxPro установлен (если конечно он правильно установился). Смущённый
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Помогите сделать простой запрос!
Ответ #1 - 12. Ноября 2009 :: 09:17
Печать  
Базу установи.
Читай про УстБД()
  
Наверх
 
IP записан
 
Dmb-dima
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 12. Ноября 2009
Re: Помогите сделать простой запрос!
Ответ #2 - 12. Ноября 2009 :: 09:58
Печать  
Запрос.УстБД1С() установил.

Теперь команда ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса) не выдает ошибку, но почему - то результат  ВыполнитьИнструкцию(ТекстЗапроса) = 0, хотя в справочник не пустой!
Может неправильно делаю запрос? Нерешительный
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Помогите сделать простой запрос!
Ответ #3 - 12. Ноября 2009 :: 10:03
Печать  
Dmb-dima писал(а) 12. Ноября 2009 :: 09:58:
Запрос.УстБД1С() установил.

Теперь команда ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса) не выдает ошибку, но почему - то результат  ВыполнитьИнструкцию(ТекстЗапроса) = 0, хотя в справочник не пустой!
Может неправильно делаю запрос? Нерешительный


Может и неправильно. Я лично селекта не увидел.
  
Наверх
 
IP записан
 
Dmb-dima
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 12. Ноября 2009
Re: Помогите сделать простой запрос!
Ответ #4 - 12. Ноября 2009 :: 10:09
Печать  
Привожу еще раз свой запрос:
ТекстЗапроса = "
|SELECT
|Спр.Code as Код,
|Спр.Descr as Наименование
|FROM
|$Справочник.Клиент1 as Спр";
           
Если Запрос.ВыполнитьИнструкцию(ТекстЗапроса) = 1 Тогда 
     Предупреждение("Запрос выполнен!");
КонецЕсли;

Возвращает 0, но почему Справочник Клиент1 полный? Нерешительный
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите сделать простой запрос!
Ответ #5 - 12. Ноября 2009 :: 10:12
Печать  
Для объекта OLEDBData надо создавать объект OLEDBCommand, а не ODBCRecordset
  
Наверх
 
IP записан
 
Dmb-dima
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 12. Ноября 2009
Re: Помогите сделать простой запрос!
Ответ #6 - 12. Ноября 2009 :: 10:58
Печать  
Всем Спасибо все заработало Улыбка

Есть еще одна просьба, как можно с помощью прямого запроса изменить мой перебор по подчиненному справочнику:
Исходный код:

Спр = СоздатьОбъект("Справочник.Улицы1");
СпрК = СоздатьОбъект("Справочник.Клиент1");
     
Если Спр.НайтиЭлемент(Улица) = 1 Тогда
     СпрК.ИспользоватьВладельца(Спр);
     СпрК.ВыбратьЭлементы();
     Пока СпрК.ПолучитьЭлемент() = 1 Цикл
           НоваяСтрока();
           ЛицСчет  = СпрК.Код;
           Фио      = СпрК.ТекущийЭлемент();
           Адрес    = СпрК.Улица.Наименование;
     КонецЦикла;
КонецЕсли;

Этим способом из подчиненного справочника долго вытягивает информацию в документ, как можно этот код перобразовать  в прямой запрос?  Озадачен
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Помогите сделать простой запрос!
Ответ #7 - 12. Ноября 2009 :: 12:16
Печать  
Как вариант выполнить запрос и грузануть ТЗ в табличную часть.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Dmb-dima
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 12. Ноября 2009
Re: Помогите сделать простой запрос!
Ответ #8 - 12. Ноября 2009 :: 12:51
Печать  
Если можно как правильно составить прямой запрос к подчиненному справочнику очень.

Допустим имеется справочник Улицы, этому  справочн подчинен  справочник Клиенты.

Нужно из формы документа выбрать справочник Улицы, а затем написать запрос, который бы находил все подчиненные справочники Клиенты.

Вот мой текст запроса, он не работае:

ТекстЗапроса = "
|SELECT
|Спр.ID as [Элемент $Справочник.Клиент1]
|FROM
|      $Справочник.Клиент1 as Спр
|WHERE
|      $Справочник.Клиент1 = :Улица~";

Озадачен

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


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Помогите сделать простой запрос!
Ответ #9 - 12. Ноября 2009 :: 13:35
Печать  
Код
Выбрать все
select
 спрКлиенты.id [Клиент $Справочник.Клиенты]
from
 $Справочник.Улицы спрУлицы
inner join
 $Справочник.Клиенты спрКлиенты on спрКлиенты.parentext = спрУлицы.id
where
 спрУлицы.id = :выбУлица 

  
Наверх
 
IP записан
 
Dmb-dima
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 12. Ноября 2009
Re: Помогите сделать простой запрос!
Ответ #10 - 12. Ноября 2009 :: 13:55
Печать  
Запрос переписал, выкидывает ошибку :

Meta name parser error: не указан параметр ":выбУлица"

|where
|СпрУлицы.id = :выбУлица;

выбУлица - Справочник улиц, он находится на форме доумента
Как правильно обратиться к Справочнику выбУлица

  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите сделать простой запрос!
Ответ #11 - 12. Ноября 2009 :: 13:57
Печать  
Может всё-таки документацию почитаешь и учебник?
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Помогите сделать простой запрос!
Ответ #12 - 12. Ноября 2009 :: 14:02
Печать  
RS.УстановитьТекстовыйПараметр("выбУлица",выбранныйЭлементСправочникаНаФорме)
и, да, документацию почитать стоит
  
Наверх
 
IP записан
 
Dmb-dima
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 12. Ноября 2009
Re: Помогите сделать простой запрос!
Ответ #13 - 12. Ноября 2009 :: 16:01
Печать  
Спасибо за совет монускрипты потиху читаю, разбираюсь. Я начинающий и сразу объять необъятное немогу. Из ручного хелпа я понимаю больше чем литературу.

Все после проделаных операций  запрос работает. Всем спасибо за подсказки.

Еще одна проблемка, суть ее таков:

После выполнения запроса, выкладываю его полностью:
ТекстЗапроса = "            
|select
|спрКлиенты.id as [Клиент $Справочник.Клиент1],
|$спрКлиенты.Улица as [Улица $Справочник.Улицы1],
|$спрКлиенты.Дом as [Дом $Строка],
|$спрКлиенты.КолКв as [КолКв $Число]
|from
|$Справочник.Улицы1 as спрУлицы
|inner join
|$Справочник.Клиент1 спрКлиенты on спрКлиенты.parentext = спрУлицы.id
|where
|спрУлицы.id = :ТекущийЭлемент";
                 
                 Запрос.УстановитьТекстовыйПараметр("ТекущийЭлемент",ТекущийЭлемент());
ТЗ =  Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
Табл.Загрузить(ТЗ);
Табл.Свернуть("Улица,Дом","КолКв");

Я замерер производительность, оказалось, что прямой запрос выполняется очень быстро (что порадовало новичка), штатным перебором в 1С это делается гораздо дольше(почему и стал искать др. способ решения проблемы.

Дело в том что справочник Улица имеет подчиненный справочник Клиент, содержимое этого справочника содержит где-то для каждой улицы от 5000 до 15000 объектов.

Моя задача после запроса выбросить все это добро на экран пользователя через Таблицу значений.

Когда я выполняю Табл.агрузить(ТЗ) а потом Табл.Свернуть("Улица,Дом","КолКв"), то именно этот момент забирает много процессорного времени (85%).

Теперь у меня стоит вопрос, а нельзя ли в прямом запросе
применить какой нибудь механизм, чтобы в запросе свернуть все повторяющиеся сроки в одну, а количество свернутых строк получить в какую-нибудь пременку?. Озадачен


  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите сделать простой запрос!
Ответ #14 - 12. Ноября 2009 :: 17:45
Печать  
Конечно можно, даже нужно. Примерно так:
Код
Выбрать все
ТекстЗапроса = "
|select
|MAX(спрКлиенты.id) as [Клиент $Справочник.Клиент1],
|$спрКлиенты.Улица as [Улица $Справочник.Улицы1],
|$спрКлиенты.Дом as [Дом $Строка],
|SUM($спрКлиенты.КолКв) as [КолКв $Число]
|from
|$Справочник.Улицы1 as спрУлицы
|inner join
|$Справочник.Клиент1 спрКлиенты on спрКлиенты.parentext = спрУлицы.id
|where
|спрУлицы.id = :ТекущийЭлемент
|GROUP BY $спрКлиенты.Улица, $спрКлиенты.Дом"; 


И эта... по t-sql тоже что-нибудь прочти. Там ключевых слов-то с гулькин нос
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Помогите сделать простой запрос!
Ответ #15 - 12. Ноября 2009 :: 17:46
Печать  
Dmb-dima писал(а) 12. Ноября 2009 :: 16:01:
Спасибо за совет монускрипты потиху читаю, разбираюсь. Я начинающий и сразу объять необъятное немогу.
...
ТекстЗапроса = "..."
...
Теперь у меня стоит вопрос, а нельзя ли в прямом запросе
применить какой нибудь механизм, чтобы в запросе свернуть все повторяющиеся сроки в одну, а количество свернутых строк получить в какую-нибудь пременку?. Озадачен

Код
Выбрать все
|select
|спрКлиенты.id as [Клиент $Справочник.Клиент1],
|$спрКлиенты.Улица as [Улица $Справочник.Улицы1],
|$спрКлиенты.Дом as [Дом $Строка],
|SUM($спрКлиенты.КолКв) as [КолКв $Число]
|from
|$Справочник.Улицы1 as спрУлицы
|inner join
|$Справочник.Клиент1 спрКлиенты on спрКлиенты.parentext = спрУлицы.id
|where
|спрУлицы.id = :ТекущийЭлемент
|GROUP BY спрКлиенты.id,
|$спрКлиенты.Улица,
|$спрКлиенты.Дом";

			Запрос.УстановитьТекстовыйПараметр("ТекущийЭлемент",ТекущийЭлемент());
Табл =  Запрос.ВыполнитьИнструкцию(ТекстЗапроса); 


Табл.Загрузить(ТЗ);
Табл.Свернуть("Улица,Дом","КолКв");
Короче, кроме учебника по 1С++ надо еще и учебник по MSSQL
  
Наверх
ICQ  
IP записан
 
Dmb-dima
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 12. Ноября 2009
Re: Помогите сделать простой запрос!
Ответ #16 - 12. Ноября 2009 :: 19:07
Печать  
Всем Helperam Спасибо, свою проблему я одолел. Теперь запрос улетает в космос.

Прямые запросы это сила! Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать