Переключение на Главную Страницу Страницы: [1] 2 3 ... 5 ОтправитьПечать
Очень популярная тема (более 25 ответов) Инспекция прямого запроса (число прочтений - 20636 )
Злоп
Senior Member
****
Отсутствует


Ябба!

Сообщений: 317
Местоположение: г.Москва
Зарегистрирован: 14. Августа 2006
Пол: Мужской
Инспекция прямого запроса
12. Декабря 2007 :: 22:47
Печать  
Я по прямым запросам - нуль, если писать самому.. если смотреть на написанное - то чуток получше...
есть черный запрос
есть его аналог на DBF (фокспрошный драйвер) - писали за небольшую оплату... есть сомнения в оптимальности запроса и еще по одному пункту.
если кому - жаба не давит - просьба дать квалифицированное заключение/подправить запрос (вопрос оплаты решаем)
.
сабж:
описание выхода запроса (запрос формируем на !!!_ТА_!!!):
"штатная" ТиС, получить перечень "незакрытых" заявок покупателей (сумма или колво ненулевые) по условию:
а) - просроченные, т.е. где (Заявка.ДатаОтгрузки+КолвоДнейНаПринятиеРешения) >= ТекущаяДата()
б) - непросроченные, т.е. где (Заявка.ДатаОтгрузки+КолвоДнейНаПринятиеРешения) < ТекущаяДата()
d) Все
черный запрос такой:
    ТекстЗапроса = "
    |Заявка = Регистр.Заявки.ЗаявкаПокупателя;
    |Контрагент = Регистр.Заявки.ДоговорПокупателя.Владелец;
    |Менеджер = Регистр.Заявки.ДоговорПокупателя.Владелец.БВК_Менеджер;
    |Договор = Регистр.Заявки.ДоговорПокупателя;
    |Склад = Регистр.Заявки.ЗаявкаПокупателя.Склад;
    |Фирма = Регистр.Заявки.Фирма;
    |ДатаОтгрузки = Регистр.Заявки.ЗаявкаПокупателя.ДатаОтгрузки;
    |СуммаЗаявки = Регистр.Заявки.СтоимостьРасход;
    |КолЗаявки = Регистр.Заявки.КоличествоРасход;
    |Функция КонОстС = КонОст(СуммаЗаявки);
    |Функция КонОстК = КонОст(КолЗаявки);";
 
    Если парамРежимФормирования = -1
    Тогда //условий не накладываем, полный отчет
    Иначе
     ТекстЗапроса = ТекстЗапроса +"
     |Условие(ЗаявкаУжеПросрочена(ДатаОтгрузки)=парамРежимФормирования);";
    КонецЕсли;
   
    Если НАЙТИ(ВРЕГ(НазваниеНабораПрав()),"АДМИН")=0 Тогда
     ТекстЗапроса = ТекстЗапроса +"
     |Условие (Менеджер в глПользователь);";
    КонецЕсли;
   
    ТекстЗапроса = ТекстЗапроса +"
    |Группировка Контрагент Без Групп;
    |Группировка Заявка;
    |";
 
    Запрос = СоздатьОбъект("Запрос");
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли;
парамРежимФормирования = 1 если нужны просроченные
парамРежимФормирования = 0 если нужны непросроченные
..
используемая функция:

//ТекущаяДатаРаботы = ТекущаяДата() (=ТА)
//ДатаОтгрузки - Заявка.ДатаОтгрузки
Функция ЗаявкаУжеПросрочена(ДатаОтгрузки)
  Если (ТекущаяДатаРаботы - ДатаОтгрузки) > КолвоДнейНаПринятиеРешения
  Тогда Возврат 1; //просрочено
  Иначе Возврат 0; //непросрочено
  КонецЕсли;
