Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Товарищи помогите с процедурой пожалуйста  [new]
Erlan_dba
Member

Откуда: Казахстан
Сообщений: 292
Есть 3 таблицы
1)Покупки (id, tovar, system_date, kol, _opt_cena.......)
2)Продажи (id, tovar, system_date, kol, cena.......)
3)Склад (tovar_d, date_refresh, kol......)

При покупке товара, через триггер обновляется количество товара на складе, при продаже так же обновляется. Как в такой схеме можно организовать удаление строк из таблиц Покупки и Продажи с соответствующим обновлением Склада. Накатал код:
create or replace
PROCEDURE       "DEL_RASHOD" (in_rashod_id IN NUMBER)
 AS
  tov NUMBER;
  id_rash NUMBER;
  kol_rash NUMBER;
BEGIN
 SELECT id, tovar_type_id, kol INTO id_rash, tov, kol_rash
  FROM uchet.pokupki
  WHERE id=in_rashod_id;
  
 UPDATE uchet.sklad
  SET kol_tovar=kol_tovar-kol_rash
  WHERE tovar_type_id=tov;

 DELETE uchet.pokupki 
  WHERE id=id_rash;
 
 EXCEPTION WHEN NO_DATA_FOUND THEN
   raise_application_error(-20001, 'Ошибка!!! Заказ с таким номером не найден!!!');
  
 END;

Но если пользователь допустим удалит покупку за прошлый период (ну или же дни) а товар то был продан и его количество на складе уменьшилось, вот тут проблема возникает. Что подскажете друзья?
11 июн 11, 15:08    [10801656]     Ответить | Цитировать Сообщить модератору
 Re: Товарищи помогите с процедурой пожалуйста  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54377
Erlan_dba,

что делать? проверять! хватит ли остатка для продажи или отмены покупки

а вообще-то, я думал, что уже везде ведётся партионный учёт
12 июн 11, 18:53    [10804128]     Ответить | Цитировать Сообщить модератору
 Re: Товарищи помогите с процедурой пожалуйста  [new]
Erlan_dba
Member

Откуда: Казахстан
Сообщений: 292
Допустим товар куплен неделю назад, продан 5 дней назад, и чтобы пользователь не мог удалить уже проданный товар. Как можно это реализовать? Подскажите?
12 июн 11, 19:18    [10804174]     Ответить | Цитировать Сообщить модератору
 Re: Товарищи помогите с процедурой пожалуйста  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10755
Erlan_dba
чтобы пользователь не мог удалить уже проданный товар. Как можно это реализовать? Подскажите?
Определить отношения ссылочной целостности между таблицами товаров и заказов?
12 июн 11, 19:49    [10804239]     Ответить | Цитировать Сообщить модератору
 Re: Товарищи помогите с процедурой пожалуйста  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54377
Basil A. Sidorov
Erlan_dba
чтобы пользователь не мог удалить уже проданный товар. Как можно это реализовать? Подскажите?
Определить отношения ссылочной целостности между таблицами товаров и заказов?
ну это вряд ли
просто проверять в триггере суммы
не забывая блокировать нужные строки
12 июн 11, 20:08    [10804286]     Ответить | Цитировать Сообщить модератору
 Re: Товарищи помогите с процедурой пожалуйста  [new]
Erlan_dba
Member

Откуда: Казахстан
Сообщений: 292
andreymx а можно чуть конкретнее? Спасибо!
13 июн 11, 08:42    [10805264]     Ответить | Цитировать Сообщить модератору
 Re: Товарищи помогите с процедурой пожалуйста  [new]
stax..
Guest
Erlan_dba,

create table sklad (tovar_d int, date_refresh date, kol number  constraint ch_sklad_kol check(kol>=0));
/
create table poupki (id int, tovar int, system_date date, kol number)
/
Table created.

SQL> insert into poupki values (1,1,sysdate,10);

1 row created.

SQL> insert into poupki values (2,1,sysdate,100);

1 row created.

SQL> insert into sklad values(1,sysdate,100);

1 row created.

SQL> commit;

Commit complete.

CREATE OR REPLACE TRIGGER tr_pokupki_DFR
BEFORE DELETE ON poupki FOR EACH ROW
begin
 update sklad s set s.kol=s.kol-:old.kol where s.tovar_d=:old.tovar;
end;
/
SQL> /

Trigger created.

SQL> select * from sklad;

   TOVAR_D DATE_REFRE        KOL
---------- ---------- ----------
         1 13.06.2011        100

SQL> select * from poupki;

        ID      TOVAR SYSTEM_DAT        KOL
---------- ---------- ---------- ----------
         1          1 13.06.2011         10
         2          1 13.06.2011        100

SQL> delete poupki where id=1;

1 row deleted.

SQL> select * from sklad;

   TOVAR_D DATE_REFRE        KOL
---------- ---------- ----------
         1 13.06.2011         90

SQL> delete poupki where id=2;
delete poupki where id=2
       *
ERROR at line 1:
ORA-02290: check constraint (STAX.CH_SKLAD_KOL) violated
ORA-06512: at "STAX.TR_POKUPKI_DFR", line 2
ORA-04088: error during execution of trigger 'STAX.TR_POKUPKI_DFR'


SQL> select * from sklad;

   TOVAR_D DATE_REFRE        KOL
---------- ---------- ----------
         1 13.06.2011         90

SQL>  select * from poupki;

        ID      TOVAR SYSTEM_DAT        KOL
---------- ---------- ---------- ----------
         2          1 13.06.2011        100

SQL>  select * from poupki;



......
stax
13 июн 11, 10:01    [10805336]     Ответить | Цитировать Сообщить модератору
 Re: Товарищи помогите с процедурой пожалуйста  [new]
stax..
Guest
andreymx
Basil A. Sidorov
пропущено...
Определить отношения ссылочной целостности между таблицами товаров и заказов?
ну это вряд ли
просто проверять в триггере суммы
не забывая блокировать нужные строки

если делать в триггере, то зачем вручну блокировать?

......
stax
13 июн 11, 10:03    [10805339]     Ответить | Цитировать Сообщить модератору
 Re: Товарищи помогите с процедурой пожалуйста  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54377
stax..
andreymx
ну это вряд ли
просто проверять в триггере суммы
не забывая блокировать нужные строки
если делать в триггере, то зачем вручну блокировать?
да вроде и незачем
вечером уже писал :(
13 июн 11, 10:33    [10805377]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить