![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Есть 2 таблицы: material и product.
|Name |CountM |Price |DeliverDate |id_Material|
|Нитки | 100,0 |25,40 |15 октября 2009 г. |1 |
|Молнии | 200,0 |16,30 |16 октября 2009 г. |2 |
|Ткань синяя |1 000,0 |12,76 |19 октября 2009 г. |3 |
|Ткань синяя |1 000,0 |10,00 |21 октября 2009 г. |4 |
|Нитки | 250,0 |4,00 |22 октября 2009 г. |5 |
При добавлении данных в таблицу product
|Name |CountM |Price |DeliverDate |id_Material|
|Нитки | 0 |25,40 |15 октября 2009 г. |1 |
|Молнии | 200,0 |16,30 |16 октября 2009 г. |2 |
|Ткань синяя |1 000,0 |12,76 |19 октября 2009 г. |3 |
|Ткань синяя |1 000,0 |10,00 |21 октября 2009 г. |4 |
|Нитки | 50,0 |4,00 |22 октября 2009 г. |5 |
Не могу понять как это правильно реализовать ![]()
Отредактированно Eugene86 (24.10.2009 22:10:18)
Неактивен

А зачем Вам такая странная схема организации данных? Таблички одновременно
несут смысл лога и количества материала? Когда материал заканчивается, лог
оказывается бессмысленным — не известно, сколько принесли. Известно только
когда.
Также задачка будет очень нетривиальна в случае, когда в material материала
(во всех строках) уже не осталось, а в product добавляется новая запись... у Вас
значения ниже нуля не опускаются ведь?
Обычно ведут отдельно журнал поступлений (Ваш material), отдельно табличку
«сколько осталось», и отдельно журнал расходов (Ваш products). Тогда и логика
простая, и работает быстро, и даже понятно, как жить с отрицательными значениями.
Неактивен
paulus написал:
...
Также задачка будет очень нетривиальна в случае, когда в material материала
(во всех строках) уже не осталось, а в product добавляется новая запись... у Вас
значения ниже нуля не опускаются ведь?
Опускаются в дефицит (Deficit). Просто здесь писать не стал.
paulus написал:
Обычно ведут отдельно журнал поступлений (Ваш material), отдельно табличку
«сколько осталось», и отдельно журнал расходов (Ваш products). Тогда и логика
простая, и работает быстро, и даже понятно, как жить с отрицательными значениями.
Это пример, содержащий 2 таблицы из БД. На самом деле таблиц разумеется больше:
Журнал поступлений: закупка сырья (таблица purchase);
табличка «сколько осталось»: склад сырья material;
журнал расходов: products
и есть ещё несколько.
|Name |CountM |Price |Deficit |DeliverDate |id |
|Нитки | 100,0 |25,40 |0 |15 октября 2009 г. |1 |
|Молнии | 200,0 |16,30 |0 |16 октября 2009 г. |2 |
|Ткань синяя |1 000,0 |12,76 |0 |19 октября 2009 г. |3 |
|Ткань синяя |1 000,0 |10,00 |0 |21 октября 2009 г. |4 |
|Нитки | 250,0 |4,00 |0 |22 октября 2009 г. |5 |
Добавляем данные в таблицу product
|Name |CountM |Price |Deficit |DeliverDate |id |
|Нитки | 0 |25,40 |0 |15 октября 2009 г. |1 |
|Молнии | 200,0 |16,30 |0 |16 октября 2009 г. |2 |
|Ткань синяя |1 000,0 |12,76 |0 |19 октября 2009 г. |3 |
|Ткань синяя |1 000,0 |10,00 |0 |21 октября 2009 г. |4 |
|Нитки | 0 |4,00 |150 |22 октября 2009 г. |5 |
Отредактированно Eugene86 (23.10.2009 22:59:58)
Неактивен

А когда потом покупаются новые нитки? Я правда не понимаю схемы, она кажется
какой-то страшной, ужасной и непонятной. Я Вас предупредил ![]()
Что касается триггера — попробуйте упростить его. Например, в курсоре Вам не нужно
бегать по всем строкам ведь. Добавьте соответствующий WHERE и упростите себе жизнь.
Когда делаете UPDATE — следите за условием (нужно делать по уникальному id), в
Вашем примере Вы обновляете сразу несколько строк (разные даты).
Если писать всё компактнее, то читать будет тоже легче ![]()
Неактивен
Написал процедуру для изменения таблицы, которая вызывается из триггера.
Отредактированно Eugene86 (24.10.2009 22:06:54)
Неактивен

Eugene86 написал:
Для того, чтобы триггер вызывал процедуру только один раз в нём нужно указывать EXIT?
create TRIGGER aft_ins_product AFTER INSERT ON product
FOR EACH ROW BEGIN
CALL addproduct(new.material,new.CountM);
EXIT;
END
Не понял, а почему он должен вызывать её несколько раз? ![]()
EXIT в триггере указать нельзя.
Если вы имеете в виду множнственный инсерт, то у вас несколько раз будет вызываться сам триггер.
Неактивен
vasya написал:
Не понял, а почему он должен вызывать её несколько раз?
Думал, что for each row
будет вызывать процедуру столько раз сколько записей в таблице.
vasya написал:
...несколько раз будет вызываться сам триггер.
Теперь ясно, спасибо.
Отредактированно Eugene86 (24.10.2009 21:08:10)
Неактивен