QuickBooks POS SDK Добавить данные пользовательского поля клиента: DataExtAdd
Кто-нибудь может помочь с добавлением данных в пользовательское поле, определенное пользовательским интерфейсом в QuickBooks POS 2013?
Я пытаюсь добавить данные в пользовательское поле, определенное пользовательским интерфейсом (поле было создано и отображено в пользовательском интерфейсе POS, а не путем программирования; поэтому OnwerID имеет значение "0") при добавлении нового клиента с веб-страницы.
Я использую: создание приложения в Microsoft Visual Studio 2012 WebForms, C# .NET, QBPOSFC3Lib, общение с QB POS 2013 Pro. Приложение и QBPOS-сервер оба включены / открыты и работают на одном сервере.
Цель: клиент вводит информацию на веб-страницу. Данные включают в себя 11 атрибутов, которые QBPOS отслеживает как часть своего основного программирования, и 7 атрибутов, которые необходимо записать и которые определены в пользовательских полях пользовательского интерфейса. После того, как клиент вводит информацию и данные проверяются методами (не включенными в приведенный ниже код) для форматирования и требований, запускается приведенный ниже код для отправки данных на QBPOS-сервер. Примечание. Команда AddCustomer работает на 100%.
Процесс программы: В приведенном ниже коде я делаю запрос на добавление клиента (CstReq) и получаю ответ на добавление клиента (CstResp) только для ListID. Использование одного метода 7 раз для создания 7 запросов на добавление данных в пользовательские поля (я закомментировал 6 из 7 как "возможно, это проблема" и тестирование только с одним DataExtAddRq) с CIDResp ListID (я не спрашиваю (в программе) или нужен ответ для DataExtAddRq). Затем EndSession и CloseConnection (для отладки я заканчиваю и закрываю после CstReq и открываю перед DataExtAdd, без изменений в результате).
Проблема: DataExtAddRq не добавляет информацию в пользовательские поля. После того, как клиент сделан и программа обращается к части DataExtAdd, он добавляет те же данные клиента в QBPOS и не добавляет данные Ext (var requestMsgSet обнуляется перед DataExtAdd).
Код в вопросе:
protected void DoCustomerAdd()
{
bool sessionBegun = false;
bool connectionOpen = false;
QBPOSSessionManager sessionManager = null;
try
{
String custDateOfBirth = KEY_BIRTHDATE.Text;
String custExpLevel = KEY_EXPERIENCE.Text;
String custCNum = KEY_C_NUM.Text;
String custCExpDate = KEY_C_EXP.Text;
String custMemCardNun = textMembershipNumber.Text;
String custIDNum = KEY_ID_NUM.Text;
String custWaiverAppr = "Yes";
//Create the session Manager object
sessionManager = new QBPOSSessionManager();
//Create the message set request object to hold our request
IMsgSetRequest requestMsgSet = sessionManager.CreateMsgSetRequest(3, 0);
requestMsgSet.Attributes.OnError = ENRqOnError.roeContinue;
BuildCustomerAddRq(requestMsgSet);//Call
//Connect to QuickBooks and begin a session
sessionManager.OpenConnection("AddCust", "MyApp");
connectionOpen = true;
sessionManager.BeginSession("");
sessionBegun = true;
//Send the request to QuickBooks and get response
IMsgSetResponse responseMsgSet = sessionManager.DoRequests(requestMsgSet);
//look at response and get customer list id, needed for adding custom fields
IResponse response = responseMsgSet.ResponseList.GetAt(0);
ICustomerRet CustomerRet = (ICustomerRet)response.Detail;
string custListID = CustomerRet.ListID.GetValue();
//End the session and close the connection to QuickBooks
sessionManager.EndSession();
sessionBegun = false;
sessionManager.CloseConnection();
connectionOpen = false;
requestMsgSet = null;
//////////////////////////////////////////////////////////////////////////////
//Create the session Manager object
sessionManager = new QBPOSSessionManager();
//Create the message set request object to hold our request
requestMsgSet = sessionManager.CreateMsgSetRequest(3, 0);
requestMsgSet.Attributes.OnError = ENRqOnError.roeContinue;
AddCustomerCustField(requestMsgSet, custListID, "C Number", custCNum);
//Connect to QuickBooks and begin a session
sessionManager.OpenConnection("AddCust", "MyApp");
connectionOpen = true;
sessionManager.BeginSession("");
sessionBegun = true;
//add to customfields
sessionManager.DoRequests(requestMsgSet);
/*/
AddCustomerCustField(requestMsgSet, custListID, "Experience Level", custExpLevel);
AddCustomerCustField(requestMsgSet, custListID, "Date of Birth", custDateOfBirth);
sessionManager.DoRequests(requestMsgSet);
AddCustomerCustField(requestMsgSet, custListID, "C Number", custCNum);
sessionManager.DoRequests(requestMsgSet);
AddCustomerCustField(requestMsgSet, custListID, "C Experation Date", custCExpDate);
sessionManager.DoRequests(requestMsgSet);
AddCustomerCustField(requestMsgSet, custListID, "Member Number", custMemCardNun);
sessionManager.DoRequests(requestMsgSet);
AddCustomerCustField(requestMsgSet, custListID, "Waiver Approved", custWaiverAppr);
sessionManager.DoRequests(requestMsgSet);
AddCustomerCustField(requestMsgSet, custListID, "ID Number", custDrivLiceNum);
sessionManager.DoRequests(requestMsgSet);
/*/
sessionManager.EndSession();
sessionBegun = false;
sessionManager.CloseConnection();
connectionOpen = false;
}
catch (Exception q)
{
if (sessionBegun) { } //sessionManager.EndSession();
if (connectionOpen) { } //sessionManager.CloseConnection();
}
} //End DoCustomerAdd
void BuildCustomerAddRq(IMsgSetRequest requestMsgSet)
{
String CustFirstName = KEY_FIRST_NAME.Text;
String CustLastName = KEY_LAST_NAME.Text;
//String CustCompanyName = TextBox.Text;
String CustEMail = KEY_EMAIL.Text;
bool CustIsOkToEMail = emailList.Checked;
String CustPhone2 = KEY_PHONE.Text;
String CustStreet = KEY_ADDRESS.Text;
String CustCity = KEY_CITY.Text;
String CustState = KEY_STATE.Text;
String CustPostalCode = KEY_ZIP.Text;
String CustCountry = "US";
String CustType = textResultMembershipLevel.Text;
ICustomerAdd CustomerAddRq = requestMsgSet.AppendCustomerAddRq();
//Set field value's
//CustomerAddRq.CompanyName.SetValue(CustCompanyName);
CustomerAddRq.EMail.SetValue(CustEMail);
CustomerAddRq.IsOkToEMail.SetValue(CustIsOkToEMail);
CustomerAddRq.FirstName.SetValue(CustFirstName);
CustomerAddRq.LastName.SetValue(CustLastName);
CustomerAddRq.Phone2.SetValue(CustPhone2); //Cell
CustomerAddRq.BillAddress.City.SetValue(CustCity);
CustomerAddRq.BillAddress.Country.SetValue(CustCountry);
CustomerAddRq.BillAddress.PostalCode.SetValue(CustPostalCode);
CustomerAddRq.BillAddress.State.SetValue(CustState);
CustomerAddRq.BillAddress.Street.SetValue(CustStreet);
CustomerAddRq.CustomerType.SetValue(CustType);
} //End BuildCustomerAddRq
public void AddCustomerCustField(IMsgSetRequest requestMsgSet, String custListID, String fieldName, String enterData)
{
IDataExtAdd DataExtAddRq = requestMsgSet.AppendDataExtAddRq();
DataExtAddRq.OwnerID.SetValue("0"); //field visable in UI so it is "0"
DataExtAddRq.DataExtName.SetValue(fieldName); //name of field
string ORDataExtOwnerElementType = "ListDataExt";
if (ORDataExtOwnerElementType == "ListDataExt")
{
//set for customer add
DataExtAddRq.ORDataExtOwner.ListDataExt.ListDataExtType.SetValue(ENListDataExtType.ldetCustomer);
//give list id for cust
DataExtAddRq.ORDataExtOwner.ListDataExt.ListObjRef.ListID.SetValue(custListID);
}
if (ORDataExtOwnerElementType == "OtherDataExtType")
{
//Set field value for OtherDataExtType
DataExtAddRq.ORDataExtOwner.OtherDataExtType.SetValue(ENOtherDataExtType.odetCompany);
}
//Set field value for DataExtValue
DataExtAddRq.DataExtValue.SetValue(enterData);
} //End AddCustomerCustField
Спасибо за любую помощь, но, пожалуйста, прочитайте анализ, прежде чем помочь.
1 ответ
Я провел некоторое тестирование и обнаружил, что это может быть ошибка, которая вызывает вашу проблему. Я использовал имя настраиваемого поля по умолчанию "Custom 1" и получил ответ об ошибке "Ошибка расширения (Имя расширения данных содержит недопустимые символы: "Custom 1")". Я знаю, что это имя пользовательского поля, и оно активно. Я изменил имя поля на "Custom1" (без пробела) и смог обновить поле.
Глядя на ваш код, кажется, что во всех полях есть пробелы. Я считаю, что в POS SDK есть ошибка, которая не допускает пробелов в именах пользовательских полей. Если вы попытаетесь изменить поля, чтобы не включать пробелы, у вас все еще есть проблема?
Кроме того, имейте в виду, что если при внесении изменений открывается экран клиента, иногда необходимо закрыть его и вернуться к экрану клиента, чтобы увидеть обновления. Он не вызывает обновление экрана, как в QuickBooks.