Задавайте вопросы, мы ответим
Вы не зашли.
Есть 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)
Неактивен