【问题标题】:How to find double transactions in MT940如何在 MT940 中查找双重交易
【发布时间】:2013-07-20 22:21:11
【问题描述】:

目前我正在编写一个导入脚本,该脚本使用 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

【问题讨论】:

  • 如果每个字段都相同,我认为没有算法可以确定它是双重交易还是仅仅是一个新的、相同的交易。
  • PS:交易日期是时间戳,还是只是DD/MM/YYYY?
  • 没有时间戳,只有 YYMMDD。
  • 您是否绝对、肯定地确定真正相同的交易是等价的?
  • @STTLCU:是的,一点一点的相同,看我在帖子中的补充!

标签: php mt940


【解决方案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. [等...]

如您所见,没有一种算法可以 100% 确定哪种情况是正确的。而且由于我们谈论的是金钱,所以不能接受低于 100% 确定性的一切。

那该怎么办?

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

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

【讨论】:

  • 这也是我想的。现在唯一的问题是,如果进口重叠了一天,那么应该确保不会错过接下来两天之间的任何交易。这意味着他们必须为每次导入手动检查大约 200 笔交易。并且可能 199 是有效的双打...但是解决这个问题,我认为就是这样!
【解决方案2】:

MT940 报表消息有期初余额和期末余额,对吗?因此,如果您有一份包含两笔相同交易的对帐单,银行账户余额就会反映这一点。

如果您“清理”出现重复的数据,这并不意味着交易没有发生。如果您正在执行此清理以将 940 中的数据放入具有唯一约束违规的数据库中,该数据库不允许发布相同的交易,那么以后可能会出现问题 - 或者如果有人比较总和时立即出现问题数据库中的交易与报表中的期末余额对比。

更好的方法可能是生成一些额外的关键信息(可能为每个语句行增加一个序列号),您可以添加这些信息以区分其他明显相同的事务并将它们加载到您的数据库中而不会违反约束。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
    • 好的,让我更清楚一点。用例是将 MT940 文件导入数据库。当您想通过 MT940 导入到您的例如银行对帐单数据时,您可以这样做。会计应用程序,用于对账。您可以针对不同且可能重叠的时间段(每月、每季度)执行此操作,可能会多次读取相同的数据。正如 OP 所写,MT940 在交易级别没有唯一标识符。我的建议展示了如何创建这样的标识符,然后您可以识别重复项,即您的数据库中已有的事务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2021-10-04
    • 2023-02-14
    • 2014-04-12
    • 2013-09-12
    • 1970-01-01
    相关资源
    最近更新 更多