Severe bug in reports in master branch

Thomas Baumgart thb at net-bembel.de
Sat Jun 24 06:52:43 UTC 2017


Hi, 

On Mittwoch, 21. Juni 2017 12:49:09 CEST Łukasz Wojniłowicz wrote:

> Hi Cristian,
> 
> Please test latest master branch because I think your issues are fixed.
> 
> Referring to order of transactions in report after transaction modification,
> it was sorting, that was to blame.
> I changed it intentionally while implementing multicurrency totals, but it
> broke your use case, so I returned old sorting.
> First tests show that my use case isn't broken and yours work too, but I
> would expect troubles with multicurrency totals anyways somewhere in
> future.
> 
> During the research, I found a bug (not critical) that transaction IDs
> written to .kmy file aren't being red from the file. Transaction IDs are
> assigned through function during KMM start and stay so till application
> quits. The assignment is according to date. When one changes date, the
> assigned ID won't change till KMM starts anew. The assigned ID is being
> written to .kmy file, but won't be red, because KMM will assign new IDs at
> start.

Well, sort of. For XML based files, this ID is reassigned during file load. 
This is not a bug, but based on a design decision. to keep transaction ids 
small in amount and regain those that were deleted. It should not hurt at all 
to keep the values that are stored in the file. This can be changed in 
MyMoneyXmlContentHandler::endElement() if it helps to solve your issues. One 
thing is critical: you should not base application logic on any of the IDs of 
KMyMoney. At one point, we might change them to something completely different 
which is not in any particular order (GUID). I did not use them as debugging 
and following is much harder and hence used the system as it is today. I know, 
that in some places (ID assignment in general) the current code relies on the 
layout of the IDs (one letter, n digits) but that is only in a very few places 
in the engine code (mymoney subdirectory) and not in the application.

There is an additional piece of information which is used for accessing a 
transaction and sorting per post-date and is obtained via 
MyMoneyTransaction::uniqueSortKey() when the transaction is added to the 
ledger in MyMoneySeqAccessMgr::addTransaction() or modified (since parts of 
the sortkey may change). When loading from file, the creation of that key 
happens in MyMoneyXmlContentHandler::endElement() where the transaction 
loaded. If a transaction does not have an id (it is empty) it is part of a 
schedule and the re-assignment won't happen.

This is sort key is used during the lifetime of the application and not stored 
on file.

So in fact, you have the following indirection:

  m_transactionKeys[transactionid] = sortkey;
  m_transactionList[sortkey] = transaction

This way, iterating over m_transactionList is always in post-date order as the 
sortkey is based on MyMoneyTransaction::postDate()  (see 
MyMoneyTransaction::uniqueSortKey()).

> That was the reason why your reports showed correctly after restart.

I am not sure if I completely understand what your multi currency report 
problem has to do with transaction IDs.

-- 

Regards

Thomas Baumgart

https://www.telegram.org/ Telegram, the better whats app
-------------------------------------------------------------
"I know, a 'real Linux geek' doesn't walk around the wall: He bangs
his head against it until it tumbles down!" -- wobo on FLUG ml
-------------------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 208 bytes
Desc: This is a digitally signed message part.
URL: <http://mail.kde.org/pipermail/kmymoney-devel/attachments/20170624/e0ce6c69/attachment.sig>


More information about the KMyMoney-devel mailing list