# Can't seem to get the adapterPO.ChangeApproveSwitch to work?
**Category:** [Epicor ERP 10](https://www.epiusers.help/c/e10/5)
**Created:** 2016-09-22 14:02 UTC
**Views:** 3717
**Replies:** 13
**URL:** https://www.epiusers.help/t/cant-seem-to-get-the-adapterpo-changeapproveswitch-to-work/35484
---
## Post #1 by @DurangoBurke
I'm trying to be able to approve/unapproved a Purchase Order via C# in Epicor 10. I'm able to get ahold of a PO with the POAdapter, but I can't seem to get following switch method to work adapterPO.ChangeApproveSwitch(approveValue, out violationMsg);?
When I run this nothing changes on the PO specified and I get a message from the switch method that no changes were made.
private void CallPOAdapterChangeApproveSwitchMethod()
{
try
{
// Declare and Initialize EpiDataView Variables
// Declare and create an instance of the Adapter.
POAdapter adapterPO = new POAdapter(this.oTrans);
adapterPO.BOConnect();
int intPONumber = 5003180;
System.Data.DataSet adapterPODS = adapterPO.GetData(intPONumber);
// Declare and Initialize Variables
bool approveValue = false;
System.String violationMsg;
// Call Adapter method
bool result = adapterPO.ChangeApproveSwitch(approveValue, out violationMsg);
adapterPO.Update();
oTrans.Update();
---
## Post #2 by @rbucek
did you try and set the RowMod = 'U'?
---
## Post #3 by @bw2868bond
And set the Approved value to “A” or “U”
---
## Post #4 by @DurangoBurke
I tried to add the RowMod = “U” and set the ApprovalStatus to “U” but I still can’t get it to unapproved the PO. I can however Approve an unapproved PO by setting Approve = true and the ApprovalStatus = “A”, I just can’t go the other way. Here is the message that I think the switch is throwing…
[cid:image001.png@01D214BF.12CA1BB0]
// Declare and create an instance of the Adapter
POAdapter adapterPO = new POAdapter(this.oTrans);
adapterPO.BOConnect();
int intPONumber = 5003180;
System.Data.DataSet dataset = adapterPO.GetData(intPONumber);
bool poAdapt = adapterPO.GetByID(intPONumber);
if((poAdapt))
{
MessageBox.Show("PONum from POAdapt = " + adapterPO.POData.POHeader[0]["PONum"].ToString() + " Status from POAdapt = " + adapterPO.POData.POHeader[0]["ApprovalStatus"].ToString());
}
// Declare and Initialize Variables
System.String violationMsg;
// Call Adapter method
bool result = adapterPO.ChangeApproveSwitch(false, out violationMsg);
if (dataset != null)
{
if(dataset.Tables["POHeader"]!= null && dataset.Tables["POHeader"].Rows.Count > 0)
{
DataTable dt = dataset.Tables["POHeader"];
for (int i = 0; i < dt.Rows.Count; i++)
{
MessageBox.Show("B4 Adapter Approval Status " + adapterPO.POData.POHeader[i]["ApprovalStatus"].ToString());
//dt.Rows[i]["Approve"] = false;
dt.Rows[i]["ApprovalStatus"] = "U";
dt.Rows[i]["RowMod"] = "U";
MessageBox.Show("After Adapter Approval Status " + adapterPO.POData.POHeader[i]["ApprovalStatus"].ToString());
adapterPO.Update();
oTrans.Update();
}
}
}
// Cleanup Adapter Reference
adapterPO.Dispose();
---
## Post #5 by @rbucek
just cuz i have to ask... you ran a trace file from the UI to take a look at methods and params normally being called?
---
## Post #6 by @DurangoBurke
Here is what it sends to the log when I use the UI to unapproved a PO…
tracePacket>
businessObject>Erp.Proxy.BO.POImpl
methodName>ChangeApproveSwitch
returnType>System.Void
localTime>9/22/2016 13:08:19:7743097 PM
parameter name="ApproveValue" type="System.Boolean">
parameter name="ViolationMsg" type="System.String">
parameter name="ds" type="PODataSet">
PODataSet xmlns="http://www.epicor.com/Ice/300/BO/PO/PO" />
paramDataSetChanges>
paramDataSet name="ds" useDataSetNbr="0">
changedValue tableName="POHeader" rowState="Modified" rowNum="0" colName="RowMod">
changedValue tableName="POHeader" rowState="Modified" rowNum="0" colName="UD_SysRevID">
businessObject>Erp.Proxy.BO.POImpl
methodName>Update
returnType>System.Void
parameters>
parameter name="ds" type="PODataSet">
PODataSet xmlns="http://www.epicor.com/Ice/300/BO/PO/PO" />
paramDataSetChanges>
paramDataSet name="ds" useDataSetNbr="0">
changedValue tableName="POHeader" rowState="Modified" rowNum="0" colName="ReadyToPrint">
changedValue tableName="POHeader" rowState="Modified" rowNum="0" colName="Approve">
changedValue tableName="POHeader" rowState="Modified" rowNum="0" colName="RowMod">
changedValue tableName="POHeader" rowState="Modified" rowNum="0" colName="UD_SysRevID">
---
## Post #7 by @DurangoBurke
There seems to be a parameter name="ds" type="PODataSet" that needs to be sent to the ChangeApproveSwitch, but I don't really know what to pass via code?
---
## Post #8 by @rbucek
i notice you are declaring a datatable, maybe it wants to work with a dataset?
DataSet ds = dataset.Tables["POHeader"]; ?
---
## Post #9 by @rbucek
also curious what the ForLoop is for? GetbyID returns a single POHeader record, if you were passing a list i could see it...
---
## Post #10 by @bw2868bond
We use a Service Connect workflow to unlock releases once a month so we can catch specific PO changes. In order to do this, approved POs need to be un-approved , the releases unlocked and the PO approved again.
The steps taken by the workflow are:
GetRows where PONum =
ChangeApproveSwitch using the ApproveValue _and_ the POHeader.Approve value set to be same as the ApproveValue parameter in the method call, POHeader.ApprovalStatus set to 'U' or 'A' depending on ApproveValue and POHeader.RowMod set to 'U'
After the ChangeApproveSwitch method is invoked, the Update method is invoked
so for us to change the approval, the method needs to be called with 3 fields changed in the POHeader table followed by the Update method
---
## Post #11 by @DurangoBurke
Good point. I just copied the code that I was using to loop through the PO Releases and changed it up for the PO Header.
---
## Post #12 by @rbucek
David ,
this should work for you
```cs
using System;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Windows.Forms;
using Erp.Adapters;
using Erp.UI;
using Ice.Lib;
using Ice.Adapters;
using Ice.Lib.Customization;
using Ice.Lib.ExtendedProps;
using Ice.Lib.Framework;
using Ice.Lib.Searches;
using Ice.UI.FormFunctions;
using Erp.BO;
public class Script
{
// ** Wizard Insert Location - Do Not Remove 'Begin/End Wizard Added Module Level Variables' Comments! **
// Begin Wizard Added Module Level Variables **
// End Wizard Added Module Level Variables **
// Add Custom Module Level Variables Here **
private EpiBaseAdapter oTrans_adapter;
EpiDataView edvPOHeader;
public void InitializeCustomCode()
{
// ** Wizard Insert Location - Do not delete 'Begin/End Wizard Added Variable Initialization' lines **
// Begin Wizard Added Variable Initialization
// End Wizard Added Variable Initialization
this.oTrans_adapter = ((EpiBaseAdapter)(this.csm.TransAdaptersHT["oTrans_adapter"]));
this.edvPOHeader = ((EpiDataView)(this.oTrans.EpiDataViews["POHeader"]));
// Begin Wizard Added Custom Method Calls
this.toad.Click += new System.EventHandler(this.toad_Click);
// End Wizard Added Custom Method Calls
}
public void DestroyCustomCode()
{
// ** Wizard Insert Location - Do not delete 'Begin/End Wizard Added Object Disposal' lines **
// Begin Wizard Added Object Disposal
this.toad.Click -= new System.EventHandler(this.toad_Click);
// End Wizard Added Object Disposal
// Begin Custom Code Disposal
// End Custom Code Disposal
}
private void tool_Click(object sender, System.EventArgs args)
{
POAdapter adapterPO = new POAdapter(this.oTrans);
adapterPO.BOConnect();
PODataSet POdata;
int intPONumber = Convert.ToInt32(edvPOHeader.dataView[edvPOHeader.Row]["PONum"]);
adapterPO.GetByID(intPONumber);
POdata = adapterPO.POData;
// Declare and Initialize Variables
System.String violationMsg;
// Call Adapter method
if (POdata != null)
{
if (POdata.Tables["POHeader"] != null && POdata.Tables["POHeader"].Rows.Count > 0)
{
string cOrderChangedMsgText = string.Empty;
PODataSet.POHeaderRow poHd = (PODataSet.POHeaderRow)POdata.POHeader[0];
poHd.ApprovalStatus = "U";
poHd.RowMod = "U";
adapterPO.ChangeApproveSwitch(false, out violationMsg);
adapterPO.chkPODatesChanges(out cOrderChangedMsgText, "POHeader");
adapterPO.Update();
oTrans.Refresh();
}
}
// Cleanup Adapter Reference
adapterPO.Dispose();
}
}
```
---
## Post #13 by @DurangoBurke
Woot Woot! Thank you very much for your assistance. The codes supplied worked like a champ!
---
## Post #14 by @rbucek
glad to hear it, feel free to mark the topic as solved :slight_smile:
---
**Canonical:** https://www.epiusers.help/t/cant-seem-to-get-the-adapterpo-changeapproveswitch-to-work/35484
**Original content:** https://www.epiusers.help/t/cant-seem-to-get-the-adapterpo-changeapproveswitch-to-work/35484