Сверка двух наборов данных / коллекций, когда количество согласованных комбинаций неизвестно - PullRequest
0 голосов
/ 20 декабря 2018

Так что я работаю консультантом, занимаюсь бухгалтерским учетом.Одна из моих задач - согласовать транзакции между наборами данных.Сравнение между коллекциями один-к-одному довольно легко решить программно.Я в основном выгрузил данные в два отдельных массива и начал проверять совпадения, используя вложенные циклы for.
У меня вопрос о том, как согласовать транзакции, когда количество транзакций в любом наборе данных не известно до времени выполнения.Далее суммы транзакций должны быть равны с обеих сторон.
Т.е.

DataSet #1    DataSet #2
A/%/k  $11    A/%/k  $22
A/%/k  $11    A/%/k  $33
A/%/k  $11
A/%/k  $11
A/%/k  $11

Выше не смущайтесь относительно (A), (%) или (k).Это просто идентифицирующие первичные ключи, если хотите.То есть.Они соответствуют номерам контрактов, номерам счетов и т. Д. Важно, чтобы в наборе данных № 1 5 транзакций составляли 55 долларов США.В наборе данных № 2 2 транзакции составляют $ 55.Два набора примирить.Теоретически, вы можете иметь n Выберите r количество транзакций, сумма которых в наборе № 1 равна сумме в наборе № 2.Менее абстрактно, вы можете иметь 8 транзакций в наборе № 1, сумма которых равна 3 транзакциям в наборе № 2.(8C3 = 56, между прочим)

Есть ли у кого-нибудь мысли по поводу алгоритма и / или массива, или другого типа структуры данных, где все возможные комбинации сумм сравниваются с другой коллекцией?Есть ли в библиотеке что-то, что могло бы помочь?Мои мысли обращены к рекурсивным алгоритмам, которые вычисляют факториалы для решения такой проблемы, но как только вычисляется комбинаторика - что тогда ??Как рассчитать все 56 сумм (см. Выше)?Действительно, есть X суммы.

Опять же, общее количество совпадений транзакций не будет известно до времени выполнения.Последняя проблема - это то, что я хотел бы сделать это в VBA / Excel.Вот где лежат мои данные, и именно там мой работодатель будет поддерживать техническое решение.Извините, я не могу программировать на Python, и это технически неосуществимо там, где я работаю.Кроме того, извиняюсь за то, что не отображаю код, так как у меня еще нет написанного кода.

1 Ответ

0 голосов
/ 20 декабря 2018

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

Если вы соедините наборы данных 1 и 2 вместев одну длинную таблицу (вам может понадобиться добавить столбец, чтобы идентифицировать строку как 1 или 2) и использовать TH в качестве источника сводной таблицы ... все готово.

Есть сводная таблицасуммируйте суммы, разбитые по первичному ключу, а затем по идентификатору набора данных, чтобы, скажем, кредиты и дебеты по номеру PO # 123987 находились рядом друг с другом.

Тогда VBA может искать различия;объекты сводной таблицы позволяют выбрать все пары ячеек «кредит / дебет» для каждого идентификатора в качестве одного диапазона, и вы можете навязать некоторый условный формат для выделения несоответствий или написать цикл FOR EACH через диапазон, ища их процедурно.

Я сделал очень простой небольшой пример вашей проблемы, насколько я понимаю, используя несколько десятков «кредитов» (набор данных 1) и «дебетов», которые составляют одну и ту же сумму, всегда с разным количеством записей,в нескольких случаях и имеют расхождение в одном случае.На «Базовом» листе показаны два набора данных, а затем третья таблица, представляющая собой только два вместе взятых.Сводная таблица, которая использует его в качестве источника, находится рядом с ней.

Лист № 2, «Отрицательные» - это копия всей проблемы, но с суммами транзакций для «дебетов», заданными как отрицательные числа.Это означает, что сумма для каждого идентификатора равна нулю, если есть сверка.Затем можно установить дополнительные правила сводной таблицы, чтобы показывать только идентификаторы, где сумма отлична от нуля, предоставляя отчет только о расхождениях.Но для примера все показано.

Если этот подход кажется правильным, мы могли бы разобраться, как можно создать сводную таблицу с VBA, и найти ее на предмет расхождений.Обратите внимание на приятный трюк сводной таблицы: если вы нажмете на номер расхождения «100», он создаст временный лист с ПРОСТО записями для этой суммы на нем, и вы сможете увидеть все суммы кредитов и дебетов по ПО № 67890 в сумме.

Хммм ... новинка здесь ... не уверен, что в stackexchange есть место для загрузки примеров электронных таблиц.Я сохранил его здесь:

http://brander.ca/stackexchange/Pivot_Table_Example.xlsx

... и могу оставить его там на годы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...