Промежуточный итог основан на датах, когда иногда требуются обратные даты - PullRequest
0 голосов
/ 19 февраля 2019

Итак, я пытаюсь создать запрос в Microsoft Access 2010 с промежуточным итогом на основе дат.Давайте упростим, предположив, что запрос основан на таблице финансовых транзакций с именем tblT1 с тремя полями, отсортированными по дате:

  • ID
  • TDa
  • te Сумма

Цель: создание финансовой книги.

Я могу несколько создать эту промежуточную сумму в запросе, используя

DSUM("Amount", "tblT1", "TDate<=#" & TDate &"#")

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

Один из способов обойти это БЫЛО, чтобы основывать критерии DSUM на ID, а не на TDate.Но это не сработает для меня, потому что иногда мне нужно задним числом вводить даты, что означает, что я получаю более старые транзакции с более высокими идентификационными номерами, чем после транзакции.Так как я сортирую по дате, это исключает поле идентификатора в качестве опции.Есть ли обходной путь для создания промежуточного итога, который обновляется построчно?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Я в конце концов решил это.Решением было создание запроса (назовите его «Query1») на основе существующей таблицы и включения нового составного идентификатора (с именем NewID) на основе даты транзакции и существующего идентификатора (первичный ключ).Затем я создал второй запрос (Query2) на основе Query1 и использовал этот NewID в качестве критерия в функции DSUM.Однако несколько слов предостережения: убедитесь, что дата отформатирована как ГГГГММДД, чтобы все даты имели одинаковое количество цифр и были отсортированы в хронологическом порядке.Также отформатируйте существующий идентификатор так, чтобы количество цифр, которое вы считаете необходимым (я выбрал 6), добавляете его к новому номеру даты.Наконец, вам нужно заключить все это в функцию Val ().В противном случае он будет отображаться в запросе как текст и может не работать должным образом в функции DSUM.Итак, вот функция в Query 2: DSUM ("Amount", "tblT1", "NewID <=" & NewID) </p>

0 голосов
/ 19 февраля 2019

Попробуйте эту логику:

DSUM("Amount",
     "tblT1",
     "(TDate < #" & TDate & "#) OR (TDate = #" & TDate &"# AND ID <= " & ID)"
    )

Если бы вы делали это как запрос, это выглядело бы следующим образом:

select t.*,
       (select sum(t2.amount)
        from transactions as t2
        where t2.tdA = t.tdA and -- not sure if this is necessary
              (t2.date < t.date or
               t2.date = t.date and t2.id <= t.id
              )
        ) as running_amount
from transactions as t;
...