IDEMPIERE-1572 Last Run and Saved parameter for process / based on patch from Deepak Pansheriya

This commit is contained in:
Carlos Ruiz 2014-04-04 10:19:40 -05:00
parent 93bc5f0909
commit 772ec43368
10 changed files with 612 additions and 25 deletions

View File

@ -0,0 +1,35 @@
SET SQLBLANKLINES ON
SET DEFINE OFF
-- Nov 27, 2013 10:35:14 AM IST
-- IDEMPIERE-1572: Last Run and Saved parameter for process
INSERT INTO AD_Column (SeqNoSelection,IsSyncDatabase,Version,AD_Table_ID,AD_Column_ID,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,AD_Reference_ID,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsUpdateable,ColumnName,Description,Help,Name,IsAllowCopy,CreatedBy,Updated,AD_Org_ID,IsActive,Created,UpdatedBy,IsToolbarButton,IsAlwaysUpdateable,EntityType,IsEncrypted,AD_Element_ID,AD_Client_ID,IsSecure) VALUES (0,'N',0,282,210890,'N','N','Y',0,'N',60,'Y',10,'N','N','Y','4f66cceb-27a2-47b8-a1ef-0bc2882bfdef','Y','Name','Alphanumeric identifier of the entity','The name of an entity (record) is used as an default search option in addition to the search key. The name is up to 60 characters in length.','Name','Y',100,TO_DATE('2013-11-27 10:35:12','YYYY-MM-DD HH24:MI:SS'),0,'Y',TO_DATE('2013-11-27 10:35:12','YYYY-MM-DD HH24:MI:SS'),100,'N','N','D','N',469,0,'N')
;
-- Nov 27, 2013 10:35:20 AM IST
-- IDEMPIERE-1572: Last Run and Saved parameter for process
ALTER TABLE AD_PInstance ADD Name NVARCHAR2(60) DEFAULT NULL
;
-- Nov 27, 2013 10:36:46 AM IST
-- IDEMPIERE-1572: Last Run and Saved parameter for process
INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Org_ID,Created,AD_Client_ID) VALUES ('I','Last Run',200240,'D','fd39a4cd-eb0a-4b35-97ae-cbd4657d8234','LastRun','Y',TO_DATE('2013-11-27 10:36:45','YYYY-MM-DD HH24:MI:SS'),100,100,0,TO_DATE('2013-11-27 10:36:45','YYYY-MM-DD HH24:MI:SS'),0)
;
-- Nov 27, 2013 10:37:01 AM IST
-- IDEMPIERE-1572: Last Run and Saved parameter for process
INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Org_ID,Created,AD_Client_ID) VALUES ('I','Saved Parameters',200241,'D','f1688973-03c3-4af4-9b76-a0cec366ec41','SavedParameter','Y',TO_DATE('2013-11-27 10:37:00','YYYY-MM-DD HH24:MI:SS'),100,100,0,TO_DATE('2013-11-27 10:37:00','YYYY-MM-DD HH24:MI:SS'),0)
;
-- Nov 27, 2013 10:47:53 AM IST
-- IDEMPIERE-1572: Last Run and Saved parameter for process
INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Org_ID,Created,AD_Client_ID) VALUES ('I','Could not save parameters.',200242,'D','d07376af-ab08-4835-a962-9f5addc8dedc','SaveParameterError','Y',TO_DATE('2013-11-27 10:47:52','YYYY-MM-DD HH24:MI:SS'),100,100,0,TO_DATE('2013-11-27 10:47:52','YYYY-MM-DD HH24:MI:SS'),0)
;
-- Mar 28, 2014 12:23:30 PM IST
-- IDEMPIERE-1572: Last Run and Saved parameter for process
INSERT INTO AD_SysConfig (AD_SysConfig_ID,ConfigurationLevel,Value,AD_SysConfig_UU,Created,Updated,AD_Org_ID,CreatedBy,IsActive,UpdatedBy,Name,AD_Client_ID,EntityType) VALUES (200046,'C','5','9b2426cb-b513-4199-b835-016cbc34a24f',TO_DATE('2014-03-28 12:23:23','YYYY-MM-DD HH24:MI:SS'),TO_DATE('2014-03-28 12:23:23','YYYY-MM-DD HH24:MI:SS'),0,100,'Y',100,'LASTRUN_RECORD_COUNT',0,'D')
;
SELECT register_migration_script('201404040826_IDEMPIERE-1572.sql') FROM dual
;

View File

