Help for SQLITE trigger

Have a trigger in Postgre and Mysql

CREATE FUNCTION fn_saldiadd() RETURNS trigger
    LANGUAGE plpgsql COST 1000
    AS $$
BEGIN
IF (SELECT COUNT(*) FROM giacenzamagazzino WHERE deposito=New.deposito AND azienda=New.azienda AND articolo=New.articolo AND esercizio=New.esercizio) = 0 
THEN
-- inserisce il record se non esiste 
INSERT INTO giacenzamagazzino
(esercizio,deposito,articolo,azienda,nomeutentecrea,quantitacarico,
valorecarico,quantitascarico,valorescarico,quantitatxcarico,valoretxcarico,
quantitatxscarico,valoretxscarico,giacenzainiziale,valgiacienzainiziale )
VALUES ( NEW.esercizio, NEW.deposito, NEW.articolo, 
NEW.azienda, NEW.nomeutentecrea,
-- quantita carico
CASE NEW.qtacarico
WHEN '+' then NEW.quantita
WHEN '-' then - NEW.quantita
ELSE 0
END,
-- valore carico
CASE NEW.valcarico
WHEN '+' then f_sconti(NEW.valore,NEW.sconto)
WHEN '-' then - f_sconti(NEW.valore,NEW.sconto)
ELSE 0
END,
-- quantita scarico
CASE NEW.qtascarico
WHEN '+' then NEW.quantita
WHEN '-' then - NEW.quantita
ELSE 0
END,
-- valore scarico
CASE NEW.valscarico
WHEN '+' then f_sconti(NEW.valore,NEW.sconto)
WHEN '-' then - f_sconti(NEW.valore,NEW.sconto)
ELSE 0
END,
-- quantita carico per trasferimento
CASE NEW.qtatxcarico
WHEN '+' then NEW.quantita
WHEN '-' then - NEW.quantita
ELSE 0
END,
-- valore carico per trasferimento
CASE NEW.valtxcarico
WHEN '+' then f_sconti(NEW.valore,NEW.sconto)
WHEN '-' then - f_sconti(NEW.valore,NEW.sconto)
ELSE 0
END,
-- quantita scarico per trasferimento
CASE NEW.qtatxscarico
WHEN '+' then NEW.quantita
WHEN '-' then - NEW.quantita
ELSE 0
END,
-- valore scarico per trasderimento
CASE NEW.valtxscarico
WHEN '+' then f_sconti(NEW.valore,NEW.sconto)
WHEN '-' then - f_sconti(NEW.valore,NEW.sconto)
ELSE 0
END,
-- quantita per rettifica
CASE NEW.qtarettifica
WHEN '+' then NEW.quantita
WHEN '-' then - NEW.quantita
ELSE 0
END,
-- valore per rettifica
CASE NEW.valrettifica
WHEN '+' then f_sconti(NEW.valore,NEW.sconto)
WHEN '-' then - f_sconti(NEW.valore,NEW.sconto)
ELSE 0
END );
ELSE
-- nel caso invece il record esista aggiorno i valori
UPDATE giacenzamagazzino
-- quantita carico
SET quantitacarico = (CASE NEW.qtacarico
WHEN '+' THEN quantitacarico + NEW.quantita
WHEN '-' then quantitacarico - NEW.quantita
ELSE quantitacarico
END),
-- valore carico
valorecarico = (CASE NEW.valcarico
WHEN '+' THEN valorecarico + f_sconti(NEW.valore,NEW.sconto)
WHEN '-' THEN valorecarico - f_sconti(NEW.valore,NEW.sconto)
ELSE valorecarico
END),
-- quantita scarico
quantitascarico = (CASE NEW.qtascarico
WHEN '+' THEN quantitascarico + NEW.quantita
WHEN '-' THEN quantitascarico - NEW.quantita
ELSE quantitascarico
END),
-- valore scarico
valorescarico = (CASE NEW.valscarico 
WHEN '+' THEN valorescarico + f_sconti(NEW.valore,NEW.sconto)
WHEN '-' THEN valorescarico - f_sconti(NEW.valore,NEW.sconto)
ELSE valorescarico
END),
-- quantita carico per trasferimento
quantitatxcarico = CASE NEW.qtatxcarico
WHEN '+' THEN quantitatxcarico + NEW.quantita
WHEN '-' THEN quantitatxcarico - NEW.quantita
ELSE quantitatxcarico
END,
-- valore carico per trasferimento
valoretxcarico = (CASE NEW.valtxcarico
WHEN '+' THEN valoretxcarico + f_sconti(NEW.valore,NEW.sconto)
WHEN '-' THEN valoretxcarico - f_sconti(NEW.valore,NEW.sconto)
ELSE valoretxcarico
END),
-- quantita scarico per trasferimento
quantitatxscarico = (CASE NEW.qtatxscarico 
WHEN '+' THEN quantitatxscarico + NEW.quantita
WHEN '-' THEN quantitatxscarico - NEW.quantita
ELSE valoretxscarico
END),
-- valore scarico per trasferimento
valoretxscarico = (CASE NEW.valtxscarico 
WHEN '+' THEN valoretxscarico + f_sconti(NEW.valore,NEW.sconto)
WHEN '-' THEN valoretxscarico - f_sconti(NEW.valore,NEW.sconto)
ELSE valoretxscarico
END),
-- quantita rettifica
giacenzainiziale = (CASE NEW.qtarettifica 
WHEN '+' THEN giacenzainiziale + NEW.quantita
WHEN '-' THEN giacenzainiziale - NEW.quantita
ELSE giacenzainiziale
END),
-- valore rettifica
valgiacienzainiziale = (CASE NEW.valrettifica 
WHEN '+' THEN valgiacienzainiziale + f_sconti(NEW.valore,NEW.sconto)
WHEN '-' THEN valgiacienzainiziale - f_sconti(NEW.valore,NEW.sconto)
ELSE valgiacienzainiziale
END)
WHERE esercizio = NEW.esercizio AND
azienda = NEW.azienda AND
articolo = NEW.articolo AND
deposito = NEW.deposito;
END IF;
RETURN NEW;
END;
$$;
CREATE TRIGGER saldiadd AFTER INSERT ON movimentimaga FOR EACH ROW EXECUTE PROCEDURE fn_saldiadd();

