Переключение на Главную Страницу Страницы: 1 ... 58 59 [60]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" (число прочтений - 290072 )
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #885 - 22. Сентября 2010 :: 20:31
Печать  
Вы тут пока обсуждайте, на меня не отвлекайтесь. Просто вот вышел новые релизик:

1.07.017 от 23.09.10 г.
- Исправлена ошибка, при которой не правильно подготавливались ВТ если в параметре «Ресурсы» присутствуют пробелы.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #886 - 23. Сентября 2010 :: 14:58
Печать  
vandalsvq писал(а) 22. Сентября 2010 :: 20:31:
Вы тут пока обсуждайте, на меня не отвлекайтесь. Просто вот вышел новые релизик:

1.07.017 от 23.09.10 г.
- Исправлена ошибка, при которой не правильно подготавливались ВТ если в параметре «Ресурсы» присутствуют пробелы.

IMHO таки не исправлена Печаль
Отладочное сообщение лезет .... и ошибка тоже лезет Улыбка
Код
Выбрать все
    Если ПустоеЗначение(Измерения) = 0 Тогда
        Сообщить(Измерения);
        Измерения = ?(Лев(Измерения,1) = "(",Сред(Измерения,2,СтрДлина(Измерения)-2),СокрЛП(Измерения));
        Измерения = """" + СтрЗаменить(Измерения,",",""",""") + """";        
        СписокИзмерений.ИзСтрокиСРазделителями(Измерения);
    КонецЕсли;
 


Так было-бы лучше
Код
Выбрать все
    Если ПустоеЗначение(Измерения) = 0 Тогда
        Измерения = СтрЗаменить(Измерения, " ", "");
        Измерения = ?(Лев(Измерения,1) = "(",Сред(Измерения,2,СтрДлина(Измерения)-2),СокрЛП(Измерения));
        Измерения = """" + СтрЗаменить(Измерения,",",""",""") + """";        
        СписокИзмерений.ИзСтрокиСРазделителями(Измерения);
    КонецЕсли;
 



Это там в трех местах строки 548 (где и была отладка), 5279 и 5642

Просто я имею привычку ставить пробелы после запятых - в результате сегодня наступил на эти грабли Улыбка
Кстати не глянул как там в ресурсах? Тоже подобный глюк?
  
Наверх
ICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #887 - 24. Сентября 2010 :: 03:34
Печать  
avgreen, твое IMHO подтверждено тестом или это просто "по моему скромному мнению"? Если последнее то я пас, я на своих тестах проверял, правда только на DBF.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #888 - 24. Сентября 2010 :: 05:22
Печать  
vandalsvq писал(а) 24. Сентября 2010 :: 03:34:
avgreen, твое IMHO подтверждено тестом или это просто "по моему скромному мнению"? Если последнее то я пас, я на своих тестах проверял, правда только на DBF.

Подтверждено конечно .... просто может мы о разных вещах говорим
Вот такая конструкция
Код
Выбрать все
$РегистрОстаткиОбороты.Взаиморасчеты(:НачДата, :КонДата~, Документ,,
(1=1 ...тут еще куча условий .... ), (Клиент, Заказ), (Долг,СуммаТары)) as РегВзаим $nolock
 


не работает, потому как перед измерением Заказ есть пробел. Падает она со следующим сообщением {Отчет.ДебеторскаяЗадолженность.Форма.Модуль(618)}: ПрямойЗапрос::ПолучитьТипКолонки(Метаданные МетаРеквизит=, Строка Тип=, Строка Вид=, Число Длина=-1, Число Точность=-1) : Поле агрегатного объекта не обнаружено
Тип = МетаРеквизит.Тип;

После моих исправление работает независимо от количества и положения пробелов, хоть вот так
Код
Выбрать все
(  Клиент  ,  Заказ  ) 


У меня SQL, хотя это вроде как без разницы, тут до запросов не доходит и сыпется на уровне разбора метазапроса.
Или я не так понял описание бага?  Печаль "не правильно подготавливались ВТ" В данном случае она вообще не подготавливается, а падает  ..... Если неправильно понял - извини что сбил с толку!  Смущённый
  
Наверх
ICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #889 - 24. Сентября 2010 :: 05:28
Печать  
Проверимся, исправимся Подмигивание.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
ВТ РегистрОстаткиОбороты
Ответ #890 - 24. Сентября 2010 :: 06:20
Печать  
Еще вопрос по ВТ РегистрОстаткиОбороты. Я не совсем понимаю как должен работать параметр "МетодДополнения". Все тот-же запрос что и выше с периодичностью Документ:
Код
Выбрать все
$РегистрОстаткиОбороты.Взаиморасчеты(:НачДата, :КонДата~, Документ,,
(Клиент = :ВыбКлиент), (Клиент, Заказ), (Долг,СуммаТары)) as РегВзаим $nolock
 


