Importazione ed Esportazione Dati API JS
Geoweb espone api js per attuare l'importazione e l'esportazione di dati con formati standard.
Formati supportati:
- .xlsx
- .csv
- .shp (per dati spaziali)
Prerequisiti
Tabella entità presente nel DB, con configurazione della relativa classe e di tutti gli widget necessari.
Implementazione delle opportune azioni javascript di import/export.
Le azioni si differenziano a seconda del tipo (CSV, XLSX o SHP), ma hanno anche in comune alcuni aspetti e modalità di utilizzo.
CSV
IMPORT CSV (js API)
importCSV()
Parametri
- grid: Object, required
- options: Object, required, contiene i seguenti parametri:
tipologia | Nome | Required | Descrizione breve |
---|---|---|---|
Integer | importType | true | è un numero intero ed indica il tipo di importazione. Può assumere il valore 0 o 1 o 2 o 3 o 4 come da sezione dedicata |
function | callback | false | Permette di inserire la funzione di callback dopo l importazione |
String | childClassName | false | Nome della classe, qualora si volesse importare i dati in una tabelle di una classe collegata a questa tramite childlist. I record verrebbero gia caricati collegati al record padre dal quale viene lanciata l azione |
String | itemId | false | chiave del record da cui si sta lanciando l azione, data.itemDB.pk_column, qualora si volesse importare i dati in una tabelle di una classe collegata a questa tramite childlist. I record verrebbero già caricati collegati al record padre dal quale viene lanciata l azione |
String | relationName | false | nome della relazione sulla classe, qualora si volesse importare i dati in una tabelle di una classe collegata a questa tramite childlist. I record verrebbero già |
String | codColumn | false | Nome della o delle colonne per qualora si facesse un importazione tipo update. Le colonne se più di una dovrebbero essere separate da virgola |
Object | columnHeadersMap | false | HashMap per la mappatura dell header dello shape con quelle del database. Vanno inserite soltanto quelle dove il nome è diverso e le si voglia importare. La forma è la seguente, nameColumnCsv:nameColumnDatabase |
Object | additionalMap | false | HashMap contenente la lista delle colonne non presenti nel file che si voglia comunque popolare durante l inserimento. la forma è nameColumnDatabase:valore, il valore può essere anche preso dinamicamente dalla sessione |
String | scriptName | false | Nome dello scripts groovy, senza estenzione che verrà lanciato al termine del caricamento. Lo script deve essere presente nella cartella dei contenuti statici sottocartella groovy |
Integer | handleErrorsType | false | Specifica il comportamento del sistema in presenza di un errore. Se 0,(default) il sistema va avanti segnalando alla fine i records non importati e l errore verificatosi, se 1 blocca l intera importazione se almeno un record non può essere importato |
Integer | idProcessImport | false | Se indicato non viene inserito un nuovo record nella tabella contenente l archivio storico delle importazioni bensì aggiorna il record con quel idProcess |
String | itemNotFoundAction | false | Permette di inserire la funzione di callback dopo l' importazione |
String | itemNotFoundUpdateField | false | Permette di inserire la funzione di callback dopo l' importazione |
String | itemNotFoundUpdateValue | false | Permette di inserire la funzione di callback dopo l' importazione |
String | csvTemplateLabel | false | |
Boolean | hideDocumentationButtons | false | (form 4.4.16) quando a true permette di nascondere o meno il div con la documentazione csv e i relativi pulsanti che consentono, rispettivamente, il download del pdf e del file xlsx |
Esempi
Apre un dialog che permette di selezionare il file .csv da importare.
var importType = 0 ; //allowed 0, 1, 2, 3, 4 importCSV(grid, { importType: importType });
Dal dialog è possibile scaricare un file .csv di esempio di importazione avente, per default, come label la stringa Crea file di importazione di esempio.
(form 4.4.16) E' possibile personalizzare l'etichetta del pulsante, passando tra i parametri opzionali dell'azione importCSV il parametro csvTemplateLabel come nell'esempio:
var importType = 0 ; //allowed 0, 1, 2, 3, 4 importCSV(grid,{importType: importType, csvTemplateLabel:'ESEMPIO LABEL CUSTOM'});
Oltre all'etichetta del pulsante che consente il download del template di tipo csv, è possibile decidere se nascondere o meno il div con la documentazione csv e i relativi pulsanti che consentono, rispettivamente, il download del pdf e del file xlsx passando tra i parametri opzionali dell'azione importCSV il parametro hideDocumentationButtons valorizzato a true come nell'esempio:
var importType = 0 ; //allowed 0, 1, 2, 3, 4 importCSV(grid,{importType: importType, hideDocumentationButtons: true});
Nell'immagine sottostante si riporta la maschera di importazione csv ottenuta ponendo hideDocumentationButtons uguale a true e csvTemplateLabel valorizzata come nell'esempio
var importType = 0 ; //allowed 0, 1, 2, 3, 4 importCSV(grid,{importType: importType, hideDocumentationButtons: true, csvTemplateLabel: 'ESEMPIO LABEL CUSTOM'});
Importazione per Aggiornamento:
importCSV(grid, {importType: 2, codColumn: 'cod_item_mc,tenant_code'});
Importazione accodamento dei record di una classe figlia dal dettaglio di un record della classe padre, legati da una childlist:
importCSV( {gwClassName: 'CLASSE_PADRE'}, { importType: 0, codColumn: 'NOME_CAMPO_CODICE', childClassName: 'NOME_CLASSE_FIGLIA', itemId: data.itemDB.CHIAVE_CLASSE_PADRE, relationName: 'NOME_RELAZIONE_CLASSE_PADRE_FIGLIA' } );
EXPORT CSV (js API)
exportCSV()
(from 4.7.4) Funzione generica. Di base lavora con gli attributi in lista per la classe. Gli header delle colonne esportate possono essere rimappati.
Parametri
- gwClassName: String, required
- queryParameter: Object, optional
- options: Object, optional
- columnHeadersMap: Object, optional, Map<String,String>
Esempi
var gwClassName = 'gwClassName'; var queryParameter = {filters: [..]}; exportCSV(gwClassName, queryParameter);
var gwClassName = 'gwClassName'; var queryParameter = {filters: [..]}; var columnHeadersMap = {'gw_attr_name': 'target_attribute_name'} var options = {columnHeadersMap: columnHeadersMap}; exportCSV(gwClassName, queryParameter, options);
exportCSVListSelected()
(from 4.7.4) Funzione specifica per la gwClassList. Lavora con gli attributi in lista per la classe. Gli header delle colonne esportate possono essere rimappati.
Parametri
- grid: Object, required
- options: Object, optional
- columnHeadersMap: Object, optional, Map<String,String>
Esempi
exportCSVListSelected(grid);
var columnHeadersMap = {'gw_attr_name': 'target_attribute_name'}; var options = {columnHeadersMap: columnHeadersMap}; exportCSVListSelected(grid, options);
exportCSVAllAttributes()
(from 4.7.4) Funzione generica. Lavora con tutti gli attributi della classe (collegati ad almeno un gruppo attributo). Gli header delle colonne esportate possono essere rimappati.
Parametri
- gwClassName: String, required
- queryParameter: Object, optional
- options: Object, optional
- columnHeadersMap: Object, optional, Map<String,String>
Esempi
var gwClassName = 'gwClassName'; var queryParameter = {filters: [..]}; exportCSVAllAttributes(gwClassName, queryParameter);
var queryParameter = {filters: [..]}; var columnHeadersMap = {'gw_attr_name': 'target_attribute_name'}; var options = {columnHeadersMap: columnHeadersMap}; exportCSVAllAttributes(gwClassName, queryParameter, options);
exportCSVListSelectedAllAttributes()
(from 4.7.4) Funzione specifica per la gwClassList. Lavora con tutti gli attributi della classe (collegati ad almeno un gruppo attributo). Gli header delle colonne esportate possono essere rimappati.
Parametri
- grid: Object, required
- options: Object, optional
- columnHeadersMap: Object, optional, Map<String,String>
Esempi
exportCSVListSelectedAllAttributes(grid);
var columnHeadersMap = {'gw_attr_name': 'target_attribute_name'}; var options = {columnHeadersMap: columnHeadersMap}; exportCSVListSelectedAllAttributes(grid, options);
exportCSVSpecifiedAttributes()
(from 4.7.4) Funzione generica. Lavora con gli attributi specificati come parametro. Gli header delle colonne esportate possono essere rimappati.
Parametri
- grid: Object, required
- options: Object, optional
- columnHeadersMap: Object, optional, Map<String,String>
- specifiedAttributesNameList: String[], required
Esempi
var gwClassName = 'gwClassName'; var queryParameter = {filters: [..]}; var columnHeadersMap = {'gw_attr_name': 'target_attribute_name'}; var specifiedAttributesNameList = ['attr_name_1', 'attr_name_2', 'attr_name_3']; var options = {columnHeadersMap: columnHeadersMap, specifiedAttributesNameList: specifiedAttributesNameList}; exportCSVSpecifiedAttributes(gwClassName, queryParameter, options);
exportCSVListSelectedSpecifiedAttributes()
(from 4.7.4) Funzione specifica per la gwClassList. Lavora con gli attributi specificati come parametro. Gli header delle colonne esportate possono essere rimappati.
Parametri
- grid: Object, required
- options: Object, optional
- columnHeadersMap: Object, optional, Map<String,String>
- specifiedAttributesNameList: String[], required
Esempi
var columnHeadersMap = {'gw_attr_name': 'target_attribute_name'}; var specifiedAttributesNameList = ['attr_name_1', 'attr_name_2', 'attr_name_3']; var options = {columnHeadersMap: columnHeadersMap, specifiedAttributesNameList: specifiedAttributesNameList}; exportCSVListSelectedSpecifiedAttributes(grid, options);
XLSX
IMPORT XLSX
EXPORT XLSX
L'esportazione in formato .xlsx è implementabile nelle seguenti modalità:
- definizione di una Report in formato .xlsx e relative modalità di fruizione. Si veda a tal proposito(Creazione di Report)
- definizione di una azione di export. Di seguito varie function di api utilizzabili.
standardListSelectedAllAttributeExportToExcel()
Esportazione Excel di TUTTI gli attributi della classe. Le intestazioni delle colonne sono le Etichette definite negli attributi.
standardListSelectedAllAttributeExportToExcel(queryParameter, grid);
standardListSelectedAllAttributeExportToExcel()
Vengono esportati gli attributi della classe che sono visibili in Lista. Le intestazioni delle colonne sono le Etichette definite negli attributi.
standardListSelectedExportToExcel(queryParameter, grid);
standardListSelectedGroupAttributeExportToExcel()
(from 4.4.4) Vengono esportati gli attributi di un gruppo attributo della classe. Le intestazioni delle colonne sono le Etichette definite negli attributi.
standardListSelectedGroupAttributeExportToExcel(queryParameter, grid, groupName);
standardListSelectedGroupAttributeExportToSimpleExcel()
(from 4.4.4) Vengono esportati gli attributi di un gruppo attributo della classe. Le intestazioni delle colonne sono i nomi degli attributi.
standardListSelectedGroupAttributeExportToSimpleExcel(queryParameter, grid, groupName);
standardPrefilterdListSelectedExportToExcel()
@Deprecated Vengono esportati tutti gli attributi della classe, ma le righe esportate tengono conto dei filtri operati attraverso il menù. Le intestazioni delle colonne sono le Etichette definite negli attributi.
standardPrefilterdListSelectedExportToExcel(queryParameter, grid);
standardListSelectedAllAttributeExportToSimpleExcel()
Esportazione Excel per AGGIORNAMENTO.
esporta un CSV da modificare a mano e reimportare
Vengono esportati tutti gli attributi della classe.
Le intestazioni delle colonne sono i nomi degli attributi.
Questa modalità di esportazione produce un file conforme al Template da utilizzare per l'importazione.
Il file va in ogni caso salvato in formato .csv.
Fare attenzione ai formati delle colonne, Excel potrebbe 'interpretare' i dati introducendo degli errori.
standardListSelectedAllAttributeExportToSimpleExcel(queryParameter, grid);
SHP
IMPORT SHP
importShape()
Parametri
- grid: Object, required
- options: Object, required. Può contenere i seguenti parametri:
tipologia | Nome | Required | Descrizione breve |
---|---|---|---|
Integer | importType | true | è un numero intero ed indica il tipo di importazione. Può assumere il valore 0 o 1 o 2 o 3 o 4 come descritto nella sezione dedicata |
function | callback | false | Permette di inserire la funzione di callback dopo l importazione |
String | childClassName | false | Nome della classe, qualora si volesse importare i dati in una tabelle di una classe collegata a questa tramite childlist. I record verrebbero gia caricati collegati al record padre dal quale viene lanciata l azione |
String | itemId | false | chiave del record da cui si sta lanciando l azione, data.itemDB.pk_column, qualora si volesse importare i dati in una tabelle di una classe collegata a questa tramite childlist. I record verrebbero già caricati collegati al record padre dal quale viene lanciata l azione |
String | relationName | false | nome della relazione sulla classe, qualora si volesse importare i dati in una tabelle di una classe collegata a questa tramite childlist. I record verrebbero già |
String | codColumn | false | Nome della o delle colonne per qualora si facesse un importazione tipo update. Le colonne se più di una dovrebbero essere separate da virgola |
Object | columnHeadersMap | false | HashMap per la mappatura dell header dello shape con quelle del database. Vanno inserite soltanto quelle dove il nome è diverso e le si voglia importare. La forma è la seguente {'nameColumnShp': 'nameColumnDatabase'} |
Object | additionalMap | false | HashMap contenente la lista delle colonne non presenti nel file che si voglia comunque popolare durante l inserimento. La forma è {'nameColumnDatabase': 'valore'}. Il valore può essere anche preso dinamicamente dalla sessione |
String | fileMapping | false | E' il nome del file di mapping se presente nei contenuti statici, deve risiedere nella cartellina SHAPE |
String | scriptName | false | Nome dello scripts groovy, senza estenzione che verrà lanciato al termine del caricamento. Lo script deve essere presente nella cartella dei contenuti statici sottocartella groovy |
Integer | handleErrorsType | false | Specifica il comportamento del sistema in presenza di un errore. Se 0,(default) il sistema va avanti segnalando alla fine i records non importati e l errore verificatosi, se 1 blocca l intera importazione se almeno un record non può essere importato |
Integer | idProcessImport | false | Se indicato non viene inserito un nuovo record nella tabella contenente l archivio storico delle importazioni bensì aggiorna il record con quel idProcess |
String | itemNotFoundAction | false | Permette di inserire la funzione di callback dopo l' importazione |
String | itemNotFoundUpdateField | false | Permette di inserire la funzione di callback dopo l' importazione |
String | itemNotFoundUpdateValue | false | Permette di inserire la funzione di callback dopo l' importazione |
Esempi
Importazione minimale dati SHAPE. Viene aperto un dialog per la selezione del file .shp.
Importazione per accodamento.
var importType = 0; //alloweb types: 0, 1, 2, 3, 4 importShape(grid, {importType: importType});
Importazione per Aggiornamento (TODO DECLINARE MEGLIO).
var callback = function(params){publishGwClassUpdate('gwd_infrastructure')}; importShape( grid, { importType: 2, fileMapping: '', codColumn: 'cod_building', callback: callback, columnHeadersMap:{ 'tipologia_ep':'type_ownership','id_pod':'id_building','descr_pod':'descr_building','status':'status_building','descr_anagr':'descr_site','commessa':'tenant_code','cod_anagr':'cod_site','pod_cod':'external_code','cod_bld':'cod_building','nome':'name_building','cod_mc':'cod_building_mc','entity':'id_entity_classification' }, additionalMap:{ 'type_ownership':'Infrastruttura','tenant_code':gwActiveScopesMap.Commessa.scopeValue } } );
Esempio generico di importazione dei record di una classe figlia dal dettaglio di un record della classe padre, legati da una childlist:
importShape( grid, { importType: importType, fileMapping: '', gwClassName: 'nome_classe_padre', childClassName: 'nome_classe_figlia', itemId: data.itemDB.nome_campo_chiave_classe_padre, relationName: 'nome_della_relazione', codColumn: 'nome_campo_chiave', callback: callback, columnHeadersMap: { 'nome_campo_nel_database1':'nome_campo_nello_shape1','nome_campo_nel_database2':'nome_campo_nello_shape2',etc… }, additionalMap: { 'campo_nello_shape': 'valore_fisso', 'campo_nello_shape': gwActiveScopesMap.NomeVarSessione.scopeValue } } );
Esempio pratico di importazione dei record di una classe figlia dal dettaglio di un record della classe padre, legati da una childlist:
var callback = function(params){publishGwClassUpdate('gwd_infrastructure')}; importShape( grid, { importType: 2, fileMapping:'', gwClassName:'gwd_site', childClassName:'gwd_infrastructure', itemId:data.itemDB.db_site, relationName: 'gwd_site’, //’gwd_infrastructure' codColumn: 'cod_building', callback: callback, columnHeadersMap:{ 'tipologia_ep':'type_ownership','id_pod':'id_building','descr_pod':'descr_building','status':'status_building','descr_anagr':'descr_site','commessa':'tenant_code','cod_anagr':'cod_site','pod_cod':'external_code','cod_bld':'cod_building','nome':'name_building','cod_mc':'cod_building_mc','entity':'id_entity_classification' }, additionalMap:{ 'type_ownership':'Infrastruttura','tenant_code':gwActiveScopesMap.Commessa.scopeValue } } );
Nota Esiste una tabella nello schema dei metadati denominata gw_process_import dove vengono scritti gli esiti dell'import. Verificare che nello schema dei dati sia presente tale tabelle, eventualmente va creata con la seguente istruzione:
CREATE TABLE gw_process_import ( id_process_import INTEGER NOT NULL, -- chiave primaria import_date TIMESTAMP WITHOUT TIME zone, -- data e ora di importazione gw_class CHARACTER VARYING(50), -- nome della classe su cui viene effettuata l'importazione error_file bytea, -- file di errore CONSTRAINT cos_gw_process_import_pk PRIMARY KEY (id_process_import) ) WITH (OIDS=FALSE);
EXPORT SHP
exportShape()
Esportazione SHAPE di tutti gli attributi codificati
Parametri
- queryParameter: Object, required
- grid: Object, required
- options: Object, optional. Può contenere i seguenti parametri:
tipologia | Nome | required | Descrizione breve |
---|---|---|---|
Integer | exportType | true | E' un numero intero ed indica il tipo di esportazione. Valori ammessi: 1 (per aggiornamento), 2 (tutti gli attributi) |
function | callback | false | Permette di inserire la funzione di callback dopo l importazione |
String | codColumn | false | Nome della o delle colonne per qualora si facesse un importazione tipo update. Le colonne se più di una dovrebbero essere separate da virgola |
Object | columnHeadersMap | false | HashMap per la mappatura dell header dello shape con quelle del database. Vanno inserite soltanto quelle dove il nome è diverso e le si voglia importare. La forma è la seguente: {'nameColumnShp': 'nameColumnDatabase'} |
Object | additionalMap | false | HashMap contenente la lista delle colonne non presenti nel file che si voglia comunque popolare durante l inserimento. la forma è {'nameColumnDatabase': 'valore'}, il valore può essere anche preso dinamicamente dalla sessione |
String | fileMapping | false | E' il nome del file di mapping se presente nei contenuti statici, deve risiedere nella cartellina SHAPE |
Esempi
Esportazione SHAPE di tutti gli attributi codificati
exportShape(queryParameter, grid, {exportType: 2});
Esportazione SHAPE per AGGIORNAMENTO (la decodifica segue le regole indicate su ciascun attributo)
exportShape(queryParameter, grid, {exportType: 1});
Esportazione SHAPE per AGGIORNAMENTO (la decodifica segue le regole indicate su ciascun attributo)
var callback = function(params){publishGwClassUpdate('gwd_infrastructure')}; exportShape( queryParameter, grid, { exportType: 1, fileMapping: '', codColumn:'cod_building', callback:callback, columnHeadersMap:{ 'type_ownership':'tipologia_ep','id_building':'id_pod','descr_building':'descr_pod','status_building':'status','descr_site':'des_anag','tenant_code':'commessa','cod_site':'cod_anagr','external_code':'pod_cod','cod_building':'cod_bld','name_building':'nome','cod_building_mc':'cod_mc','id_entity_classification':'entity' }, additionalMap:{ 'type_ownership':'Infrastruttura','tenant_code':gwActiveScopesMap.Commessa.scopeValue } } );
Configurazioni Comuni
Tipologie di import
Dove applicabili, sono disponibili 5 tipologie di importazione:
- importType=0 effettua l'accodamento dei record
Esempio: importCSV({gwClassName:'pv_punti_vendita'},{importType: 0});
- importType=1 effettua la sostituzione (delete e insert) dei record sulla base del valore del campo CAMPO_CODICE. (verranno cancellati solo i record del database che possiedono il campo codice uguale a quello dei record presenti nel file importato)
Esempio: importCSV({gwClassName:'pv_punti_vendita'},{importType: 1, codColumn:'cod_punti_vendita'});
- importType=2 effettua l'aggiornamento (update) dei record sulla base del valore del campo CAMPO_CODICE. i campi che vengono aggiornati sono TUTTI i campi presenti nel file di importazione, quindi se si vuole aggiornare, ad esempio, solo un campo, occorre includere solo una colonna intestata a quel campo.\\Se il record non viene trovato, effettua l'accodamento.
Esempio: importCSV({gwClassName:'pv_punti_vendita'},{importType: 2, codColumn:'cod_punti_vendita'});
- importType=3 cancella tutti i record della classe e effettua l'accodamento dei record
Esempio: importCSV({gwClassName:'pv_punti_vendita'},{importType: 3});
- importType=4 cancella tutti i record della classe relativamente all'ambito corrente ed effettua l'accodamento il CSV
Esempio: importCSV({gwClassName:'pv_punti_vendita'},{importType: 4});
Tipo | Operazione |
---|---|
0 | Accodamento |
1 | Sostituzione |
2 | Aggiornamento |
3 | Svuotamento della tabella e Accodamento |
4 | Svuotamento per ambito e Accodamento |
Qualora si scelga la tipologia 1 o 2 è obbligatorio il secondo parametro codColumn.
codColumn deve essere il nome del campo nella tabella o nel file che identifica in maniera univoca un record; Non è necessario che sia la chiave ma è necessario sia un codice univoco. Questo campo viene utilizzato per ricercare in tabella il record che si sta tentando di importare. Se presente, nel caso 2 viene aggiornato con i nuovi dati, nel caso 1 viene cancellato e reinserito completamente con i dati del record nel file.
Le logiche sono del
Mappatura dei campi
Per importare o esportare i dati dalla tabella al file, è necessaria la corrispondenza tra i campi in tabella e gli header del file affinché i dati di ciascun record finiscano nel campo corrispondete.
Se i nomi delle colonne (field della tabella sul db) coincidono con quelli del file questa mappatura non è necessaria.
Purtroppo non sempre questo è vero, sopratutto nel caso dello shape dove i nomi delle intestazioni delle colonne hanno un massimo di 10 caratteri.
In questo caso è d'obbligo definire la mappatura dei campi, cioè la relazione che intercorre tra i campi del file il cui nome differisce dai nome dei campi in tabella.
La mappatura può avvenire in 3 modalità (ma non tutte le tipologie di importazione/esportazione la supportano), ognuna mutualmente esclusiva con le altre.
Matrice di supporto.
Tipo Mappatura | Come si configura | Import. Shp | Import. Csv | Esport. Shp | Esport. Csv |
---|---|---|---|---|---|
HashMap | parametro columnHeadersMap | Si | Si | Si | No |
fileMapping Contenuti Statici | parametro fileMapping | Si | No | Si | No |
fileMapping dinamico | Richiesto input | Si | No | Si | No |
- HashMap Si passa un parametro denominata 'columnHeadersMap' variabile hashmap contenente una lista di chiave\valore dove in fase di esportazione la chiave è il campo nel database e valore il campo nel file e viceversa in fase di importazione.
columnHeadersMap:{ ‘nome_campo_nel_database1’:'nome_campo_nel_file1',‘nome_campo_nel_database2’:'nome_campo_nel_file2',etc…} columnHeadersMap:{ ‘nome_campo_nel_file1’:'nome_campo_nel_database1',‘nome_campo_nel_file2’:'nome_campo_nel_database2',etc…}
- file xml presente nei contenuti statici Si passa un parametro denominata 'fileMapping' contenente il nome (senza estensione) del file presente nei contenuti statici che conterrà la definizione della Mappatura. Il file dovrà risiedere nella cartellina SHAPE dei contenuti statici ed avere questa struttura
<?xml version="1.0"?> <attributes> <truncate>true</truncate> <attribute><nameFieldShape>NOME_CAMPO_SHAPE1</nameFieldShape> <nameFieldDatabase>NOME_CAMPO_NEL_DATABASE1</nameFieldDatabase> <defaultValue></defaultValue> </attribute> <attribute> <nameFieldShape>NOME_CAMPO_SHAPE2</nameFieldShape> <nameFieldDatabase>NOME_CAMPO_NEL_DATABASE2</nameFieldDatabase> <defaultValue></defaultValue> </attribute> </attributes>
- file xml passato in fase di importazione/esportazione Nessun parametro aggiuntivo, in fase di importazione\esportazione si dovrà passare dinamicamente volta per volta un file xml con la stessa struttura indicata sopra. In caso di importazione shape questo file dovrà essere passato nello zip dello shape da importare e potrà avere qualsiasi nome. In caso di esportazione Shape il file dovrà essere passato all'interno della form html della maschera che viene aperta all'utente allo voce file di mapping. Tale voce sarà seguita dal pulsante per la scelta del file nel file system. Questo campo della form non è obbligatorio.
fileMapping: ''
Priorità di valutazione:
- file di mapping
- contenuti statici
- columnHeadersMap
Campi aggiuntivi nei dati
Ove previsto, in fase di import/export è possibile passare nei dati in transito dal file alla tabella o viceversa, delle informazioni non presenti nella fonte dati di partenza. Praticamente è possibile aggiungere delle colonne in più rispetto alla fonte dati di partenza. Questo è possibile aggiungendo il parametro 'additionalMap' con le colonne da aggiungere e il valore con il quale verranno popolate. In queste colonne, tutti i records assumeranno lo stesso valore. I valori possono essere indicati o come valori fissi oppure con dei valori provenienti da variabili in sessione. GeoWeb infatti, mette a disposizione delle variabile in sessione contenenti, i valori dell'ambito del progetto aperto, il nome dell'utente che si è loggato, il nome del gruppo di appartenza dell'utente etc….
La sintassi da utilizzare è la seguente:
additionalMap: { 'nome_campo': 'valore_fisso', 'nome_campo': gwActiveScopesMap.NomeVarSessione.scopeValue }
Decodifica dei campi
Parlando dei veri e propri dati caricati o esportati, può accadere che alcuni valori, siano delle codifiche di descrizioni più dettagliate.
GeoWeb, attraverso la configurazione di widget dedicati (come dbcombobox, exsternaltable etc..) va a recuperare la descrizione presente in un tabella esterna presentando all'utente un dato intellegibile nel dettaglio o nella lista di classe.
Quando si esporta o si importa è opportuno indicare cosa stiamo passando in questi campi in fase di importazione o cosa vogliamo in questi campi in fase di esportazione.
Ovvero dobbiamo indicare se si sta lavorando con il codice o con la descrizione.
Alcune volte potrebbe essere comodo passare la descrizione altre il codice.
Questa configurazione è specificata all'interno del file XML di ciascun widget, dove si può specificare se stiamo importando o esportando valori codificati o decodificati.
Il tag di riferiemnto dell'xmld el widget è importCSVWithoutDecoding, che può assumere i seguenti valori:
- true inserimento diretto del codice
- false inserimento della descrizione da decodificare
Nota: a dispetto del nome il flag viene valutato anche durante l'esportazione
<DBWindowList> <width>250</width> <height>18</height> <maxLength>255</maxLength> <required>true</required> <readonly>false</readonly> <disabled>false</disabled> <isDefaultOrderBy>true</isDefaultOrderBy> <isDefaultOrderByAscending>true</isDefaultOrderByAscending> <isDefaultOrderByOnFieldToShow>true</isDefaultOrderByOnFieldToShow> <listCellTextAlign></listCellTextAlign> <listCellStyleRules></listCellStyleRules> <listCellClass></listCellClass> <listCellHeaderStyleRules></listCellHeaderStyleRules> <importCSVWithoutDecoding>false</importCSVWithoutDecoding> <strQuery>select pk_tab_tipo_cavo,codice_materiale,description,numero_fibre from rete_fibra_ottica.tab_tipo_cavo</strQuery> <queryClausole></queryClausole> <fieldToShow>description</fieldToShow> <fieldToStore>pk_tab_tipo_cavo</fieldToStore> <initSelValue></initSelValue> <columnsLabel>Codice,Materiale,Descrizione,Numero Fibre</columnsLabel> <columnsView>pk_tab_tipo_cavo,codice_materiale,description,numero_fibre</columnsView> <columnsType></columnsType> <allowMultipleSelection>false</allowMultipleSelection> <multipleSelectionSeparator>,</multipleSelectionSeparator> </DBWindowList>
<ComboBox> <width>250</width> <height>18</height> <maxLength>255</maxLength> <defaultValue></defaultValue> <required>false</required> <readonly>false</readonly> <disabled>false</disabled> <isDefaultOrderBy>true</isDefaultOrderBy> <isDefaultOrderByAscending>true</isDefaultOrderByAscending> <isDefaultOrderByOnFieldToShow>true</isDefaultOrderByOnFieldToShow> <listCellTextAlign></listCellTextAlign> <listCellStyleRules></listCellStyleRules> <listCellClass></listCellClass> <listCellHeaderStyleRules></listCellHeaderStyleRules> <importCSVWithoutDecoding>false</importCSVWithoutDecoding> <values> <string>DPR 462/01</string> </values> <keys> <string>DPR 462/01</string> </keys> <initSelValue></initSelValue> </ComboBox>
Classi classificate: Attributi Variabili
Un altro concetto molto importante ma che non comporta configurazione particolari per l'utente, è il concetto di classificazione e di attributi variabili. L’importazione e l’esportazione Shape, trattano classi classificate. Se si esporta o si importa una classe classificata il software si preoccupa di portarsi dietro tutti gli attributi variabili. Tutto questo viene gestito dal software in maniera del tutto trasparente all'utente. Attenzione però, qualora si verificano problemi, potrebbe essere uno tra le cause da verificare con attenzione. Gli attributi variabili vengono esportati qualora si lanci l'esportazione da una lista classificata, in caso contrario vengono riportati solo gli attributi comuni a tutte le famiglie. Per ciascun record verrà comunque riportata la famiglia di appartenenza. Deve essere definito l'attributo id_entity_classification come widget classification per la classe e deve essere configurato con importCSVWithoutDecoding impostato a false come segue:
<Classification> <width>-1</width> <height>50</height> <listWidth>100</listWidth> <required>false</required> <readonly>false</readonly> <disabled>false</disabled> <hideRelations>false</hideRelations> <intermediateChanges>false</intermediateChanges> <isDefaultOrderBy>true</isDefaultOrderBy> <isDefaultOrderByAscending>true</isDefaultOrderByAscending> <isDefaultOrderByOnFieldToShow>true</isDefaultOrderByOnFieldToShow> <listCellTextAlign></listCellTextAlign> <listCellStyleRules></listCellStyleRules> <listCellClass></listCellClass> <listCellHeaderStyleRules></listCellHeaderStyleRules> <importCSVWithoutDecoding>false</importCSVWithoutDecoding> <classReference>gwd_item</classReference> <mapPath></mapPath> </Classification>
Il software si preoccupa di mettere come valore nel campo id_entity_classification il codice della famiglia, e gestirlo correttamente tra importazione ed esportazione.
Importazione dal Padre
Fino a questo momento abbiamo trattato azioni di importazione/esportazione a partire dalla lista di una specifica classe geoweb. Quindi azioni:
- selezionati in lista
- selezionati in lista (posto nella Toolbar)
E' disponibile anche un sistema per importare dati a partire dal dettaglio di classe, con azioni:
- dettaglio
- dettaglio (posto nella Toolbar)
In altre parole è possibile caricare dati (un numero indefinito di records) di una classe figlia (cioè logicamente e gerarchicamente dipendenti da un record della classe padre, collegati ad essa tramite una relazione N:1 (n figli per un padre)), dal dettaglio di una classe padre.
Precondizione: tra la classe padre e la classe figlia deve essere definita una relazione 1:N nel webadmin, ovvero un collegamento tra due campi delle due tabelle. Si veda a tale proposito la sezione relazioni.
In fase di importazione il campo della tabella della classe figlia che rappresenta il collegamento con la classe padre viene popolato in automatico con il valore della colonna della classe padre del record in cui ci troviamo.
Questo permette di agganciare dinamicamente in fase di importazione già i records alla maschera voluta.
Esempi
var callback = function(params){publishGwClassUpdate(‘nome_classe’);}; importShape( grid, { importType: tipo_importazione, fileMapping:'', gwClassName:'nome_classe_padre', childClassName:'nome_classe_figlia', itemId:data.itemDB.nome_campo_chiave_classe_padre, relationName:nome_della_relazione', codColumn:'nome_campo_chiave', callback: callback, columnHeadersMap:{‘nome_campo_nel_database1’:' nome_campo_nello_shape1’ ', ‘nome_campo_nel_database2’:' nome_campo_nello_shape2',etc…}, additionalMap: {'campo_nello_shape':'valore_fisso','campo_nello_shape':gwActiveScopesMap.NomeVarSessione.scopeValue} } );
Le tipologie di importazione, il mappaggio dei campi e quant'altro seguono le stesse regole dell'importazione spiegate fino a questo momento.
Shape: gestione dei dati Geometrici
L'importazione/esportazione shape a differenza del csv, puo' essere definita ed utilizzata solamente su classi di tipo Geometrico quindi che riferiscano una tabella con una colonna geometrica. La classe deve essere dichiarata geometrico, e aver definita la sua geomColumn come attributo. Si rimanda alla definizione di classe a questo link. Classi Si puo' definire l'importazione/Esportazione shape anche se la classe non è dichiarata geometrica ma è necessario aver definito almeno l'attributo di tipo (POINT/POLYGON/LINESTRING) sulla colonna geometrica. Se vengono a mancare una di queste due, l’importazione o l’esportazione shape non puo’ essere effettuata e se configurata va in errore.
Bisogna far molta attenzione alla configurazione dell'attributo geometrico ma non solo. Durante l'importazione il dato spaziale segue una serie di regole del framework relative al sistema di coordinate che è opportuno sapere e conoscere.
Il sistema di coordinate puo' essere dichiarato in 4 punti:
- shape
- database
- mappa maestro
- fonte dati maestro
- attributo geometrico
Allora, per quanto riguarda lo shape esso può avere qualsiasi sistema di coordinate anche nullo. Per quanto riguarda la configurazione da Maestro, di norma non deve essere specificato il sistema di coordinate sulla fonte dati, ma soltanto sulla mappa. A livello di strumenti di amministrazione di Geoweb invece deve essere specificato il sistema di coordinate sulla mappa che deve coincidere con quello inserito nella Mappa nella configurazione di Maestro.
Sempre a livello di Geoweb deve essere definito il sistema di coordinate su ciascun attributo geometrico di ciascuna classe geometrica e deve coincidere con il sistema di coordinate del database.
<Point> <width>250</width> <listWidth>80</listWidth> <required>false</required> <readonly>false</readonly> <isDefaultOrderBy>true</isDefaultOrderBy> <isDefaultOrderByAscending>true</isDefaultOrderByAscending> <isDefaultOrderByOnFieldToShow>true</isDefaultOrderByOnFieldToShow> <listCellTextAlign></listCellTextAlign> <listCellStyleRules></listCellStyleRules> <listCellClass></listCellClass> <listCellHeaderStyleRules></listCellHeaderStyleRules> <type>point</type> <drawing>false</drawing> <drawingType></drawingType> <coordinateSystem>4326</coordinateSystem> <startingScale>1000.0</startingScale> </Point>
Geoweb infatti può lavorare con un sistema di coordinate differente tra quello definito per il database e quello definito per la mappa, l’importante è settare correttamente il sistema di coordinate nella configurazione del geoweb dagli strumenti di amministrazione e in Maestro. Allora per quanto riguarda l’esportazione, viene restituito un file shape con lo stesso sistema di coordinate del database e quindi quello della tabella esportata. Per quanto riguarda l’importazione invece vengono seguite le seguenti regole. Se il file shape da importare ha un suo sistema di coordinate definito, allora l’importazione esegue una trasformazione della geometria da quel sistema di coordinate a quello del database ovvero al sistema di coordinate definito per l ‘attributo geometrico. Se lo shape non ha definito il suo sistema di coordinate si dà per scontato che la geometria presente nello shape è nel sistema di coordinate standard generico 2_d. Se il sistema di coordinate di partenza è differente da quello di arrivo viene effettuata la trasformazione altrimenti si riporta la geometria così come è nello shape. Se non è definito il sistema di coordinate per l’attributo geometrico quindi il sistema di coordinate della destinazione viene fissato quello standard 2_D. In fase di esportazione, vengono esportati soltanto i records la cui geometria non è nulla, gli altri vengono ignorati senza dare l’errore. In fase di importazione, non ci sono problemi perché hanno tutti la geometria.
Definizione del sistema di coordinate nella mappa di Geoweb:
Definizione del sistema di coordinate nella mappa di Maestro:
Wizard Export gwClassList
(dalla versione 4.7.4)
necessario plugin gw-csv-connector version 2.0.2
E' disponibile una api js per avviare un mini wizard di esportazione da tutte le gwClassList. Basterà implementare una gwAction 'Selezionati in Lista'/'Selezionati in Lista (posta nella toolbar)', che utilizzi l'api js openExportWizardFromGwClassList().
All'esecuzione dell'azione verrà aperto un piccolo floatingPane, che permette il download diretto nei formati .csv/.xlsx. Per il solo formato .xlsx verrà presentata un'anteprima in floatingPane (c'è un checkBox per escludere questo comportamento ed andare al download diretto).
Dalla preview .xlsx è disponibile il download.
openExportWizardFromGwClassList()
Parametri
- grid: Object, required
- options: Object, optional, per ospitare gli stessi parametri delle option della api js exportCSVListSelectedAllAttributes() (usata internamente) e/o per ospitare i parametri generici del floatingPane
Esempio
var options = {}; openExportWizardFromGwClassList(grid, options);