CMDBuild Forum

Trigger per estrarre dato di tipo lookup

Ciao.

Ho creato una classe PC con attributo Marca di tipo lookup.
 
Vorrei che il campo Description (che si crea di default ) venga automaticamente riempito uguale a Marca.
 
Ho creato il trigger seguente:
-- Function: public.setta_description_pc()
 
-- DROP FUNCTION public.setta_description_pc();
 
CREATE OR REPLACE FUNCTION public.setta_description_pc()
  RETURNS trigger AS
$BODY$
 
   BEGIN
 
     NEW."Description" = NEW."Marca";
 
     RETURN NEW;
 
   END;
 
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.setta_description_pc()
  OWNER TO postgres;
 
 
Il problema è che ora Description è un numero intero che vedo essere corrispondente al campo Id della tabella LookUp.
Vorrei invece che fosse il campo Description della tabella Lookup.
Come posso fare?
 
Grazie mille.
 

Anzichè:

    NEW."Description" = NEW."Marca";

devi scrivere:

    NEW."Description" = (select "Description" from "LookUp" where "Id" = NEW."Marca");

 

CMDBuild Team

 

 

 Grazie mille, funziona!

 

 
Se invece volessi in una classe A che il campo Importo sia la somma del campo Importo delle classi B correlate con dominio 1:N come potrei fare?
 
Temo che in questo caso avrei un problema con l'history che ad ogni modifica crea una riga nella tabella della classe B

No, funzionerebbe anche con un dominio 1:N fra le classi A e B nell'ordine, ed in modo molto simile se nella classe B ci fosse un campo reference alla classe A basato su quel dominio.

Basterebbe ad esempio scrivere nel trigger una riga tipo:

    NEW."Totale" = (select sum("ClasseB"."Addendo") from "ClasseB" where "ClasseB"."Campo_reference_alla_classeA" = NEW."Id");

CMDBuild Team

Previously Tecnoteca wrote:

No, funzionerebbe anche con un dominio 1:N fra le classi A e B nell'ordine, ed in modo molto simile se nella classe B ci fosse un campo reference alla classe A basato su quel dominio.

Basterebbe ad esempio scrivere nel trigger una riga tipo:

    NEW."Totale" = (select sum("ClasseB"."Addendo") from "ClasseB" where "ClasseB"."Campo_reference_alla_classeA" = NEW."Id");

CMDBuild Team

Ho provato, ma se non aggiungo lo "Status" = 'A' mi risulta un dato sballato.
 
NEW."Totale" = (select SUM("ClasseB"."Addendo") from "ClasseB" where ("ClasseB"."Campo_reference_alla_classeA" = NEW."Id") AND ("ClasseB"."Status" = 'A')) ;

Confermo la necessità della condizione sullo stato

Avendo scritto la risposta senza aver fatto nessun test era purtroppo sfuggita la mancanza di quel controllo.

CMDBuild Team

Grazie mille.
 
Però temo che non sia la strada giusta...
 
Supponendo di modificare i valori di "ClasseB"."Addendo" la modifica nel campo NEW."Totale" la vedo solo se faccio una modifica alla classe A altrimenti il dato non si aggiorna.
 
 
Forse devo utilizzare qualcosa di diverso per implementare una funzionalità di questo tipo?

Questo è normale.

Il trigger descritto nei post precedenti era solo un esempio di trigger che calcola una somma basandosi su un dominio.

Se l'obiettivo è quello di mantenere quella somma sempre aggiornata bisogna che il trigger venga definito non sulla classe A ma sulla classe B, forzando il ricalcolo sulla classe A ad ogni variazione (inserimento, modifica, cancellazione) del campo "Campo_reference_alla_classeA" e / o del campo "Addendo" su una delle righe della classe B.

 

CMDBuild Team