Найдите первый контрольный номер в Quickbooks с помощью QBFC

Я использую Quickbooks QBFC и хочу программно получить значение поля «Первый контрольный номер».

Его можно найти в Quickbooks в меню Файл > Печатные формы > Чеки.

Пожалуйста, предложите, как это можно сделать, или любую ссылку, на которую я могу посмотреть.


person Thakur    schedule 29.08.2012    source источник


Ответы (1)


Вы не можете сделать это напрямую, но вы можете запросить самые последние чеки, которые были выписаны для интересующей вас учетной записи. Номер первой проверки по умолчанию будет на единицу больше, чем самый высокий номер чека, который был выписан.

Как правило, я не пишу для них код людей, сегодня делаю исключение только потому, что сегодня пятница и у меня сумасшедшее настроение. Следующий код можно использовать в качестве отправной точки для полезной процедуры последнего контрольного числа. Чтобы иметь реалистичную, полезную рутину, вам, а не мне, придется иметь дело со всеми странностями, которые связаны с тем, как люди используют свои чековые книжки: нечисловые числа, числа не по порядку и т. д.

Обратите внимание: в этом коде используется библиотека с открытым исходным кодом Zombie и QBFC 11.

class CheckNumbers
{
    private const int DATE_INTERVAL = -7;

    private string _accountName;
    private DateTime _lastToDate;
    private DateTime _lastFromDate;

    public CheckNumbers(string accountName)
    {
        _accountName = accountName;
        _lastToDate = DateTime.Today;
        _lastFromDate = _lastToDate.AddDays(DATE_INTERVAL);
    }

    private void SetCriteria(IORTxnQuery qry)
    {
        qry.TxnFilter.AccountFilter.ORAccountFilter.FullNameList.Add(_accountName);

        var dateFilter = qry.TxnFilter.ORDateRangeFilter.ModifiedDateRangeFilter;

        dateFilter.FromModifiedDate.SetValue(_lastFromDate, true);
        dateFilter.ToModifiedDate.SetValue(_lastToDate, true);
    }

    private void ProcessCheckNumber(string checkNumber, ref int highestNumber)
    {
        if (!string.IsNullOrEmpty(checkNumber))
        {
            int thisCheck;
            if (!int.TryParse(checkNumber, out thisCheck))
            {
                throw new Exception(string.Format("Check number {0} cannot be read as an integer", checkNumber));
            }
            if (thisCheck > highestNumber) highestNumber = thisCheck;
        }
    }

    public int GetLastCheckNumber()
    {
        DateTime failSafe = DateTime.Parse("1/1/2010");

        using (var cn = Zombie.ConnectionMgr.GetConnection())
        {
            int highestCheck = 0;

            while (highestCheck == 0 && _lastFromDate > failSafe)
            {
                var batch = cn.NewBatch();

                var checkQuery = batch.MsgSet.AppendCheckQueryRq();
                checkQuery.IncludeRetElementList.Add("RefNumber");

                SetCriteria(checkQuery.ORTxnQuery);

                batch.SetClosures(checkQuery, b =>
                    {
                        var checks = new Zombie.QBFCIterator<ICheckRetList, ICheckRet>(b);
                        foreach (var check in checks)
                        {
                            ProcessCheckNumber(Zombie.Safe.Value(check.RefNumber), ref highestCheck);
                        }
                    });

                var billCheckQuery = batch.MsgSet.AppendBillPaymentCheckQueryRq();
                billCheckQuery.IncludeRetElementList.Add("RefNumber");

                SetCriteria(billCheckQuery.ORTxnQuery);

                batch.SetClosures(billCheckQuery, b =>
                    {
                        var checks = new Zombie.QBFCIterator<IBillPaymentCheckRetList, IBillPaymentCheckRet>(b);
                        foreach (var check in checks)
                        {
                            ProcessCheckNumber(Zombie.Safe.Value(check.RefNumber), ref highestCheck);
                        }
                    });

                if (!batch.Run()) return 0;

                _lastToDate = _lastFromDate;
                _lastFromDate = _lastToDate.AddDays(DATE_INTERVAL);
            }

            return highestCheck;
        }
    }
}
person Paul Keister    schedule 29.08.2012
comment
Спасибо, @paul, в каком поле даты мы проверяем последние проверки, учетная запись. Также какой интерфейс мы должны использовать? - person Thakur; 30.08.2012
comment
В SDK нет даты последнего изменения, поэтому вам придется установить ее самостоятельно. Вот как я бы это сделал: выберите консервативную дату (возможно, вчера) и посмотрите, возвращает ли запрос чеки. Если он не будет продолжать расширять диапазон назад, пока вы не найдете что-то. Вы можете упростить запрос, используя IncludeRetElementList, чтобы ограничить возврат только TxnId чека, TxnDate и RefNumber. - person Paul Keister; 30.08.2012
comment
Спасибо, @Paul, очень ценю это. Завтра постараюсь реализовать и сообщу. - person Thakur; 30.08.2012
comment
Я хочу получить последний сгенерированный контрольный номер для определенной учетной записи. Это поле упоминается в QB On Screen Reference: AccountQuery IncludeRetElementList, но я не могу получить LastCheckNumber с помощью ACcountQuery. Не могли бы вы помочь? - person Thakur; 28.09.2012