НачДата = '01.03.2010', КонДата = '31.03.2010'
ВыбКлиент для простоты анализа один (вообще-то у меня там список укладывается  и по нему отбирается). Что я должен получить в результате? Как я себе это представлял:
1. Общий остаток на 01.03.2010 по выбранному контрагенту с пустым полем Документ
2. Общий остаток на 01.03.2010 по каждому Заказу (у меня это договора, и их всего три) с пустым полем Документ
3. Остатки на начало, обороты, остатки на конец по каждому документу, сделавшему движение с НЕпустым полем Документ (там присутствует документ сделавший движение)
4. Общий остаток на 31.03.2010 по выбранному контрагенту с пустым полем Документ
5. Общий остаток на 31.03.2010 по каждому Заказу с пустым полем Документ

В результате я получаю только п.п. 2 и 3. Т.е. общего остатка по Контрагенту нету и остатков на конец периода тоже нету. в п. 2 НачОст и КонОст равны, что впрочем логично, т.к. это остатки одну и ту-же позицию времени.

Хочу понять - я что-то не то получаю или я как-то не так понимаю принцип работы данной ВТ?
  
Наверх
ICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #891 - 24. Сентября 2010 :: 06:35
Печать  
1, 4, 5 не будут, там буду поля с Остатком на начало периода по совокупности наборов значений Клиент/Заказ, документ всегда будет пустой.
Т.е. если один клиент и три заказа (договора) то и будет три поля остатка (если они есть): "Клиент / Заказ 1, Клиент / Заказ 2, Клиент / Заказ 3". Соответственно то же самое будет с конечным остатком.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #892 - 24. Сентября 2010 :: 07:17
Печать  
vandalsvq писал(а) 24. Сентября 2010 :: 06:35:
1, 4, 5 не будут, там буду поля с Остатком на начало периода по совокупности наборов значений Клиент/Заказ, документ всегда будет пустой.
Т.е. если один клиент и три заказа (договора) то и будет три поля остатка (если они есть): "Клиент / Заказ 1, Клиент / Заказ 2, Клиент / Заказ 3". Соответственно то же самое будет с конечным остатком.

Ну конечного остатка у меня вообще почему-то нету. Я так тебя понял что, то что пункты 1 и 4 отсутствуют - это нормально. Но пункт 5 все-таки должен быть? "Клиент / Заказ 1, Клиент / Заказ 2, Клиент / Заказ 3" с остатком на 31.03.2010. У меня он отсутствует
  
Наверх
ICQ  
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #893 - 24. Сентября 2010 :: 07:34
Печать  
Вот что я получил в результате.... т.е. на 31.03.2010 остатков нету Печаль
   Кстати интересно таки - почему нету НачОст и КонОст по первому измерению, т.е. по Контрагенту? А если у меня будет не один контрагент а несколько - как получить итоговые остатки по всем Заказам одного Контрагента?
   И еще - а если будет три измерения, например Менеджер, Контрагент, Заказ, то как тогда будут выходить итоги? Только по третьему измерению, т.е. по всем Заказам каждого Контрагента каждого Менеджера. А по каждому Контрагенту каждого Менеджера остатков не будет?
  

112.mxl ( 16 KB | Загрузки )
Наверх
ICQ  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #894 - 24. Сентября 2010 :: 09:38
Печать  
Итак попробуем разобраться что же происходит при работе ВТ ОстаткиОбороты
Выводятся остатки на НАЧАЛО периода по комбинациям значений указанных измерений
есть два варианта - первый когда за дату начала периода не будет движений, в этом случае движения по оборотам не будет и колонка Период (Документ) будет не заполнена. Второй - когда за дату начала периода по комбинации измерений есть документ движения. В этом случае колонка Период (Документ) будет заполнена. При этом в колонке НачОст будет находиться начальный остаток по комбинации измерений, а в колонках оборотов будут указаны обороты по документу движения.
Теперь попробуем ответить на вопрос:
Цитата:
как получить итоговые остатки по всем Заказам одного Контрагента?

Прежде всего в данный запрос надо добавить уточнение "....на определенный момент - значение Периода (конкретный документ)"
Я считаю что необходимо:
1) Создать уникальный индекс "*Контрагент,*Заказ" это нам позволит перебрать все комбинации данных измерений.
2) Создать неуникальный индекс "*Контрагент,*Заказ,Период". В случае периодичности ВТ Документ необходимо использовать не Период а ПозицияДокумента.
3) При переборе таблицы запроса по первому индексу установить для второго индекса фильтр соответственно с Контрагентом и Заказом из первой выборки а для периода использовать минимальную и максимальную границы отчета (как для дат так и для позиции документа), которые можно определить 3.1. Создав уникальный индекс по периоду и установив минимальное значение и максимальное; 3.2 - просто по датам документов. Далее получить минимальное значение индекса  - это будет Начальный остаток по комбинации Контрагент+Заказ, максимальное значение индекса - это будет Конечный остаток по комбинации Контрагент+Заказ. Соответственно сумма всех НачОст и КонОст даст общий начальный остаток и общий конечный остаток по контрагенту.
Все вышесказанное было описано из теоретических соображений и требует практического подтверждения.
Для множества контрагентов необходимо вышеописанное обернуть в выборку по уникальному индексу "*Контрагент".
  
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #895 - 24. Сентября 2010 :: 11:07
Печать  
Есть вариант дождаться когда я сделаю вариант периодичности "С ДОПОЛНЕНИЕМ".
НО: сколько бы я не возвращался к данному вопросу, у меня всегда есть две трудности:
1. Если периоодичность = Документ. Что тогда является дополнением? Видимо ничего.
2. Если начальный и/или конечный период не задан какая дата является началом/концом. 1753 год и 2012 Смех ??? А если периодичность ДЕНЬ, а если условия отбора настолько большие что в итоге строк с остатками и оборотами будет 10, а дат по периоду будет.... (сами считайте).
В общем поскольку данный вопрос однажды был мною озвучен в кулуарной беседе, и ответа я самостоятельно не нашел, а от собеседника его не прозвучало я даже не знаю что делать.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #896 - 24. Сентября 2010 :: 12:07
Печать  
vandalsvq писал(а) 24. Сентября 2010 :: 11:07:
Есть вариант дождаться когда я сделаю вариант периодичности "С ДОПОЛНЕНИЕМ".
НО: сколько бы я не возвращался к данному вопросу, у меня всегда есть две трудности:
1. Если периоодичность = Документ. Что тогда является дополнением? Видимо ничего.
2. Если начальный и/или конечный период не задан какая дата является началом/концом. 1753 год и 2012 Смех ??? А если периодичность ДЕНЬ, а если условия отбора настолько большие что в итоге строк с остатками и оборотами будет 10, а дат по периоду будет.... (сами считайте).
В общем поскольку данный вопрос однажды был мною озвучен в кулуарной беседе, и ответа я самостоятельно не нашел, а от собеседника его не прозвучало я даже не знаю что делать.

Цитата из хелпа 1с++
Цитата:
МетодДополнения - тип: конструкция типа ключевое слово. Имеет смысл, только когда используется разворот по периодам. Задается один из следующих вариантов:

Движения (Actions) - в таблицу включаются обороты по каждому периоду движений, и текущие остатки только по тем комбинациям измерений, по которым были движения в период расчета;
ДвиженияИГраницыПериода (ActionsAndPeriodBoundaries) - в таблицу включаются обороты по каждому периоду движений и текущие остатки; также таблица дополняется записями о ненулевых остатках на начало и/или конец на границы периода расчета.

IMHO границы периода расчета это в данном случае НачДата и КонДата, а никак не начало и конец каждого периода по которому задана периодичность. Т.е. и при периодичности Документ и периодичности Год ДОПОЛНЕНИЕМ всегда будет НачОст и КонОст на НачДата и КонДата. И опять-же IMHO - желательно в одной строке (и НачОст и КонОст) с пустой позицией. Потому как позиция в такой строке не будет иметь смысла. Ну и кроме того - нужно-же ей как-то отличаться Улыбка А так - все строки с пустыми позициями - это ДОПОЛНЕНИЯ .... с разными комбинациями измерений.
Теперь по поводу если период не задан - а какая проблема? Начало периода - первая запись в RG, конец периода - ТА. А когда именно первая запись - да и фик с ней, в строках дополнений ведь позиция будет пустая.
Как такая схема? логичная? Насколько труднореализуемая?
  
Наверх
ICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #897 - 24. Сентября 2010 :: 12:31
Печать  
В общем по первой части, отвечу так:
РегистрОстаткиОбороты = РегистрОстатки (нач периода) + union all РегистрОбороты (нач периода - кон периода) + свертка + пересчет.
Причем для любого метода дополнения. Вот только если метод = ДвиженияИГраницыПериода выводится "как есть", а если просто Движения то отсеиваются строки у которых СуммаОборот, СуммаПриход и СуммаРасход = 0.
Вот так вот. Логика тут меняться не будет Улыбка. Совсем Улыбка.

Что же касается дополнения периодов. Начало периодов - первая запись RG - вариант. В принципе получения этой даты будет стоить копейки. А конец ТА или БИ. Тоже вариант. Как все просто Улыбка.
А что делать если периодичность Документ? Улыбка.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #898 - 24. Сентября 2010 :: 18:18
Печать  
Дабы не сломать случайно эту ветку предлагаю все обсуждения перенести в продолжение. А именно сюда.
Надеюсь что это сообщение будет тут последним

Итак: ч.2 - http://www.1cpp.ru/forum/YaBB.pl?num=1285352210
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Dolly_EV
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 152
Местоположение: Чита
Зарегистрирован: 22. Октября 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #899 - 25. Мая 2013 :: 04:31
Печать  
vandalsvq писал(а) 18. Января 2010 :: 09:12:
classic писал(а) 18. Января 2010 :: 08:51:
Предлагаю переписать функцию

Перепишемс Подмигивание


Так и не переписал Улыбка. Я тоже полчаса убил на отладку 5 строк, где в УложитьТаблицуЗначений укладывал ИД-ы, и потерялись лидирующие пробелы
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 58 59 [60] 
ОтправитьПечать