IDEMPIERE-5567 Support of UUID as Key (FHCA-4195) + IDEMPIERE-6143 (#2367)
- fix export and import for UUID based tables - fix ExportAction creating temporary files with the wrong extension - fix export and import of multi-selection fields IDEMPIERE-6143
This commit is contained in:
parent
a3fb6f5b9c
commit
2aa7215e2c
|
|
@ -107,6 +107,8 @@ public class GridTabCSVExporter implements IGridTabExporter
|
|||
continue;
|
||||
} else if (! (field.isDisplayed() || field.isDisplayedGrid())) {
|
||||
continue;
|
||||
} else if (DisplayType.Binary == field.getDisplayType()) {
|
||||
continue;
|
||||
}
|
||||
String headName = resolveColumnName(table, column);
|
||||
headArray.add(headName);
|
||||
|
|
@ -438,15 +440,16 @@ public class GridTabCSVExporter implements IGridTabExporter
|
|||
String ref = (String) idO;
|
||||
value = MRefList.getListName(Env.getCtx(), column.getAD_Reference_Value_ID(), ref);
|
||||
} else {
|
||||
int id = (Integer) idO;
|
||||
MTable forTab = MTable.get(Env.getCtx(), foreignTable);
|
||||
String foreignKeyCol = forTab.getKeyColumns()[0];
|
||||
int start = headName.indexOf("[")+1;
|
||||
int end = headName.length()-1;
|
||||
String foreignColumn = headName.substring(start, end);
|
||||
StringBuilder select = new StringBuilder("SELECT ")
|
||||
.append(foreignColumn).append(" FROM ")
|
||||
.append(foreignTable).append(" WHERE ")
|
||||
.append(foreignTable).append("_ID=?");
|
||||
value = DB.getSQLValueStringEx(null, select.toString(), id);
|
||||
.append(foreignKeyCol).append("=?");
|
||||
value = DB.getSQLValueStringEx(null, select.toString(), idO);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
@ -478,7 +481,7 @@ public class GridTabCSVExporter implements IGridTabExporter
|
|||
*/
|
||||
private String resolveColumnName(MTable table, MColumn column) {
|
||||
StringBuilder name = new StringBuilder(column.getColumnName());
|
||||
if (DisplayType.isLookup(column.getAD_Reference_ID())) {
|
||||
if (DisplayType.isLookup(column.getAD_Reference_ID()) && !DisplayType.isMultiID(column.getAD_Reference_ID())) {
|
||||
// resolve to identifier - search for value first, if not search for name - if not use the ID
|
||||
String foreignTable = column.getReferenceTableName();
|
||||
if ("AD_EntityType".equals(foreignTable) && I_AD_EntityType.COLUMNNAME_AD_EntityType_ID.equals(column.getColumnName())){
|
||||
|
|
@ -579,7 +582,8 @@ public class GridTabCSVExporter implements IGridTabExporter
|
|||
|| gridField.isEncryptedColumn()
|
||||
|| !(gridField.isDisplayed() || gridField.isDisplayedGrid())
|
||||
|| gridField.isReadOnly()
|
||||
|| (DisplayType.Button == MColumn.get(Env.getCtx(),gridField.getAD_Column_ID()).getAD_Reference_ID())
|
||||
|| DisplayType.Button == gridField.getDisplayType()
|
||||
|| DisplayType.Binary == gridField.getDisplayType()
|
||||
)
|
||||
continue;
|
||||
|
||||
|
|
@ -598,7 +602,8 @@ public class GridTabCSVExporter implements IGridTabExporter
|
|||
{
|
||||
if ("AD_Client_ID".equals(field.getColumnName()))
|
||||
continue;
|
||||
if (DisplayType.Button == MColumn.get(Env.getCtx(),field.getAD_Column_ID()).getAD_Reference_ID())
|
||||
if ( DisplayType.Button == field.getDisplayType()
|
||||
|| DisplayType.Binary == field.getDisplayType())
|
||||
continue;
|
||||
if ( field.isVirtualColumn()
|
||||
|| field.isEncrypted()
|
||||
|
|
|
|||
|
|
@ -1022,17 +1022,16 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
|
||||
if (isForeing && value != null && !"(null)".equals(value)){
|
||||
String foreignTable = column.getReferenceTableName();
|
||||
String idS = null;
|
||||
int id = -1;
|
||||
Object idS = null;
|
||||
if("AD_Ref_List".equals(foreignTable))
|
||||
idS= resolveForeignList(column,foreignColumn,value,null);
|
||||
idS = resolveForeignList(column,foreignColumn,value,null);
|
||||
else
|
||||
id = resolveForeign(foreignTable,foreignColumn,value,field,null);
|
||||
idS = resolveForeign(foreignTable,foreignColumn,value,field,null);
|
||||
|
||||
if(idS == null && id < 0){
|
||||
if(idS == null){
|
||||
//it could be that record still doesn't exist if import mode is inserting or merging
|
||||
if(isUpdateMode())
|
||||
return new StringBuilder(Msg.getMsg(Env.getCtx(),id==-2?"ForeignMultipleResolved":"ForeignNotResolved",new Object[]{header.get(i),value}));
|
||||
return new StringBuilder(Msg.getMsg(Env.getCtx(),(idS instanceof Integer && (int)idS==-2)?"ForeignMultipleResolved":"ForeignNotResolved",new Object[]{header.get(i),value}));
|
||||
}
|
||||
} else {
|
||||
// TODO: we could validate length of string or min/max
|
||||
|
|
@ -1095,9 +1094,9 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
|
||||
if(isForeing && !"(null)".equals(value)){
|
||||
String foreignTable = columnName.substring(0,columnName.length()-3);
|
||||
int id = resolveForeign(foreignTable,foreignColumn,value,field,null);
|
||||
if (id < 0)
|
||||
return new StringBuilder(Msg.getMsg(Env.getCtx(), id==-2?"ForeignMultipleResolved":"ForeignNotResolved" ,new Object[]{header.get(j),value}));
|
||||
Object id = resolveForeign(foreignTable,foreignColumn,value,field,null);
|
||||
if (id == null || (id instanceof Integer && (int)id < 0))
|
||||
return new StringBuilder(Msg.getMsg(Env.getCtx(),(id instanceof Integer && (int)id==-2)?"ForeignMultipleResolved":"ForeignNotResolved" ,new Object[]{header.get(j),value}));
|
||||
}
|
||||
isEmptyRow=false;
|
||||
}
|
||||
|
|
@ -1205,19 +1204,18 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
}else if (masterRecord==null && isDetail){
|
||||
MColumn column = MColumn.get(Env.getCtx(),field.getAD_Column_ID());
|
||||
String foreignTable = column.getReferenceTableName();
|
||||
String idS = null;
|
||||
int id = -1;
|
||||
Object idS = null;
|
||||
|
||||
if ("AD_Ref_List".equals(foreignTable))
|
||||
idS= resolveForeignList(column, foreignColumn, value,trx);
|
||||
idS = resolveForeignList(column, foreignColumn, value,trx);
|
||||
else
|
||||
id = resolveForeign(foreignTable,foreignColumn,value, field, trx);
|
||||
idS = resolveForeign(foreignTable,foreignColumn,value, field, trx);
|
||||
|
||||
if(idS == null && id < 0)
|
||||
return Msg.getMsg(Env.getCtx(),id==-2?"ForeignMultipleResolved":"ForeignNotResolved",new Object[]{header.get(i),value});
|
||||
if (idS == null || (idS instanceof Integer && (int)idS < 0))
|
||||
return Msg.getMsg(Env.getCtx(),(idS instanceof Integer && (int)idS==-2)?"ForeignMultipleResolved":"ForeignNotResolved",new Object[]{header.get(i),value});
|
||||
|
||||
if(id >= 0)
|
||||
logMsg = gridTab.setValue(field,id);
|
||||
if (idS instanceof Integer && (int)idS >= 0)
|
||||
logMsg = gridTab.setValue(field,idS);
|
||||
else if (idS != null)
|
||||
logMsg = gridTab.setValue(field,idS);
|
||||
|
||||
|
|
@ -1251,14 +1249,14 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
isThereRow =true;
|
||||
} else {
|
||||
|
||||
int id = resolveForeign(foreignTable, foreignColumn, value,field,trx);
|
||||
if(id < 0)
|
||||
return Msg.getMsg(Env.getCtx(),id==-2?"ForeignMultipleResolved":"ForeignNotResolved",new Object[]{header.get(i),value});
|
||||
Object id = resolveForeign(foreignTable, foreignColumn, value,field,trx);
|
||||
if (id == null || (id instanceof Integer && (int)id < 0))
|
||||
return Msg.getMsg(Env.getCtx(),(id instanceof Integer && (int)id==-2)?"ForeignMultipleResolved":"ForeignNotResolved",new Object[]{header.get(i),value});
|
||||
|
||||
setValue = id;
|
||||
if (field.isParentValue()) {
|
||||
int actualId = (Integer) field.getValue();
|
||||
if (actualId != id) {
|
||||
Object actualId = field.getValue();
|
||||
if (actualId != null && ! actualId.equals(id)) {
|
||||
logMsg = Msg.getMsg(Env.getCtx(), "ParentCannotChange",new Object[]{header.get(i)});
|
||||
break;
|
||||
}
|
||||
|
|
@ -1380,9 +1378,9 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
|
||||
setValue = idS;
|
||||
} else {
|
||||
int id = resolveForeign(foreignTable, foreignColumn, setValue, field, trx);
|
||||
if (id < 0)
|
||||
return Msg.getMsg(Env.getCtx(),id==-2?"ForeignMultipleResolved":"ForeignNotResolved",new Object[]{columnName,setValue});
|
||||
Object id = resolveForeign(foreignTable, foreignColumn, setValue, field, trx);
|
||||
if (id == null || (id instanceof Integer && (int)id < 0))
|
||||
return Msg.getMsg(Env.getCtx(),(id instanceof Integer && (int)id==-2)?"ForeignMultipleResolved":"ForeignNotResolved",new Object[]{columnName,setValue});
|
||||
|
||||
setValue = id;
|
||||
}
|
||||
|
|
@ -1478,7 +1476,7 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
String idS = resolveForeignList(column, foreignColumn, tmpValue,trx);
|
||||
setValue = idS;
|
||||
}else {
|
||||
int id = resolveForeign(foreignTable, foreignColumn, tmpValue,field,trx);
|
||||
Object id = resolveForeign(foreignTable, foreignColumn, tmpValue,field,trx);
|
||||
setValue = id;
|
||||
}
|
||||
}else{
|
||||
|
|
@ -1519,8 +1517,7 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
String idS = resolveForeignList(column,foreignColumn,value,trx);
|
||||
value = idS;
|
||||
}else {
|
||||
int id = resolveForeign(foreignTable,foreignColumn,value,field,trx);
|
||||
value = id;
|
||||
value = resolveForeign(foreignTable,foreignColumn,value,field,trx);
|
||||
}
|
||||
}
|
||||
}else{ //mandatory key not found
|
||||
|
|
@ -1587,7 +1584,7 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
* @param trx
|
||||
* @return -3 for not found, -2 for more than 1 match and > 0 for foreign id
|
||||
*/
|
||||
private int resolveForeign(String foreignTable, String foreignColumn, Object value, GridField field, Trx trx) {
|
||||
private Object resolveForeign(String foreignTable, String foreignColumn, Object value, GridField field, Trx trx) {
|
||||
boolean systemAccess = false;
|
||||
if (!"AD_Client".equals(foreignTable)) {
|
||||
MTable ft = MTable.get(Env.getCtx(), foreignTable);
|
||||
|
|
@ -1632,9 +1629,13 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
}
|
||||
}
|
||||
StringBuilder selectCount = new StringBuilder("SELECT COUNT(*)").append(postSelect);
|
||||
StringBuilder selectId = new StringBuilder("SELECT ").append(foreignTable).append("_ID").append(postSelect);
|
||||
MTable forTab = MTable.get(Env.getCtx(), foreignTable);
|
||||
StringBuilder selectId = new StringBuilder("SELECT ").append(forTab.getKeyColumns()[0]).append(postSelect);
|
||||
int count = DB.getSQLValueEx(trxName, selectCount.toString(), value, thisClientId);
|
||||
if (count == 1) { // single value found, OK
|
||||
if (forTab.isUUIDKeyTable())
|
||||
return DB.getSQLValueStringEx(trxName, selectId.toString(), value, thisClientId);
|
||||
else
|
||||
return DB.getSQLValueEx(trxName, selectId.toString(), value, thisClientId);
|
||||
} else if (count > 1) { // multiple values found, error ForeignMultipleResolved
|
||||
return -2;
|
||||
|
|
@ -1643,6 +1644,9 @@ public class GridTabCSVImporter implements IGridTabImporter
|
|||
// not found in client, try with System
|
||||
count = DB.getSQLValueEx(trxName, selectCount.toString(), value, 0 /* System */);
|
||||
if (count == 1) { // single value found, OK
|
||||
if (forTab.isUUIDKeyTable())
|
||||
return DB.getSQLValueStringEx(trxName, selectId.toString(), value, 0 /* System */);
|
||||
else
|
||||
return DB.getSQLValueEx(trxName, selectId.toString(), value, 0 /* System */);
|
||||
} else if (count > 1) { // multiple values found, error ForeignMultipleResolved
|
||||
return -2;
|
||||
|
|
|
|||
|
|
@ -15,12 +15,12 @@ package org.adempiere.webui.panel.action;
|
|||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import org.adempiere.base.IGridTabExporter;
|
||||
import org.adempiere.base.equinox.EquinoxExtensionLocator;
|
||||
|
|
@ -99,8 +99,8 @@ public class ExportAction implements EventListener<Event>
|
|||
*/
|
||||
public void export()
|
||||
{
|
||||
exporterMap = new HashMap<String, IGridTabExporter>();
|
||||
extensionMap = new HashMap<String, String>();
|
||||
exporterMap = new TreeMap<String, IGridTabExporter>();
|
||||
extensionMap = new TreeMap<String, String>();
|
||||
List<IGridTabExporter> exporterList = EquinoxExtensionLocator.instance().list(IGridTabExporter.class).getExtensions();
|
||||
MRole role = MRole.getDefault();
|
||||
for(IGridTabExporter exporter : exporterList)
|
||||
|
|
@ -130,11 +130,8 @@ public class ExportAction implements EventListener<Event>
|
|||
cboType.setMold("select");
|
||||
|
||||
cboType.getItems().clear();
|
||||
List<String> keys = new ArrayList<>(extensionMap.keySet());
|
||||
Collections.sort(keys);
|
||||
for(String key : keys)
|
||||
{
|
||||
cboType.appendItem(key, key);
|
||||
for (Entry<String, String> extension : extensionMap.entrySet()) {
|
||||
cboType.appendItem(extension.getKey(), extension.getValue());
|
||||
}
|
||||
|
||||
cboType.setSelectedIndex(0);
|
||||
|
|
@ -352,12 +349,12 @@ public class ExportAction implements EventListener<Event>
|
|||
*/
|
||||
protected IGridTabExporter getExporter() {
|
||||
ListItem li = cboType.getSelectedItem();
|
||||
if(li == null || li.getValue() == null)
|
||||
if(li == null || li.getLabel() == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
String ext = li.getValue().toString();
|
||||
String ext = li.getLabel().toString();
|
||||
IGridTabExporter exporter = exporterMap.get(ext);
|
||||
return exporter;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue