Cette documentation montre comment effectuer un lettrage de plusieurs lignes d'une nouvelle écriture comptable, lors de l'exécution d'un code sur mesure qui génère cette écriture. Ce code devra se placer entre
MercatorUi.Engine.Cpta.BookingEngine bookingEngine = MercatorUi.Engine.Cpta.BookingEngine.InitNew(3, jouFin)
et la sauvegarde via BookingEngine.Save() ou l'affichage de la BookingForm.
Dans une boucle qui énumère les lignes à lettrer (
foreach), il faut d'abord récupérer le prochain numéro de lettrage avec la procédure stockée
SP_GET_N_LETTRAGE. Il faut ensuite construire un script SQL qui va associer les lignes à lettrer. Cela se fait via un
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 = numéro de la ligne
// ligne de l'écriture en cours non déjà sauvegardée -> 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);
// ligne de l'écriture existante qu'il faut lettrer
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;
}
Une fois l'énumération des lignes terminée, ce code doit être exécuté (une seule fois) :
if (sbReqSqlLettrage.Length > 0)
{
using (SqlCommand cmd = new SqlCommand(sbReqSqlLettrage.ToString()))
{
Api.SqlExec(MercatorUi.Globals.RepData, cmd);
}
}
💡 Vous observez qu'on ne s'adresse jamais directement à LIGNES_C.LETTRAGE dans la base de données. Ce code utilise la table SQL LETTRAGTMP. Cela présente ces avantages :
- Le lettrage sera effectué dans la même transaction SQL que la sauvegarde de l'écriture.
- Le statut "lettrage complet" - "lettrage partiel" sera vérifié et déterminé automatiquement. (Le code ne doit donc PAS gérer les numéros de lettrage négatifs pour les lettrages partiels.)
- Il vérifie aussi la disponibilité des lignes à lettrer (lettrages identiques et simultanés sur différents postes).