powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Дайте пример как обновлять остатки через процедуру?
25 сообщений из 25, страница 1 из 1
Дайте пример как обновлять остатки через процедуру?
    #39144255
RADSeatle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем
Как вы обновляте остатки товаров через ХП?
Прочитал
Хранимые агрегаты без конфликтов и блокировок - рецепт
Но там в конце не понял и еще когда вызвать где вызвать тоже не понятно
авторИ время от времени запускаем её в транзакции с TIL CONCURRENCY. Ни в коем случае не в READ COMMITTED!!!


авторsession #2
-- вот при этом commit'e должно было бы сработать отложенное ограничение!
-- но оно выполнилось ранее, при insert'e, когда сеанс_1 еще не закоммитил
-- свои данные и их не было видно в сеансе_2
SQL> commit;

session #1
SQL> select * from goods_amounts_agg;

GOOD AMOUNT AMOUNT_TOTAL
============ ============ =====================
1 100 -80
1 200 -80
1 -190 -80
1 -190 -80


Всё, приехали. :(



Количество складов ограничено максимум 10 реально использует 3 точки + склад основной
Есть 2 таблица
Мастер и детайл остатки пока беру селектом но в будущем если база копится то селектом проблема будет с тормозами..
Пример таблица мастер

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
table headdoc
id	          number
direction	    varchar2(100)			--sale,purchase,return purchase,return sale,move,correction
from_store    varchar2(100)		  --from china turkey or stores or customers
to_store	    varchar2(100)	    --to stores or customers
dateoperation	date			oper date
docnum	      varchar2(10)			
isexecuted	  varchar2(3)	yes/no calculated remain items total


Пример таблица детайл
Код: sql
1.
2.
3.
4.
5.
6.
7.
table headerdetail
id	number
id_headdoc	number
item	varchar2(100)
qty	number
amt	number
boxnumber	number ---- Код коробки



Остатки беру так и показываю при расходе с каких коробок продаем и там сам выбирает

Код: 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.
select item,
       boxnumber,
       sum(decode(stores,'store1',abs(qty),0)) as "store1",
       sum(decode(stores,'store2',abs(qty),0)) as "store2",
       sum(decode(stores,'store3',abs(qty),0)) as "store3",
       sum(decode(stores,'mainstore',abs(qty),0)) as "mainstore",
       sum(abs(qty)) Total from 
  (
select bnf.headdoc.from_store stores,-sum(headerdetail.qty) qty,headerdetail.item item,headerdetail.boxnumber boxnumber from bnf.headdoc
   join bnf.headerdetail on bnf.headerdetail.id_headdoc=bnf.headdoc.id
    and bnf.headdoc.direction='Move'
    GROUP BY headdoc.from_store, item, headerdetail.boxnumber
union all    
select bnf.headdoc.to_store stores, sum(headerdetail.qty) qty,headerdetail.item item,headerdetail.boxnumber boxnumber from bnf.headdoc
   join bnf.headerdetail on bnf.headerdetail.id_headdoc=bnf.headdoc.id
    and bnf.headdoc.direction='Move'
    GROUP BY headdoc.to_store, item,headerdetail.boxnumber
union all     
select bnf.headdoc.from_store stores, sum(headerdetail.qty) qty,headerdetail.item item,headerdetail.boxnumber boxnumber from bnf.headdoc
   join bnf.headerdetail on bnf.headerdetail.id_headdoc=bnf.headdoc.id
    and bnf.headdoc.direction='Correction'
    GROUP BY headdoc.from_store, item,headerdetail.boxnumber
union all     
select bnf.headdoc.from_store stores, -sum(headerdetail.qty) qty,headerdetail.item item,headerdetail.boxnumber boxnumber from bnf.headdoc
   join bnf.headerdetail on bnf.headerdetail.id_headdoc=bnf.headdoc.id
    and bnf.headdoc.direction='Sale'
    GROUP BY headdoc.from_store, item,headerdetail.boxnumber    
    ) x   
group by stores,item,boxnumber;


Пока думаю создать еще одну таблицу

Код: sql
1.
2.
3.
4.
5.
6.
7.
Table TotalItems с полями
ID
IDItems
Boxnumber
IdStore
Qty
AvgAmount   --Средная себестоимость товара



Потом селектом с этого таблиц брал. Но как обновить и контролироват? Особенно при перемещение то есть одного точка минисуется а другой плюсуется. Заранее благодарен..
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39144674
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RADSeatle,

запрос не работоспособен. По крайней мере на Firebird. Нет в FB схем, а потому такие конструкции bnf.headdoc.from_store в принципе не возможны, если конечно bnf не пакет, headdoc его процедура, а from_store выходной параметр процедуры
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39144827
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисНет в FB схем
А также типа VARCHAR2 о deferred constraints.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39144829
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovо deferred constraints.
оооооо! deferred constraints!

p.s. скукотища. в смысле, что до НГ, что после.
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39144831
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Kdv!
You wrote on 11 января 2016 г. 17:44:58:

Kdv> p.s. скукотища. в смысле, что до НГ, что после.печень бережешь?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39144847
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvскукотища. в смысле, что до НГ, что после.
А ты ожидал, что НГ автоматически приносит с собой смех и веселье?..

Впрочем, если ты, в отличии от меня, считаешь глупость забавной - читай firebird-support.
Там ежедневный цирк с обезьянками.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39144857
RADSeatle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас структуры выложу
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39144864
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RADSeatleСейчас структуры выложу

Ни к чему: Оракул всё равно в соседнем разделе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39144867
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящийпечень бережешь?
моя печень окружающим пофиг, просто давно уже нет каких-то серьезных топиков. Школота разве что доставляет, и все.
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39144892
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvпросто давно уже нет каких-то серьезных топиков.
Что ты считаешь "серьёзным топиком"?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39144893
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Kdv!
You wrote on 11 января 2016 г. 18:40:44:

Kdv> моя печень окружающим пофиг, просто давно уже нет каких-то серьезных топиков. Школота разве что доставляет, и все.
кризис жанра.
программизЪм отмирает как атавистическое порождение избыточного интеллекта.
на смену ему уже пришел тупой прогрессивный кодинг и мапинг.
со всевозможными ORM-ами и фреймворками.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39144995
RADSeatle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа ну что вы .. Вот примерный 2 таблиц. В реале будет

Таблицы
RefProducts
RefCategory --Shoes Shirt etc
RefMeasurement
RefStores
RefCustomers
RefUsers
RefActions --- Sale Return Purchase Correction
HeaderDoc
HeaderDetail


Планирую 2 доп таблицу
Table Saldo
ProductID
BoxNumber
StoreID
CurrentDate
saldo_in,
in_come,
out_come,
saldo_out


Table Remain
ProductID
BoxNumber
StoreID
Qty.. Буду отсюда брать остатки


Пока селектом беру но такой подход не нравиться мне
Пока в день будет инсертится общий 500-1000 записи

Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
/******************************************************************************/
/***         Generated by IBExpert 2016.1.11.1 11.01.2016 23:43:48          ***/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES UTF8;

SET CLIENTLIB 'C:\fb3rc2\fbclient.dll';

CREATE DATABASE 'butik'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET UTF8 COLLATION UTF8;



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/



CREATE TABLE HEADDOC (
    ID             D_ID GENERATED BY DEFAULT AS IDENTITY,
    DIRECTION      VARCHAR(30),
    FROM_STORE     VARCHAR(20),
    TO_STORE       VARCHAR(20),
    DATEOPERATION  TIMESTAMP,
    DOCNUM         VARCHAR(20),
    ISEXECUTED     VARCHAR(3)
);

CREATE TABLE HEADERDETAIL (
    ID          INTEGER GENERATED BY DEFAULT AS IDENTITY,
    ID_HEADDOC  INTEGER NOT NULL,
    ITEM        VARCHAR(50) CHARACTER SET NONE,
    QTY         INTEGER DEFAULT 0 NOT NULL,
    AMT         NUMERIC(18,3) DEFAULT 0 NOT NULL,
    BOXNUMBER   INTEGER NOT NULL
);

INSERT INTO HEADDOC (ID, DIRECTION, FROM_STORE, TO_STORE, DATEOPERATION, DOCNUM, ISEXECUTED) VALUES (1, 'purchase', 'China', 'Мainstore', '2016-01-10 00:00:00', '#1', 'Yes');
INSERT INTO HEADDOC (ID, DIRECTION, FROM_STORE, TO_STORE, DATEOPERATION, DOCNUM, ISEXECUTED) VALUES (2, 'move', 'Мainstore', 'Store1', '2016-01-11 23:07:02', '#2', 'Yes');
INSERT INTO HEADDOC (ID, DIRECTION, FROM_STORE, TO_STORE, DATEOPERATION, DOCNUM, ISEXECUTED) VALUES (3, 'move', 'Store1', 'Мainstore', '2016-01-12 00:00:00', '#3', 'Yes');
INSERT INTO HEADDOC (ID, DIRECTION, FROM_STORE, TO_STORE, DATEOPERATION, DOCNUM, ISEXECUTED) VALUES (4, 'sale', 'Store1', 'client', '2016-01-13 00:00:00', '#3', 'Yes');
INSERT INTO HEADDOC (ID, DIRECTION, FROM_STORE, TO_STORE, DATEOPERATION, DOCNUM, ISEXECUTED) VALUES (5, 'correction', 'Store1', NULL, '2016-01-20 00:00:00', '#2', 'Yes');
INSERT INTO HEADDOC (ID, DIRECTION, FROM_STORE, TO_STORE, DATEOPERATION, DOCNUM, ISEXECUTED) VALUES (6, 'return sale', 'client', 'Store1', '2016-01-26 00:00:00', '#Return ', 'Yes');

COMMIT WORK;

INSERT INTO HEADERDETAIL (ID, ID_HEADDOC, ITEM, QTY, AMT, BOXNUMBER) VALUES (1, 1, 'Item A Black XXL', 10, 15, 1);
INSERT INTO HEADERDETAIL (ID, ID_HEADDOC, ITEM, QTY, AMT, BOXNUMBER) VALUES (2, 1, 'Item A Red  XXX', 10, 15, 1);
INSERT INTO HEADERDETAIL (ID, ID_HEADDOC, ITEM, QTY, AMT, BOXNUMBER) VALUES (3, 1, 'Item A White XL', 10, 15, 1);
INSERT INTO HEADERDETAIL (ID, ID_HEADDOC, ITEM, QTY, AMT, BOXNUMBER) VALUES (4, 2, 'Item A Black XXL', 5, 15, 1);
INSERT INTO HEADERDETAIL (ID, ID_HEADDOC, ITEM, QTY, AMT, BOXNUMBER) VALUES (11, 3, 'Item A Black XXL', 3, 15, 1);
INSERT INTO HEADERDETAIL (ID, ID_HEADDOC, ITEM, QTY, AMT, BOXNUMBER) VALUES (12, 4, 'Item A Black XXL', 2, 25, 1);
INSERT INTO HEADERDETAIL (ID, ID_HEADDOC, ITEM, QTY, AMT, BOXNUMBER) VALUES (13, 5, 'Item A Black XXL', 5, 15, 1);
INSERT INTO HEADERDETAIL (ID, ID_HEADDOC, ITEM, QTY, AMT, BOXNUMBER) VALUES (15, 6, 'Item A Black XXL', 1, 25, 1);

COMMIT WORK;



/******************************************************************************/
/***                        Autoincrement generators                        ***/
/******************************************************************************/

ALTER TABLE HEADDOC ALTER ID RESTART WITH 6;
ALTER TABLE HEADERDETAIL ALTER ID RESTART WITH 15;




/******************************************************************************/
/***                              Primary keys                              ***/
/******************************************************************************/

ALTER TABLE HEADERDETAIL ADD PRIMARY KEY (ID);


/******************************************************************************/
/***                          Fields descriptions                           ***/
/******************************************************************************/

COMMENT ON COLUMN HEADDOC.DIRECTION IS 
'sale,purchase,return purchase,return sale,move,correction';

COMMENT ON COLUMN HEADDOC.FROM_STORE IS 
'from china turkey or stores or customers';

COMMENT ON COLUMN HEADDOC.TO_STORE IS 
'to stores or customers';

COMMENT ON COLUMN HEADDOC.DATEOPERATION IS 
'operation date';

COMMENT ON COLUMN HEADDOC.DOCNUM IS 
'Doc number';

COMMENT ON COLUMN HEADDOC.ISEXECUTED IS 
'yes/no calculated remain items total';

COMMENT ON COLUMN HEADERDETAIL.ITEM IS 
'Name Item';



Сам селект для показа остатка

Код: 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.
select item, boxnumber, sum(decode(stores, 'Store1', (qty), 0)) as "Store1",
       sum(decode(stores, 'Store2', (qty), 0)) as "Store2",
       sum(decode(stores, 'Store3', (qty), 0)) as "Store3",
       sum(decode(stores, 'Мainstore', (qty), 0)) as "Мainstore",
       sum((qty)) total
from (select headdoc.to_store stores, sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on  headdoc.id = headerdetail.id_headdoc and
            headdoc.direction = 'purchase'
      group by headdoc.to_store, item, headerdetail.boxnumber
      union all
      select headdoc.from_store stores, -sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on headerdetail.id_headdoc = headdoc.id and
            headdoc.direction = 'move'
      group by headdoc.from_store, item, headerdetail.boxnumber
      union all
      select headdoc.to_store stores, sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on headerdetail.id_headdoc = headdoc.id and
            headdoc.direction = 'move'
      group by headdoc.to_store, item, headerdetail.boxnumber
      union all
      select headdoc.from_store stores, sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on headerdetail.id_headdoc = headdoc.id and
            headdoc.direction = 'correction'
      group by headdoc.from_store, item, headerdetail.boxnumber
      union all
      select headdoc.from_store stores, -sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on headerdetail.id_headdoc = headdoc.id and
            headdoc.direction = 'sale'
      group by headdoc.from_store, item, headerdetail.boxnumber
      union all
      select headdoc.to_store stores, sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on  headdoc.id = headerdetail.id_headdoc and
            headdoc.direction = 'return sale'
      group by headdoc.to_store, item, headerdetail.boxnumber
      ) x
group by  item, boxnumber;
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39145124
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv...просто давно уже нет каких-то серьезных топиков.
Сгенерировать?
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39145182
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

Серьёзный топик - это не когда рука тянется набить лицо.
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39145211
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery, когда рука тянется набить лицо, это не "сюда", это к психоаналитику. ;)
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39145266
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv> просто давно уже нет каких-то серьезных топиков