and going to traslate for sqlite, but not have any idea for proceed.

CREATE TRIGGER `movimentimaga_AFTER_DELETE` AFTER DELETE ON `movimentimaga` FOR EACH ROW BEGIN DECLARE tmpsconto TEXT; SET tmpsconto := OLD.sconto; UPDATE giacenzamagazzino SET quantitacarico = CASE WHEN OLD.qtacarico = '+' then quantitacarico - OLD.quantita WHEN OLD.qtacarico = '-' then quantitacarico + OLD.quantita ELSE quantitacarico END, valorecarico = CASE WHEN OLD.valcarico = '+' then valorecarico - f_sconti(OLD.valore,tmpsconto) WHEN OLD.valcarico = '-' then valorecarico + f_sconti(OLD.valore,tmpsconto) ELSE valorecarico END, quantitascarico = CASE WHEN OLD.qtascarico = '+' then quantitascarico - OLD.quantita WHEN OLD.qtascarico = '-' then quantitascarico + OLD.quantita ELSE quantitascarico END, valorescarico = CASE WHEN OLD.valscarico = '+' then valorescarico - f_sconti(OLD.valore,tmpsconto) WHEN OLD.qtascarico = '-' then valorescarico + f_sconti(OLD.valore,tmpsconto) ELSE valorescarico END, quantitatxcarico = CASE WHEN OLD.qtatxcarico = '+' then quantitatxcarico - OLD.quantita WHEN OLD.qtatxcarico = '-' then quantitatxcarico + OLD.quantita ELSE quantitatxcarico END, valoretxcarico = CASE WHEN OLD.valtxcarico = '+' then valoretxcarico - f_sconti(OLD.valore,tmpsconto) WHEN OLD.valtxcarico = '-' then valoretxcarico + f_sconti(OLD.valore,tmpsconto) ELSE valoretxcarico END, quantitatxscarico = case WHEN OLD.qtatxscarico = '+' then quantitatxscarico - OLD.quantita WHEN OLD.qtatxscarico = '-' then quantitatxscarico + OLD.quantita ELSE valoretxscarico END, valoretxscarico = case WHEN OLD.valtxscarico = '+' then valoretxscarico - f_sconti(OLD.valore,tmpsconto) WHEN OLD.valtxscarico = '-' then valoretxscarico + f_sconti(OLD.valore,tmpsconto) ELSE valoretxscarico END, giacenzainiziale = case WHEN OLD.qtarettifica = '+' then giacenzainiziale - OLD.quantita WHEN OLD.qtarettifica = '-' then giacenzainiziale + OLD.quantita ELSE giacenzainiziale END, valgiacienzainiziale = case WHEN OLD.valrettifica = '+' then valgiacienzainiziale - f_sconti(OLD.valore,tmpsconto) WHEN OLD.valrettifica = '-' then valgiacienzainiziale + f_sconti(OLD.valore,tmpsconto) ELSE valgiacienzainiziale END WHERE esercizio = OLD.esercizio AND azienda = OLD.azienda AND articolo = OLD.articolo AND deposito = OLD.deposito; END;

