1

使用 QB SDK 将 txn 标记为已清除非常容易,但您似乎无法查询此值(例如,查看它是否已清除)。

public bool MarkAsCleared(string sTxnID, string sTxnLineID)
{
    // sm is class variable of type QBSessionManager
    IMsgSetRequest msr = sm.CreateMsgSetRequest("US", 7, 0);
    msr.Attributes.OnError = ENRqOnError.roeStop;

    IClearedStatusMod q = msr.AppendClearedStatusModRq();
    q.ClearedStatus.SetValue(ENClearedStatus.csCleared);
    q.TxnID.SetValue(sTxnID);
    q.TxnLineID.SetValue(sTxnLineID);

    IMsgSetResponse resp = sm.DoRequests(msr);
    if ( resp.ResponseList.Count == 1 && resp.ResponseList.GetAt(0).StatusCode == 0 )
        return true;

    return false;
}
4

2 回答 2

2

这是上面发布的代码的 VB 版本。我测试了它,它似乎正在工作。我没有做日志查询部分。您只需传递 TxnID(交易查询中的 listID、txn 日期和帐户列表 ID。该函数将返回 True 或 False,具体取决于您传递的 txn 是否为该帐户清除。

Public Function IsCleared(ByVal sTxnID As String, ByVal dTxnDate As DateTime, ByVal sAccount As String) As Boolean

    Dim bCleared As Boolean = False

    Dim requestMsgSet As IMsgSetRequest
    requestMsgSet = sessionManager.CreateMsgSetRequest("US", 8, 0.0)
    requestMsgSet.Attributes.OnError = ENRqOnError.roeContinue

    Dim rq As ICustomDetailReportQuery
    rq = requestMsgSet.AppendCustomDetailReportQueryRq()
    rq.CustomDetailReportType.SetValue(ENCustomDetailReportType.cdrtCustomTxnDetail)
    rq.IncludeColumnList.Add(ENIncludeColumn.icClearedStatus)
    rq.IncludeColumnList.Add(ENIncludeColumn.icTxnID)
    ' Is Cleared status per txn or per txn line?
    rq.ReportAccountFilter.ORReportAccountFilter.ListIDList.Add(sAccount)
    rq.ORReportPeriod.ReportPeriod.FromReportDate.SetValue(dTxnDate)
    rq.ORReportPeriod.ReportPeriod.ToReportDate.SetValue(dTxnDate)
    rq.SummarizeRowsBy.SetValue(ENSummarizeRowsBy.srbItemDetail)

    Dim responseMsgSet As IMsgSetResponse
    responseMsgSet = sessionManager.DoRequests(requestMsgSet)

    Dim rp As IReportRet
    rp = responseMsgSet.ResponseList.GetAt(0).Detail

    Try
        Dim data As IORReportData = Nothing
        For i = 0 To rp.ReportData.ORReportDataList.Count - 1
            data = rp.ReportData.ORReportDataList.GetAt(i)
            If (Not data.DataRow Is Nothing) Then
                If (data.DataRow.ColDataList.Count > 1) Then
                    If (data.DataRow.ColDataList.GetAt(1).value.GetValue() = sTxnID) Then
                        bCleared = (data.DataRow.ColDataList.GetAt(0).value.GetValue() = "Cleared")
                        Return bCleared
                    End If
                End If
            End If
        next

    Catch ex As Exception
        MsgBox("Error looking up cleared status: " + ex.Message)
    End Try
    Return False
End Function
于 2013-02-26T19:59:37.127 回答
0

有一种使用 CustomDetailReportQuery 的 hacky 方法。我想不出一种方法来获取单个交易的报告,因此必须对整个帐户进行报告,然后循环遍历,直到找到正确的 txn 并返回其清除状态:

public bool IsCleared(string sTxnID, string sTxnLineID, string sAccount, out bool bCleared)
{
    bCleared = false;

    IMsgSetRequest msr = sm.CreateMsgSetRequest("US", 7, 0);
    msr.Attributes.OnError = ENRqOnError.roeStop;

    IJournalEntryQuery cq = msr.AppendJournalEntryQueryRq();
    cq.metaData.SetValue(ENmetaData.mdMetaDataAndResponseData);
    cq.ORTxnQuery.TxnIDList.Add(sTxnID);
    cq.IncludeLineItems.SetValue(true);

    IMsgSetResponse resp = sm.DoRequests(msr);

    try
    {
        IJournalEntryRetList crl = (IJournalEntryRetList)resp.ResponseList.GetAt(0).Detail;
        IJournalEntryRet r = crl.GetAt(0);
        msr.ClearRequests();

        ICustomDetailReportQuery rq = msr.AppendCustomDetailReportQueryRq();
        rq.CustomDetailReportType.SetValue(ENCustomDetailReportType.cdrtCustomTxnDetail);
        rq.IncludeColumnList.Add(ENIncludeColumn.icClearedStatus);
        rq.IncludeColumnList.Add(ENIncludeColumn.icTxnID);

        // Is Cleared status per txn or per txn line?
        rq.ReportAccountFilter.ORReportAccountFilter.FullNameList.Add(sAccount);
        rq.ORReportPeriod.ReportPeriod.FromReportDate.SetValue(r.TxnDate.GetValue());
        rq.ORReportPeriod.ReportPeriod.ToReportDate.SetValue(r.TxnDate.GetValue());
        rq.SummarizeRowsBy.SetValue(ENSummarizeRowsBy.srbItemDetail);

        resp = sm.DoRequests(msr);
        IReportRet rp = (IReportRet)resp.ResponseList.GetAt(0).Detail;
        IORReportData data = null;
        for (int i = 0; i < rp.ReportData.ORReportDataList.Count; i++)
        {
            data = rp.ReportData.ORReportDataList.GetAt(i);
            if (data.DataRow != null)
            {
                if (data.DataRow.ColDataList.Count > 1)
                {
                    if (data.DataRow.ColDataList.GetAt(1).value.GetValue() == sTxnID)
                    {
                        bCleared = (data.DataRow.ColDataList.GetAt(0).value.GetValue() == "Cleared");
                        return true;
                    }
                }
            }
        }
    }
    catch (Exception e)
    {
        Log("Error looking up cleared status: " + e.Message);
    }
    return false;
}
于 2013-01-26T19:37:33.077 回答