Deze documentatie toont hoe u een afpunting (lettrage) uitvoert voor meerdere lijnen van een nieuwe boeking, tijdens het draaien van maatwerkcode die deze boeking aanmaakt. Deze code moet geplaatst worden tussen
MercatorUi.Engine.Cpta.BookingEngine bookingEngine = MercatorUi.Engine.Cpta.BookingEngine.InitNew(3, jouFin)
en het bewaren via BookingEngine.Save() of het tonen van de BookingForm.
In een lus die de af te punten lijnen doorloopt (
foreach) moet eerst het volgende afpuntnummer worden opgehaald met de stored procedure
SP_GET_N_LETTRAGE. Vervolgens wordt een SQL-script opgebouwd dat de lijnen aan elkaar koppelt. Dit gebeurt met een
StringBuilder sbReqSqlLettrage.
List<Int64> l = Api.Zselect<Int64>(Globals.RepData, $"exec {MercatorUi.Globals.DatabaseName}.dbo.SP_GET_N_LETTRAGE -1");
if (l != null)
{
Int64 n_lettrage = l[0];
// n = lijnnummer
// lijn van de huidige, nog niet bewaarde boeking -> piece = 0
sbReqSqlLettrage.AppendFormat("insert into lettragtmp (spid,id_doc_ori,journal,piece,dl_id,lettrage) values ({0},'{1}','{2}',0,'{3}',{4}) \r\n", MercatorUi.Globals.CurrentSpId, bookingEngine.Id + bookingEngine.LIGNES_C.Rows[n]["dl_id"].ToString(), bookingEngine.LIGNES_C.Rows[n]["journal"].ToString(), bookingEngine.LIGNES_C.Rows[n]["dl_id"], n_lettrage);
// lijn van de bestaande boeking die moet worden afgepunt
sbReqSqlLettrage.AppendFormat("insert into lettragtmp (spid,id_doc_ori,journal,piece,dl_id,lettrage) values ({0},'{1}','{2}',{3},'{4}',{5}) \r\n", MercatorUi.Globals.CurrentSpId, bookingEngine.Id + bookingEngine.LIGNES_C.Rows[n]["dl_id"].ToString(), journal_autre_ecriture, piece_autre_ecriture, dl_id autre_ecriture, n_lettrage);
bookingEngine.LignesCRecords[n].LETTRAGE = n_lettrage;
bookingEngine.LignesCRecords[n].TOT_DV_LET = bookingEngine.LignesCRecords[n].TOT_DV;
bookingEngine.LignesCRecords[n].TOT_LET = bookingEngine.LignesCRecords[n].TOT;
}
Wanneer alle lijnen zijn doorlopen, moet deze code (exact één keer) worden uitgevoerd:
if (sbReqSqlLettrage.Length > 0)
{
using (SqlCommand cmd = new SqlCommand(sbReqSqlLettrage.ToString()))
{
Api.SqlExec(MercatorUi.Globals.RepData, cmd);
}
}
💡 Merk op dat er nooit rechtstreeks naar LIGNES_C.LETTRAGE in de database wordt geschreven. Deze code gebruikt de SQL-tabel LETTRAGTMP. Dat biedt de volgende voordelen:
- De afpunting gebeurt binnen dezelfde SQL-transactie als het bewaren van de boeking.
- De status “volledig afgepunt” / “gedeeltelijk afgepunt” wordt automatisch gecontroleerd en bepaald. (De code hoeft dus geen negatieve afpuntnummers te beheren voor gedeeltelijke afpuntingen.)
- Er wordt ook gecontroleerd of de lijnen die moeten worden afgepunt nog beschikbaar zijn (om gelijktijdige, identieke afpuntingen op verschillende werkposten te voorkomen).