CMDBuild Forum

id Scheda come primarykey

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…

 
Stiamo valutando di risolverlo diversamente.
 
Visto che l'id univoco in realtà esiste già preferirei modificare il codice lato GUI in modo che lo visualizzi sempre, invece di andare a fare un lavoro di basso livello sul DB.
 
Spero comunque che la visualizzazione del progressivo auto incrementale possa essere implementata nella prossima versione e mi sembra strano che non sia già prevista attualmente.
 
Ci sarà sicuramente una buona ragione dal punto di vista del mantainer che pero' mi sfugge.
 

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,

spero che sarà disponibile presto.
Grazie e buon lavoro