Смотря что ты называешь серьёзным.
Таблоид вон стабильно почти каждую
неделю выдаёт что-то. Игорь иногда
тоже отжигает. Или тебе нетривиальные
запросы нужны?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39145433
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

Не меняй тему. Генерировать серьёзные топики ты не приспособлен.
А будешь мне диагноз ставить - он к тебе не раз ещё вернётся
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39145474
Гхостик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RADSeatle, если ты делаешь это в оракле и тебе нужны только текущие остатки а не на дату, заведи поле в справочнике и заполняй его. Лучше в compound trigger-е суммой по всем измененным одним statement-ом записям.
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39145492
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RADSeatleОстатки беру так и показываю при расходе с каких коробок продаем и там сам выбирает
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
select ...
  (
select ... from bnf.headdoc
   join bnf.headerdetail on ....
    and bnf.headdoc.direction='Move'
    ...
union all    
select ... from bnf.headdoc
   join bnf.headerdetail on ...
    and bnf.headdoc.direction='Move'
    ...
union all     
select ... from bnf.headdoc
   join bnf.headerdetail on ...
    and bnf.headdoc.direction='Correction'
    ...
union all     
select ... from bnf.headdoc
   join bnf.headerdetail on ...
    and bnf.headdoc.direction='Sale'
    ...
    ) x   
...

Вы соединяете 4 раза одни и те же таблицы (со странными для ФБ именами, ну да ладно), меняя только условие and bnf.headdoc.direction" = '...'. Соединение - очень дорогая операция (если не самая дорогая), старайтесь всегда уменьшить число обращений к ней.

RADSeatleкак обновить и контролироват? Особенно при перемещение то есть одного точка минисуется а другой плюсуется. Заранее благодарен..Обновить остатки - просто (в процедуре, которая "пробегает" по журналу, делаете update or insert таблицы этих остатков, как показал в своём посте ДС).

А вот контролировать их на неотрицательность - уже веселее.
Вам придется лочить строку таблицы остатков при выполнении каждого расхода (а также отмены ранее созданного прихода), чтобы не давать двум транзакциям снять с полки больше, чем там имеется. Это при интенсивной работе с одним и тем же изделием неизбежно приведёт к большому числу лок-конфликтов.
Есть один способ уменьшить частоту этих конфликтов (там сальдовая таблица вообще не лочится), но он весьма геморный в реализации и требует, чтобы все транзакции стартовали только с TIL = snapshot, т.е. никаких RC.
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39145516
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидА вот контролировать их на неотрицательность - уже веселее.
Вам придется лочить строку таблицы остатков при выполнении каждого расхода (а также отмены ранее созданного прихода), чтобы не давать двум транзакциям снять с полки больше, чем там имеется. Это при интенсивной работе с одним и тем же изделием неизбежно приведёт к большому числу лок-конфликтов.
Есть один способ уменьшить частоту этих конфликтов (там сальдовая таблица вообще не лочится), но он весьма геморный в реализации и требует, чтобы все транзакции стартовали только с TIL = snapshot, т.е. никаких RC.
А почему нельзя наложить ограничение на хранимый агрегат "остаток" что-то типа VALUE>0?
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39145521
RADSeatle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот это правилный селект
Код: 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.
select item, boxnumber, sum(decode(stores, 'Store1', (qty), 0)) as "Store1",
       sum(decode(stores, 'Store2', (qty), 0)) as "Store2",
       sum(decode(stores, 'Store3', (qty), 0)) as "Store3",
       sum(decode(stores, 'Мainstore', (qty), 0)) as "Мainstore",
       sum((qty)) total
from (select headdoc.to_store stores, sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on  headdoc.id = headerdetail.id_headdoc and
            headdoc.direction = 'purchase'
      group by headdoc.to_store, item, headerdetail.boxnumber
      union all
      select headdoc.from_store stores, -sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on headerdetail.id_headdoc = headdoc.id and
            headdoc.direction = 'move'
      group by headdoc.from_store, item, headerdetail.boxnumber
      union all
      select headdoc.to_store stores, sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on headerdetail.id_headdoc = headdoc.id and
            headdoc.direction = 'move'
      group by headdoc.to_store, item, headerdetail.boxnumber
      union all
      select headdoc.from_store stores, sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on headerdetail.id_headdoc = headdoc.id and
            headdoc.direction = 'correction'
      group by headdoc.from_store, item, headerdetail.boxnumber
      union all
      select headdoc.from_store stores, -sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on headerdetail.id_headdoc = headdoc.id and
            headdoc.direction = 'sale'
      group by headdoc.from_store, item, headerdetail.boxnumber
      union all
      select headdoc.to_store stores, sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on  headdoc.id = headerdetail.id_headdoc and
            headdoc.direction = 'return sale'
      group by headdoc.to_store, item, headerdetail.boxnumber
      ) x
group by  item, boxnumber;


Как лочит таблицу? Процедуру insert update delete вызваю режиме snapshot.. Пусткай в минус уходит потом сами корректирует check на минус нет у меня

