Buongiorno a tutti,
Qualcuno sa come si fa ad avere un campo id nella scheda che funge da primarykey , quindi unique,not null e autogenerato.??? Ho visto che c'è l'attributo Code, ma bisogna mettere i valori a mano.
Grazie.
Buongiorno a tutti,
Qualcuno sa come si fa ad avere un campo id nella scheda che funge da primarykey , quindi unique,not null e autogenerato.??? Ho visto che c'è l'attributo Code, ma bisogna mettere i valori a mano.
Grazie.
Ciao Mauro,
la mia ricetta è questa:
1) Dalla GUI Amministrativa di CMDBuild creati l'attributo "Progressivo" di tipo integer nella tua classe "MauroClass" (eventualmente fallo di sola lettura);
2) Lancia lo script sul database
CREATE SEQUENCE mauroclass_seq
INCREMENT 1
MINVALUE 0
MAXVALUE 9223372036854775807
START 1
CACHE 1;
3) Lancia un ulteriore script sul database
ALTER TABLE "MauroClass" ALTER COLUMN "Progressivo" SET DEFAULT nextval('mauroclass_seq'::regclass);
Questo dovrebbe essere sufficiente a far sì che ad ogni inserimento non valorizzato dell'attributo "Progressivo" venga preso come valore di default quello proposto dalla sequenza postgres definita.
Se non ho scritto una stupidaggine potrei anche dare uno spunto ai ragazzi di Tecnoteca per creare un nuovo tipo di dato per gli attributi chiamato "incrementale" che nei fatti fa la stessa cosa che ho riportato a livello di scripting lato DB.
Saluti,
Luca
Previously mauro wrote:
Buongiorno a tutti,
Qualcuno sa come si fa ad avere un campo id nella scheda che funge da primarykey , quindi unique,not null e autogenerato.??? Ho visto che c'è l'attributo Code, ma bisogna mettere i valori a mano.
Grazie.
Ciao Luca,
Grazie della tua risposta. Mi sembra però un intervento molto a basso livello, bisogna mettere mano nel DB.
Però cosa succede se io cancello la classe "MauroClass" ? ogni volta dovrei fare questo tipo di intervento per crearmi la primaryKey? In teoria sarebbe una duplicazione della chiave di tabella, in effetti ogni tabella ha la sua chiave che però rimane nascosta lato GUI, l'utente non ha modo di visualizzare l'id di ogni riga.
Saluti.
Previously Luca wrote:
Ciao Mauro,
la mia ricetta è questa:
1) Dalla GUI Amministrativa di CMDBuild creati l'attributo "Progressivo" di tipo integer nella tua classe "MauroClass" (eventualmente fallo di sola lettura);
2) Lancia lo script sul database
CREATE SEQUENCE mauroclass_seq
INCREMENT 1
MINVALUE 0
MAXVALUE 9223372036854775807
START 1
CACHE 1;3) Lancia un ulteriore script sul database
ALTER TABLE "MauroClass" ALTER COLUMN "Progressivo" SET DEFAULT nextval('mauroclass_seq'::regclass);
Questo dovrebbe essere sufficiente a far sì che ad ogni inserimento non valorizzato dell'attributo "Progressivo" venga preso come valore di default quello proposto dalla sequenza postgres definita.
Se non ho scritto una stupidaggine potrei anche dare uno spunto ai ragazzi di Tecnoteca per creare un nuovo tipo di dato per gli attributi chiamato "incrementale" che nei fatti fa la stessa cosa che ho riportato a livello di scripting lato DB.
Saluti,
Luca
Ciao, sì "purtroppo" devi mettere mano al DB. Cmq ad oggi un uso intensivo ed avanzato di CMDBuild non può escludere questo tipo di accesso diretto (parlo per esperienza personale).
Ormai implemento le nuove classi di CMDBuild oltre che con la modalità amministrativa, anche con il tool pgadminIII sempre aperto.
E chiaramente dipende dal maintainer del progetto dotare lo strumento di un tipo di dato incrementale che puoi gestire direttamente dalla modalità amministrativa (come avevo già detto nella mia risposta).
Saluti
Luca
Previously Mauro wrote:
Ciao Luca,
Grazie della tua risposta. Mi sembra però un intervento molto a basso livello, bisogna mettere mano nel DB.
Però cosa succede se io cancello la classe "MauroClass" ? ogni volta dovrei fare questo tipo di intervento per crearmi la primaryKey? In teoria sarebbe una duplicazione della chiave di tabella, in effetti ogni tabella ha la sua chiave che però rimane nascosta lato GUI, l'utente non ha modo di visualizzare l'id di ogni riga.
Saluti.
Previously Luca wrote:
Ciao Mauro,
la mia ricetta è questa:
1) Dalla GUI Amministrativa di CMDBuild creati l'attributo "Progressivo" di tipo integer nella tua classe "MauroClass" (eventualmente fallo di sola lettura);
2) Lancia lo script sul database
CREATE SEQUENCE mauroclass_seq
INCREMENT 1
MINVALUE 0
MAXVALUE 9223372036854775807
START 1
CACHE 1;3) Lancia un ulteriore script sul database
ALTER TABLE "MauroClass" ALTER COLUMN "Progressivo" SET DEFAULT nextval('mauroclass_seq'::regclass);
Questo dovrebbe essere sufficiente a far sì che ad ogni inserimento non valorizzato dell'attributo "Progressivo" venga preso come valore di default quello proposto dalla sequenza postgres definita.
Se non ho scritto una stupidaggine potrei anche dare uno spunto ai ragazzi di Tecnoteca per creare un nuovo tipo di dato per gli attributi chiamato "incrementale" che nei fatti fa la stessa cosa che ho riportato a livello di scripting lato DB.
Saluti,
Luca
Come Luca anche io uso le sequence allo stesso modo per i progressivi, ma mi rimane irrisolto (o comunque gestito in maniera molto macchinosa) un altro problema : generare un numero progressivo sull'anno che si resetti a fine anno.
Mi spiego con un esempio dato che è più facile farlo vedere che spiegarlo: avete presente la numerazione delle fatture?
1-2010
2-2010
3-2010
...
da capodanno 2011 diventa :
1-2011
2-2011
3-2011
da capodanno 2012 sarà
1-2012
2-2012
3-2012
conoscete un modo efficente per gestire il problema?
Attualmente risolvo con un count()+1 per incrementare "where numero like %2011", ma non mi piace come sistema perché per evitare conflitti di accessi concorrenti dovrei effettuare il lock della tabella.
Qualcuno ha affrontato e risolto questo problema in maniera più efficente?
saluti,
Alessandro Grillini
Previously Luca wrote:
Ciao, sì "purtroppo" devi mettere mano al DB. Cmq ad oggi un uso intensivo ed avanzato di CMDBuild non può escludere questo tipo di accesso diretto (parlo per esperienza personale).
Ormai implemento le nuove classi di CMDBuild oltre che con la modalità amministrativa, anche con il tool pgadminIII sempre aperto.
E chiaramente dipende dal maintainer del progetto dotare lo strumento di un tipo di dato incrementale che puoi gestire direttamente dalla modalità amministrativa (come avevo già detto nella mia risposta).
Saluti
Luca
Previously Mauro wrote:
Ciao Luca,
Grazie della tua risposta. Mi sembra però un intervento molto a basso livello, bisogna mettere mano nel DB.
Però cosa succede se io cancello la classe "MauroClass" ? ogni volta dovrei fare questo tipo di intervento per crearmi la primaryKey? In teoria sarebbe una duplicazione della chiave di tabella, in effetti ogni tabella ha la sua chiave che però rimane nascosta lato GUI, l'utente non ha modo di visualizzare l'id di ogni riga.
Saluti.
Previously Luca wrote:
Ciao Mauro,
la mia ricetta è questa:
1) Dalla GUI Amministrativa di CMDBuild creati l'attributo "Progressivo" di tipo integer nella tua classe "MauroClass" (eventualmente fallo di sola lettura);
2) Lancia lo script sul database
CREATE SEQUENCE mauroclass_seq
INCREMENT 1
MINVALUE 0
MAXVALUE 9223372036854775807
START 1
CACHE 1;3) Lancia un ulteriore script sul database
ALTER TABLE "MauroClass" ALTER COLUMN "Progressivo" SET DEFAULT nextval('mauroclass_seq'::regclass);
Questo dovrebbe essere sufficiente a far sì che ad ogni inserimento non valorizzato dell'attributo "Progressivo" venga preso come valore di default quello proposto dalla sequenza postgres definita.
Se non ho scritto una stupidaggine potrei anche dare uno spunto ai ragazzi di Tecnoteca per creare un nuovo tipo di dato per gli attributi chiamato "incrementale" che nei fatti fa la stessa cosa che ho riportato a livello di scripting lato DB.
Saluti,
Luca
Sto affrontando lo stesso tipo di problema, ovvero ottenere la visualizzazione dell’id univoco auto generato per tutte le classi, gestire il progressivo a mano non è pensabile…
L'Id univoco gestito da CMDBuild come attributo di sistema non sarà reso visibile nella GUI essendo una informazione ad uso esclusivamente interno.
Va considerato che non è un progressivo specifico della classe ma è unico per tutte le classi e tutte le relazioni, ed assume quindi valori potenzialmente anche molto elevati.
E' sicuramente più corretto, nella logica di CMDBuild, il suggerimento di Luca di creare un attributo applicativo e agganciarlo tramite trigger ad una "sequence" del database.
In questo momento richiede di "mettere mano" al DB, ma la soluzione del problema potrebbe rientrare nella possibilità di definire dei campi calcolati, già considerata nella roadmap del progetto.
Uno dei metodi di calcolo potrà essere infatti quello di definire un attributo come "contatore" autoincrementale, impostandolo poi via codice (evitando quindi a quel punto di dover operare nel DB) tramite generazione automatica sia della "sequence" che del trigger.
L'attivazione di logiche applicative particolari, come ad esempio quella dell'azzeramento ad inizio anno, dovrebbe essere comunque risolta intervenendo manualmente sul trigger.
Fabio
La soluzione del
“contatore” auto incrementale sarebbe più che sufficiente a risolvere questa esigenza,