@ -0,0 +1,32 @@
-- Nov 27, 2013 10:35:14 AM IST
-- IDEMPIERE-1572: Last Run and Saved parameter for process
INSERT INTO AD_Column (SeqNoSelection,IsSyncDatabase,Version,AD_Table_ID,AD_Column_ID,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsParent,FieldLength,IsSelectionColumn,AD_Reference_ID,IsKey,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsUpdateable,ColumnName,Description,Help,Name,IsAllowCopy,CreatedBy,Updated,AD_Org_ID,IsActive,Created,UpdatedBy,IsToolbarButton,IsAlwaysUpdateable,EntityType,IsEncrypted,AD_Element_ID,AD_Client_ID,IsSecure) VALUES (0,'N',0,282,210890,'N','N','Y',0,'N',60,'Y',10,'N','N','Y','4f66cceb-27a2-47b8-a1ef-0bc2882bfdef','Y','Name','Alphanumeric identifier of the entity','The name of an entity (record) is used as an default search option in addition to the search key. The name is up to 60 characters in length.','Name','Y',100,TO_TIMESTAMP('2013-11-27 10:35:12','YYYY-MM-DD HH24:MI:SS'),0,'Y',TO_TIMESTAMP('2013-11-27 10:35:12','YYYY-MM-DD HH24:MI:SS'),100,'N','N','D','N',469,0,'N')
;
-- Nov 27, 2013 10:35:20 AM IST
-- IDEMPIERE-1572: Last Run and Saved parameter for process
ALTER TABLE AD_PInstance ADD COLUMN Name VARCHAR(60) DEFAULT NULL
;
-- Nov 27, 2013 10:36:46 AM IST
-- IDEMPIERE-1572: Last Run and Saved parameter for process
INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Org_ID,Created,AD_Client_ID) VALUES ('I','Last Run',200240,'D','fd39a4cd-eb0a-4b35-97ae-cbd4657d8234','LastRun','Y',TO_TIMESTAMP('2013-11-27 10:36:45','YYYY-MM-DD HH24:MI:SS'),100,100,0,TO_TIMESTAMP('2013-11-27 10:36:45','YYYY-MM-DD HH24:MI:SS'),0)
;
-- Nov 27, 2013 10:37:01 AM IST
-- IDEMPIERE-1572: Last Run and Saved parameter for process
INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Org_ID,Created,AD_Client_ID) VALUES ('I','Saved Parameters',200241,'D','f1688973-03c3-4af4-9b76-a0cec366ec41','SavedParameter','Y',TO_TIMESTAMP('2013-11-27 10:37:00','YYYY-MM-DD HH24:MI:SS'),100,100,0,TO_TIMESTAMP('2013-11-27 10:37:00','YYYY-MM-DD HH24:MI:SS'),0)
;
-- Nov 27, 2013 10:47:53 AM IST
-- IDEMPIERE-1572: Last Run and Saved parameter for process
INSERT INTO AD_Message (MsgType,MsgText,AD_Message_ID,EntityType,AD_Message_UU,Value,IsActive,Updated,CreatedBy,UpdatedBy,AD_Org_ID,Created,AD_Client_ID) VALUES ('I','Could not save parameters.',200242,'D','d07376af-ab08-4835-a962-9f5addc8dedc','SaveParameterError','Y',TO_TIMESTAMP('2013-11-27 10:47:52','YYYY-MM-DD HH24:MI:SS'),100,100,0,TO_TIMESTAMP('2013-11-27 10:47:52','YYYY-MM-DD HH24:MI:SS'),0)
;
-- Mar 28, 2014 12:23:30 PM IST
-- IDEMPIERE-1572: Last Run and Saved parameter for process
INSERT INTO AD_SysConfig (AD_SysConfig_ID,ConfigurationLevel,Value,AD_SysConfig_UU,Created,Updated,AD_Org_ID,CreatedBy,IsActive,UpdatedBy,Name,AD_Client_ID,EntityType) VALUES (200046,'C','5','9b2426cb-b513-4199-b835-016cbc34a24f',TO_TIMESTAMP('2014-03-28 12:23:23','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2014-03-28 12:23:23','YYYY-MM-DD HH24:MI:SS'),0,100,'Y',100,'LASTRUN_RECORD_COUNT',0,'D')
;
SELECT register_migration_script('201404040826_IDEMPIERE-1572.sql') FROM dual
;

View File

@ -161,6 +161,19 @@ public interface I_AD_PInstance
/** Get Processing */ /** Get Processing */
public boolean isProcessing(); public boolean isProcessing();
/** Column name Name */
public static final String COLUMNNAME_Name = "Name";
/** Set Name.
* Alphanumeric identifier of the entity
*/
public void setName (String Name);
/** Get Name.
* Alphanumeric identifier of the entity
*/
public String getName();
/** Column name Record_ID */ /** Column name Record_ID */
public static final String COLUMNNAME_Record_ID = "Record_ID"; public static final String COLUMNNAME_Record_ID = "Record_ID";

View File