КонецФункции //ЗаявкаУжеПросрочена()
..
..
вот прямой запрос на фокспрошном драйвере
ТекстЗапроса = "
    |SELECT
    | т.Заявка as [Заявка $Документ.ЗаявкаПокупателя],
    | т.Договор as [Договор $Справочник.Договоры],
    | т.Фирма as [Фирма $Справочник.Фирмы],
    | т.Склад as [Склад $Справочник.Склады],
    | т.ДатаОтгрузки as ДатаОтгрузки,
    | т.Контрагент as [Контрагент $Справочник.Контрагенты],
    | т.Менеджер as [Менеджер $Справочник.Пользователи],
    | т.Количество as КонОстК,
    | т.Сумма as КонОстС,
    | т.Флаг as Флаг
    |FROM(
    |SELECT
    | $Рег.ЗаявкаПокупателя as Заявка,
    | $Рег.ДоговорПокупателя as Договор,
    | $Рег.Фирма as Фирма,
    | $Док.Склад as Склад,
    | $Док.ДатаОтгрузки as ДатаОтгрузки,
    | Спр1.id as Контрагент,
    | $Спр1.БВК_Менеджер as Менеджер,
    | SUM($Рег.КоличествоРасход) as Количество,
    | SUM($Рег.СтоимостьРасход) as Сумма,
    | IIF(:ДатаРаботы~~ >$Док.ДатаОтгрузки,1,0) as Флаг
    |FROM
    | $РегистрИтоги.Заявки as Рег
    | INNER JOIN $Документ.ЗаявкаПокупателя Док on Док.IDDoc = Right($Рег.ЗаявкаПокупателя,9)
    | INNER JOIN $Справочник.Договоры Спр on Спр.id = $Рег.ДоговорПокупателя
    | INNER JOIN $Справочник.Контрагенты Спр1 on Спр1.id = Спр.ParentExt
    |WHERE Рег.Period = :ДатуТА~~
    | GROUP BY узки,Спр1.id,$Спр1.БВК_Менеджер) as т
    |WHERE
    | т.Сумма+т.Количество>0";
    Если НАЙТИ(ВРЕГ(НазваниеНабораПрав()),"АДМИН")=0 Тогда
     ТекстЗапроса = ТекстЗапроса + "
     | and т.Менеджер = :ГлПользователь";
    КонецЕсли;
    Если парамРежимФормирования = -1
    Тогда //условий не накладываем, полный отчет
    Иначе
     ТекстЗапроса = ТекстЗапроса +"
     | and т.Флаг=:парамРежимФормирования";
    КонецЕсли;
    ТекстЗапроса = ТекстЗапроса +"
    | Order by т.Контрагент,т.Заявка";
   
    ДатаРаботы = ТекущаяДата()-ВыбДень;
    Запрос.УстановитьТекстовыйПараметр("ДатаРаботы" ,ДатаРаботы);
       Запрос.УстановитьТекстовыйПараметр("ГлПользователь" ,ГлПользователь);
     Запрос.УстановитьТекстовыйПараметр("ДатуТА" ,НачМесяца(РабочаяДата()));
       Запрос.УстановитьТекстовыйПараметр("парамРежимФормирования" ,парамРежимФормирования);
       ТЗЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);

..
..
Монопольно - Управление опертивными итогами - периодичность сохранения остатков
.. и тут как раз вылазит бяка!
вызывает вопрос вот это:
   |WHERE Рег.Period = :ДатуТА~~
в совокупности
Запрос.УстановитьТекстовыйПараметр("ДатуТА" ,НачМесяца(РабочаяДата()));
.. при этом похоже что запрос будет цеплять лишние данные...

Спасибо!
  
Наверх
www  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Инспекция прямого запроса
Ответ #1 - 12. Декабря 2007 :: 23:52
Печать  
1. При доступе к таблице регистра не попал в индекс, из за чего будет считана вся таблица

