IDEMPIERE-454 Easy import / Version 3 Exporter - when exporting on a detail tab export parent and details
This commit is contained in:
parent
205803a089
commit
63d34ee56e
|
@ -32,6 +32,7 @@ import org.compiere.model.GridField;
|
||||||
import org.compiere.model.GridTab;
|
import org.compiere.model.GridTab;
|
||||||
import org.compiere.model.GridTable;
|
import org.compiere.model.GridTable;
|
||||||
import org.compiere.model.MColumn;
|
import org.compiere.model.MColumn;
|
||||||
|
import org.compiere.model.MQuery;
|
||||||
import org.compiere.model.MRefList;
|
import org.compiere.model.MRefList;
|
||||||
import org.compiere.model.MTable;
|
import org.compiere.model.MTable;
|
||||||
import org.compiere.util.DB;
|
import org.compiere.util.DB;
|
||||||
|
@ -39,6 +40,7 @@ import org.compiere.util.DisplayType;
|
||||||
import org.compiere.util.Env;
|
import org.compiere.util.Env;
|
||||||
import org.compiere.util.Msg;
|
import org.compiere.util.Msg;
|
||||||
import org.compiere.util.Util;
|
import org.compiere.util.Util;
|
||||||
|
import org.jfree.util.Log;
|
||||||
import org.supercsv.cellprocessor.FmtBool;
|
import org.supercsv.cellprocessor.FmtBool;
|
||||||
import org.supercsv.cellprocessor.FmtDate;
|
import org.supercsv.cellprocessor.FmtDate;
|
||||||
import org.supercsv.cellprocessor.FmtNumber;
|
import org.supercsv.cellprocessor.FmtNumber;
|
||||||
|
@ -51,6 +53,7 @@ import org.supercsv.prefs.CsvPreference;
|
||||||
/**
|
/**
|
||||||
* CSV Exporter for GridTab
|
* CSV Exporter for GridTab
|
||||||
* @author Carlos Ruiz
|
* @author Carlos Ruiz
|
||||||
|
* @author Juan David Arboleda
|
||||||
*/
|
*/
|
||||||
public class GridTabCSVExporter implements IGridTabExporter
|
public class GridTabCSVExporter implements IGridTabExporter
|
||||||
{
|
{
|
||||||
|
@ -58,17 +61,24 @@ public class GridTabCSVExporter implements IGridTabExporter
|
||||||
public void export(GridTab gridTab, List<GridTab> childs, boolean currentRowOnly, File file) {
|
public void export(GridTab gridTab, List<GridTab> childs, boolean currentRowOnly, File file) {
|
||||||
|
|
||||||
ICsvMapWriter mapWriter = null;
|
ICsvMapWriter mapWriter = null;
|
||||||
|
Map<GridTab,GridField[]> tabMapDetails = new HashMap<GridTab, GridField[]>();
|
||||||
|
MTable table= null;
|
||||||
|
MTable tableDetail = null;
|
||||||
try {
|
try {
|
||||||
mapWriter = new CsvMapWriter(new FileWriter(file), CsvPreference.STANDARD_PREFERENCE);
|
mapWriter = new CsvMapWriter(new FileWriter(file), CsvPreference.STANDARD_PREFERENCE);
|
||||||
|
String IsValidTab = IsValidTabToExport(gridTab);
|
||||||
|
if (IsValidTab!=null){
|
||||||
|
Log.info(IsValidTab);
|
||||||
|
return;
|
||||||
|
}
|
||||||
GridTable gt = gridTab.getTableModel();
|
GridTable gt = gridTab.getTableModel();
|
||||||
GridField[] gridFields = getFields(gridTab);
|
GridField[] gridFields = getFields(gridTab);
|
||||||
List<String> headArray = new ArrayList<String>();
|
List<String> headArray = new ArrayList<String>();
|
||||||
List<String> colsArray = new ArrayList<String>();
|
|
||||||
List<CellProcessor> procArray = new ArrayList<CellProcessor>();
|
List<CellProcessor> procArray = new ArrayList<CellProcessor>();
|
||||||
MTable table = MTable.get(Env.getCtx(), gridTab.getTableName());
|
table = MTable.get(Env.getCtx(), gridTab.getTableName());
|
||||||
|
//master tab
|
||||||
for (int idxfld = 0; idxfld < gridFields.length; idxfld++) {
|
for (int idxfld = 0; idxfld < gridFields.length; idxfld++) {
|
||||||
GridField field = gridFields[idxfld];
|
GridField field = gridFields[idxfld];
|
||||||
colsArray.add(field.getColumnName());
|
|
||||||
MColumn column = MColumn.get(Env.getCtx(), field.getAD_Column_ID());
|
MColumn column = MColumn.get(Env.getCtx(), field.getAD_Column_ID());
|
||||||
String headName = resolveColumnName(table, column);
|
String headName = resolveColumnName(table, column);
|
||||||
headArray.add(headName);
|
headArray.add(headName);
|
||||||
|
@ -88,6 +98,45 @@ public class GridTabCSVExporter implements IGridTabExporter
|
||||||
procArray.add(null);
|
procArray.add(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//Details up to tab level 1
|
||||||
|
if(childs.size() > 0){
|
||||||
|
for(GridTab detail: childs){
|
||||||
|
|
||||||
|
if (detail.getTabLevel()>1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
IsValidTab = IsValidTabToExport(detail);
|
||||||
|
if (IsValidTab!=null){
|
||||||
|
Log.info(IsValidTab);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
tableDetail = MTable.get(Env.getCtx(), detail.getTableName());
|
||||||
|
gridFields = getFields(detail);
|
||||||
|
for(GridField field : gridFields){
|
||||||
|
MColumn columnDetail = MColumn.get(Env.getCtx(), field.getAD_Column_ID());
|
||||||
|
String headNameDetail =detail.getTableName()+">"+resolveColumnName(tableDetail, columnDetail);
|
||||||
|
headArray.add(headNameDetail);
|
||||||
|
if (DisplayType.Date == columnDetail.getAD_Reference_ID()) {
|
||||||
|
procArray.add(new Optional(new FmtDate(DisplayType.DEFAULT_DATE_FORMAT)));
|
||||||
|
} else if (DisplayType.DateTime == columnDetail.getAD_Reference_ID()) {
|
||||||
|
procArray.add(new Optional(new FmtDate(DisplayType.DEFAULT_TIMESTAMP_FORMAT)));
|
||||||
|
} else if (DisplayType.Time == columnDetail.getAD_Reference_ID()) {
|
||||||
|
procArray.add(new Optional(new FmtDate("DisplayType.DEFAULT_TIME_FORMAT")));
|
||||||
|
} else if (DisplayType.Integer == columnDetail.getAD_Reference_ID() || DisplayType.isNumeric(columnDetail.getAD_Reference_ID())) {
|
||||||
|
DecimalFormat nf = DisplayType.getNumberFormat(columnDetail.getAD_Reference_ID());
|
||||||
|
nf.setGroupingUsed(false);
|
||||||
|
procArray.add(new Optional(new FmtNumber(nf)));
|
||||||
|
} else if (DisplayType.YesNo == columnDetail.getAD_Reference_ID()) {
|
||||||
|
procArray.add(new Optional(new FmtBool("Y", "N")));
|
||||||
|
} else { // lookups and text
|
||||||
|
procArray.add(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tabMapDetails.put(detail,gridFields);
|
||||||
|
}
|
||||||
|
gridFields = null;
|
||||||
|
}
|
||||||
|
|
||||||
// the header elements are used to map the bean values to each column (names must match)
|
// the header elements are used to map the bean values to each column (names must match)
|
||||||
String[] header = headArray.toArray(new String[headArray.size()]);
|
String[] header = headArray.toArray(new String[headArray.size()]);
|
||||||
CellProcessor[] processors = procArray.toArray(new CellProcessor[procArray.size()]);
|
CellProcessor[] processors = procArray.toArray(new CellProcessor[procArray.size()]);
|
||||||
|
@ -104,14 +153,42 @@ public class GridTabCSVExporter implements IGridTabExporter
|
||||||
}
|
}
|
||||||
for (int idxrow = start; idxrow < end; idxrow++) {
|
for (int idxrow = start; idxrow < end; idxrow++) {
|
||||||
Map<String, Object> row = new HashMap<String, Object>();
|
Map<String, Object> row = new HashMap<String, Object>();
|
||||||
for (int idxfld = 0; idxfld < header.length; idxfld++) {
|
int idxfld = 0;
|
||||||
GridField field = gridFields[idxfld];
|
int index =0;
|
||||||
|
int rowDetail=0;
|
||||||
|
|
||||||
|
for(GridField field : getFields(gridTab)){
|
||||||
MColumn column = MColumn.get(Env.getCtx(), field.getAD_Column_ID());
|
MColumn column = MColumn.get(Env.getCtx(), field.getAD_Column_ID());
|
||||||
String headName = header[idxfld];
|
String headName = header[idxfld];
|
||||||
Object value = resolveValue(gridTab, table, column, idxrow, headName);
|
Object value = resolveValue(gridTab, table, column, idxrow, headName);
|
||||||
row.put(headName, value);
|
row.put(headName, value);
|
||||||
|
idxfld++;
|
||||||
|
index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
if(childs.size()>0){
|
||||||
|
Map<String, Object> tmpRow = resolveMasterDetailRow(rowDetail,tabMapDetails,headArray,index,gridTab.getKeyID(idxrow), gridTab.getKeyColumnName());
|
||||||
|
if(tmpRow!= null){
|
||||||
|
for(Map.Entry<String, Object> details : tmpRow.entrySet()) {
|
||||||
|
String detailColumn = details.getKey();
|
||||||
|
Object value =details.getValue();
|
||||||
|
row.put(detailColumn , value);
|
||||||
|
}
|
||||||
|
rowDetail++;
|
||||||
mapWriter.write(row, header, processors);
|
mapWriter.write(row, header, processors);
|
||||||
|
}else{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(rowDetail==0)
|
||||||
|
mapWriter.write(row, header, processors);
|
||||||
|
|
||||||
|
idxfld=0;
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new AdempiereException(e);
|
throw new AdempiereException(e);
|
||||||
|
@ -127,6 +204,60 @@ public class GridTabCSVExporter implements IGridTabExporter
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//add constraints to not allow certain tabs
|
||||||
|
private String IsValidTabToExport(GridTab gridTab){
|
||||||
|
String result=null;
|
||||||
|
|
||||||
|
if(gridTab.isReadOnly())
|
||||||
|
result = Msg.getMsg(Env.getCtx(),"FieldIsReadOnly", new Object[] {gridTab.getName()});
|
||||||
|
|
||||||
|
if(gridTab.getTableName().endsWith("_Acct"))
|
||||||
|
result = "Accounting Tab cannot be exported "+ gridTab.getName();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, Object> resolveMasterDetailRow(int currentDetRow,Map<GridTab,GridField[]> tabMapDetails,List<String>headArray,int idxfld,int record_Id,String keyColumnParent){
|
||||||
|
Map<String, Object> row = new HashMap<String, Object>();
|
||||||
|
Object value = null;
|
||||||
|
boolean hasDetails = false;
|
||||||
|
|
||||||
|
if (currentDetRow > 0 )
|
||||||
|
for(int j =0;j<idxfld;j++)
|
||||||
|
row.put(headArray.get(j), null);
|
||||||
|
|
||||||
|
for(Map.Entry<GridTab, GridField[]> childTabDetail : tabMapDetails.entrySet()) {
|
||||||
|
GridTab childTab = childTabDetail.getKey();
|
||||||
|
String whereCla = getWhereClause (childTab ,record_Id ,keyColumnParent);
|
||||||
|
childTab.getTableModel().dataRequery(whereCla, false, 0);
|
||||||
|
if (childTab.getRowCount() > 0) {
|
||||||
|
for(GridField field : childTabDetail.getValue()){
|
||||||
|
MColumn column = MColumn.get(Env.getCtx(), field.getAD_Column_ID());
|
||||||
|
MTable tableDetail = MTable.get(Env.getCtx(), childTab.getTableName());
|
||||||
|
String headName = headArray.get(headArray.indexOf(childTab.getTableName()+">"+resolveColumnName(tableDetail,column)));
|
||||||
|
value = resolveValue(childTab, MTable.get(Env.getCtx(),childTab.getTableName()), column, currentDetRow, headName.substring(headName.indexOf(">")+ 1,headName.length()));
|
||||||
|
row.put(headName, value);
|
||||||
|
if (value!=null)
|
||||||
|
hasDetails = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasDetails)
|
||||||
|
return row;
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getWhereClause (GridTab childTab, int record_Id , String keyColumnParent){
|
||||||
|
String whereClau = null;
|
||||||
|
String linkColumn = childTab.getLinkColumnName();
|
||||||
|
if (keyColumnParent.equals(linkColumn)){
|
||||||
|
whereClau= linkColumn+MQuery.EQUAL+record_Id;
|
||||||
|
}
|
||||||
|
return whereClau;
|
||||||
|
}
|
||||||
|
|
||||||
private Object resolveValue(GridTab gridTab, MTable table, MColumn column, int i, String headName) {
|
private Object resolveValue(GridTab gridTab, MTable table, MColumn column, int i, String headName) {
|
||||||
Object value = null;
|
Object value = null;
|
||||||
if (headName.indexOf("[") >= 0 && headName.endsWith("]")) {
|
if (headName.indexOf("[") >= 0 && headName.endsWith("]")) {
|
||||||
|
@ -210,9 +341,12 @@ public class GridTabCSVExporter implements IGridTabExporter
|
||||||
int AD_Field_ID = Integer.parseInt(fieldIdStr);
|
int AD_Field_ID = Integer.parseInt(fieldIdStr);
|
||||||
for (GridField gridField : tmpFields)
|
for (GridField gridField : tmpFields)
|
||||||
{
|
{
|
||||||
|
if(gridField.isVirtualColumn() || gridField.isEncrypted() || gridField.isEncryptedColumn())
|
||||||
|
continue;
|
||||||
|
|
||||||
if (gridField.getAD_Field_ID() == AD_Field_ID)
|
if (gridField.getAD_Field_ID() == AD_Field_ID)
|
||||||
{
|
{
|
||||||
if (!gridField.isReadOnly() && gridField.isDisplayedGrid())
|
if (!gridField.isReadOnly() && gridField.isDisplayedGrid() && !(DisplayType.Button == MColumn.get(Env.getCtx(),gridField.getAD_Column_ID()).getAD_Reference_ID()))
|
||||||
fieldList.add(gridField);
|
fieldList.add(gridField);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -229,6 +363,10 @@ public class GridTabCSVExporter implements IGridTabExporter
|
||||||
{
|
{
|
||||||
if ("AD_Client_ID".equals(field.getColumnName()))
|
if ("AD_Client_ID".equals(field.getColumnName()))
|
||||||
continue;
|
continue;
|
||||||
|
if (DisplayType.Button == MColumn.get(Env.getCtx(),field.getAD_Column_ID()).getAD_Reference_ID())
|
||||||
|
continue;
|
||||||
|
if (field.isVirtualColumn() || field.isEncrypted() || field.isEncryptedColumn())
|
||||||
|
continue;
|
||||||
if (field.isParentValue() || (!field.isReadOnly() && field.isDisplayedGrid()))
|
if (field.isParentValue() || (!field.isReadOnly() && field.isDisplayedGrid()))
|
||||||
gridFieldList.add(field);
|
gridFieldList.add(field);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue