【发布时间】:2014-07-17 14:26:12
【问题描述】:
有没有办法通过 QuickBooks SDK 识别 QuickBooks 文件中的第一个交易日期?
【问题讨论】:
标签: sdk quickbooks
有没有办法通过 QuickBooks SDK 识别 QuickBooks 文件中的第一个交易日期?
【问题讨论】:
标签: sdk quickbooks
没有使用 SDK 执行此操作的特定方法,但您可以提出一些代码,每月查看一次以确定此信息。您可以在 QuickBooks 中使用的最早日期是 01/01/1901。我可能只是对ITransactionQueryRq 进行MetaDataOnly 查询以检查是否有交易,然后再进行NoMetaData 查询以获取该月交易的实际日期。您甚至可能希望缩小到一周和/或一天,以限制 NoMetaData 查询所需的时间。
int count = 0;
DateTime fromDate = new DateTime(1901, 01, 01);
DateTime toDate = new DateTime(1901, 01, 31);
while(count <= 0)
{
ITransactionQuery query = MsgSetRequest.AppendTransactionQueryRq();
query.metaData.SetValue(MetaDataOnly);
ITransactionQuery query = MsgRequest.AppendTransactionQueryRq();
query.metaData.SetValue(ENmetaData.mdMetaDataOnly);
query.ORTransactionQuery.TransactionFilter.TransactionDateRangeFilter.ORTransactionDateRangeFilter.TxnDateRange.FromTxnDate.SetValue(fromDate);
query.ORTransactionQuery.TransactionFilter.TransactionDateRangeFilter.ORTransactionDateRangeFilter.TxnDateRange.ToTxnDate.SetValue(toDate);
IResponse response = SessionManager.DoRequests(MsgRequest).ResponseList.GetAt(0);
if (response.StatusCode == 0)
{
count = response.retCount;
}
else if (response.StatusCode == 1)
{
fromDate = fromDate.AddMonths(1);
toDate = new DateTime(fromDate.Year, fromDate.Month, DateTime.DaysInMonth(fromDate.Year, fromDate.Month));
}
else throw new Exception("TransactionQuery returned error: " + response.StatusMessage);
}
// fromDate and toDate contain the first month that has transactions.
【讨论】:
代码有一些问题,下面是VB,net版本。重要的区别是在每个 API 调用之间添加了 msgSetRequest.ClearRequests()。
此代码的运行速度也快得多,并且可以在第一笔交易的一天内完成。我考虑过从 10 年跳跃开始,以使其更快。
Public Sub GetFirstTransactionDate(ByRef QuickBooksSessionManager As IQBSessionManager, ByRef fromDate As Date, ByRef toDate As Date)
Dim msgSetRequest As IMsgSetRequest = QuickBooksSessionManager.CreateMsgSetRequest("US", 13, 0)
Dim count As Integer = 0
fromDate = New Date(1901, 1, 1)
toDate = New Date(1901, 12, 31)
' make sure we do not have any old requests still defined
msgSetRequest.ClearRequests()
' set the OnError attribute to continueOnError
msgSetRequest.Attributes.OnError = ENRqOnError.roeContinue
While count <= 0
msgSetRequest.ClearRequests()
Dim query As ITransactionQuery = msgSetRequest.AppendTransactionQueryRq()
query.metaData.SetValue(ENmetaData.mdMetaDataOnly)
query.ORTransactionQuery.TransactionFilter.TransactionDateRangeFilter.ORTransactionDateRangeFilter.TxnDateRange.FromTxnDate.SetValue(fromDate)
query.ORTransactionQuery.TransactionFilter.TransactionDateRangeFilter.ORTransactionDateRangeFilter.TxnDateRange.ToTxnDate.SetValue(toDate)
Dim response As IResponse = QuickBooksSessionManager.DoRequests(msgSetRequest).ResponseList.GetAt(0)
If response.StatusCode = 0 Then
count = response.retCount
ElseIf response.StatusCode = 1 Then
fromDate = fromDate.AddYears(1)
toDate = toDate.AddYears(1)
Else
Throw New Exception("TransactionQuery returned error: " + response.StatusMessage)
End If
End While
toDate = New DateTime(fromDate.Year, fromDate.Month, DateTime.DaysInMonth(fromDate.Year, fromDate.Month))
count = 0
While count <= 0
msgSetRequest.ClearRequests()
Dim query As ITransactionQuery = msgSetRequest.AppendTransactionQueryRq()
query.metaData.SetValue(ENmetaData.mdMetaDataOnly)
query.ORTransactionQuery.TransactionFilter.TransactionDateRangeFilter.ORTransactionDateRangeFilter.TxnDateRange.FromTxnDate.SetValue(fromDate)
query.ORTransactionQuery.TransactionFilter.TransactionDateRangeFilter.ORTransactionDateRangeFilter.TxnDateRange.ToTxnDate.SetValue(toDate)
Dim response As IResponse = QuickBooksSessionManager.DoRequests(msgSetRequest).ResponseList.GetAt(0)
If response.StatusCode = 0 Then
count = response.retCount
ElseIf response.StatusCode = 1 Then
fromDate = fromDate.AddMonths(1)
toDate = New DateTime(fromDate.Year, fromDate.Month, DateTime.DaysInMonth(fromDate.Year, fromDate.Month))
Else
Throw New Exception("TransactionQuery returned error: " + response.StatusMessage)
End If
End While
toDate = fromDate.AddDays(1)
count = 0
While count <= 0
msgSetRequest.ClearRequests()
Dim query As ITransactionQuery = msgSetRequest.AppendTransactionQueryRq()
query.metaData.SetValue(ENmetaData.mdMetaDataOnly)
query.ORTransactionQuery.TransactionFilter.TransactionDateRangeFilter.ORTransactionDateRangeFilter.TxnDateRange.FromTxnDate.SetValue(fromDate)
query.ORTransactionQuery.TransactionFilter.TransactionDateRangeFilter.ORTransactionDateRangeFilter.TxnDateRange.ToTxnDate.SetValue(toDate)
Dim response As IResponse = QuickBooksSessionManager.DoRequests(msgSetRequest).ResponseList.GetAt(0)
If response.StatusCode = 0 Then
count = response.retCount
ElseIf response.StatusCode = 1 Then
fromDate = fromDate.AddDays(1)
toDate = fromDate.AddDays(1)
Else
Throw New Exception("TransactionQuery returned error: " + response.StatusMessage)
End If
End While
' fromDate and toDate contain the first month that has transactions.
End Sub
【讨论】: