CMDBuild Forum

Doppio campo REFERENCE su medesime classi

Salve a tutti.

Ho questa esigenza: ho una classe di apparecchiature e una classe di fornitori/costruttori.

All'interno della classe apparecchiature ho (o almeno vorrei) due campi REFERENCE, il primo per identificare il costruttore, il secondo il fornitore.

Per comodità (perché il 90% delle volte il costruttore e il fornitore coincidono) c'è un'unica classe per i fornitori/costruttori, ma CMDBUILD non mi permette di avere due campi REFERENCE (o almeno io non ci riesco) sulle stesse classi. Ad essere precisi accade questo:

1) se creo un solo dominio tra le due classi, ApparecchiatureXCostruttori, posso mettere quanti campi REFERENCE voglio, facendo riferimento a questo dominio, con la conseguenza però che una volta settato un valore per il primo campo, questo valore verrà replicato sugli altri campi REFERENCE; in altre parole, se faccio così, quando scelgo il costruttore, questo è necessariamente anche il fornitore. Se scelgo un costruttore e un fornitore diversi in questa configurazione ricevo un errore.

2) se invece voglio creare due domini tra le classi, il primo ApparecchiatureXCostruttori e il secondo ApparecchiatureXFornitori, quando creo il secondo dominio ho un errore.

 

Ripeto, non ho creato due classi distinte, Costruttori e Fornitori perché per la quasi totalità delle apparecchiature coincidono. Tuttavia ho necessità di inserirli entrambi nella scheda della classe Apparecchiature.

 

Grazie come sempre per il supporto.

 

Gianluca Giaconia

La soluzione corretta e normalmente utilizzata in CMDBuild è proprio quella di creare due domini fra la stessa coppia di classi, come indicato all'ipotesi 2).

Poi un attributo reference sarà collegato al primo dominio e un altro attributo reference sarà collegato al secondo dominio.

Non ci risultano malfunzionamenti a questo riguardo.

Fabio

 

Allora, l'errore ce l'ho quando provo a creare l'attributo Fornitore di tipo REFERENCE facendo riferimento al dominio ApparecchiatureXFornitori.

 

L'errore sintetico è:

Errore SQL: ERROR: trigger "_Constr_apparecchiature_fornitore" for relation "Costruttori" already exists

 

L'errore nei dettagli:

org.cmdbuild.exception.ORMException: ORM_ERROR_GENERIC_SQL ERROR: trigger "_Constr_apparecchiature_fornitore" for relation "Costruttori" already exists
	at org.cmdbuild.exception.ORMException$ORMExceptionType.createException(ORMException.java:60)
	at org.cmdbuild.dao.backend.postgresql.PGCMBackend$CMSqlException.throwGenericException(PGCMBackend.java:124)
	at org.cmdbuild.dao.backend.postgresql.PGCMBackend$CMSqlException.throwCustomExceptionFrom(PGCMBackend.java:109)
	at org.cmdbuild.dao.backend.postgresql.PGCMBackend$SqlState.throwCustomExceptionFrom(PGCMBackend.java:171)
	at org.cmdbuild.dao.backend.postgresql.PGCMBackend.createAttribute(PGCMBackend.java:469)
	at org.cmdbuild.elements.AttributeImpl.save(AttributeImpl.java:397)
	at org.cmdbuild.servlets.json.schema.ModClass.saveAttribute(ModClass.java:389)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.cmdbuild.servlets.JSONDispatcher.dispatch(JSONDispatcher.java:94)
	at org.cmdbuild.servlets.JSONDispatcher.doPost(JSONDispatcher.java:55)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.cmdbuild.filters.AuthFilter.doFilter(AuthFilter.java:54)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.cmdbuild.filters.PatchManagerFilter.doFilter(PatchManagerFilter.java:28)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.cmdbuild.filters.ConfCheckFilter.doFilter(ConfCheckFilter.java:31)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.cmdbuild.filters.TranslationFilter.doFilter(TranslationFilter.java:37)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:877)
	at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:594)
	at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1675)
	at java.lang.Thread.run(Unknown Source)

Grazie

 

Gianluca Giaconia

Com’è stato rimosso l’attributo Fornitore precedentemente creato sulla stessa classe?

 
Paolo
 

Tecnoteca ha scritto:

Com'è stato rimosso l'attributo Fornitore precedentemente creato sulla stessa classe?
 
Paolo
 

mmmhhh....forse il problema è qui effettivamente...

 

Allora, ho fatto un mezzo casino: ho eliminato il vecchio dominio ApparecchiatureXCostruttori (perché l'attributo Fornitore era REFERENCE su questo dominio e CMDBUILD non mi fa modificare il tipo di attributo REFERENCE).

Poi ho provato ad eliminare l'attributo Fornitore, ma ovviamente CMDBUILD non me l'ha fatto fare per qualche motivo che ora non ricordo (c'erano dei dati probabilmente).

Allora sono andato brutalmente sul db e ho eliminato il campo dalla tabella relativa alla classe.

Tornato su CMDBUILD la classe Apparecchiature ha cominciato a dare i numeri e in ogni caso non era possibile eliminare l'attributo Fornitore perché il campo non esisteva :-O

 

(fine prima parte)

(seconda parte)

 

Allora sono andato sul DB è ho creato di nuovo il campo Fornitore, poi l'ho cancellato da CMDBuild.

A questo punto ho ricreato l'attributo Fornitore di tipo REFERENCE e l'ho associato al nuovo dominio ApparecchiatureXFornitori e al momento di salvare l'attributo avevo un errore.

 

A questo punto ho fatto una cosa, ho eliminato di nuovo l'attributo Fornitore e no ho creato uno nuovo Fornitor (con descrizione Fornitore) sempre di tipo REFERENCE sul dominio ApparecchiatureXFornitori. Questa volta è andato tutto bene nel salvare l'attributo, ma al momento di aggiungere una nuova scheda Apparecchiature avevo ancora un errore (e precisamente che la colonna Fornitore non esisteva!).

Non mi sono perso d'animo e sono tornato sul DB creando un campo Fornitore. Fatto questo tutto è andato bene (e funziona ancora bene).

 

Mi nasce un dubbio però: dopo la cancellazione "brutale" del campo Fornitore dal DB, io continuavo a vedere l'attirbuto Fornitore su CMDBuild. Dove è mappata nel DB la struttura della classe? Perché continuavo a vedere l'attributo? Dovevo forse riavviare tomcat?

 

Grazie

 

Gianluca

 

(senza emoticon funziona!)

CMDBuild utilizza una cache lato server che viene ovviamente vuotata riavviando Tomcat, ma può essere rimossa anche andando nel Modulo di Amministrazione - Configurazione - Gestione server e richiedendo con l’apposito pulsante la sincronizzazione

dei servizi.

Fabio