Пока этот мысл у меня не знаю правильно ли или нет
Примерно все в одном транзакции
Код: 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.
     MasterInsertProcedure
     DetailInsertProcedure
     UpdateRemains(IDDOC)


     Внутри UpdateRemain
           select sum(qty) into v_sum
               group by item
            
           update goods     
               qty=qty+v_sum
           where goodid


     MasterUpdateProcedure
     DetailUpdateProcedure
     UpdateRemains(IDDOC)


     Внутри UpdateRemain
           select sum(qty) into v_sum
               group by item
            
           update goods     
               qty=qty-v_sum
           where goodid

           update goods     
               qty=qty+v_sum
           where goodid


Как то так
Если есть лучший способ поделитесь
Допустим у меня юзер сделал приход но галочку не поставил тоесть документ состояние (не проведен)
Тогда тупа инсерт в мастер и детайл если что то забыл апдейтил мастера и детайла и поставил галочку на проведен
То тогда апдейт мастер апдейт детайл и апдейт таблицу остатков потом если удалил документ или еще менял что то то опять надо уменшить или увеличет баланс
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39145526
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDD,

журнал движения (который далее надо будет обмолотить, чтобы схлопнуть остатки) заполняется _до_ всякого контроля на неотрицательность. Затолкали количество = 7 в расходный ("-1") документ по изделию номер 789654 - добавили в журнал запись "789654; -1; 7". То же самое сделала вторая транзакция. И не ведает, что там уже нет 7 штук на полке.
Дальше документы "проводят" , а затем на сцену приходит процедурка, которая будет схлопывать остатки. Она, конечно, обломается на этом схлопывании из-за check>=0.
Смекатете, что дальше надо будет ? ;-)
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39145542
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид, а про журнал то я и забыл. У меня его нету, таблица агрегатов заполняется при добавлении строки/проводке документов. Блокировки разруливаются на клиенте, да и нет их практически в аптеке. Кстати и у ТСа нет насущной необходимости в промежуточном журнале с его 1000 инсертами в день.
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39145556
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeDDу ТСа нет насущной необходимости в промежуточном журнале с его 1000 инсертами в день.да, до меня тоже дошло, что ему надо просто лочить сальдовую табилицу в триггере :-)
Фраза "Пусткай в минус уходит потом сами корректирует check на минус нет у меня" всё как-то сразу прояснила.
...
Рейтинг: 0 / 0
Дайте пример как обновлять остатки через процедуру?
    #39145567
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot RADSeatle]Вот это правилный селект
Код: 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.
select item, boxnumber, sum(decode(stores, 'Store1', (qty), 0)) as "Store1",
       sum(decode(stores, 'Store2', (qty), 0)) as "Store2",
       sum(decode(stores, 'Store3', (qty), 0)) as "Store3",
       sum(decode(stores, 'Мainstore', (qty), 0)) as "Мainstore",
       sum((qty)) total
