Bonsoir glodybiss4,
Envoyé par
glodybiss4
si la ligne cost_paid, money_transac sont différents de NULL
Je pense qu’il y a un quiproquo : comme je l’ai signalé précédemment, en SQL, NULL est un marqueur représentant l’absence d’information, ce qui ne peut se produire pour votre table cfco_transaction puisque pour chaque colonne vous avez codé la clause « NOT NULL ». J’ai l’impression que dans votre phrase « NULL » est à remplacer par « ZÉRO ».
En tout cas, dans ce qui suit je l’interprète ainsi.
Pour les contrôles à sous-traiter à MySQL, il faut :
— Un trigger BEFORE INSERT pour faire passer transac_status à 1 s’il n’ y a pas d’erreur, c'est-à-dire, en supposant que j’ai bien compris ce que vous dites, si cost_paid >= 15000 et money_transac > 0.
— Un trigger AFTER INSERT pour effectuer les inserts dans la table cfco_ticket_errors. En effet, quand le trigger BEFORE INSERT agit, la colonne id_transac n’est pas encore correctement valorisée : on doit attendre que les inserts dans la table cfco_transaction soient effectifs.
Si vous prévoyez des UPDATE de la table cfco_transaction, il faudra prévoir deux triggers supplémentaires, calqués sur ceux qui sont utilisés pour les inserts.
Je vous renvoie à la documentation de MySQL pour que vous y étudiiez l’instruction CREATE TRIGGER.
Une procédure ne sert à rien dans votre cas, mais ce sont bien des triggers dont vous avez besoin : avant d’effectuer un insert, MySQL passe d’abord la main au trigger BEFORE INSERT, en lui présentant la ligne à insérer : chaque colonne de cette ligne est accessible en préfixant son nom par « new.».
Quand l’insert a été effectué, c’est au trigger AFTER INSERT que MySQL passe la main.
Je joins un script pour tester tout ça :
USE temp ;
DROP TABLE IF EXISTS cfco_ticket_errors ;
DROP TABLE IF EXISTS cfco_transaction ;
CREATE TABLE cfco_ticket_errors
(
id_error INT NOT NULL AUTO_INCREMENT,
the_error VARCHAR(100) NOT NULL,
PRIMARY KEY (id_error)
) ;
CREATE TABLE cfco_transaction
(
id_transac INT NOT NULL AUTO_INCREMENT
, cost_paid INT NOT NULL
, transac_status INT NOT NULL DEFAULT '0'
, phone_number INT NOT NULL
, money_transac INT NOT NULL
, total_transac INT NOT NULL
, when_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
, PRIMARY KEY (id_transac)
, UNIQUE KEY phone_number (phone_number)
) ;
COMMIT ;
DELIMITER GO
CREATE TRIGGER cfco_transaction_before_insert_tr BEFORE INSERT ON cfco_transaction
FOR EACH ROW
BEGIN
SET new.transac_status = 0 ;
IF new.cost_paid >= 15000 AND new.money_transac > 0 THEN
SET new.transac_status = 1 ;
END IF ;
END
GO
CREATE TRIGGER cfco_transaction_after_insert_tr AFTER INSERT ON cfco_transaction
FOR EACH ROW
BEGIN
SET @erreur = CONCAT('id_transac = ', new.id_transac, ' : ') ;
IF new.transac_status = 0 THEN
IF new.cost_paid < 15000 THEN
SET @erreur = CONCAT(@erreur, 'cost_paid doit être >= 15000. ') ;
END IF ;
IF new.money_transac = 0 THEN
SET @erreur = CONCAT(@erreur, 'money_transac doit être > 0.') ;
END IF ;
INSERT INTO cfco_ticket_errors (the_error)
SELECT @erreur ;
END IF ;
END
GO
DELIMITER ;
INSERT INTO cfco_transaction (cost_paid, phone_number, money_transac, total_transac)
VALUES (15000, 123456780, 1500, 250) ;
INSERT INTO cfco_transaction (cost_paid, phone_number, money_transac, total_transac)
VALUES (100, 123456781, 1000, 200) ;
INSERT INTO cfco_transaction (cost_paid, phone_number, money_transac, total_transac)
VALUES (1000, 123456782, 1000, 200) ;
INSERT INTO cfco_transaction (cost_paid, phone_number, money_transac, total_transac)
VALUES (0, 123456783, 1000, 200) ;
INSERT INTO cfco_transaction (cost_paid, phone_number, money_transac, total_transac)
VALUES (15000, 123456784, 0, 200) ;
INSERT INTO cfco_transaction (cost_paid, phone_number, money_transac, total_transac)
VALUES (0, 123456785, 0, 200) ;
SELECT * FROM cfco_transaction ;
SELECT * FROM cfco_ticket_errors ;
Un rappel : en SQL il n'y a ni enregistrements ni champs, mais des lignes et des colonnes.
Partager