Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Алгоритм расчёта ведомости движения товара / 25 сообщений из 39, страница 1 из 2
12.09.2016, 14:21
    #39307609
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
Коллеги, приветствую !
В голове никак не могу придумать, какую нужно организовать структуру базы и как потом быть с сформированием запроса ведомости по движению товара для следующих условий:
Заказчик хочет чтобы была возможность смены цены в определённую дату и товар до этой даты считался по старой цене, а после этой даты - по новой.
И чтобы таких дат со сменой цены могло быть неограниченное количество.

Если кто с таким сталкивался или знает как реализовать - намекните на решение с формированием запроса по движению товара...
...
Рейтинг: 0 / 0
12.09.2016, 14:34
    #39307630
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
Придумал вот так...

ID товара Дата начала цены Дата конца цены Цена
327 01.05.2016 31.05.2016 100
327 01.06.2016 30.06.2016 115
327 01.07.2016 120

А при выборе цены проверять дату операций на between дат у цен и использовать попадающую в промежутки.
...
Рейтинг: 0 / 0
12.09.2016, 14:45
    #39307642
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
Евген987Придумал вот так...Подобный подход требует наложения на систему хранения ограничивающего условия (гарантирующего отсутствие как наложения периодов, так и "пропусков"), которое в рамках MS Access реализовать невозможно. То есть имеется потенция нарушения целостности и непротиворечивости данных.
Для реализации требования достаточно более простой структуры - (ИД товара, Цена, Дата начала её действия). Тогда для любой заданной даты и товара цена определяется просто выбором первой записи для этого товара с датой не более заданной при сортировке по убыванию дат.
...
Рейтинг: 0 / 0
12.09.2016, 14:47
    #39307648
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
Akina, спасибо, учту обязательно Ваши подсказки !!!
...
Рейтинг: 0 / 0
12.09.2016, 16:12
    #39307750
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
Евген987,
в общих чертах как-то так: (а подробней - нет предела совершенству см это )
...
Рейтинг: 0 / 0
12.09.2016, 19:52
    #39307956
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
Вообщем в двух словах:
1) Структура таблицы прайса

2) Структура таблицы операций

и вот таким запросом считаем сумму операций за период
Код: sql
1.
2.
SELECT SUM(a.Quantity*(SELECT TOP 1 b.intPrice FROM floatPrice b WHERE b.pDate<=a.operDate AND a.prodID=b.prodID ORDER BY b.pDate desc)) 
FROM floatOper AS a;


Получаем следующее
...
Рейтинг: 0 / 0
12.09.2016, 20:07
    #39307972
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
Евген987,

С самого начала формирования номенклатуры по товару планируешь цепочку выстраивать? Товар смешанный? (производство РФ и импорт из зарубежного государства?). Роль твоей компании на рынке? (продавец,покупатель?)
...
Рейтинг: 0 / 0
12.09.2016, 20:15
    #39307975
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
Сергей Лалов, я думаю внедрять уже в действующий проект...
про товар вообще не в курсе, мне без разницы до него, ну и про компании которые работают на проекте - они перекупы получается
А что ?
...
Рейтинг: 0 / 0
20.09.2016, 10:10
    #39311709
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
Коллеги, спасайте !!!
Не вижу ошибки, а мне говорит есть...


