It works like a charm. I've now got a dedicated query (fExec) for insert, update and delete, and one only for select. I've put in a couple of questions for you, if you don't mind 
To answer your questions.
No, it's not needed to do fExec.Close if it's only used there.
As stated in the previous post, an UPDATE, INSERT and DELETE don't produce a dataset.
So in that case you shouldn't use fExec.Open and fExec.Close.
The fTrans.Commit doesn't close the query because the fExec.ExecSQL doesn't need closing.
Closing is only something you do on a dataset (after opening).
And since ExecSQL (with UPDATE, INSERT and DELETE) doesn't return anything, there is no need for closing.
(BTW there is an exception on this when you are including RETURNING when INSERTing but that's a separate case which you don't use here)
The fTrans.Commit should also only be done when there is a transaction.
So:
procedure TLiteDb.RunSQL(const aStatement: string); { writing: insert, update & delete }
begin
if not fTrans.Active then fTrans.StartTransaction;
try
fExec.SQL.Text:= aStatement;
fExec.ExecSQL;
finally
if fTrans.Active then fTrans.Commit; { or fTrans.CommitRetaining; }
end;
end;
BTW. If the fTrans is the same as used in the TConnection and other TSQLQuery for SELECT, it might be needed to use fTrans.CommitRetaining;
Because it could be that when the transaction is closed that the other TSQLQuery is closed automatically.
(When a transaction is committed ALL connected queries are usually also closed, but that could depend on the database and other components used).
If the fTrans is a different transaction, the other TSQLQuery for SELECT could need a Close/Open cycle before they see the changes made by this ExecSQL.