quickbooks桌面Web连接器qbxml添加作业continueOnError无法正常工作

时间:2015-04-07 19:29:29

标签: quickbooks qbxml

我使用的是QuickBooks Enterprise,Web连接器版本:2.1.0.30以及此处的框架:https://github.com/consolibyte/quickbooks-php
添加作业时,某些情况下存在相同的作业名称,因此Quickbooks会出错。我希望在错误发生后继续进程,因此我将onError属性设置为" continueOnError"如下所述:https://developer-static.intuit.com/qbSDK-current/Common/newOSR/qbsdk/staticHtml/QBD-Attributes.html,但流程停止,下一个请求(添加发票)不会执行。我必须重新运行下一个要处理的请求。 这是我的xml的一部分:

<?xml version="1.0" encoding="utf-8"?>
    <?qbxml version="2.0"?>
    <QBXML>
          <QBXMLMsgsRq onError="continueOnError">
               <CustomerAddRq requestID="...">
                   <CustomerAdd> ...

我在这里做错了什么?这是要走的路还是我需要做其他的事情?
提前致谢。

1 个答案:

答案 0 :(得分:1)

如果当前请求中发生错误,stopOnErrorcontinueOnError标志指示使用当前请求的剩余部分执行(停止或继续)

例如,如果您这样做:

<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="2.0"?>
<QBXML>
      <QBXMLMsgsRq onError="continueOnError">
           <CustomerAddRq requestID="1">
           ...
           </CustomerAddRq>
           <InvoiceAddRq requestID="2">
           ...
           </InvoiceAddRq>
       ....

您告诉QuickBooks,如果CustomerAddRq部分发生错误,请忽略它并继续处理InvoiceAddRq部分(如果您使用stopOnError部分,则不会甚至在遇到InvoiceAddRq部分中的错误后尝试CustomerAddRq

但是,如果您正确使用Web连接器(您是),那么您将发送多个单独的请求,而不是像上面示例中的一个批量请求。这意味着stopOnErrorcontinueOnError不是您需要的。

相反,您需要的是使用错误处理程序处理PHP代码中的错误。

添加功能:

/** 
 * Try to handle an error 
 * 
 * @param string $requestID
 * @param string $user         This is the username of the connected Web Connector user
 * @param string $action       The action type that experienced an error (i.e. QUICKBOOKS_ADD_CUSTOMER, or QUICKBOOKS_QUERY_CUSTOMER, or etc.)
 * @param string $ID           The $ID value of the record that experienced an error (usually your primary key for this record)
 * @param array $extra 
 * @param string $err          If an error occurs **within the error handler**, put an error message here (i.e. if your error handler experienced an internal error), otherwise, leave this NULL
 * @param string $xml
 * @param string $errnum       The error number or error code which occurred
 * @param string $errmsg       The error message received from QuickBooks 
 * @return boolean             Return TRUE if the error was handled and you want to continue processing records, or FALSE otherwise
 */
function my_error_handler($requestID, $user, $action, $ID, $extra, &$err, $xml, $errnum, $errmsg)
{
    // ...
    // return true;     // return TRUE if you want the Web Connector to continue to process requests
    // return false;    // return FALSE if you want the Web Connector to stop processing requests and report the error
}

并确保告诉QuickBooks PHP lib您的新错误处理函数:

$errmap = array(
    // This is an array mapping the error number/code to the error handler function
    3070 => 'my_error_handler', 

    // You can also use static method error handlers if you don't like functions...
    // 3070 => 'MyStaticClass::myStaticMethod', 

    // ... or object instant error handlers.
    // 3070 => array( $MyObjectInstance, 'myMethod' ), 

    // You can also register a "catch-all" error handler to catch all errors:
    // '*' => 'my_catchall_error_handler', 
    );

更多信息: