|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jul 2009
Messaggi: 2
|
[POSTGRES] VINCOLO CHIAVE STERNA TABELLE - TRIGGER
Una buona giornata a tutti. Ho un problema con una serie di trigger in tabelle che adesso vi espongo. Cerco di farmi capire per poter focalizzare il problema. Ho 3 tabelle di magazzino, la prima contiene il record di testata di magazzino(mag0000f), la seconda contiene i records di dettaglio di magazzino(mag0100f) e la terza contiene i records di saldi di magazzino(mag0500f). Ho scritto una serie di trigger i quali alimentano la tabella dei saldi di magazzino(mag0500f), ogni qual volta movimento mag0000f e mag0100f (rispettivamente testata e dettaglio magazzino). Nella tabella mag0100f, ho inserito un vincolo di chiave esterna in modo tale che quando cancello un record di testata, automaticamente mi cancella anche tutte le righe di dettaglio collegate. Il tutto funziona correttamente quando effettuo nuovi inserimenti, modifiche o cancellazioni delle righe di dettaglio di magazzino. Mentre se cancello la testata di magazzino (operazione fatta dal cliente PG-ADMIN) in un primo momento sembra che il record venga cancellato, ma se faccio un aggiornameto il record di testata mi ricompare in griglia, se guardo il dettaglio, le righe correlate al record che precedentemente avevo provato a cancellare, sono prenti ancora, mentre la tabella dei saldi di magazzino mag0500f viene aggiornata correttamente. La versione del database che utilizzo è la 8.2.3.
Se qualcuno potesse darmi una mano a risolvere tale problema, gliene sarei grato. Posto gli script delle tabelle, function e trigger. CREATE OR REPLACE FUNCTION inserisci_record_maga_saldi(integer, character varying) RETURNS void AS $BODY$BEGIN -- if NOT $1 IS NULL THEN insert into mag0500f(mag05mag, mag05art) values ($1, $2); -- END IF; EXCEPTION WHEN unique_violation THEN RETURN; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION inserisci_record_maga_saldi(integer, character varying) OWNER TO postgres; CREATE OR REPLACE FUNCTION zerosenull(integer) RETURNS information_schema.cardinal_number AS $BODY$BEGIN IF $1 IS NULL THEN RETURN 0; ELSE RETURN $1; END IF; END$BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION zerosenull(integer) OWNER TO postgres; CREATE OR REPLACE FUNCTION mag0000_delete_aggiorna_saldi_mag0500f() RETURNS "trigger" AS $BODY$DECLARE mag01 RECORD; sql varchar; mmc RECORD; BEGIN RAISE NOTICE 'OLD.mag00pro = %', OLD.mag00pro; FOR mag01 IN SELECT * FROM mag0100f WHERE mag01pro = OLD.mag00pro LOOP RAISE NOTICE 'TRIGGER MAG0000F mag01rig = %', mag01.mag01rig || ' ARTICOLO = ' || mag01.mag01art; SELECT INTO mmc * FROM tabmmc WHERE mmccodicaus=mag01.mag01mmc; sql:=''; sql:=sql || 'Update mag0500f SET mag05gia = '; --GIACENZA IF mmc.mmctipocaus='C' THEN sql:=sql || '(mag05gia - ' || abs(mag01.mag01qto) || ') ,'; ELSEIF mmc.mmctipocaus='S' THEN sql:=sql || '(mag05gia + ' || abs(mag01.mag01qto) || ') ,'; END IF; --GIACENZA INIZIALE QUANTITA' IF mmc.mmcgiainiqu='+' THEN sql:=sql || 'mag05giq=(mag05giq - ' || abs(mag01.mag01qto) || ') ,'; ELSEIF mmc.mmcgiainiqu='-' THEN sql:=sql || 'mag05giq=(mag05giq + ' || abs(mag01.mag01qto) || ') ,'; END IF; --GIACENZA INIZIALE VALORE' IF mmc.mmcgiainiva='+' THEN sql:=sql || 'mag05giv=(mag05giv - ' || abs(mag01.mag01val) || ') ,'; ELSEIF mmc.mmcgiainiva='-' THEN sql:=sql || 'mag05giv=(mag05giv + ' || abs(mag01.mag01val) || ') ,'; END IF; --CARICHI QUANTITA' IF mmc.mmccarichqu='+' THEN sql:=sql || 'mag05caq=(mag05caq - ' || abs(mag01.mag01qto) || ') ,'; ELSEIF mmc.mmccarichqu='-' THEN sql:=sql || 'mag05caq=(mag05caq + ' || abs(mag01.mag01qto) || ') ,'; END IF; --CARICHI ALTRI' IF mmc.mmccarichal='+' THEN sql:=sql || 'mag05caa=(mag05caa - ' || abs(mag01.mag01qto) || ') ,'; ELSEIF mmc.mmccarichal='-' THEN sql:=sql || 'mag05caa=(mag05caa + ' || abs(mag01.mag01qto) || ') ,'; END IF; --CARICHI VALORE' IF mmc.mmccarichva='+' THEN sql:=sql || 'mag05cav=(mag05cav - ' || abs(mag01.mag01val) || ') ,'; ELSEIF mmc.mmccarichva='-' THEN sql:=sql || 'mag05cav=(mag05cav + ' || abs(mag01.mag01val) || ') ,'; END IF; --SCARICHI QUANTITA' IF mmc.mmcscaricqu='+' THEN sql:=sql || 'mag05scq=(mag05caq - ' || abs(mag01.mag01qto) || ') ,'; ELSEIF mmc.mmcscaricqu='-' THEN sql:=sql || 'mag05scq=(mag05caq + ' || abs(mag01.mag01qto) || ') ,'; END IF; --SCARICHI ALTRI' IF mmc.mmcscarical='+' THEN sql:=sql || 'mag05saa=(mag05caa - ' || abs(mag01.mag01qto) || ') ,'; ELSEIF mmc.mmcscarical='-' THEN sql:=sql || 'mag05saa=(mag05caa + ' || abs(mag01.mag01qto) || ') ,'; END IF; --SCARICHI VALORE' IF mmc.mmcscaricva='+' THEN sql:=sql || 'mag05scv=(mag05cav - ' || abs(mag01.mag01val) || ') ,'; ELSEIF mmc.mmcscaricva='-' THEN sql:=sql || 'mag05scv=(mag05cav + ' || abs(mag01.mag01val) || ') ,'; END IF; sql:=substring(sql from 1 for (char_length(sql)-1)); sql:=sql || ' Where (mag05art = $$' || mag01.mag01art || '$$) and (mag05mag = ' || OLD.mag00mma || ')'; EXECUTE sql; END LOOP; RAISE NOTICE 'FINE TRIGGER MAG0000F'; RETURN NEW; END;$BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION mag0000_delete_aggiorna_saldi_mag0500f() OWNER TO postgres; CREATE OR REPLACE FUNCTION mag0000_update_aggiorna_saldi_mag0500f() RETURNS "trigger" AS $BODY$DECLARE mag01old RECORD; mag01new RECORD; sql varchar; mmc RECORD; BEGIN if OLD.mag00mma <> NEW.mag00mma THEN FOR mag01old IN SELECT * FROM mag0100f WHERE mag01pro = OLD.mag00pro LOOP SELECT INTO mmc * FROM tabmmc WHERE mmccodicaus=mag01old.mag01mmc; sql:=''; sql:=sql || 'Update mag0500f SET mag05gia = '; --GIACENZA IF mmc.mmctipocaus='C' THEN sql:=sql || '(mag05gia - ' || abs(mag01old.mag01qto) || ') ,'; ELSEIF mmc.mmctipocaus='S' THEN sql:=sql || '(mag05gia + ' || abs(mag01old.mag01qto) || ') ,'; END IF; --GIACENZA INIZIALE QUANTITA' IF mmc.mmcgiainiqu='+' THEN sql:=sql || 'mag05giq=(mag05giq - ' || abs(mag01old.mag01qto) || ') ,'; ELSEIF mmc.mmcgiainiqu='-' THEN sql:=sql || 'mag05giq=(mag05giq + ' || abs(mag01old.mag01qto) || ') ,'; END IF; --GIACENZA INIZIALE VALORE' IF mmc.mmcgiainiva='+' THEN sql:=sql || 'mag05giv=(mag05giv - ' || abs(mag01old.mag01val) || ') ,'; ELSEIF mmc.mmcgiainiva='-' THEN sql:=sql || 'mag05giv=(mag05giv + ' || abs(mag01old.mag01val) || ') ,'; END IF; --CARICHI QUANTITA' IF mmc.mmccarichqu='+' THEN sql:=sql || 'mag05caq=(mag05caq - ' || abs(mag01old.mag01qto) || ') ,'; ELSEIF mmc.mmccarichqu='-' THEN sql:=sql || 'mag05caq=(mag05caq + ' || abs(mag01old.mag01qto) || ') ,'; END IF; --CARICHI ALTRI' IF mmc.mmccarichal='+' THEN sql:=sql || 'mag05caa=(mag05caa - ' || abs(mag01old.mag01qto) || ') ,'; ELSEIF mmc.mmccarichal='-' THEN sql:=sql || 'mag05caa=(mag05caa + ' || abs(mag01old.mag01qto) || ') ,'; END IF; --CARICHI VALORE' IF mmc.mmccarichva='+' THEN sql:=sql || 'mag05cav=(mag05cav - ' || abs(mag01old.mag01val) || ') ,'; ELSEIF mmc.mmccarichva='-' THEN sql:=sql || 'mag05cav=(mag05cav + ' || abs(mag01old.mag01val) || ') ,'; END IF; --SCARICHI QUANTITA' IF mmc.mmcscaricqu='+' THEN sql:=sql || 'mag05scq=(mag05caq - ' || abs(mag01old.mag01qto) || ') ,'; ELSEIF mmc.mmcscaricqu='-' THEN sql:=sql || 'mag05scq=(mag05caq + ' || abs(mag01old.mag01qto) || ') ,'; END IF; --SCARICHI ALTRI' IF mmc.mmcscarical='+' THEN sql:=sql || 'mag05saa=(mag05caa - ' || abs(mag01old.mag01qto) || ') ,'; ELSEIF mmc.mmcscarical='-' THEN sql:=sql || 'mag05saa=(mag05caa + ' || abs(mag01old.mag01qto) || ') ,'; END IF; --SCARICHI VALORE' IF mmc.mmcscaricva='+' THEN sql:=sql || 'mag05scv=(mag05cav - ' || abs(mag01old.mag01val) || ') ,'; ELSEIF mmc.mmcscaricva='-' THEN sql:=sql || 'mag05scv=(mag05cav + ' || abs(mag01old.mag01val) || ') ,'; END IF; sql:=substring(sql from 1 for (char_length(sql)-1)); sql:=sql || ' Where (mag05art = $$' || mag01old.mag01art || '$$) and (mag05mag = ' || OLD.mag00mma || ')'; EXECUTE sql; END LOOP; FOR mag01new IN SELECT * FROM mag0100f WHERE mag01pro = NEW.mag00pro LOOP PERFORM inserisci_record_maga_saldi(NEW.mag00mma, mag01new.mag01art::text); SELECT INTO mmc * FROM tabmmc WHERE mmccodicaus=mag01new.mag01mmc; sql:=''; sql:=sql || 'Update mag0500f SET mag05gia = '; --GIACENZA IF mmc.mmctipocaus='C' THEN sql:=sql || '(mag05gia + ' || abs(mag01new.mag01qto) || ') ,'; ELSEIF mmc.mmctipocaus='S' THEN sql:=sql || '(mag05gia - ' || abs(mag01new.mag01qto) || ') ,'; END IF; --GIACENZA INIZIALE QUANTITA' IF mmc.mmcgiainiqu='+' THEN sql:=sql || 'mag05giq=(mag05giq + ' || abs(mag01new.mag01qto) || ') ,'; ELSEIF mmc.mmcgiainiqu='-' THEN sql:=sql || 'mag05giq=(mag05giq - ' || abs(mag01new.mag01qto) || ') ,'; END IF; --GIACENZA INIZIALE VALORE' IF mmc.mmcgiainiva='+' THEN sql:=sql || 'mag05giv=(mag05giv + ' || abs(mag01new.mag01val) || ') ,'; ELSEIF mmc.mmcgiainiva='-' THEN sql:=sql || 'mag05giv=(mag05giv - ' || abs(mag01new.mag01val) || ') ,'; END IF; --CARICHI QUANTITA' IF mmc.mmccarichqu='+' THEN sql:=sql || 'mag05caq=(mag05caq + ' || abs(mag01new.mag01qto) || ') ,'; ELSEIF mmc.mmccarichqu='-' THEN sql:=sql || 'mag05caq=(mag05caq - ' || abs(mag01new.mag01qto) || ') ,'; END IF; --CARICHI ALTRI' IF mmc.mmccarichal='+' THEN sql:=sql || 'mag05caa=(mag05caa + ' || abs(mag01new.mag01qto) || ') ,'; ELSEIF mmc.mmccarichal='-' THEN sql:=sql || 'mag05caa=(mag05caa - ' || abs(mag01new.mag01qto) || ') ,'; END IF; --CARICHI VALORE' IF mmc.mmccarichva='+' THEN sql:=sql || 'mag05cav=(mag05cav + ' || abs(mag01new.mag01val) || ') ,'; ELSEIF mmc.mmccarichva='-' THEN sql:=sql || 'mag05cav=(mag05cav - ' || abs(mag01new.mag01val) || ') ,'; END IF; --SCARICHI QUANTITA' IF mmc.mmcscaricqu='+' THEN sql:=sql || 'mag05scq=(mag05caq + ' || abs(mag01new.mag01qto) || ') ,'; ELSEIF mmc.mmcscaricqu='-' THEN sql:=sql || 'mag05scq=(mag05caq - ' || abs(mag01new.mag01qto) || ') ,'; END IF; --SCARICHI ALTRI' IF mmc.mmcscarical='+' THEN sql:=sql || 'mag05saa=(mag05caa + ' || abs(mag01new.mag01qto) || ') ,'; ELSEIF mmc.mmcscarical='-' THEN sql:=sql || 'mag05saa=(mag05caa - ' || abs(mag01new.mag01qto) || ') ,'; END IF; --SCARICHI VALORE' IF mmc.mmcscaricva='+' THEN sql:=sql || 'mag05scv=(mag05cav + ' || abs(mag01new.mag01val) || ') ,'; ELSEIF mmc.mmcscaricva='-' THEN sql:=sql || 'mag05scv=(mag05cav - ' || abs(mag01new.mag01val) || ') ,'; END IF; sql:=substring(sql from 1 for (char_length(sql)-1)); sql:=sql || ' Where (mag05art = $$' || mag01new.mag01art || '$$) and (mag05mag = ' || NEW.mag00mma || ')'; EXECUTE sql; END LOOP; END IF; RETURN NEW; END;$BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION mag0000_update_aggiorna_saldi_mag0500f() OWNER TO postgres; CREATE OR REPLACE FUNCTION somma_maga_saldi() RETURNS "trigger" AS $BODY$DECLARE magaorig integer; datmov date; sql varchar; mmc RECORD; mag05 RECORD; BEGIN sql:=''; magaorig:=(select mag0000f.mag00mma FROM mag0000f WHERE mag00pro=NEW.mag01pro); datmov:=(select mag0000f.mag00dmu FROM mag0000f WHERE mag00pro=NEW.mag01pro); -- RAISE NOTICE 'Magazzino Origine = %', magaorig; PERFORM inserisci_record_maga_saldi(magaorig, NEW.mag01art::text); SELECT INTO mag05 * FROM mag0500f WHERE mag05mag=magaorig and mag05art=NEW.mag01art; -- SELECT INTO mag05 * FROM mag0500f WHERE mag05mag=NEW.mag01mma and mag05art=NEW.mag01art; SELECT INTO mmc * FROM tabmmc WHERE mmccodicaus=NEW.mag01mmc; sql:=sql || 'Update mag0500f SET mag05gia = '; --GIACENZA IF mmc.mmctipocaus='C' THEN sql:=sql || '(mag05gia + ' || abs(NEW.mag01qto) || ') ,'; ELSEIF mmc.mmctipocaus='S' THEN sql:=sql || '(mag05gia - ' || abs(NEW.mag01qto) || ') ,'; END IF; --GIACENZA INIZIALE QUANTITA' IF mmc.mmcgiainiqu='+' THEN sql:=sql || 'mag05giq=(mag05giq + ' || abs(NEW.mag01qto) || ') ,'; ELSEIF mmc.mmcgiainiqu='-' THEN sql:=sql || 'mag05giq=(mag05giq - ' || abs(NEW.mag01qto) || ') ,'; END IF; --GIACENZA INIZIALE VALORE' IF mmc.mmcgiainiva='+' THEN sql:=sql || 'mag05giv=(mag05giv + ' || abs(NEW.mag01val) || ') ,'; ELSEIF mmc.mmcgiainiva='-' THEN sql:=sql || 'mag05giv=(mag05giv - ' || abs(NEW.mag01val) || ') ,'; END IF; --CARICHI QUANTITA' IF mmc.mmccarichqu='+' THEN sql:=sql || 'mag05caq=(mag05caq + ' || abs(NEW.mag01qto) || ') ,'; ELSEIF mmc.mmccarichqu='-' THEN sql:=sql || 'mag05caq=(mag05caq - ' || abs(NEW.mag01qto) || ') ,'; END IF; --CARICHI ALTRI' IF mmc.mmccarichal='+' THEN sql:=sql || 'mag05caa=(mag05caa + ' || abs(NEW.mag01qto) || ') ,'; ELSEIF mmc.mmccarichal='-' THEN sql:=sql || 'mag05caa=(mag05caa - ' || abs(NEW.mag01qto) || ') ,'; END IF; --CARICHI VALORE' IF mmc.mmccarichva='+' THEN sql:=sql || 'mag05cav=(mag05cav + ' || abs(NEW.mag01val) || ') ,'; ELSEIF mmc.mmccarichva='-' THEN sql:=sql || 'mag05cav=(mag05cav - ' || abs(NEW.mag01val) || ') ,'; END IF; --AGGIORNA ULTIMA DATA CARICO' IF mmc.mmcaggcardt=True THEN IF mag05.mag05duc IS NULL THEN sql:=sql || 'mag05duc = (''' || to_char(datmov, 'YYYY-MM-DD') || ''') ,'; ELSE IF datmov > mag05.mag05duc THEN sql:=sql || 'mag05duc = (''' || to_char(datmov, 'YYYY-MM-DD') || ''') ,'; END IF; END IF; END IF; --AGGIORNA ULTIMA COSTO CARICO' IF mmc.mmcaggcarco=True THEN sql:=sql || 'mag05uci = (''' || abs(NEW.mag01pre) || ''') ,'; END IF; --SCARICHI QUANTITA' IF mmc.mmcscaricqu='+' THEN sql:=sql || 'mag05scq=(mag05caq + ' || abs(NEW.mag01qto) || ') ,'; ELSEIF mmc.mmcscaricqu='-' THEN sql:=sql || 'mag05scq=(mag05caq - ' || abs(NEW.mag01qto) || ') ,'; END IF; --SCARICHI ALTRI' IF mmc.mmcscarical='+' THEN sql:=sql || 'mag05saa=(mag05caa + ' || abs(NEW.mag01qto) || ') ,'; ELSEIF mmc.mmcscarical='-' THEN sql:=sql || 'mag05saa=(mag05caa - ' || abs(NEW.mag01qto) || ') ,'; END IF; --SCARICHI VALORE' IF mmc.mmcscaricva='+' THEN sql:=sql || 'mag05scv=(mag05cav + ' || abs(NEW.mag01val) || ') ,'; ELSEIF mmc.mmcscaricva='-' THEN sql:=sql || 'mag05scv=(mag05cav - ' || abs(NEW.mag01val) || ') ,'; END IF; --AGGIORNA ULTIMA DATA SCARICO' IF mmc.mmcaggscadt=True THEN sql:=sql || 'mag05dus = (''' || to_char(datmov, 'YYYY-MM-DD') || ''') ,'; END IF; sql:=substring(sql from 1 for (char_length(sql)-1)); sql:=sql || ' Where (mag05art = $$' || NEW.mag01art || '$$) and (mag05mag = ' || magaorig || ')'; EXECUTE sql; RETURN NEW; END;$BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION somma_maga_saldi() OWNER TO postgres; CREATE OR REPLACE FUNCTION sottrae_maga_saldi() RETURNS "trigger" AS $BODY$DECLARE magaorig integer; sql varchar; mmc RECORD; BEGIN sql:=''; magaorig:=(select zerosenull(mag0000f.mag00mma) FROM mag0000f WHERE mag00pro=OLD.mag01pro); RAISE NOTICE 'magaorig = %', magaorig; IF magaorig > 0 THEN RAISE NOTICE 'OLD.mag01art = %', OLD.mag01art; PERFORM inserisci_record_maga_saldi(magaorig, OLD.mag01art::text); RAISE NOTICE 'dopo inserisci_record_maga_saldi'; SELECT INTO mmc * FROM tabmmc WHERE mmccodicaus=OLD.mag01mmc; sql:=sql || 'Update mag0500f SET mag05gia = '; --GIACENZA IF mmc.mmctipocaus='C' THEN sql:=sql || '(mag05gia - ' || abs(OLD.mag01qto) || ') ,'; ELSEIF mmc.mmctipocaus='S' THEN sql:=sql || '(mag05gia + ' || abs(OLD.mag01qto) || ') ,'; END IF; --GIACENZA INIZIALE QUANTITA' IF mmc.mmcgiainiqu='+' THEN sql:=sql || 'mag05giq=(mag05giq - ' || abs(OLD.mag01qto) || ') ,'; ELSEIF mmc.mmcgiainiqu='-' THEN sql:=sql || 'mag05giq=(mag05giq + ' || abs(OLD.mag01qto) || ') ,'; END IF; --GIACENZA INIZIALE VALORE' IF mmc.mmcgiainiva='+' THEN sql:=sql || 'mag05giv=(mag05giv - ' || abs(OLD.mag01val) || ') ,'; ELSEIF mmc.mmcgiainiva='-' THEN sql:=sql || 'mag05giv=(mag05giv + ' || abs(OLD.mag01val) || ') ,'; END IF; --CARICHI QUANTITA' IF mmc.mmccarichqu='+' THEN sql:=sql || 'mag05caq=(mag05caq - ' || abs(OLD.mag01qto) || ') ,'; ELSEIF mmc.mmccarichqu='-' THEN sql:=sql || 'mag05caq=(mag05caq + ' || abs(OLD.mag01qto) || ') ,'; END IF; --CARICHI ALTRI' IF mmc.mmccarichal='+' THEN sql:=sql || 'mag05caa=(mag05caa - ' || abs(OLD.mag01qto) || ') ,'; ELSEIF mmc.mmccarichal='-' THEN sql:=sql || 'mag05caa=(mag05caa + ' || abs(OLD.mag01qto) || ') ,'; END IF; --CARICHI VALORE' IF mmc.mmccarichva='+' THEN sql:=sql || 'mag05cav=(mag05cav - ' || abs(OLD.mag01val) || ') ,'; ELSEIF mmc.mmccarichva='-' THEN sql:=sql || 'mag05cav=(mag05cav + ' || abs(OLD.mag01val) || ') ,'; END IF; --SCARICHI QUANTITA' IF mmc.mmcscaricqu='+' THEN sql:=sql || 'mag05scq=(mag05caq - ' || abs(OLD.mag01qto) || ') ,'; ELSEIF mmc.mmcscaricqu='-' THEN sql:=sql || 'mag05scq=(mag05caq + ' || abs(OLD.mag01qto) || ') ,'; END IF; --SCARICHI ALTRI' IF mmc.mmcscarical='+' THEN sql:=sql || 'mag05saa=(mag05caa - ' || abs(OLD.mag01qto) || ') ,'; ELSEIF mmc.mmcscarical='-' THEN sql:=sql || 'mag05saa=(mag05caa + ' || abs(OLD.mag01qto) || ') ,'; END IF; --SCARICHI VALORE' IF mmc.mmcscaricva='+' THEN sql:=sql || 'mag05scv=(mag05cav - ' || abs(OLD.mag01val) || ') ,'; ELSEIF mmc.mmcscaricva='-' THEN sql:=sql || 'mag05scv=(mag05cav + ' || abs(OLD.mag01val) || ') ,'; END IF; sql:=substring(sql from 1 for (char_length(sql)-1)); sql:=sql || ' Where (mag05art = $$' || OLD.mag01art || '$$) and (mag05mag = ' || magaorig || ')'; EXECUTE sql; END IF; RETURN NEW; END;$BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION sottrae_maga_saldi() OWNER TO postgres; CREATE TABLE mag0000f ( mag00pro integer NOT NULL, -- progressivo mag00rmc integer, -- progressivo registrazione contro magazzino corrisponden mag00con character varying(10), -- codice contro tabbella pco0000f.pco00kei mag00fco character varying(1) DEFAULT 'N'::character varying, -- s=movimentodi contro magazzino mag00dmu date, -- data movimento mag00ndo character varying(20), -- numero documento mag00ddu date, -- data documento mag00ser character varying(3), -- serie magazzino mag00mma integer, -- magazzino codice mag00cma integer, -- contro magazzino mag00nfa character varying(8), -- numero fattura mag00dfa date, -- data fattura mag00gio boolean DEFAULT false, -- giornale di magazzino stampato mag00fat integer, -- collegamento a fatture fat0000f.fat00pro mag00bol boolean DEFAULT false, -- bollato registro carico/scarico stampato mag00oin character varying(30), mag00din timestamp without time zone, mag00omo character varying(30), mag00dmo timestamp without time zone, CONSTRAINT mag0000f_pk PRIMARY KEY (mag00pro), CONSTRAINT mag00con_ke FOREIGN KEY (mag00con) REFERENCES pco0000f (pco00key) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT ) WITHOUT OIDS; ALTER TABLE mag0000f OWNER TO postgres; COMMENT ON COLUMN mag0000f.mag00pro IS 'progressivo'; COMMENT ON COLUMN mag0000f.mag00rmc IS 'progressivo registrazione contro magazzino corrisponden'; COMMENT ON COLUMN mag0000f.mag00con IS 'codice contro tabbella pco0000f.pco00kei'; COMMENT ON COLUMN mag0000f.mag00fco IS 's=movimentodi contro magazzino'; COMMENT ON COLUMN mag0000f.mag00dmu IS 'data movimento'; COMMENT ON COLUMN mag0000f.mag00ndo IS 'numero documento'; COMMENT ON COLUMN mag0000f.mag00ddu IS 'data documento'; COMMENT ON COLUMN mag0000f.mag00ser IS 'serie magazzino'; COMMENT ON COLUMN mag0000f.mag00mma IS 'magazzino codice'; COMMENT ON COLUMN mag0000f.mag00cma IS 'contro magazzino'; COMMENT ON COLUMN mag0000f.mag00nfa IS 'numero fattura'; COMMENT ON COLUMN mag0000f.mag00dfa IS 'data fattura'; COMMENT ON COLUMN mag0000f.mag00gio IS 'giornale di magazzino stampato'; COMMENT ON COLUMN mag0000f.mag00fat IS 'collegamento a fatture fat0000f.fat00pro'; COMMENT ON COLUMN mag0000f.mag00bol IS 'bollato registro carico/scarico stampato'; -- Index: fki_mag00con_ke -- DROP INDEX fki_mag00con_ke; CREATE INDEX fki_mag00con_ke ON mag0000f USING btree (mag00con); -- Index: mag00con_k -- DROP INDEX mag00con_k; CREATE INDEX mag00con_k ON mag0000f USING btree (mag00con); -- Index: mag00dmu_k -- DROP INDEX mag00dmu_k; CREATE INDEX mag00dmu_k ON mag0000f USING btree (mag00dmu); -- Index: mag00fat -- DROP INDEX mag00fat; CREATE INDEX mag00fat ON mag0000f USING btree (mag00fat); -- Index: mag00fco_k -- DROP INDEX mag00fco_k; CREATE INDEX mag00fco_k ON mag0000f USING btree (mag00fco); -- Index: mag00mma_k -- DROP INDEX mag00mma_k; CREATE INDEX mag00mma_k ON mag0000f USING btree (mag00mma); -- Index: mag00rmc_k -- DROP INDEX mag00rmc_k; CREATE UNIQUE INDEX mag00rmc_k ON mag0000f USING btree (mag00rmc); -- Index: mag00ser_k -- DROP INDEX mag00ser_k; CREATE INDEX mag00ser_k ON mag0000f USING btree (mag00ser); -- Trigger: mag0000f_after_update on mag0000f -- DROP TRIGGER mag0000f_after_update ON mag0000f; CREATE TRIGGER mag0000f_after_update AFTER UPDATE ON mag0000f FOR EACH ROW EXECUTE PROCEDURE mag0000_update_aggiorna_saldi_mag0500f(); -- Trigger: mag0000f_before_delete on mag0000f -- DROP TRIGGER mag0000f_before_delete ON mag0000f; CREATE TRIGGER mag0000f_before_delete BEFORE DELETE ON mag0000f FOR EACH ROW EXECUTE PROCEDURE mag0000_delete_aggiorna_saldi_mag0500f(); CREATE TABLE mag0100f ( mag01pro integer NOT NULL, -- progressivo mag01rig integer NOT NULL, -- numero rigo mag01art character varying(13), -- codice articolo mag01bum character varying(3), -- unita di misura secondaria tabbum mag01bu2 character varying(3), -- unita di misura secondaria tabbum mag01qto numeric(11,2) DEFAULT 0, -- quantita origine(quella digitata) mag01coe numeric(11,2) DEFAULT 1, -- coefficente di conversione mag01qta numeric(11,2), -- quantita(mag01qto x mag00coe) mag01pre numeric(11,2), -- valore unitario mag01val numeric(11,2), -- valore totale mag01mmc integer, -- causale di magazzino mag01iva integer, -- codice iva mag01pft integer, -- fat0100f.fat01pro mag01sfm integer DEFAULT 0, -- legame con tabbellatabsfm(stato fisico) mag01ecp character varying(4), -- legame con tabbella ecp(eventuali classi di pericolosit mag01des character(30), -- descrizione registro mag01nrc integer, -- progressivo registro di carici/scarico mag01oin character varying(30), mag01din timestamp without time zone, mag01omo character varying(30), mag01dmo character varying, mag01rft integer, -- fat0100f.fat01pro CONSTRAINT mag0100f_pk PRIMARY KEY (mag01pro, mag01rig), CONSTRAINT pppppp FOREIGN KEY (mag01pro) REFERENCES mag0000f (mag00pro) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE ) WITHOUT OIDS; ALTER TABLE mag0100f OWNER TO postgres; COMMENT ON COLUMN mag0100f.mag01pro IS 'progressivo'; COMMENT ON COLUMN mag0100f.mag01rig IS 'numero rigo'; COMMENT ON COLUMN mag0100f.mag01art IS 'codice articolo'; COMMENT ON COLUMN mag0100f.mag01bum IS 'unita di misura secondaria tabbum'; COMMENT ON COLUMN mag0100f.mag01bu2 IS 'unita di misura secondaria tabbum'; COMMENT ON COLUMN mag0100f.mag01qto IS 'quantita origine(quella digitata)'; COMMENT ON COLUMN mag0100f.mag01coe IS 'coefficente di conversione'; COMMENT ON COLUMN mag0100f.mag01qta IS 'quantita(mag01qto x mag00coe)'; COMMENT ON COLUMN mag0100f.mag01pre IS 'valore unitario'; COMMENT ON COLUMN mag0100f.mag01val IS 'valore totale'; COMMENT ON COLUMN mag0100f.mag01mmc IS 'causale di magazzino'; COMMENT ON COLUMN mag0100f.mag01iva IS 'codice iva'; COMMENT ON COLUMN mag0100f.mag01pft IS 'fat0100f.fat01pro'; COMMENT ON COLUMN mag0100f.mag01sfm IS 'legame con tabbellatabsfm(stato fisico)'; COMMENT ON COLUMN mag0100f.mag01ecp IS 'legame con tabbella ecp(eventuali classi di pericolosit'; COMMENT ON COLUMN mag0100f.mag01des IS 'descrizione registro'; COMMENT ON COLUMN mag0100f.mag01nrc IS 'progressivo registro di carici/scarico'; COMMENT ON COLUMN mag0100f.mag01rft IS 'fat0100f.fat01pro'; -- Index: fki_mag0100f_mag00pro_ke -- DROP INDEX fki_mag0100f_mag00pro_ke; CREATE INDEX fki_mag0100f_mag00pro_ke ON mag0100f USING btree (mag01pro); -- Index: fki_pppppp -- DROP INDEX fki_pppppp; CREATE INDEX fki_pppppp ON mag0100f USING btree (mag01pro); -- Trigger: mag0100f_after_insert on mag0100f -- DROP TRIGGER mag0100f_after_insert ON mag0100f; CREATE TRIGGER mag0100f_after_insert AFTER INSERT ON mag0100f FOR EACH ROW EXECUTE PROCEDURE somma_maga_saldi(); -- Trigger: mag0100f_after_update on mag0100f -- DROP TRIGGER mag0100f_after_update ON mag0100f; CREATE TRIGGER mag0100f_after_update AFTER UPDATE ON mag0100f FOR EACH ROW EXECUTE PROCEDURE somma_maga_saldi(); -- Trigger: mag0100f_before_update on mag0100f -- DROP TRIGGER mag0100f_before_update ON mag0100f; CREATE TRIGGER mag0100f_before_update BEFORE UPDATE ON mag0100f FOR EACH ROW EXECUTE PROCEDURE sottrae_maga_saldi(); CREATE TABLE mag0500f ( mag05mag integer NOT NULL, -- codice magazzino mag05art character varying(13) NOT NULL, -- codice articolo mag05gia numeric(16,2) DEFAULT 0, -- giacenza mag05giq numeric(16,2) DEFAULT 0, -- giacensa iniziale quantita mag05giv numeric(16,2) DEFAULT 0, -- giacenza iniziale valore mag05caq numeric(16,2) DEFAULT 0, -- carichi quantita mag05cav numeric(16,2) DEFAULT 0, -- carichi valore mag05caa numeric(16,2) DEFAULT 0, -- carichi altri mag05scq numeric(16,2) DEFAULT 0, -- scarichi quantita mag05scv numeric(16,2) DEFAULT 0, -- scarichi valore mag05saa numeric(16,2) DEFAULT 0, -- scarichi altri mag05duc timestamp without time zone, -- data ultimo carico mag05uci numeric(16,2) DEFAULT 0, -- ultimo costo imputato mag05dus timestamp without time zone, -- data ultimo scarico CONSTRAINT mag0500f_pk PRIMARY KEY (mag05mag, mag05art) ) WITHOUT OIDS; ALTER TABLE mag0500f OWNER TO postgres; COMMENT ON TABLE mag0500f IS 'saldi di magazzino'; COMMENT ON COLUMN mag0500f.mag05mag IS 'codice magazzino'; COMMENT ON COLUMN mag0500f.mag05art IS 'codice articolo'; COMMENT ON COLUMN mag0500f.mag05gia IS 'giacenza'; COMMENT ON COLUMN mag0500f.mag05giq IS 'giacensa iniziale quantita'; COMMENT ON COLUMN mag0500f.mag05giv IS 'giacenza iniziale valore'; COMMENT ON COLUMN mag0500f.mag05caq IS 'carichi quantita'; COMMENT ON COLUMN mag0500f.mag05cav IS 'carichi valore'; COMMENT ON COLUMN mag0500f.mag05caa IS 'carichi altri'; COMMENT ON COLUMN mag0500f.mag05scq IS 'scarichi quantita'; COMMENT ON COLUMN mag0500f.mag05scv IS 'scarichi valore'; COMMENT ON COLUMN mag0500f.mag05saa IS 'scarichi altri'; COMMENT ON COLUMN mag0500f.mag05duc IS 'data ultimo carico'; COMMENT ON COLUMN mag0500f.mag05uci IS 'ultimo costo imputato'; COMMENT ON COLUMN mag0500f.mag05dus IS 'data ultimo scarico'; -- Index: mag05art_k -- DROP INDEX mag05art_k; CREATE INDEX mag05art_k ON mag0500f USING btree (mag05art); -- Index: mag05mag_k -- DROP INDEX mag05mag_k; CREATE INDEX mag05mag_k ON mag0500f USING btree (mag05mag); CREATE TABLE pco0000f ( pco00key character varying(10) NOT NULL, -- 0101 xxxxx=fornitore 0201=clienti 0301 xxxxx=altri pco00cod integer, -- codice cliente pco00tip character varying(1), -- c=cliente f=fornitore a=altro pco00rag character varying(40), -- regione sociale pco00rind character varying(30), -- indirizzo pco00com integer DEFAULT 0, -- codice comune pco00cit character varying(30), -- citta pco00cap character varying(5), -- cap pco00pro character varying(2), -- provincia pco00cfp character varying(16), -- codice fiscale pco00piv character varying(11), -- parita iva pco00pag integer, -- codice pagamento della tabbella pag0000f pco00ban character varying(10), -- tabbella abicap pco00con character varying(30), -- cordinate bancarie iban pco00lis character varying(1), -- codice listino di vendita pco00not text, -- note pco00oin character varying(30), -- operatore inserimento pco00din timestamp without time zone, -- data inserimento pco00omo character varying(30), -- operatore modifica pco00dmo timestamp without time zone, -- data modifica CONSTRAINT pco00key_pk PRIMARY KEY (pco00key) ) WITHOUT OIDS; ALTER TABLE pco0000f OWNER TO postgres; COMMENT ON COLUMN pco0000f.pco00key IS '0101 xxxxx=fornitore 0201=clienti 0301 xxxxx=altri'; COMMENT ON COLUMN pco0000f.pco00cod IS 'codice cliente'; COMMENT ON COLUMN pco0000f.pco00tip IS 'c=cliente f=fornitore a=altro'; COMMENT ON COLUMN pco0000f.pco00rag IS 'regione sociale'; COMMENT ON COLUMN pco0000f.pco00rind IS 'indirizzo'; COMMENT ON COLUMN pco0000f.pco00com IS 'codice comune'; COMMENT ON COLUMN pco0000f.pco00cit IS 'citta'; COMMENT ON COLUMN pco0000f.pco00cap IS 'cap'; COMMENT ON COLUMN pco0000f.pco00pro IS 'provincia'; COMMENT ON COLUMN pco0000f.pco00cfp IS 'codice fiscale'; COMMENT ON COLUMN pco0000f.pco00piv IS 'parita iva'; COMMENT ON COLUMN pco0000f.pco00pag IS 'codice pagamento della tabbella pag0000f'; COMMENT ON COLUMN pco0000f.pco00ban IS 'tabbella abicap'; COMMENT ON COLUMN pco0000f.pco00con IS 'cordinate bancarie iban'; COMMENT ON COLUMN pco0000f.pco00lis IS 'codice listino di vendita'; COMMENT ON COLUMN pco0000f.pco00not IS 'note'; COMMENT ON COLUMN pco0000f.pco00oin IS 'operatore inserimento'; COMMENT ON COLUMN pco0000f.pco00din IS 'data inserimento'; COMMENT ON COLUMN pco0000f.pco00omo IS 'operatore modifica'; COMMENT ON COLUMN pco0000f.pco00dmo IS 'data modifica'; CREATE TABLE tabmmc ( mmccodicaus integer NOT NULL, -- codice causale magazzino mmcdesccaus character(30), -- descrizione causale mmctipocaus character varying(1), -- a=altro c=carico s=scarico mmcrelacaus character varying(1), -- c=clienti f=fornitori a=altri mmcaltrmaga boolean, -- richiede l' inserimento de contro magazzino e contro cau mmcaltrcaus integer, -- contro causale mmcgiainiqu character varying(1), -- giacenza iniziale quantita + -blank mmcgiainiva character varying(1), -- giacensa iniziale valore + -blank mmccarichqu character varying(1), -- carichi quantita + -blank mmccarichal character varying(1), -- carichi altri+ -blank mmccarichva character varying(1), -- carichi valore + -blank mmcaggcardt boolean, -- aggiorna ultima data carico (s/n) mmcaggcarco boolean, -- aggiorna ultimo costo carico(s/n) mmcscaricqu character varying(1), -- scarici quantita+ - blank mmcscarical character varying(1), -- scarici altri+ -blank mmcscaricva character varying(1), -- scarico a valore+ -blank mmcaggscadt boolean, -- aggiorna ultima data scarico(s/n) mmcdataorac timestamp without time zone, -- data ora creazione mmcutentrec character varying(30), -- utente creazione mmcdataoram timestamp without time zone, -- data ora modifica mmcutentemo character varying(30), -- utente modifica CONSTRAINT tabmmc_pk PRIMARY KEY (mmccodicaus) ) WITHOUT OIDS; ALTER TABLE tabmmc OWNER TO postgres; COMMENT ON COLUMN tabmmc.mmccodicaus IS 'codice causale magazzino'; COMMENT ON COLUMN tabmmc.mmcdesccaus IS 'descrizione causale'; COMMENT ON COLUMN tabmmc.mmctipocaus IS 'a=altro c=carico s=scarico'; COMMENT ON COLUMN tabmmc.mmcrelacaus IS 'c=clienti f=fornitori a=altri'; COMMENT ON COLUMN tabmmc.mmcaltrmaga IS 'richiede l'' inserimento de contro magazzino e contro cau'; COMMENT ON COLUMN tabmmc.mmcaltrcaus IS 'contro causale'; COMMENT ON COLUMN tabmmc.mmcgiainiqu IS 'giacenza iniziale quantita + -blank'; COMMENT ON COLUMN tabmmc.mmcgiainiva IS 'giacensa iniziale valore + -blank'; COMMENT ON COLUMN tabmmc.mmccarichqu IS 'carichi quantita + -blank'; COMMENT ON COLUMN tabmmc.mmccarichal IS 'carichi altri+ -blank'; COMMENT ON COLUMN tabmmc.mmccarichva IS 'carichi valore + -blank'; COMMENT ON COLUMN tabmmc.mmcaggcardt IS 'aggiorna ultima data carico (s/n)'; COMMENT ON COLUMN tabmmc.mmcaggcarco IS 'aggiorna ultimo costo carico(s/n)'; COMMENT ON COLUMN tabmmc.mmcscaricqu IS 'scarici quantita+ - blank'; COMMENT ON COLUMN tabmmc.mmcscarical IS 'scarici altri+ -blank'; COMMENT ON COLUMN tabmmc.mmcscaricva IS 'scarico a valore+ -blank'; COMMENT ON COLUMN tabmmc.mmcaggscadt IS 'aggiorna ultima data scarico(s/n)'; COMMENT ON COLUMN tabmmc.mmcdataorac IS 'data ora creazione'; COMMENT ON COLUMN tabmmc.mmcutentrec IS 'utente creazione'; COMMENT ON COLUMN tabmmc.mmcdataoram IS 'data ora modifica'; COMMENT ON COLUMN tabmmc.mmcutentemo IS 'utente modifica'; |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Il DUMP del DB?
Comunque io sconsiglio l'uso dei trigger per problemi come questo, soprattutto se fatti con Dynamic SQL... Userei piuttosto una vista che, sulla base delle tabelle originali in cui ci sono le informazioni, calcola quanto desiderato.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Jul 2009
Messaggi: 2
|
Ecco il DUMP, comunque tabelle, funzioni e trigger erano inclusi nello script Sql. Per quanto riguarda la Vista, se sono pochi records allora il discorso potrebbe funzionare. Sicuramente una tabella di appoggio è molto più performante per calcolare un saldo al posto di leggere migliaia di records per calcolarsi il saldo. Il DUMP contiene già i dati, tutto il resto delle tabelle non contiene ancora nulla e mancano gli indici, ma le tabelle interessate sono pronte per utilizzarle con i trigger. Il DATABASE lo sto completando ancora, ho solo visto che i TRIGGER non mi funzionano come io vorrei. La qualsiasi cosa fai sul dettaglio (mag0100f) è funzionante. Anche sul Master (mag0000f) se cambi il magazzino, la tabella mag0500f si aggiorna correttamente. Solo se cancello il record in testata (mag0000f), non ottengo l'effetto desiderato. Ti ringrazio anticipatamente della collaborazione.
Ultima modifica di taffy2 : 08-07-2009 alle 18:15. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:45.