from (select headdoc.to_store stores, sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on  headdoc.id = headerdetail.id_headdoc and
            headdoc.direction = 'purchase'
      group by headdoc.to_store, item, headerdetail.boxnumber
      union all
      select headdoc.from_store stores, -sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on headerdetail.id_headdoc = headdoc.id and
            headdoc.direction = 'move'
      group by headdoc.from_store, item, headerdetail.boxnumber
      union all
      select headdoc.to_store stores, sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on headerdetail.id_headdoc = headdoc.id and
            headdoc.direction = 'move'
      group by headdoc.to_store, item, headerdetail.boxnumber
      union all
      select headdoc.from_store stores, sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on headerdetail.id_headdoc = headdoc.id and
            headdoc.direction = 'correction'
      group by headdoc.from_store, item, headerdetail.boxnumber
      union all
      select headdoc.from_store stores, -sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on headerdetail.id_headdoc = headdoc.id and
            headdoc.direction = 'sale'
      group by headdoc.from_store, item, headerdetail.boxnumber
      union all
      select headdoc.to_store stores, sum(headerdetail.qty) qty, headerdetail.item item,
             headerdetail.boxnumber boxnumber
      from headdoc
      join headerdetail on  headdoc.id = headerdetail.id_headdoc and
            headdoc.direction = 'return sale'
      group by headdoc.to_store, item, headerdetail.boxnumber
      ) x
group by  item, boxnumber;



это ужас, а не селект.
Вот это должно давать примерно тоже самое и работать быстрее. Но не проверял

Код: 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.
WITH X
AS (
   SELECT
        HEADDOC.TO_STORE AS STORES,
        SUM(HEADERDETAIL.QTY) AS QTY,
        HEADERDETAIL.ITEM AS ITEM,
        HEADERDETAIL.BOXNUMBER AS BOXNUMBER
    FROM
        HEADDOC
        JOIN HEADERDETAIL ON HEADDOC.ID = HEADERDETAIL.ID_HEADDOC
    WHERE HEADDOC.DIRECTION IN ('purchase', 'move', 'return sale')
    GROUP BY HEADDOC.TO_STORE, ITEM, HEADERDETAIL.BOXNUMBER

    UNION ALL

    SELECT
        HEADDOC.FROM_STORE AS STORES,
        SUM(CASE
          WHEN HEADDOC.DIRECTION IN ('move', 'sale')
          THEN -HEADERDETAIL.QTY
          ELSE HEADERDETAIL.QTY
        END) AS QTY,
        HEADERDETAIL.ITEM AS ITEM,
        HEADERDETAIL.BOXNUMBER AS BOXNUMBER
    FROM
        HEADDOC
        JOIN HEADERDETAIL ON HEADERDETAIL.ID_HEADDOC = HEADDOC.ID
    WHERE HEADDOC.DIRECTION IN ('move', 'sale', 'correction')
    GROUP BY HEADDOC.FROM_STORE, ITEM, HEADERDETAIL.BOXNUMBER
)
SELECT
    ITEM,
    BOXNUMBER,
    SUM(IIF(STORES = 'Store1', QTY, 0)) AS "Store1",
    SUM(IIF(STORES = 'Store2', QTY, 0)) AS "Store2",
    SUM(IIF(STORES = 'Store3', QTY, 0)) AS "Store3",
    SUM(IIF(STORES = 'Мainstore', QTY, 0)) AS "Мainstore",
    SUM(QTY) AS TOTAL
FROM X
GROUP BY ITEM, BOXNUMBER;
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Дайте пример как обновлять остатки через процедуру?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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