Bu yazımızda mysql triger kullanımı göreceğiz. Triger işlemini Opencart veri tabanı üzerinde gördüğüm bir eksiği tamamlayarak göstereceğim. Opencart veritabanında bir ürünün özelliğine (örneğin:Bir A ürününün 41 ,42 … numarasının her birine ait stok) ait stok bilgileri tutulurken bunlar ürüne ait toplam stoktan bağımsız olarak farklı tabloda tutuluyor.Örnek olarak bir A ürünün 41 numarasından 5 adet ,42 numarasından 4 adet ve 43 numarasından 10 adet ayakkabı olduğunu varsayalım. Ayakkabının toplam stoğu 19 olması gerekirken genel stok daha farklı olabiliyor. Şimdi bir Triger oluşturarak yeni bir özellik INSERT
ettikten sonra vaya UPDATE
update yaptıktan sonra toplam stoğun otomotik olarak güncellenmesini sağlayacağız.
opencart product
tablosu sql kodu:
CREATE TABLE `product` ( `product_id` int(11) NOT NULL, `model` varchar(64) NOT NULL, `sku` varchar(64) NOT NULL, `upc` varchar(12) NOT NULL, `ean` varchar(14) NOT NULL, `jan` varchar(13) NOT NULL, `isbn` varchar(17) NOT NULL, `mpn` varchar(64) NOT NULL, `location` varchar(128) NOT NULL, `quantity` int(4) NOT NULL DEFAULT '0', `stock_status_id` int(11) NOT NULL, `image` varchar(255) DEFAULT NULL, `manufacturer_id` int(11) NOT NULL, `shipping` tinyint(1) NOT NULL DEFAULT '1', `price` decimal(15,4) NOT NULL DEFAULT '0.0000', `points` int(8) NOT NULL DEFAULT '0', `tax_class_id` int(11) NOT NULL, `date_available` date NOT NULL DEFAULT '0000-00-00', `weight` decimal(15,8) NOT NULL DEFAULT '0.00000000', `weight_class_id` int(11) NOT NULL DEFAULT '0', `length` decimal(15,8) NOT NULL DEFAULT '0.00000000', `width` decimal(15,8) NOT NULL DEFAULT '0.00000000', `height` decimal(15,8) NOT NULL DEFAULT '0.00000000', `length_class_id` int(11) NOT NULL DEFAULT '0', `subtract` tinyint(1) NOT NULL DEFAULT '1', `minimum` int(11) NOT NULL DEFAULT '1', `sort_order` int(11) NOT NULL DEFAULT '0', `status` tinyint(1) NOT NULL DEFAULT '0', `viewed` int(5) NOT NULL DEFAULT '0', `date_added` datetime NOT NULL, `date_modified` datetime NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
product_option_value
tablosu:
CREATE TABLE `product_option_value` ( `product_option_value_id` int(11) NOT NULL, `product_option_id` int(11) NOT NULL, `product_id` int(11) NOT NULL, `option_id` int(11) NOT NULL, `option_value_id` int(11) NOT NULL, `quantity` int(3) NOT NULL, `subtract` tinyint(1) NOT NULL, `price` decimal(15,4) NOT NULL, `price_prefix` varchar(1) NOT NULL, `points` int(8) NOT NULL, `points_prefix` varchar(1) NOT NULL, `weight` decimal(15,8) NOT NULL, `weight_prefix` varchar(1) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Burada amacımız , product_option_value
tablosuna her ekleme ve güncelleme işlemlerinden sonra product
tablosundaki quantity değeri ile product_option_value
quantity değerlerini ilişkili bir şekilde güncel tutmaktır.
Her güncelleme yapıldıktan sonra toplam stoğu güncelleyecek TRIGER:
DELIMITER $$ CREATE TRIGGER product_stock_update AFTER UPDATE ON product_option_value FOR EACH ROW BEGIN UPDATE product SET quantity=(SELECT SUM(quantity) FROM product_option_value WHERE product_id=OLD.product_id) WHERE product_id=OLD.product_id; END$$ DELIMITER ;
Her yeni kayıt eklendikten sonra toplam stoğu güncelleyecek TRIGER:
DELIMITER $$ CREATE TRIGGER product_stock_insert AFTER INSERT ON product_option_value FOR EACH ROW BEGIN UPDATE product SET quantity=(SELECT SUM(quantity) FROM product_option_value WHERE product_id=NEW.product_id) WHERE product_id=NEW.product_id; END$$ DELIMITER ;
Selahaddin bey merhaba, paylaşımınız için teşekkürler.
Benim de benzer bir işlem yaptırmam lazım lakin beceremedim. Amacım ürün tablomdaki stok ve fiyat değişince ikisinin çarpımı olan toplam tutar kısmını güncellemek.
tablo adı: yep_products
stok kolon adı : products_stock
fiyat kolon adı : products_sales_price
toplam tutar kolon adı : products_total_sales
ben bu şekilde yaptım lakin bir türlü olmadı ;
DELIMITER $$
CREATE TRIGGER tutar_update AFTER UPDATE ON yep_products
FOR EACH ROW BEGIN
UPDATE yep_products SET products_total_sales = products_stock * products_sales_price WHERE products_id;
END$$
DELIMITER ;
Merhaba Yunus Bey,
Yazmış olduğunuz Sql kodunun UPDATE yep_products SET products_total_sales = products_stock * products_sales_price WHERE products_id; Satırında WHERE şartında sonra yazmış olduğunuz products_id ifadesinden kaynaklandığını düşünüyorum. Şartlı ifadeyi birde, WHERE product_id=OLD.product_id; şeklinde güncelleyip denemenizi rica ediyorum. Sorununuz çözülmez ise Opencart versiyonunuzu bana iletirseniz yardımcı olmaya çalışayım.