|
![]() |
#1 |
Участник
|
X++: qbrCena1TransDate.value(queryRange(dateNull(), SOPCenaDoc.TransDate)); qbrCena2TransDate.value(queryRange(SOPCenaTable.TransDate + 1, dateNull())); qbrCena2TransDate.value(queryRange(dateNull(), SOPCenaDoc.TransDate));
__________________
// no comments |
|
![]() |
#2 |
Участник
|
1)qbrCena2TransDate.value(queryRange(dateNull(), SOPCenaDoc.TransDate)) вообще убивает предыдущее условие, остается только ((TransDate<={ts '2017-01-27 00:00:00.000'})), а надо AND
2)qbrCena2TransDate.value(queryRange(SOPCenaTable.TransDate + 1, dateNull())); в запросе превращается в ((TransDate>={ts '1900-01-02 00:00:00.000'})) |
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от Яга1
![]() 1)qbrCena2TransDate.value(queryRange(dateNull(), SOPCenaDoc.TransDate)) вообще убивает предыдущее условие, остается только ((TransDate<={ts '2017-01-27 00:00:00.000'})), а надо AND
2)qbrCena2TransDate.value(queryRange(SOPCenaTable.TransDate + 1, dateNull())); в запросе превращается в ((TransDate>={ts '1900-01-02 00:00:00.000'})) X++: qbrCena2TransDate.value('(SOPCenaTable.TransDate < SOPCenaTableView.TransDate)') qbrCenaTableTransDate = qbds.addRange(fieldNum(SOPCenaTableView, TransDate)); qbrCenaTableTransDate.value(queryRange(datenull(), _DATE));
__________________
// no comments |
|
![]() |
#4 |
Участник
|
Тогда условия связались по OR:
(((SOPCenaTable.TransDate < SOPCenaTableView.TransDate)) OR (TransDate<={ts '2016-09-01 00:00:00.000'})) |
|
![]() |
#5 |
Участник
|
Цитата:
решили хранить не прейкурант полностью, а таблицу, что цена на такой-то ItemId меняется с такой-то даты на такую-то (иногда на 0).
Добавить поле даты окончания срока действия цены ValidTo, заполнять его по умолчанию максимальной датой, а при создании строки с последующей датой заполнять его соответстующим значением окончания срока действия. Тогда запросы по актуальным ценам упростятся до [дата цены]>=ValidFrom AND [дата цены] <= ValidTo.
__________________
Ален ноби, ностра алис. Что означает - если один человек построил, другой завсегда разобрать может. |
|
![]() |
#6 |
Злыдни
|
C ценами нельзя использовать такую модель, т.к. полноценная реализация запрещает иметь пересекающиеся диапазоны. В реально жизни очень часто встречаются маркетинговые акции, действующие короткий срок и с ценами ниже обычной. После окончания маркетинговой акции опять создавать нормальные цены? В свою бытность, помню, даже мутили специальную модификацию, которая выполняла последовательное создание ценового соглашения, если в журнале цен у записи была указана дата окончания действия: закрыть предыдущую датой начала и создать копию с датой начала равной дате окончания + 1.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
![]() |
#7 |
Участник
|
Цитата:
Сообщение от KiselevSA
![]() C ценами нельзя использовать такую модель, т.к. полноценная реализация запрещает иметь пересекающиеся диапазоны. В реально жизни очень часто встречаются маркетинговые акции, действующие короткий срок и с ценами ниже обычной. После окончания маркетинговой акции опять создавать нормальные цены?
|
|
![]() |
#8 |
Участник
|
Цитата:
Сообщение от KiselevSA
![]() очень часто встречаются маркетинговые акции, действующие короткий срок и с ценами ниже обычной. После окончания маркетинговой акции опять создавать нормальные цены?
В свою бытность, помню, даже мутили специальную модификацию, которая выполняла последовательное создание ценового соглашения, если в журнале цен у записи была указана дата окончания действия: закрыть предыдущую датой начала и создать копию с датой начала равной дате окончания + 1. И создавать нормальную цену на последующий период, по идее, нужно не при прекращении действия краткосрочного ценового соглашения, а в тот момент когда становится известным срок окончания акции. Как правило, это бывает уже в начале действия акции.
__________________
Ален ноби, ностра алис. Что означает - если один человек построил, другой завсегда разобрать может. |
|
|
За это сообщение автора поблагодарили: dn (1). |
![]() |
#9 |
Участник
|
Цитата:
Сообщение от AlGol
![]() Может проще будет доработать таблицу с ценами до полноценной реализации модели ValidFrom-ValidTo?
Добавить поле даты окончания срока действия цены ValidTo, заполнять его по умолчанию максимальной датой, а при создании строки с последующей датой заполнять его соответстующим значением окончания срока действия. Тогда запросы по актуальным ценам упростятся до [дата цены]>=ValidFrom AND [дата цены] <= ValidTo. И не максимальную, а какую-то там еще, если удалилась не последняя строка И при изменении ValidFrom, если в результате строка перескакивает через несколько строк назад, тоже исправить ValidTo. Мы уже делали так. Впечатление, что ПРОЩЕ все-таки qbrCena2TransDate.value('((SOPCenaTable.TransDate<SOPCenaTableView.TransDate) && (SOPCenaTableView.TransDate<='+date2StrXpp(_DATE)+'))'); как предложил Wamr Наглядно и точно нет ошибок при пересчете ValidTo |
|
![]() |
#10 |
Участник
|
Есть два связанных между собой процесса
Вы выбрали структуру данных, оптимальную для первого процесса (запись и модификация данных). Но, как Вы видите в данной теме, эта структура создает проблемы при выборке и анализе данных. Однако если модифицировать структуру данных для оптимальной выборки и анализа, то она будет не оптимальна для модификации и хранения. И тут вопрос в том, что для Вас важнее? Что чаще придется делать? Ведь, в конце концов, написать код триггерров на insert/update/delete придется только один раз. Пусть даже он будет достаточно сложным. А вот выборки цен Вы будете делать еще много раз и по разным поводам. И каждый раз Вы будете мучительно долго вспоминать, как же это все "упихать" в один запрос, причем в синтаксисе Axapta.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|