3

目前我正在研究一个使用 php 将银行账户数据导入 MySQL 数据库的导入脚本。我找到了一些 mt940 解析器,但那些没有做我想做的事或不符合当前的 MT940 标准。所以我编写了自己的简单类来解析我需要的数据。

问题不是,这甚至可能不是 MT940 问题,是我必须过滤双重交易。基本上,这很简单,如果数据库中已经存在完全相同的事务,则不要再次导入。这就是我所做的。

但现在有趣的部分是: 一些交易可能在同一天发生两次。例如,有人在同一天进行两次相同的交易[有人可能喜欢我,只是两次给我汇款;)]。第一次导入时,没有问题。在一个文件中,每个事务都是一个事务。

但是现在的问题是: 因为交易不是唯一的(MT940 不会为交易发送任何唯一的),所以很难从唯一的交易中过滤掉双重交易。所以如果我从我的银行账户下载了两个 MT940 文件。两个事务中的一个在第一个文件中,另一个在第二个文件中。导入第二个文件时,它现在会告诉我该交易是双重交易。

所以..我正在为此苦苦挣扎,而且可能我不是唯一一个。大会计程序的使用MT940结构也必须处理同样的问题。

谁知道处理这个问题的方法?

附加信息

在交易本身 (:61:) 中,可以获得以下信息:

  • 日期
  • 数量
  • 银行帐号
  • 银行账户名称
  • 银行账户地址
  • 交易说明

如果某人进行两次交易,则可能会发生所有这些信息都相同的情况。

两次双重交易的例子(当然我修改了交易的名称和银行账户):(这个在一个MT940文件中是双重的,但实际上是两次交易)。

:61:130311C000000000029,95N122NONREF          
0123456789
:86:/ORDP//NAME/JANSEN W H/ADDR/SOMEROAD 1 9569 GS THECITY/REMI/N
OKIA 3310/ISDT/2013-03-11
4

3 回答 3

1

The MT940 statement message has opening and closing balances, right? So if you have a statement containing two identical transactions, the bank account balance is going to reflect that.

If you 'clean up' data that appears duplicate, it doesn't mean that the transactions didn't happen. If you are doing this clean-up in order to fit your data from the 940 into a database that has a unique constraint violation that disallows identical transactions to be posted, that could be a problem later - or immediately if anyone compares the sum of the transactions in your database against the closing balance from the statement.

A better approach might be to generate some additional key information (perhaps increment a sequence number for each statement-line) that you can add to differentiate otherwise apparently identical transactions and load them into your db without violating the constraints.

于 2015-03-19T14:28:09.703 回答
1

假设您有 3 笔交易:A、B 和 C。

A 和 B 是重复的,因此 B 必须被丢弃

C 是一个不同的事务,但它在各个方面都与 A 相同。

根据您在问题中提供的数据,A = B = C 确实如此。它们绝对相同。没有办法通过阅读他们的内容来确定谁是真实的,谁是复制的。以下场景中的每个人都可能有效:

  1. C是B的副本,B是A的副本。丢弃B和C并保留A。
  2. B是与A相同的真实交易。C是B的副本。丢弃B。
  3. 他们是三个真正相同的交易。保留所有这些。
  4. [ETC...]

如您所见,没有一种算法可以 100% 确定哪种情况是正确的。既然我们在谈论金钱,任何低于 100% 确定性的东西都不能被接受。

那该怎么办?

如果计算机无法确定,就让人类介入。当你记录冲突时,编制一份清单。处理所有没有冲突的东西,当你完成批处理时,将冲突列表发送给人工操作员,让他/她从真实交易中挑选出重复的交易(即使我仍然想知道他们如何对它们进行分类,如果它们在各个方面都是相同的)

如果您发现操作员知道如何对它们进行排序,请尝试推断他们的人工算法,如果可能的话。

于 2013-07-22T09:36:32.327 回答
0

一个答案指出,mt940 消息包含开始(和结束)余额。在您浏览消息时,使用起始余额信息为每笔交易创建当前余额。将当前余额与交易的起息日结合使用,也许还可以使用帐户代码来创建唯一标识符。例如,您可以通过连接它们并使用您的编程语言提供的任何函数来创建 MD5 散列来做到这一点。

于 2016-05-14T08:42:25.893 回答