2016-04-11 4 views
0

KontextWie alle Kassenbons Liste der Quickbooks API

ich den Import Verkaufsdatum in Quickbooks mit einer C# Desktop-Anwendung und die Quickbooks QBFC API.

Ich muss eine Liste der Memo-Werte für alle Verkaufsbelege in der Unternehmensdatei erstellen. Dies liegt daran, dass das Memo eine Verkaufsreferenz enthält, die auf Duplikate überprüft werden muss, bevor ein neuer Verkaufsbeleg importiert werden kann.

Ausgabe

Der Code, den ich derzeit bin mit ist:

IMsgSetRequest requestMsgSet = qbSessionManager.CreateMsgSetRequest("UK", 13, 0); 

ISalesReceiptQuery salesReceiptQuery = requestMsgSet.AppendSalesReceiptQueryRq(); 

salesReceiptQuery.metaData.SetValue(ENmetaData.mdNoMetaData); 
salesReceiptQuery.IncludeRetElementList.Add("Memo"); 

IMsgSetResponse responseMsgSet = qbSessionManager.DoRequests(requestMsgSet); 

IResponseList responseList = responseMsgSet.ResponseList; 

for (int i = 0; i < responseList.Count; i++) 
{ 
    IResponse response = responseList.GetAt(i); 

    if (response.StatusCode == 0) 
    { 
     ExistingOrderIds.Add(response.Detail.ToString()); 
    } 
    else 
    { 
     Log.Error("While building OrderId list. Error returned when listing memos from QuickBooks Sales Receipts"); 
     Log.Error(response.StatusCode + " " + response.StatusMessage + " " + response.Detail); 
    } 
} 

Das gibt nur einen einzigen IResponseList Artikel und response.detail.toString() ergibt "System .__ ComObject". In dieser Unternehmensdatei befinden sich mehrere hundert Verkaufsbelege.

Frage

Was mache ich hier falsch?

+0

so was passiert, wenn Sie den Code debuggen .. zum Beispiel diese Zeile in der for-Schleife 'IResponse response = responseList.GetAt (i);' erhalten Sie alle Elemente hinzugefügt zur 'ExistingOrderIds.Add()' Methode, wenn sie aufgerufen wird ..? – MethodMan

+0

Im Debugger responseList.Count ist immer 1. response.StatusCode ergibt dann Null und ein einzelnes Element wird zu ExistingOrderIds mit dem Wert "System .__ ComObject" hinzugefügt. – ifinlay

+0

Weitere Informationen - Studieren der OSR weiter Ich denke, ich kann die for-Schleife auf dem falschen Level haben. Ich stelle fest, dass IResponse eine "Liste von ISalesReceiptRet-Objekten" enthält. Ich kann das aber nicht in eine lesbare Form bringen. – ifinlay

Antwort

0

Ok, endlich geknackt das. Mein Missverständnis ist, dass Sie auf IResponseList iterieren. Tatsächlich enthält die einzelne IResponseList alle meine Memos in einer Liste von ISalesReceiptRet-Objekten. Daher muss die Iteration in der ISalesReceiptRetList erfolgen. Die QuickBooks OSR-Beispiele sind dabei nicht im Entferntesten klar! So ist der Arbeits Code lautet wie folgt:

IMsgSetRequest requestMsgSet = qbSessionManager.CreateMsgSetRequest("UK", 13, 0); 

ISalesReceiptQuery salesReceiptQuery = requestMsgSet.AppendSalesReceiptQueryRq(); 

salesReceiptQuery.metaData.SetValue(ENmetaData.mdNoMetaData); 
salesReceiptQuery.IncludeRetElementList.Add("Memo"); 

IMsgSetResponse responseMsgSet = qbSessionManager.DoRequests(requestMsgSet); 

IResponse response = responseMsgSet.ResponseList.GetAt(0); 

ISalesReceiptRetList salesReceiptRetList = (ISalesReceiptRetList)response.Detail; 

for (int i = 0; i < salesReceiptRetList.Count; i++) 
{ 
    if (salesReceiptRetList.GetAt(i).Memo != null) 
    { 
     string memo = salesReceiptRetList.GetAt(i).Memo.GetValue(); 

     if (memo != string.Empty) 
     { 
      ExistingOrderIds.Add(memo); 
     } 
    } 
} 
+0

'ExistingOrderIds = salesReceiptRetList.Where (x => false == string.IsNullOrWhiteSpace (x.Memo)) .Wählen Sie (x => x.Memo.GetValue()). ToList()' Sie sollten existingOrderIds wahrscheinlich in OrderMemos oder umbenennen etwas das macht mehr Sinn –

+0

Danke, das sieht ordentlich aus. Leider enthält "'ISalesReceiptRetList' keine Definition für 'Where'". Beim Umbenennungsproblem enthält das Memo-Feld in diesem Zusammenhang immer eine OrderId. Das System, aus dem Bestellungen importiert werden, hat OrderIds zu lange, um von den QuickBooks-Verkaufs-No (störend!) Aufgenommen zu werden. – ifinlay

+0

Sie müssen einen Verweis auf system.linq hinzufügen –