我使用QuickBooks PHP DevKit获取每位客户的发票。这样可以正常工作,但是我需要从发票中的每一行获取每个项目以简单地显示它,并且由于某种原因我很难获得这些信息。
我可以使用
获取ItemRef$Item = $Line->getSalesItemLineDetail();
$itemRef = $Item->getItemRef();
但它会抛出一个致命错误:"在非对象上调用成员函数getItemRef()"并杀死剧本。
这是我的代码。
//get QuickBooks customer ID
$customers = $CustomerService->query($Context, $realm, "SELECT * FROM Customer WHERE id = '18' ");
if (count($customers))
{
foreach ($customers as $Customer)
{
$invoices = $InvoiceService->query($Context, $realm, "SELECT * FROM Invoice WHERE CustomerRef = '" . QuickBooks_IPP_IDS::usableIDType($Customer->getId()) . "' ");
if (count($invoices))
{
foreach ($invoices as $Invoice)
{
echo $Invoice->getTotalAmt();
$line_count = $Invoice->countLine();
for ($i = 0; $i < $line_count; $i++)
{
$Line = $Invoice->getLine($i);
//print_r($Line);
$Item = $Line->getSalesItemLineDetail();
$itemRef = $Item->getItemRef();
$item = $ItemService->query($Context, $realm, "SELECT * FROM Item WHERE id = '" . QuickBooks_IPP_IDS::usableIDType($itemRef) . "' ");
foreach($item as $Item){
echo $Item->getName();
}
}
}
}
else
{
print(' This customer has no invoices.<br>');
}
}
}
else
{
print('There are no customers with the provided ID');
}
简而言之,在发票的每一行中查询项目的正确方法是什么?
答案 0 :(得分:3)
这里有一些值得注意的事情,而且很难确切地说出你的代码究竟发生了什么......所以这里有一些事情需要检查:
<强> 1。确保您提取订单项:
默认情况下,Intuit的某些查询不会返回订单项。这对于PHP或其他任何东西都不是特定的,它只是Intuit的API工作方式。
如果您想要订单项,则可能需要执行以下查询:
SELECT *, Line.* FROM Invoice WHERE Id = '5'
<强> 2。并非每个订单项都会有SalesItemLineDetail
个节点。
订单项可以包含各种不同的详细信息节点。某些订单项可能包含SalesItemLineDetail
个节点,而其他订单项可能包含DiscountLineDetail
个节点,而其他订单项可能包含其他类型。
在此处查看可能性:
所以,像这样的声明:
是不安全的$Line = $Invoice->getLine(0);
$Item = $Line->getSalesItemLineDetail();
$itemRef = $Item->getItemRef();
因为您尝试获取的SalesItemLineDetail
节点可能不存在,这会导致$Item
为NULL
,这会导致print($IPP->lastRequest());
print($IPP->lastResponse());
一个错误。
第3。调试!强>
对您而言可能有用的一件事(当您发布寻求帮助时肯定会有所帮助)将是查看您从Intuit获得的实际XML响应。
您可以这样做:
print_r($Line);
这将转储一些有用的调试输出。您还可以打印出对象:
$num_lines = $Invoice->countLine(); // How many line items are there?
for ($i = 0; $i < $num_lines; $i++)
{
$Line = $Invoice->getLine(0);
// Let's find out what detail type this uses - only fetching item lines here
if ($Line->getDetailType() == 'SalesItemLineDetail')
{
$Detail = $Line->getSalesItemLineDetail();
$item_id = $Detail->getItemRef();
print('Item id is: ' . $item_id . "\n");
// Query for the item
$items = $ItemService->query($Context, $realm, "SELECT * FROM Item WHERE Id = '" . QuickBooks_IPP_IDS::usableIDType($item_id) . "' ");
print(' That item is named: ' . $items[0]->getName() . "\n");
}
}
这也可以帮助您追踪问题。
<强> 4。最后 - 一个有效的例子!
这是一个适合你的例子:
简而言之,您想要做的是:
{{1}}