2. Запрос.УстановитьТекстовыйПараметр("ДатуТА" ,НачМесяца(РабочаяДата()));
Правильно, непонятно что вызывает вопрос.
Ну разве что Запрос.УстановитьТекстовыйПараметр("ДатуТА" ,НачМесяца(ПолучитьДатуТА()); чуть получше

3. INNER JOIN
соединение промисходит до группировки из за чего на него будут затрачены большие ресурсы.(соединение к большей таблице)
И почему не LEFT.

4.На выходе запроса нужно делать соединение со спр и журналом, получая наименования,
номера документов , их даты и т.п. В противном случае при выводе на печать системе придется
в каждой строке делать запрос к базе получая представление
  
Наверх
 
IP записан
 
Злоп
Senior Member
****
Отсутствует


Ябба!

Сообщений: 317
Местоположение: г.Москва
Зарегистрирован: 14. Августа 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #2 - 13. Декабря 2007 :: 00:16
Печать  
2 kiruha
1. понял, но думаю что смутно понял:
как написать "чтоб попал в индекс"?
2. вопрос в том - зачем здесь в запросе начало месяца, если идет обращение к итогам НА ТА? (или итоги на ТА невозможно получит сразу а надо "считать" от начала месяца плюс-минус движения?) и зачем начало месяца, если у меня периодичность сохранения остатков = 5 дней?
3. втыкнул процентов на 10% - не более, т.е. практически не втыкнул (так, на уровне подсознания) - SQL для чайников пролистал бегло, тщательнее - времени не особо... отсюда тот же вопрос: как сделать правильно...? почему не лефт - не знаю... по той же причине...
4. да, именно так и есть - потом из результатов запроса вытягиваю через точку нужные реквизиты - но это пока несущественно - если можно то как тоже сделать?
..
как написано выше - вопрос оплаты решаем.
  
Наверх
www  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Инспекция прямого запроса
Ответ #3 - 13. Декабря 2007 :: 00:53
Печать  
Цитата:
2 kiruha
1. понял, но думаю что смутно понял:
как написать "чтоб попал в индекс"?
2. вопрос в том - зачем здесь в запросе начало месяца, если идет обращение к итогам НА ТА? (или итоги на ТА невозможно получит сразу а надо "считать" от начала месяца плюс-минус движения?) и зачем начало месяца, если у меня периодичность сохранения остатков = 5 дней?
3. втыкнул процентов на 10% - не более, т.е. практически не втыкнул (так, на уровне подсознания) - SQL для чайников пролистал бегло, тщательнее - времени не особо... отсюда тот же вопрос: как сделать правильно...? почему не лефт - не знаю... по той же причине...
4. да, именно так и есть - потом из результатов запроса вытягиваю через точку нужные реквизиты - но это пока несущественно - если можно то как тоже сделать?
..
как написано выше - вопрос оплаты решаем.


5. Оплата не для этого сайта Улыбка

2. Периодичность сохранения остатков 5 дней?
Тогда нужно получить ближайшую дату делящуюся на 5 видимо
- случай нестандартный

1. Чтобы попасть в индекс (для Fox)
нужно писать подзапрос к регистру вида

Код
Выбрать все
| (SELECT
    | $Рег.ЗаявкаПокупателя as Заявка,
    | $Рег.ДоговорПокупателя as Договор,
    | $Рег.Фирма as Фирма,
    | SUM($Рег.КоличествоРасход) as Количество,
    | SUM($Рег.СтоимостьРасход) as Сумма,
    |FROM
    | $РегистрИтоги.Заявки as Рег
|  WHERE г.ЗаявкаПокупателя
|	   LIKE (DTOS(:ДатуТА~~ )"+L_(9+9+9+9)+")
| GROUP BY $Рег.ЗаявкаПокупателя,$Рег.ДоговорПокупателя,$Рег.Фирма) as РегЗаявки
 


Где
Код
Выбрать все
Функция L_(нн)   Экспорт
	 ВозврСтр="'";

	 Для ИИ=1 По нн Цикл
		   ВозврСтр=ВозврСтр+"_";
	 КонецЦикла;
	 ВозврСтр=ВозврСтр+"'";
	 Возврат ВозврСтр;
КонецФункции 



почему так - прикреплена статья
http://www.1cpp.ru/forum/YaBB.pl?num=1184317705

все остальное не так важно
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #4 - 13. Декабря 2007 :: 06:14
Печать  
Цитата:
2. вопрос в том - зачем здесь в запросе начало месяца, если идет обращение к итогам НА ТА? (или итоги на ТА невозможно получит сразу а надо "считать" от начала месяца плюс-минус движения?) и зачем начало месяца, если у меня периодичность сохранения остатков = 5 дней?

Цитата:
2. Периодичность сохранения остатков 5 дней?
Тогда нужно получить ближайшую дату делящуюся на 5 видимо
- случай нестандартный

Случай вполне стандартный, надо писать так:
Цитата:
Запрос.УстановитьТекстовыйПараметр("ДатуТА", Запрос.мд.ПолучитьНачПериода(ПолучитьДатуТА()));
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #5 - 13. Декабря 2007 :: 11:25
Печать  
Пиши в аську, ув. тов. Чебуратор
Что там по поводу адресного склада?  Подмигивание
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
CDX
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 3
Зарегистрирован: 13. Декабря 2007
Re: Инспекция прямого запроса
Ответ #6 - 13. Декабря 2007 :: 14:04
Печать  
Запрос.мд.ПолучитьНачПериода(ПолучитьДатуТА()));

Сорри, что есть Запрос.мд ?  Да и ПолучитьНачПериода()  тоже.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #7 - 13. Декабря 2007 :: 14:12
Печать  
Цитата:
Свойства
мд / md свойство содержит статический объект типа MetaDataWork.
  
Наверх
 
IP записан
 
Злоп
Senior Member
****
Отсутствует


Ябба!

