‘Error: Unable To Log Transaction (48)) attempting to frame the transaction on WKProsjekt!PosGlass.’
After 6 hours, the error disappears.
Today, exactly 2 weeks after, a new error appears:
‘Error: Unable To Log Transaction (48)) attempting to frame the transaction on WKProsjekt!PosBeslag.’
And after 2 hours, the error disappears again.
First time, only the PosGlass table generates the error, and second time, only the PosBeslag table. They are both used in the same Form in a similar way. There are also four more tables in the same Form that works in the same way. And they are all in WKProsjekt.tps.
The application with this Form has been working without any problems for 10 years.
Does anyone have an idea what could be causing it?
I remember using multiple tables in a single file, used to be working nicely. But I also remember using a TCF file for managing transactions across the network. I can’t remember the detail but have a look in the Clarion help for “TCF”. Maybe by using a TCF file in the same folder as the TPS file, you’ll make some progress to solve it.
You could run into this problem if someone else was in a transaction and a window was open. The transaction locks the files.
Another cause, similar, is if someone is in a transaction and the system blows up, or they logout and leave the program running, or some other cause that basically leave an open transaction.
After a period it times out and can be released.
Transaction Framing error 48 on a MEMORY driver table?
I have 3 ‘virtually’ identical procedures using 3 different single record memory files. 2 work fine, the other gives me an error 48 whenever data is changes. Click Continue and it saves fine.
Thanks Sean Hennessey…
For reference…
In my data dll (or your single exe): Global Props → Actions
→ Indiv File Overrides → select the Table → Properties
→ Use RI Transaction Frame → NO
The transactions are mostly done in the RelationManager methods. And I think the individual file manager is probably the one that sets “SELF.UseLogout” for the primary file – the templates set that to “Use default” (which you have had to chnage to “No”). I think you would really only run into problems if your primary file is able to use logout, but one of its related files is a different file type that you cannot add to the logout. And I think that’s up to you to specify – too much to expect of the templates.
I guess there are two levels of dealing with logouts. The first one of the code that the templates/and classes implement. There’s the UseLogout check in the relation manager methods, and that value comes from the relationmanager init, which will set UseLogout to False if you click No in the overrides, and True otherwise (Default or Yes override). It doesn’t have any driver-based variation.
The second level is what the driver does when it gets told to logout a file, or a list of related files. There are a bunch of drivers (dbase, foxpro, memory etc.) that don’t support logout. When the driver gets a logout request for a driver that doesn’t support logout I guess it has the choice of totally ignoring it (and the commit), or giving you a warning. Probably the warning is the better option.
Complicating things is that PROP:Driver is writable at runtime, so in theory you could, for example, set up a file as ODBC in the dictionary, and change it to the in-memory driver when you start your program. The template would have to base its writing of the Init method on your dictionary declaration, so would be wrong once you changed your driver.