this is mysql version.

check this http://www.sqlitetutorial.net/sqlite-trigger/
or this http://www.w3resource.com/sqlite/sqlite-triggers.php

basic template

   CREATE TRIGGER triggername
   AFTER DELETE ON tablename
   FOR EACH ROW
          WHEN 'condition' goes here'
          BEGIN 'action goes here' ; 
         END ;

one of the dangers of embedding business logic in a platform specific language like postregsql’s or mysql’s trigger languages

portability suffers

this might cut it since it is one giant update stmt
however I have no idea how you’re going to define the function f_sconti - since there is no ability to define functions in sqlite
if it can be replaced by some simple code then it might work

CREATE TRIGGER `movimentimaga_AFTER_DELETE` AFTER DELETE ON `movimentimaga` FOR EACH ROW
BEGIN
UPDATE giacenzamagazzino
SET quantitacarico = CASE 
WHEN OLD.qtacarico = '+' then quantitacarico - OLD.quantita
WHEN OLD.qtacarico = '-' then quantitacarico + OLD.quantita
ELSE quantitacarico
END,
valorecarico = CASE
WHEN OLD.valcarico = '+' then valorecarico - f_sconti(OLD.valore, OLD.sconto)
WHEN OLD.valcarico = '-' then valorecarico + f_sconti(OLD.valore, OLD.sconto)
ELSE valorecarico
END,
quantitascarico = CASE
WHEN OLD.qtascarico = '+' then quantitascarico - OLD.quantita
WHEN OLD.qtascarico = '-' then quantitascarico + OLD.quantita
ELSE quantitascarico
END,
valorescarico = CASE
WHEN OLD.valscarico = '+' then valorescarico - f_sconti(OLD.valore, OLD.sconto)
WHEN OLD.qtascarico = '-' then valorescarico + f_sconti(OLD.valore, OLD.sconto)
ELSE valorescarico
END,
quantitatxcarico = CASE
WHEN OLD.qtatxcarico = '+' then quantitatxcarico - OLD.quantita
WHEN OLD.qtatxcarico = '-' then quantitatxcarico + OLD.quantita
ELSE quantitatxcarico
END,
valoretxcarico = CASE
WHEN OLD.valtxcarico = '+' then valoretxcarico - f_sconti(OLD.valore, OLD.sconto)
WHEN OLD.valtxcarico = '-' then valoretxcarico + f_sconti(OLD.valore, OLD.sconto)
ELSE valoretxcarico
END,
quantitatxscarico = case
WHEN OLD.qtatxscarico = '+' then quantitatxscarico - OLD.quantita
WHEN OLD.qtatxscarico = '-' then quantitatxscarico + OLD.quantita
ELSE valoretxscarico
END,
valoretxscarico = case
WHEN OLD.valtxscarico = '+' then valoretxscarico - f_sconti(OLD.valore, OLD.sconto)
WHEN OLD.valtxscarico = '-' then valoretxscarico + f_sconti(OLD.valore, OLD.sconto)
ELSE valoretxscarico
END,
giacenzainiziale = case
WHEN OLD.qtarettifica = '+' then giacenzainiziale - OLD.quantita
WHEN OLD.qtarettifica = '-' then giacenzainiziale + OLD.quantita
ELSE giacenzainiziale
END,
valgiacienzainiziale = case
WHEN OLD.valrettifica = '+' then valgiacienzainiziale - f_sconti(OLD.valore, OLD.sconto)
WHEN OLD.valrettifica = '-' then valgiacienzainiziale + f_sconti(OLD.valore, OLD.sconto)
ELSE valgiacienzainiziale
END
WHERE esercizio = OLD.esercizio AND
azienda = OLD.azienda AND
articolo = OLD.articolo AND
deposito = OLD.deposito;
END;

Thank Norman, Dave, Asis…
Pretending to translate all database triggers from Postgre / Mysql to Sqlite is impracticable.
However, take some trigger types that are simple insert / update not conditional at the end there are only 4 that I can not translate.
I decided to modify the XOJO code (at my own risk) to emulate precisely the use of these triggers only if the selected database is sqlite.
Have risk because there are some features that read, open, write, erase … something like 50 tables.
For example, for invoices, orders, quotes:
Customers / Suppliers
Banks
Table IVA
Accounting
Payments
Deadlines
warehouse
Articles
Warehouse Movements
And many, really many more …
Postgre and mysql is flexible… but for mono user sqlite are a reasonable solution.
Thanks again to everyone.
Max

NB: Monday I go on vacation for 15 days in Tunisia, I wear the fins, the mask, but not the MAC!