zsxsoft / my-beancount-scripts

Git repo to save my Beancount scripts
363 stars 71 forks source link

一个关于 deduplicate 的 bug #7

Closed SamuelQZQ closed 3 years ago

SamuelQZQ commented 3 years ago

https://github.com/zsxsoft/my-beancount-scripts/blob/f90949f9758372dfb74500318e8ea20a27ea7bc6/modules/imports/deduplicate.py#L35

这一行应该是 continue?

(感谢分享这些脚本,非常有用)

zsxsoft commented 3 years ago

咦我为什么在这里写了俩return,应该都是continue的啊

zsxsoft commented 3 years ago

仔细看了一下……这里return False没有问题。 因为find_duplicate是用于单笔交易的检测重复,而这里的逻辑和上面的注释说的一样,“unique_no存在但不同,那就绝对不是同一笔交易了,这个时候就直接返回不存在同订单”,因此逻辑没问题。

SamuelQZQ commented 3 years ago

@zsxsoft 那段代码是在一个 for loop 里,你只判断了一个就直接 return,剩下的其他订单里有重复的怎么办....

zsxsoft commented 3 years ago

@SamuelQZQ 这个函数是每一笔交易都会调用一次,不是攒齐了所有交易一口气deduplicate的

SamuelQZQ commented 3 years ago

@zsxsoft For example:

find_duplicate 里有这个代码:

bql = "SELECT flag, filename, lineno, location, account, year, month, day, str(entry_meta('timestamp')) as timestamp, metas() as metas WHERE year = {} AND month = {} AND day = {} AND number(convert(units(position), '{}')) = {} ORDER BY timestamp ASC".format(
            entry.date.year, entry.date.month, entry.date.day, currency, money)
items = query.run_query(self.entries, self.option_map, bql)

如果返回的 items 有多条,但在 for loop 里由于 return false, 那么能够被检查到的永远只有第一条。