diff --git a/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVExporter.java b/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVExporter.java index 87a874a8aa..ea5d7c4a70 100644 --- a/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVExporter.java +++ b/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVExporter.java @@ -106,6 +106,8 @@ public class GridTabCSVExporter implements IGridTabExporter specialHDispayType = DisplayType.Location; continue; } else if (! (field.isDisplayed() || field.isDisplayedGrid())) { + continue; + } else if (DisplayType.Binary == field.getDisplayType()) { continue; } String headName = resolveColumnName(table, column); @@ -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() diff --git a/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVImporter.java b/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVImporter.java index df5cd9deac..2b4e28bddc 100644 --- a/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVImporter.java +++ b/org.adempiere.base/src/org/adempiere/impexp/GridTabCSVImporter.java @@ -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,10 +1629,14 @@ 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 - return DB.getSQLValueEx(trxName, selectId.toString(), value, thisClientId); + 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; } else if (count == 0) { // no values found, error ForeignNotResolved @@ -1643,7 +1644,10 @@ 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 - return DB.getSQLValueEx(trxName, selectId.toString(), value, 0 /* System */); + 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; } diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/ExportAction.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/ExportAction.java index 4c0e9865dc..0842d581e2 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/ExportAction.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/ExportAction.java @@ -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 */ public void export() { - exporterMap = new HashMap(); - extensionMap = new HashMap(); + exporterMap = new TreeMap(); + extensionMap = new TreeMap(); List exporterList = EquinoxExtensionLocator.instance().list(IGridTabExporter.class).getExtensions(); MRole role = MRole.getDefault(); for(IGridTabExporter exporter : exporterList) @@ -130,11 +130,8 @@ public class ExportAction implements EventListener cboType.setMold("select"); cboType.getItems().clear(); - List keys = new ArrayList<>(extensionMap.keySet()); - Collections.sort(keys); - for(String key : keys) - { - cboType.appendItem(key, key); + for (Entry extension : extensionMap.entrySet()) { + cboType.appendItem(extension.getKey(), extension.getValue()); } cboType.setSelectedIndex(0); @@ -352,12 +349,12 @@ public class ExportAction implements EventListener */ 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; }