Вот сам код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
SELECT a.prodid, 
       d.produnit, 
       d.prodname, 
       (SELECT TOP 1 z.prodprice 
        FROM   products z 
        WHERE  d.prodid = z.prodid 
               AND z.pricedate <=# 09 / 20 / 2016# 
        ORDER  BY z.pricedate DESC), 
       c.quantity                                                 AS BegRem, 
       SUM(Iif(b.opername = 'prihod' 
               AND b.operdate <# 09 / 20 / 2016#, b.quantity, 0)) AS Prihod, 
       SUM(Iif(b.opername = 'realiz' 
               AND b.operdate <# 09 / 20 / 2016#, b.quantity, 0)) AS Realiz, 
       SUM(Iif(b.opername = 'spisanie' 
               AND b.operdate <# 09 / 20 / 2016#, b.quantity, 0)) AS Spisanie, 
       SUM(Iif(b.opername = 'vozvrat' 
               AND b.operdate <# 09 / 20 / 2016#, b.quantity, 0)) AS Vozvrat, 
       Iif(begrem IS NULL, 0, begrem) + prihod 
       + vozvrat - realiz - spisanie                              AS EndRem 
FROM   ((((((SELECT prodid 
            FROM   remains 
            WHERE  salid = 19 
            UNION 
            SELECT a.prodid 
            FROM   operations a, 
                   users b 
            WHERE  a.usrid = b.usrid 
                   AND b.salid = 19) a 
            LEFT JOIN operations b 
                   ON a.prodid = b.prodid) 
           LEFT JOIN remains c 
                  ON a.prodid = c.prodid) 
          LEFT JOIN products d 
                 ON a.prodid = d.prodid) 
         LEFT JOIN users e 
                ON b.usrid = e.usrid) 
        LEFT JOIN bases f 
               ON d.basid = f.basid) 
WHERE  e.salid = 19 
       AND f.srvflag = 0 
GROUP  BY a.prodid, 
          d.produnit, 
          d.prodname, 
          (SELECT TOP 1 z.prodprice 
           FROM   products z 
           WHERE  d.prodid = z.prodid 
                  AND z.pricedate <=# 09 / 20 / 2016# 
           ORDER  BY z.pricedate DESC), 
          c.quantity 
ORDER  BY d.prodname 
...
Рейтинг: 0 / 0
20.09.2016, 10:34
    #39311730
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
До внедрения подзапроса с выбором цены был следующий вариант (который проверен и работает)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SELECT a.prodid, 
       d.produnit, 
       d.prodname, 
       d.prodprice, 
       c.quantity                                                 AS BegRem, 
       SUM(Iif(b.opername = 'prihod' 
               AND b.operdate <# 09 / 20 / 2016#, b.quantity, 0)) AS Prihod, 
       SUM(Iif(b.opername = 'realiz' 
               AND b.operdate <# 09 / 20 / 2016#, b.quantity, 0)) AS Realiz, 
       SUM(Iif(b.opername = 'spisanie' 
               AND b.operdate <# 09 / 20 / 2016#, b.quantity, 0)) AS Spisanie, 
       SUM(Iif(b.opername = 'vozvrat' 
               AND b.operdate <# 09 / 20 / 2016#, b.quantity, 0)) AS Vozvrat, 
       Iif(begrem IS NULL, 0, begrem) + prihod 
       + vozvrat - realiz - spisanie                              AS EndRem 
FROM   ((((((SELECT prodid 
            FROM   remains 
            WHERE  salid = 19 
            UNION 
            SELECT a.prodid 
            FROM   operations a, 
                   users b 
            WHERE  a.usrid = b.usrid 
                   AND b.salid = 19) a 
            LEFT JOIN operations b 
                   ON a.prodid = b.prodid) 
           LEFT JOIN remains c 
                  ON a.prodid = c.prodid) 
          LEFT JOIN products d 
                 ON a.prodid = d.prodid) 
         LEFT JOIN users e 
                ON b.usrid = e.usrid) 
        LEFT JOIN bases f 
               ON d.basid = f.basid) 
WHERE  e.salid = 19 
       AND f.srvflag = 0 
GROUP  BY a.prodid, 
          d.produnit, 
          d.prodname, 
          d.prodprice, 
          c.quantity 
ORDER  BY d.prodname
...
Рейтинг: 0 / 0
20.09.2016, 10:36
    #39311731
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
Удалите подзапрос из Group By.
...
Рейтинг: 0 / 0
20.09.2016, 10:36
    #39311733
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
т.е. вместо d.prodprice пытаюсь инжектить подзапрос, который из справочника продукции (прайслиста) будет подтягивать цену на дату, которая спрашивается в запросе.

Ну вот что не так я сделал ? - не пойму... :-(
...
Рейтинг: 0 / 0
20.09.2016, 10:40
    #39311739
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
mds_world, результат :-(

...
Рейтинг: 0 / 0
20.09.2016, 10:44
    #39311745
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
В тестовом запросе такой же точно подзапрос отлично отрабатывает
Код: sql
1.
2.
3.
SELECT b.prodName, (SELECT TOP 1 c.prodPrice FROM products c WHERE a.prodID=c.prodID AND c.priceDate<=#09/19/2016# ORDER BY c.priceDate desc) AS Cen
FROM operations AS a, products AS b
WHERE a.prodID=b.prodID AND a.operDate=#09/19/2016#;
...
Рейтинг: 0 / 0
20.09.2016, 10:53
    #39311755
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
Евген987,
попробуй скопипастить запрос , который ниже себе в конструктор SQL запросов и выполнить , и скажи , что будет
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
SELECT a.prodid, d.produnit, d.prodname, (SELECT TOP 1 z.prodprice 
        FROM   products z 
        WHERE  d.prodid = z.prodid 
               AND z.pricedate <=#9/20/2016# 
        ORDER  BY z.pricedate DESC), c.quantity AS BegRem, SUM(Iif(b.opername = 'prihod' 
               AND b.operdate <# 09 / 20 / 2016#, b.quantity, 0)) AS Prihod, SUM(Iif(b.opername = 'realiz' 
               AND b.operdate <# 09 / 20 / 2016#, b.quantity, 0)) AS Realiz, SUM(Iif(b.opername = 'spisanie' 
               AND b.operdate <# 09 / 20 / 2016#, b.quantity, 0)) AS Spisanie, SUM(Iif(b.opername = 'vozvrat' 
               AND b.operdate <# 09 / 20 / 2016#, b.quantity, 0)) AS Vozvrat, Iif(begrem IS NULL, 0, begrem) + prihod 
       + vozvrat - realiz - spisanie AS EndRem
FROM (((((SELECT prodid 
            FROM   remains 
            WHERE  salid = 19 
            UNION 
            SELECT a.prodid 
            FROM   operations a, 
                   users b 
            WHERE  a.usrid = b.usrid 
                   AND b.salid = 19) AS a LEFT JOIN operations AS b ON a.prodid = b.prodid) LEFT JOIN remains AS c ON a.prodid = c.prodid) LEFT JOIN products AS d ON a.prodid = d.prodid) LEFT JOIN users AS e ON b.usrid = e.usrid) LEFT JOIN bases AS f ON d.basid = f.basid
WHERE e.salid = 19 
       AND f.srvflag = 0
GROUP BY a.prodid, d.produnit, d.prodname, (SELECT TOP 1 z.prodprice 
           FROM   products z 
           WHERE  d.prodid = z.prodid 
                  AND z.pricedate <=#9/20/2016# 
           ORDER  BY z.pricedate DESC), c.quantity
ORDER BY d.prodname;
...
Рейтинг: 0 / 0
20.09.2016, 11:08
    #39311764
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
guest_rusimport,



Сейчас базу подготовлю, выложу, чтобы все желающие могли попробовать...
...
Рейтинг: 0 / 0
20.09.2016, 11:11
    #39311768
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
База для тестов лежит здесь

http://korosteleff.narod.ru/infobase.mdb/
...
Рейтинг: 0 / 0
20.09.2016, 11:12
    #39311773
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
База для тестов лежит здесь (последний слеш был лишним)

http://korosteleff.narod.ru/infobase.mdb
...
Рейтинг: 0 / 0
20.09.2016, 11:22
    #39311780
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
Евген987,

база битая
...
Рейтинг: 0 / 0
20.09.2016, 11:24
    #39311784
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
guest_rusimport,

попробуй снова, я перезаливал...
сейчас ещё архивом выложу...
...
Рейтинг: 0 / 0
20.09.2016, 11:25
    #39311788
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
...
Рейтинг: 0 / 0
20.09.2016, 11:26
    #39311789
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
Евген987mds_world, результат :-(Ошибка из-за того, что в условии подзапроса написано z .prodid, а группбае a .prodid. Разумеется будет ошибка, ведь z.prodid не в группировке
...
Рейтинг: 0 / 0
20.09.2016, 11:31
    #39311793
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
mds_world,

у тебя заработало ?
...
Рейтинг: 0 / 0
20.09.2016, 11:40
    #39311810
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
Стандартная задача учета товара по продажным ценам.
Стандартно решается путем "прайс-листа" на дату.
...
Рейтинг: 0 / 0
20.09.2016, 11:42
    #39311814
Евген987
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм расчёта ведомости движения товара
982183, согласен, так и пытаюсь решить, подтянуть цену по товару, которая была установленной на эту дату
Но не взлетает...
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Алгоритм расчёта ведомости движения товара / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]