Сообщений: 317
Местоположение: г.Москва
Зарегистрирован: 14. Августа 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #8 - 14. Декабря 2007 :: 00:42
Печать  
В результате имеем: "деньги не для этого форума" и никто вообщем-то толково запрос не переписал.. даже за денежку.. все самому придется, блин...
  
Наверх
www  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Инспекция прямого запроса
Ответ #9 - 14. Декабря 2007 :: 07:59
Печать  
Цитата:
В результате имеем: "деньги не для этого форума" и никто вообщем-то толково запрос не переписал.. даже за денежку.. все самому придется, блин...


Ну если подставить подзапрос вместо
Код
Выбрать все
|FROM
    | $РегистрИтоги.Заявки as Рег  

это так сложно ....

Вроде очень много толковых вещей на инфостарте  Озадачен
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #10 - 14. Декабря 2007 :: 08:14
Печать  
Ещё надо заметить, что Чеб хочет, чтобы это работало как на ДБФ, так и на СКЛ версии, поэтому перед формированием запроса необходимо сделать:
Код
Выбрать все
МетаИнфо=СоздатьОбъект("MetaInfoClasses");
	флЭтоСКЛ=МетаИнфо.ЭтоSQL_Версия(); 


и далее в запросе везде, где идёт сравнение дат надо ставить:
Код
Выбрать все
":ДатаРаботы~"+?(флЭтоСКЛ=1,"","~")+">$Док.ДатаОтгрузки" 


+ ес-но, если будешь использовать совет, который дал тебе Кирюха:
Код
Выбрать все
WHERE г.ЗаявкаПокупателя
|	   LIKE (DTOS(:ДатуТА~~ )"+L_(9+9+9+9)+") 


то также надо обращать на это внимание, либо просто оставить как было:
Код
Выбрать все
"Рег.Period = :ДатуТА~"+?(флЭтоСКЛ=1,"","~") 

  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #11 - 14. Декабря 2007 :: 08:20
Печать  
Чебуратора просто жаба давит, что за поделку заплочено... и он хочет тыркнуть разработчика носом, дескать, смотри какую хрень наваял, вертай половину бабла  Смех
Другое объяснение такого поведения найти не могу, ведь можно обратиться к разработчику непосредственно
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #12 - 14. Декабря 2007 :: 09:45
Печать  
Мы здесь все-таки в основном рассчитываем на людей пытливых, которые сами могут все сделать с помощью наших подсказок Улыбка

Попробуй заинтересуй знающего спеца с этого форуме чем-нибудь типа деньги или своей интересной прогой или еще чем Улыбка
Сам понимаешь, с нуля никому не хочется запрос переписывать и тратить свое время.
  

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


Ябба!

Сообщений: 317
Местоположение: г.Москва
Зарегистрирован: 14. Августа 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #13 - 14. Декабря 2007 :: 10:37
Печать  
1. БЛИН, КАКИЕ ТУТ ВСЕ ЗЛЫЕ Подмигивание
2. А я что, денег не предлагал? - сразу же в первом посте, на что было сказано что тут все забесплатно - ну я и ламанулся...
3. а насчет "тут типа подсказывают а дальше сам" - я сразу тоже написал - я в ПЗ = 0.
4. СКУЛЬНЫЙ ЗАПРОС ИДЕТ ОТДЕЛЬНОЙ ВЕТКОЙ АЛГОРИТМА!!! не надо его суда примешивать...
5. Человеку которому было заплачено - мну жаба не давит! и никуда тыкать не собираюсь Подмигивание потому как я считаю было заплачено адекватно и претензий к выполненной работе нет... - запрос работает, выдает правильные данные, ошибочка с нестандартным периодом остатков - решена с вашей поммощью я думаю... А то что не сильно оптимальный запрос - ТАК ИМЕННО СЮДА И ЛОМАНУЛСЯ ИЗ_ЗА ЭТОГО... максималист я...
а вы здые.. такими и останетсеь если не допомогните...
  
Наверх
www  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Инспекция прямого запроса
Ответ #14 - 14. Декабря 2007 :: 11:14
Печать  
Цитата:
4. СКУЛЬНЫЙ ЗАПРОС ИДЕТ ОТДЕЛЬНОЙ ВЕТКОЙ АЛГОРИТМА!!! не надо его суда примешивать...

Тебя не поймёшь... То ты говоришь, чтоб запрос отрабатывал на ЛЮБОЙ базе, то у тебя оказывается, что для СКЛ у тебя отдельный запрос.
Ну тогда бери и собирай все из этой ветки в одну кучу, пробуй и потом спрашивай что у тебя не получилось, что сделать лучше и показывай уже новый запрос.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 5
ОтправитьПечать