CMDBuild Forum

Valori predefiniti attributi

Ciao a tutti.

E' possibile settare dei valori predefiniti o dei comportamenti predefiniti per alcuni degli attributi di una classe?

Ad esempio è possibile fare in modo che un campo TIMESTAMP riporti di default (quindi senza che sia valorizzato da un utente) la data e l'ora di creazione della scheda?

Oppure è possibile che un attributo CODE si valorizzi da solo con un progressivo secondo un criterio predefinito? (es. APP001, APP002, APP003, ecc.)

Grazie

Gianluca Giaconia

Sì, è possibile.

Attualmente la soluzione da utilizzare è però quella di agire direttamente nel database.

Ovviamente le impostazioni effettuate agiranno in tal caso al momento del salvataggio nel database e non al momento della presentazione dei dati nella form.

 

Nel caso della data è sufficiente modificare manualmente la colonna "nomeattributo" di tipo timestamp creata da CMDBuild nella classe "nomeclasse" con il comando:

 

    ALTER TABLE "nomeclasse" ALTER COLUMN "nomeattributo" SET DEFAULT now();

 

Nel caso del codice progressivo è invece necessario creare una "sequence" (contatore) nel database, ad esempio con il comando:

 

    CREATE SEQUENCE nomesequence INCREMENT 1 START 1;

 

e creare poi una funzione trigger ed un trigger sulla classe interessata, ad esempio con i comandi:

    CREATE OR REPLACE FUNCTION nomefunzione()

      RETURNS trigger AS

    $BODY$

      BEGIN

        IF( TG_OP = 'INSERT' ) THEN

          NEW."Code" = 'APP' || (select lpad(nextval('nomesequence')::varchar, 3, '0'));

        END IF; 

        RETURN NEW;

      END;

    $BODY$

      LANGUAGE plpgsql VOLATILE;

 

    CREATE TRIGGER nometrigger

      BEFORE INSERT OR UPDATE

      ON "nomeclasse"

      FOR EACH ROW

      EXECUTE PROCEDURE nomefunzione(E'\\x');

 

Nella roadmap di CMDBuild è prevista per il prossimo anno una estensione che consenta di ottenere gli stessi risultati agendo direttamente sulla definizione dell'attributo dal Modulo di Amministrazione di CMDBuild (anzichè dal database).

 

Fabio

 

Grazie per la risposta molto dettagliata.

Reputo un compromesso assolutamente accettabile quello di agire direttamente sul DB e anzi era una cosa alla quale potevo pensare direttamente (ma il fatto di concentrarmi adesso sui processi, mi ha un po' disabituato a ragionare da tecnico).

 

Grazie

 

Gianluca