@ -25,8 +25,10 @@ import java.util.List;
import java.util.Properties; import java.util.Properties;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Msg;
/** /**
* Process Instance Model * Process Instance Model
@ -40,11 +42,12 @@ import org.compiere.util.Env;
*/ */
public class MPInstance extends X_AD_PInstance public class MPInstance extends X_AD_PInstance
{ {
/**
*
*/
private static final long serialVersionUID = -3952972645135787655L;
/** private static CLogger s_log = CLogger.getCLogger (MPInstance.class);
*
*/
private static final long serialVersionUID = -5848424269552679604L;
/** /**
* Standard Constructor * Standard Constructor
@ -130,6 +133,7 @@ public class MPInstance extends X_AD_PInstance
final String whereClause = "AD_PInstance_ID=?"; final String whereClause = "AD_PInstance_ID=?";
List <MPInstancePara> list = new Query(getCtx(), I_AD_PInstance_Para.Table_Name, whereClause, null) // @TODO: Review implications of using transaction List <MPInstancePara> list = new Query(getCtx(), I_AD_PInstance_Para.Table_Name, whereClause, null) // @TODO: Review implications of using transaction
.setParameters(getAD_PInstance_ID()) .setParameters(getAD_PInstance_ID())
.setOrderBy("SeqNo, ParameterName")
.list(); .list();
// //
@ -349,4 +353,78 @@ public class MPInstance extends X_AD_PInstance
ip.saveEx(); ip.saveEx();
return ip; return ip;
} }
} // MPInstance
public static List<MPInstance> get(Properties ctx, int AD_Process_ID, int AD_User_ID) {
List<MPInstance> list = new ArrayList<MPInstance>();
List<String> paramsStrAdded = new ArrayList<String>();
List<MPInstance> namedInstances = new Query(ctx, Table_Name, "AD_Process_ID=? AND AD_User_ID=? AND Name IS NOT NULL", null)
.setClient_ID()
.setOnlyActiveRecords(true)
.setParameters(AD_Process_ID, AD_User_ID)
.setOrderBy("Name")
.list();
for (MPInstance namedInstance : namedInstances) {
list.add(namedInstance);
paramsStrAdded.add(namedInstance.getParamsStr());
}
// unnamed instances
int lastRunCount = MSysConfig.getIntValue("LASTRUN_RECORD_COUNT", 5, Env.getAD_Client_ID(ctx));
if (lastRunCount > 0) {
// using JDBC instead of Query for performance reasons, AD_PInstance can be huge
String sql = "SELECT * FROM AD_PInstance "
+ " WHERE AD_Process_ID=? AND AD_User_ID=? AND IsActive='Y' AND AD_Client_ID=? AND Name IS NULL"
+ " ORDER BY Created DESC";
PreparedStatement pstmt = null;
ResultSet rs = null;
int cnt = 0;
try {
pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, AD_Process_ID);
pstmt.setInt(2, AD_User_ID);
pstmt.setInt(3, Env.getAD_Client_ID(ctx));
rs = pstmt.executeQuery();
while (rs.next()) {
MPInstance unnamedInstance = new MPInstance(ctx, rs, null);
String paramsStr = unnamedInstance.getParamsStr();
if (! paramsStrAdded.contains(paramsStr)) {
unnamedInstance.setName(Msg.getMsg(ctx, "LastRun") + " " + unnamedInstance.getCreated());
list.add(unnamedInstance);
paramsStrAdded.add(paramsStr);
cnt++;
if (cnt == lastRunCount)
break;
}
}
} catch (Exception e)
{
s_log.log(Level.SEVERE, "Error while Fetching last run records", e);
} finally {
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
}
return list;
}
private String getParamsStr() {
StringBuilder cksum = new StringBuilder();
for (MPInstancePara ip : getParameters()) {
cksum.append("(")
.append(ip.getParameterName()).append("|")
.append(ip.getP_String()).append("|")
.append(ip.getP_String_To()).append("|")
.append(ip.getP_Number()).append("|")
.append(ip.getP_Number_To()).append("|")
.append(ip.getP_Date()).append("|")
.append(ip.getP_Date_To()).append("|")
.append(ip.getInfo()).append("|")
.append(ip.getInfo_To()).append("|")
.append(")");
}
return cksum.toString();
}
} // MPInstance

View File

@ -30,7 +30,7 @@ public class X_AD_PInstance extends PO implements I_AD_PInstance, I_Persistent
/** /**
* *
*/ */
private static final long serialVersionUID = 20131031L; private static final long serialVersionUID = 20140404L;
/** Standard Constructor */ /** Standard Constructor */
public X_AD_PInstance (Properties ctx, int AD_PInstance_ID, String trxName) public X_AD_PInstance (Properties ctx, int AD_PInstance_ID, String trxName)
@ -209,6 +209,23 @@ public class X_AD_PInstance extends PO implements I_AD_PInstance, I_Persistent
return false; return false;
} }
/** Set Name.
@param Name
Alphanumeric identifier of the entity
*/
public void setName (String Name)
{
set_Value (COLUMNNAME_Name, Name);
}
/** Get Name.
@return Alphanumeric identifier of the entity
*/
public String getName ()
{
return (String)get_Value(COLUMNNAME_Name);
}
/** Set Record ID. /** Set Record ID.
@param Record_ID @param Record_ID
Direct internal record ID Direct internal record ID

View File

@ -16,20 +16,27 @@
*****************************************************************************/ *****************************************************************************/
package org.compiere.apps; package org.compiere.apps;
import static org.compiere.model.SystemIDs.PROCESS_C_INVOICE_GENERATE;
import static org.compiere.model.SystemIDs.PROCESS_M_INOUT_GENERATE;
import java.awt.AWTEvent; import java.awt.AWTEvent;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.FlowLayout; import java.awt.FlowLayout;
import java.awt.GraphicsConfiguration; import java.awt.GraphicsConfiguration;
import java.awt.Insets;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.io.File; import java.io.File;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JEditorPane; import javax.swing.JEditorPane;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
@ -39,18 +46,23 @@ import org.adempiere.exceptions.AdempiereException;
import org.adempiere.exceptions.DBException; import org.adempiere.exceptions.DBException;
import org.adempiere.util.Callback; import org.adempiere.util.Callback;
import org.adempiere.util.IProcessUI; import org.adempiere.util.IProcessUI;
import static org.compiere.model.SystemIDs.*; import org.compiere.model.MPInstance;
import org.compiere.model.MPInstancePara;
import org.compiere.print.ReportCtl; import org.compiere.print.ReportCtl;
import org.compiere.print.ReportEngine; import org.compiere.print.ReportEngine;
import org.compiere.process.ProcessInfo; import org.compiere.process.ProcessInfo;
import org.compiere.process.ProcessInfoUtil; import org.compiere.process.ProcessInfoUtil;
import org.compiere.swing.CButton; import org.compiere.swing.CButton;
import org.compiere.swing.CComboBox;
import org.compiere.swing.CFrame; import org.compiere.swing.CFrame;
import org.compiere.swing.CLabel;
import org.compiere.swing.CPanel; import org.compiere.swing.CPanel;
import org.compiere.util.AdempiereSystemError;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
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;
/** /**
* Dialog to Start process. * Dialog to Start process.
@ -75,7 +87,7 @@ public class ProcessDialog extends CFrame
/** /**
* *
*/ */
private static final long serialVersionUID = 7486479305726277406L; private static final long serialVersionUID = 2435351857958558386L;
/** /**
* @deprecated * @deprecated
@ -194,6 +206,11 @@ public class ProcessDialog extends CFrame
private ProcessParameterPanel parameterPanel = null; private ProcessParameterPanel parameterPanel = null;
private JSeparator separator = new JSeparator(); private JSeparator separator = new JSeparator();
private ProcessInfo m_pi = null; private ProcessInfo m_pi = null;
private CComboBox fSavedName = new CComboBox();
private CButton bSave = new CButton();
private CButton bDelete = new CButton();
private List<MPInstance> savedParams;
private CLabel lSaved = new CLabel(Msg.getMsg(Env.getCtx(), "SavedParameter"));
/** /**
* Static Layout * Static Layout
@ -207,6 +224,19 @@ public class ProcessDialog extends CFrame
dialog.setMinimumSize(new Dimension(500, 200)); dialog.setMinimumSize(new Dimension(500, 200));
bOK.addActionListener(this); bOK.addActionListener(this);
bPrint.addActionListener(this); bPrint.addActionListener(this);
fSavedName.setToolTipText (Msg.getMsg(Env.getCtx(),"SavedParameter"));
fSavedName.setEditable(true);
fSavedName.addActionListener(this);
bSave.setIcon(new ImageIcon(org.compiere.Adempiere.class.getResource("images/Save24.gif")));
bSave.setMargin(new Insets(2, 2, 2, 2));
bSave.setToolTipText(Msg.getMsg(Env.getCtx(),"Save"));
bSave.addActionListener(this);
bSave.setEnabled(false);
bDelete.setIcon(new ImageIcon(org.compiere.Adempiere.class.getResource("images/Delete24.gif")));
bDelete.setMargin(new Insets(2, 2, 2, 2));
bDelete.setToolTipText(Msg.getMsg(Env.getCtx(),"Delete"));
bDelete.addActionListener(this);
bDelete.setEnabled(false);
// //
southPanel.setLayout(southLayout); southPanel.setLayout(southLayout);
southLayout.setAlignment(FlowLayout.RIGHT); southLayout.setAlignment(FlowLayout.RIGHT);
@ -216,7 +246,12 @@ public class ProcessDialog extends CFrame
message.setFocusable(true); message.setFocusable(true);
getContentPane().add(dialog); getContentPane().add(dialog);
dialog.add(southPanel, BorderLayout.SOUTH); dialog.add(southPanel, BorderLayout.SOUTH);
southPanel.add(bPrint, null);
southPanel.add(lSaved,"wrap");
southPanel.add(fSavedName, "w :200:");
southPanel.add(bSave, null);
southPanel.add(bDelete, null);
southPanel.add(bPrint, "span, split 2, align right, pushx");
southPanel.add(bOK, null); southPanel.add(bOK, null);
dialog.add(messagePane, BorderLayout.NORTH); dialog.add(messagePane, BorderLayout.NORTH);
messagePane.setBorder(null); messagePane.setBorder(null);
@ -337,16 +372,39 @@ public class ProcessDialog extends CFrame
if(m_ShowHelp != null && m_ShowHelp.equals("S")) if(m_ShowHelp != null && m_ShowHelp.equals("S"))
bOK.doClick(); bOK.doClick();
querySaved();
dialog.revalidate(); dialog.revalidate();
return true; return true;
} // init } // init
private void querySaved() {
//user query
savedParams = MPInstance.get(Env.getCtx(), m_AD_Process_ID, Env.getContextAsInt(Env.getCtx(), "#AD_User_ID"));
String[] queries = new String[savedParams.size()+1];
int i = 0;
queries[i++] = "";
for (MPInstance instance : savedParams)
{
queries[i++] = instance.getName();
}
fSavedName.setModel(new DefaultComboBoxModel(queries));
fSavedName.setValue("");
}
/** /**
* ActionListener (Start) * ActionListener (Start)
* @param e ActionEvent * @param e ActionEvent
*/ */
public void actionPerformed (ActionEvent e) public void actionPerformed (ActionEvent e)
{ {
String saveName = null;
if (fSavedName.getSelectedItem() != null)
saveName = fSavedName.getSelectedItem().toString();
boolean lastRun = ("** " + Msg.getMsg(Env.getCtx(), "LastRun") + " **").equals(saveName);
if (e.getSource() == bOK) if (e.getSource() == bOK)
{ {
if (bOK.getText().length() == 0) if (bOK.getText().length() == 0)
@ -357,12 +415,92 @@ public class ProcessDialog extends CFrame
ProcessCtl.process(this, m_WindowNo, parameterPanel, m_pi, null); ProcessCtl.process(this, m_WindowNo, parameterPanel, m_pi, null);
} }
} }
else if (e.getSource() == fSavedName)
{
if (savedParams != null && saveName != null)
{
for (int i = 0; i < savedParams.size(); i++)
{
if (savedParams.get(i).getName().equals(saveName))
{
loadSavedParams(savedParams.get(i));
}
}
}
boolean enabled = !Util.isEmpty(saveName);
bSave.setEnabled(enabled && !lastRun);
bDelete.setEnabled(enabled && fSavedName.getSelectedIndex() > -1 && !lastRun);
}
else if (e.getSource() == bSave && fSavedName != null && !lastRun)
{
// Update existing
if (fSavedName.getSelectedIndex() > -1 && savedParams != null)
{
for (int i = 0; i < savedParams.size(); i++)
{
if (savedParams.get(i).getName().equals(saveName))
{
m_pi.setAD_PInstance_ID(savedParams.get(i).getAD_PInstance_ID());
for (MPInstancePara para : savedParams.get(i).getParameters())
{
para.deleteEx(true);
}
parameterPanel.saveParameters();
}
}
}
// create new
else {
MPInstance instance = null;
try
{
instance = new MPInstance(Env.getCtx(), m_pi.getAD_Process_ID(), m_pi.getRecord_ID());
instance.setName(saveName);
instance.saveEx();
m_pi.setAD_PInstance_ID(instance.getAD_PInstance_ID());
// Get Parameters
if (parameterPanel != null) {
if (!parameterPanel.saveParameters())
{
throw new AdempiereSystemError(Msg.getMsg(Env.getCtx(), "SaveParameterError"));
}
}
}
catch (Exception ex)
{
ADialog.warn(m_WindowNo, this, ex.getLocalizedMessage());
}
}
querySaved();
fSavedName.setSelectedItem(saveName);
}
else if (e.getSource() == bDelete && fSavedName != null && !lastRun )
{
Object o = fSavedName.getSelectedItem();
if (savedParams != null && o != null)
{
String selected = o.toString();
for (int i = 0; i < savedParams.size(); i++)
{
if (savedParams.get(i).getName().equals(selected))
{
savedParams.get(i).deleteEx(true);
}
}
}
querySaved();
}
else if (e.getSource() == bPrint) else if (e.getSource() == bPrint)
printScreen(); printScreen();
} // actionPerformed } // actionPerformed
private void loadSavedParams(MPInstance instance) {
parameterPanel.loadParameters(instance);
}
/** /**
* Lock User Interface * Lock User Interface
* Called from the Worker before processing * Called from the Worker before processing

View File

@ -40,6 +40,7 @@ import org.compiere.model.GridField;
import org.compiere.model.GridFieldVO; import org.compiere.model.GridFieldVO;
import org.compiere.model.MClient; import org.compiere.model.MClient;
import org.compiere.model.MLookup; import org.compiere.model.MLookup;
import org.compiere.model.MPInstance;
import org.compiere.model.MPInstancePara; import org.compiere.model.MPInstancePara;
import org.compiere.process.ProcessInfo; import org.compiere.process.ProcessInfo;
import org.compiere.swing.CLabel; import org.compiere.swing.CLabel;
@ -65,7 +66,7 @@ public class ProcessParameterPanel extends CPanel implements VetoableChangeListe
/** /**
* *
*/ */
private static final long serialVersionUID = 3871379020889713432L; private static final long serialVersionUID = -111202562692738248L;
/** /**
* Dynamic generated Parameter panel. * Dynamic generated Parameter panel.
@ -638,6 +639,64 @@ public class ProcessParameterPanel extends CPanel implements VetoableChangeListe
return true; return true;
} // saveParameters } // saveParameters
/*
* load parameters from saved instance
*/
public boolean loadParameters(MPInstance instance)
{
log.config("");
MPInstancePara[] params = instance.getParameters();
for (int j = 0; j < m_mFields.size(); j++)
{
GridField mField = (GridField)m_mFields.get(j);
// Get Values
VEditor editor = (VEditor)m_vEditors.get(j);
VEditor editor2 = (VEditor)m_vEditors2.get(j);
editor.setValue(null);
if (editor2 != null)
editor2.setValue(null);
for ( int i = 0; i<params.length; i++)
{
MPInstancePara para = params[i];
para.getParameterName();
if ( mField.getColumnName().equals(para.getParameterName()) )
{
if (para.getP_Date() != null || para.getP_Date_To() != null )
{
editor.setValue(para.getP_Date());
if (editor2 != null )
editor2.setValue(para.getP_Date_To());
}
// String
else if ( para.getP_String() != null || para.getP_String_To() != null )
{
editor.setValue(para.getP_String());
if (editor2 != null)
editor2.setValue(para.getP_String_To());
}
else if ( !Env.ZERO.equals(para.getP_Number()) || !Env.ZERO.equals(para.getP_Number_To()) )
{
editor.setValue(para.getP_Number());
if (editor2 != null)
editor2.setValue(para.getP_Number_To());
}
log.fine(para.toString());
break;
}
} // for every saved parameter
} // for every field
return true;
} // saveParameters
/** /**
* Restore window context. * Restore window context.
* @author teo_sarca [ 1699826 ] * @author teo_sarca [ 1699826 ]

View File

@ -21,9 +21,14 @@ import org.adempiere.util.ContextRunnable;
import org.adempiere.util.IProcessUI; import org.adempiere.util.IProcessUI;
import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.component.Button; import org.adempiere.webui.component.Button;
import org.adempiere.webui.component.Combobox;
import org.adempiere.webui.component.ConfirmPanel; import org.adempiere.webui.component.ConfirmPanel;
import org.adempiere.webui.component.Grid;
import org.adempiere.webui.component.GridFactory;
import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.Mask; import org.adempiere.webui.component.Mask;
import org.adempiere.webui.component.Panel; import org.adempiere.webui.component.Panel;
import org.adempiere.webui.component.Rows;
import org.adempiere.webui.component.Window; import org.adempiere.webui.component.Window;
import org.adempiere.webui.desktop.IDesktop; import org.adempiere.webui.desktop.IDesktop;
import org.adempiere.webui.factory.ButtonFactory; import org.adempiere.webui.factory.ButtonFactory;
@ -36,16 +41,21 @@ import org.adempiere.webui.window.FDialog;
import org.adempiere.webui.window.MultiFileDownloadDialog; import org.adempiere.webui.window.MultiFileDownloadDialog;
import org.adempiere.webui.window.SimplePDFViewer; import org.adempiere.webui.window.SimplePDFViewer;
import org.compiere.Adempiere; import org.compiere.Adempiere;
import org.compiere.model.MPInstance;
import org.compiere.model.MPInstancePara;
import org.compiere.model.MProcess;
import org.compiere.model.X_AD_CtxHelp; import org.compiere.model.X_AD_CtxHelp;
import org.compiere.print.ReportEngine; import org.compiere.print.ReportEngine;
import org.compiere.process.ProcessInfo; import org.compiere.process.ProcessInfo;
import org.compiere.process.ProcessInfoLog; import org.compiere.process.ProcessInfoLog;
import org.compiere.process.ProcessInfoUtil; import org.compiere.process.ProcessInfoUtil;
import org.compiere.util.AdempiereSystemError;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.DisplayType; 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.zkoss.zhtml.Table; import org.zkoss.zhtml.Table;
import org.zkoss.zhtml.Td; import org.zkoss.zhtml.Td;
import org.zkoss.zhtml.Text; import org.zkoss.zhtml.Text;
@ -62,11 +72,12 @@ import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.A; import org.zkoss.zul.A;
import org.zkoss.zul.Borderlayout; import org.zkoss.zul.Borderlayout;
import org.zkoss.zul.Center; import org.zkoss.zul.Center;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Div; import org.zkoss.zul.Div;
import org.zkoss.zul.Hlayout; import org.zkoss.zul.Hbox;
import org.zkoss.zul.Html; import org.zkoss.zul.Html;
import org.zkoss.zul.Label;
import org.zkoss.zul.North; import org.zkoss.zul.North;
import org.zkoss.zul.Row;
import org.zkoss.zul.South; import org.zkoss.zul.South;
import com.lowagie.text.Document; import com.lowagie.text.Document;
@ -107,7 +118,7 @@ public class ProcessDialog extends Window implements EventListener<Event>, IProc
/** /**
* *
*/ */
private static final long serialVersionUID = 6316822220179816250L; private static final long serialVersionUID = -899849696748614034L;
private static final String MESSAGE_DIV_STYLE = "max-height: 150pt; overflow: auto; margin: 10px;"; private static final String MESSAGE_DIV_STYLE = "max-height: 150pt; overflow: auto; margin: 10px;";
private Div messageDiv; private Div messageDiv;
@ -117,6 +128,10 @@ public class ProcessDialog extends Window implements EventListener<Event>, IProc
private List<File> downloadFiles; private List<File> downloadFiles;
private boolean showLastRun = false;
private Grid southRowPanel = GridFactory.newGridLayout();
/** /**
* Dialog to start a process/report * Dialog to start a process/report
* @param ctx * @param ctx
@ -139,6 +154,11 @@ public class ProcessDialog extends Window implements EventListener<Event>, IProc
Env.setContext(Env.getCtx(), m_WindowNo, "IsSOTrx", isSOTrx ? "Y" : "N"); Env.setContext(Env.getCtx(), m_WindowNo, "IsSOTrx", isSOTrx ? "Y" : "N");
try try
{ {
MProcess process = new MProcess(m_ctx, m_AD_Process_ID, null);
int count = process.getParameters().length;
if (count > 0)
showLastRun = true;
initComponents(); initComponents();
init(); init();
addEventListener(WindowContainer.ON_WINDOW_CONTAINER_SELECTION_CHANGED_EVENT, this); addEventListener(WindowContainer.ON_WINDOW_CONTAINER_SELECTION_CHANGED_EVENT, this);
@ -174,26 +194,48 @@ public class ProcessDialog extends Window implements EventListener<Event>, IProc
center.setAutoscroll(true); center.setAutoscroll(true);
center.setStyle("border: none"); center.setStyle("border: none");
Hlayout hbox = new Hlayout(); Rows rows = southRowPanel.newRows();
Row row = rows.newRow();
Hbox hBox = new Hbox();
hBox.appendChild(lSaved);
fSavedName.addEventListener(Events.ON_CHANGE, this);
hBox.appendChild(fSavedName);
bSave.setEnabled(false);
bSave.addActionListener(this);
hBox.appendChild(bSave);
bDelete.setEnabled(false);
bDelete.addActionListener(this);
hBox.appendChild(bDelete);
row.appendChild(hBox);
if(!showLastRun)
hBox.setVisible(false);
Panel confParaPanel =new Panel();
confParaPanel.setAlign("right");
@SuppressWarnings("unused") @SuppressWarnings("unused")
String label = Msg.getMsg(Env.getCtx(), "Start"); String label = Msg.getMsg(Env.getCtx(), "Start");
// Invert - Unify OK/Cancel IDEMPIERE-77 // Invert - Unify OK/Cancel IDEMPIERE-77
bOK = ButtonFactory.createNamedButton(ConfirmPanel.A_OK, true, true); bOK = ButtonFactory.createNamedButton(ConfirmPanel.A_OK, true, true);
bOK.setId("Ok"); bOK.setId("Ok");
bOK.addEventListener(Events.ON_CLICK, this); bOK.addEventListener(Events.ON_CLICK, this);
hbox.appendChild(bOK); confParaPanel.appendChild(bOK);
Button btn = ButtonFactory.createNamedButton(ConfirmPanel.A_CANCEL, true, true); bCancel = ButtonFactory.createNamedButton(ConfirmPanel.A_CANCEL, true, true);
btn.setId("Cancel"); bCancel.setId("Cancel");
btn.addEventListener(Events.ON_CLICK, this); bCancel.addEventListener(Events.ON_CLICK, this);
hbox.appendChild(btn); confParaPanel.appendChild(bCancel);
hbox.setStyle("padding: 10px; margin: auto; overflow: visible;"); row.appendChild(confParaPanel);
hbox.setHflex("min");
South south = new South(); South south = new South();
south.setSclass("dialog-footer"); south.setSclass("dialog-footer");
layout.appendChild(south); layout.appendChild(south);
south.appendChild(hbox); south.appendChild(southRowPanel);
this.appendChild(layout); this.appendChild(layout);
} }
@ -209,6 +251,7 @@ public class ProcessDialog extends Window implements EventListener<Event>, IProc
private Panel centerPanel = null; private Panel centerPanel = null;
private Html message = null; private Html message = null;
private Button bOK = null; private Button bOK = null;
private Button bCancel = null;
private boolean valid = true; private boolean valid = true;
@ -229,6 +272,13 @@ public class ProcessDialog extends Window implements EventListener<Event>, IProc
private static final String ON_STATUS_UPDATE = "onStatusUpdate"; private static final String ON_STATUS_UPDATE = "onStatusUpdate";
private static final String ON_COMPLETE = "onComplete"; private static final String ON_COMPLETE = "onComplete";
//saved parameters
private Combobox fSavedName=new Combobox();
private Button bSave=ButtonFactory.createNamedButton("Save");
private Button bDelete=ButtonFactory.createNamedButton("Delete");
private List<MPInstance> savedParams;
private Label lSaved=new Label(Msg.getMsg(Env.getCtx(), "SavedParameter"));
/** /**
* Set Visible * Set Visible
* (set focus to OK if visible) * (set focus to OK if visible)
@ -330,9 +380,24 @@ public class ProcessDialog extends Window implements EventListener<Event>, IProc
{ {
startProcess(); startProcess();
} }
querySaved();
return true; return true;
} // init } // init
private void querySaved()
{
//user query
savedParams = MPInstance.get(Env.getCtx(), m_AD_Process_ID, Env.getContextAsInt(Env.getCtx(), "#AD_User_ID"));
fSavedName.removeAllItems();
for (MPInstance instance : savedParams)
{
String queries = instance.get_ValueAsString("Name");
fSavedName.appendItem(queries);
}
fSavedName.setValue("");
}
public void startProcess() public void startProcess()
{ {
m_pi.setPrintPreview(true); m_pi.setPrintPreview(true);
@ -379,6 +444,14 @@ public class ProcessDialog extends Window implements EventListener<Event>, IProc
public void onEvent(Event event) { public void onEvent(Event event) {
Component component = event.getTarget(); Component component = event.getTarget();
String saveName = null;
boolean lastRun = false;
if (fSavedName.getRawText() != null) {
saveName = fSavedName.getRawText();
lastRun = ("** " + Msg.getMsg(Env.getCtx(), "LastRun") + " **")
.equals(saveName);
}
if(component instanceof A && event.getName().equals((Events.ON_CLICK))){ if(component instanceof A && event.getName().equals((Events.ON_CLICK))){
doOnClick((A)component); doOnClick((A)component);
} else if (component instanceof Button) { } else if (component instanceof Button) {
@ -393,6 +466,59 @@ public class ProcessDialog extends Window implements EventListener<Event>, IProc
restart(); restart();
} else if ("Cancel".equalsIgnoreCase(element.getId())) { } else if ("Cancel".equalsIgnoreCase(element.getId())) {
this.dispose(); this.dispose();
} else if (event.getTarget().equals(bSave) && fSavedName != null
&& !lastRun) {
// Update existing
if (fSavedName.getSelectedIndex() > -1 && savedParams != null) {
for (int i = 0; i < savedParams.size(); i++) {
if (savedParams.get(i).getName().equals(saveName)) {
m_pi.setAD_PInstance_ID(savedParams.get(i)
.getAD_PInstance_ID());
for (MPInstancePara para : savedParams.get(i)
.getParameters()) {
para.deleteEx(true);
}
parameterPanel.saveParameters();
}
}
}
// create new
else {
MPInstance instance = null;
try {
instance = new MPInstance(Env.getCtx(),
m_pi.getAD_Process_ID(), m_pi.getRecord_ID());
instance.setName(saveName);
instance.saveEx();
m_pi.setAD_PInstance_ID(instance.getAD_PInstance_ID());
// Get Parameters
if (parameterPanel != null) {
if (!parameterPanel.saveParameters()) {
throw new AdempiereSystemError(Msg.getMsg(
Env.getCtx(), "SaveParameterError"));
}
}
} catch (Exception ex) {
log.log(Level.SEVERE, ex.getLocalizedMessage(), ex);
}
}
querySaved();
fSavedName.setSelectedItem(getComboItem(saveName));
}
else if (event.getTarget().equals(bDelete) && fSavedName != null
&& !lastRun) {
Object o = fSavedName.getSelectedItem();
if (savedParams != null && o != null) {
String selected = fSavedName.getSelectedItem().getLabel();
for (int i = 0; i < savedParams.size(); i++) {
if (savedParams.get(i).getName().equals(selected)) {
savedParams.get(i).deleteEx(true);
}
}
}
querySaved();
} }
} else if (event.getName().equals(ON_STATUS_UPDATE)) { } else if (event.getName().equals(ON_STATUS_UPDATE)) {
onStatusUpdate(event); onStatusUpdate(event);
@ -400,8 +526,36 @@ public class ProcessDialog extends Window implements EventListener<Event>, IProc
onComplete(); onComplete();
} else if (event.getName().equals(WindowContainer.ON_WINDOW_CONTAINER_SELECTION_CHANGED_EVENT)) { } else if (event.getName().equals(WindowContainer.ON_WINDOW_CONTAINER_SELECTION_CHANGED_EVENT)) {
SessionManager.getAppDesktop().updateHelpContext(X_AD_CtxHelp.CTXTYPE_Process, m_AD_Process_ID); SessionManager.getAppDesktop().updateHelpContext(X_AD_CtxHelp.CTXTYPE_Process, m_AD_Process_ID);
} else if (event.getTarget().equals(fSavedName)) {
if (savedParams != null && saveName != null) {
for (int i = 0; i < savedParams.size(); i++) {
if (savedParams.get(i).getName().equals(saveName)) {
loadSavedParams(savedParams.get(i));
}
}
}
boolean enabled = !Util.isEmpty(saveName);
bSave.setEnabled(enabled && !lastRun);
bDelete.setEnabled(enabled && fSavedName.getSelectedIndex() > -1
&& !lastRun);
} }
}
public Comboitem getComboItem( String value) {
Comboitem item = null;
for (int i = 0; i < fSavedName.getItems().size(); i++) {
if (fSavedName.getItems().get(i) != null) {
item = (Comboitem)fSavedName.getItems().get(i);
if (value.equals(item.getLabel().toString())) {
break;
}
}
}
return item;
}
private void loadSavedParams(MPInstance instance) {
parameterPanel.loadParameters(instance);
} }
private void doOnClick(A btn) { private void doOnClick(A btn) {

View File

@ -44,6 +44,7 @@ import org.compiere.model.GridField;
import org.compiere.model.GridFieldVO; import org.compiere.model.GridFieldVO;
import org.compiere.model.MClient; import org.compiere.model.MClient;
import org.compiere.model.MLookup; import org.compiere.model.MLookup;
import org.compiere.model.MPInstance;
import org.compiere.model.MPInstancePara; import org.compiere.model.MPInstancePara;
import org.compiere.process.ProcessInfo; import org.compiere.process.ProcessInfo;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
@ -71,7 +72,7 @@ public class ProcessParameterPanel extends Panel implements
/** /**
* *
*/ */
private static final long serialVersionUID = -5996487688479454715L; private static final long serialVersionUID = -6089753824709746119L;
private String width; private String width;
@ -429,6 +430,64 @@ public class ProcessParameterPanel extends Panel implements
return true; return true;
} // validateParameters } // validateParameters
/*
* load parameters from saved instance
*/
public boolean loadParameters(MPInstance instance)
{
log.config("");
MPInstancePara[] params = instance.getParameters();
for (int j = 0; j < m_mFields.size(); j++)
{
GridField mField = (GridField)m_mFields.get(j);
// Get Values
WEditor editor = (WEditor)m_wEditors.get(j);
WEditor editor2 = (WEditor)m_wEditors2.get(j);
editor.setValue(null);
if (editor2 != null)
editor2.setValue(null);
for ( int i = 0; i<params.length; i++)
{
MPInstancePara para = params[i];
para.getParameterName();
if ( mField.getColumnName().equals(para.getParameterName()) )
{
if (para.getP_Date() != null || para.getP_Date_To() != null )
{
editor.setValue(para.getP_Date());
if (editor2 != null )
editor2.setValue(para.getP_Date_To());
}
// String
else if ( para.getP_String() != null || para.getP_String_To() != null )
{
editor.setValue(para.getP_String());
if (editor2 != null)
editor2.setValue(para.getP_String_To());
}
else if ( !Env.ZERO.equals(para.getP_Number()) || !Env.ZERO.equals(para.getP_Number_To()) )
{
editor.setValue(para.getP_Number());
if (editor2 != null)
editor2.setValue(para.getP_Number_To());
}
log.fine(para.toString());
break;
}
} // for every saved parameter
} // for every field
return true;
} // loadParameters
/** /**
* Save Parameter values * Save Parameter values

View File

@ -18,6 +18,8 @@
package org.adempiere.webui.editor; package org.adempiere.webui.editor;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.math.BigDecimal;
import java.sql.Timestamp;
import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener; import javax.swing.event.ListDataListener;
@ -255,7 +257,7 @@ ContextMenuListener, IZoomableEditor
return; return;
} }
if (value != null && (value instanceof Integer || value instanceof String)) if (value != null && (value instanceof Integer || value instanceof String || value instanceof Timestamp || value instanceof BigDecimal))
{ {
getComponent().setValue(value); getComponent().setValue(value);