Je ne comprends pas les "méthodes" à utiliser pour mettre à jour un champ formatté dans un formulaire
La méthode Value n'est pas acceptée, la méthode Date marche mais il faut préparer
la méthode Text remplit bien le champ, on le voit, mais quand on veut enregistrer il dit qu'il n'y a rien dedans
j'accède aux champs de mon formulaire fmtID ou fmtDATE ou fmtMONTANT qui sont formattés
Une première technique a été de remplacer un autre champ formatté fmtMOIS (format 01, 02, ... 12) par un champ numérique MOIS et la macro a marché
à partir de la date quand je quitte le dernier champ obligatoire je calcule un champ ANNEE et un champ MOIS pour lier la sous table qui visualise les relevés bancaires du mois.
J'ai trois types de champ formattés :
- des clefs numériques fmtID (et avant fmtMOIS)
- un monétaire fmtMONTANT
- une date fmtDATE
J'ai beaucoup lu dans votre forum, ou en posant la question à qwant et ne trouvant rien de clair j'ai copié des exemples et fait de la programmation expérimentale avec des msgbox pour voir les étapes mais je suis dans l'impasse.
J'ai fait une application de Gestion des Entrées-Sorties pour un Groupement Agricole foncier qui loue des terres et un appartement
J'ai créé une table des Relevés bancaires avec les images zoomées sur les relevés bancaires
La clef est donc ANNEE et MOIS
J'ai créé une table des Mouvements bancaires GFA_ENT_SORT qui contient deux champs calculés par macros (ANNEE et DATE) pour pouvoir lier l'image du Relevé avec ces deux champs.
et je classe les dépenses ou les recettes avec des champs liste
Ensuite je fais des jeux d'écriture pour diviser un versement en différentes lignes : le virement trimestriel d'un loyer est découpé en dépôt de garantie, provisions, dépenses à la charge du locataire (à régulariser plus tard avec les provisions), dépenses à notre charge déduite du versement mais à faire apparaître comme charge déductible, part de la taxes d'ordures ménagères du locataire déclarable aux impôts, ...
La clef d'une telle table est donc un chiffre : les deux derniers numéros de l'année puis 4 chiffres
J'ai 3 boutons qui activent des macros quand je relâche le bouton:
1) nouvelle année pour démarrer la clef en dernière année +1 par exemple 31/12/2024 => 24+1 => 250000 formatté en '25 000 0' et je conserve et change de signe le montant (accès à fmtID, fmtMONTANT et fmtDATE 3 champs formattés à remplir)
2) un bouton pour saisir chaque nouveau mouvement bancaire : la clef saute de 10 en 10 (ou de 7 en 10 si dernière clef xxxxx7)
(accès à fmtID champ formatté)
3) un bouton pour saisir les jeux d'écriture : la clef saute de 1 en 1 (25 170 0 => 25 170 1 puis 2 puis 3...) et je conserve la date
(accès à fmtID, et fmtDATE donc 2 champs formattés à remplir)
Enfin une macro qui se déclenche quand je quitte le 4e champ qui est obligatoire pour l'enregistrement et qui calcule le champ ANNEE et le champ MOIS. Je peux enregistrer et alors faire apparaître l'image du relevé bancaire, le lire et corriger la date, le montant et remplir toutes les autres informations.
j'avais mis le MOIS formatté 01 ou 02 ... 11 12 et j'ai du renoncer car impossible de mettre à jour un tel champ
Mais j'ai récemment essayé de formatter ma clef pour 2025 : "25 000 0" car c'est plus parlant: la partie centrale s'incrémente de 1 en 1 en fait 10 en 10 et la dernière partie détaille les double jeux (enlever un montant au virement et mettre ce montant ailleurs)
Avec la méthode Text j'arrive à remplir le champ visualisé mais pas le vrai champ de la table et pourtant j'ai mis un commit
pareil pour le montant : il inscrit un chiffre avec une virgule mais sans € et ne le prend pas en compte.
Bizarrement tous vos exemples disent d'utiliser ThisComponent.DrawPage.Forms.getByName("GAF_ENT_SORT")
mais la macro s'arrête
expérimentalement j'ai essayé oForm = ThisComponent.DrawPage.Forms("GAF_ENT_SORT")
et ça marche
Code : Tout sélectionner
Sub Main
End Sub
REM =======================
Sub Calc_AnneeMois_fromDate
REM =======================
Dim oForm As Object
Dim oField_date As Object
Dim oField_annee As Object
Dim oField_mois As Object
REM Dim d As Date
Dim i_a As Integer
Dim i_m As Integer
Dim sd As String
Dim sa As String
Dim sm As String
REM oForm = ThisComponent.DrawPage.Forms.getByName("GAF_ENT_SORT") REM ne marche pas
oForm = ThisComponent.DrawPage.Forms("GAF_ENT_SORT")
REM les champs s'appellent datDATE ANNEE et MOIS
REM datDATE est de type date et le format est DD/MM/AA
REM ANNEE est de type numerique (sur 4 chiffres puisque c'est l'année
REM MOIS est un champ formatté pour avoir un 0 devant : 01,02,03...11,12
REM MOIS est devenu un champ numérique 1,2,3..11,12
oField_date = oForm.getByNAME("datDATE")
oField_annee = oForm.getByNAME("ANNEE")
oField_mois = oForm.getByNAME("MOIS")
REM d = oField_date.CurrentValue
sd = oField_date.CurrentValue
REM msgboxaffiche sd 20250302 quand il y a dans la date 02/03/25
sa = LEFT(sd,4)
sm = MID(sd,5,2)
i_a = VAL(sa)
i_m = VAL(sm)
REM i_a = YEAR(d)
REM i_m = MONTH(d)
msgbox "DATE :"+sd+" ANNEE : "+sa+" MOIS : "+sm+"!!!"+Cstr(i_a)+"/"+Cstr(i_m)
oField_annee.Value = i_a
oField_mois.Value = i_m REM ne marchait pas avec un champ formatté car pas de méthode Value mais j'ai changé le champ qui est devenu de type numérique
REM Le commit est nécessaire sinon l'affichage ne permet pas la jointure et s'efface
oField_annee.Commit
oField_mois.Commit
End Sub
REM ------- Calc_AnneeMois_fromDate -------------------------------------------------------------------
REM =====================
Sub CreateNexRecord10by10
REM =====================
Dim oForm As Object
Dim oField_ID, oField_dat As Object
Dim s_cle10, s_cle6 As String
Dim lid as Long
Dim d_dDate as Date
REM 1 pour ne pas risquer de créer une clef existante aller sur le dernier enregistrement
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem - ALLER au dernier enregistrement ----
dispatcher.executeDispatch(document, ".uno:LastRecord", "", 0, Array())
REM 2 récupérer la clef du dernier enregistrement pour pouvoir lui rajouter 10
oForm = ThisComponent.DrawPage.Forms("GAF_ENT_SORT")
oField_ID = oForm.getByNAME("fmtID")
lid = oField_ID.CurrentValue + 10
s_cle10 = CStr(lid)
REM s_cle6 = LEFT(s_cle10,5)+"0"
s_cle6 = LEFT(s_cle10,2) & " " & MID(s_cle10,3,3) & " 0"
msgbox "Nouvelle clé : "+s_cle6
oField_date = oForm.getByNAME("datDATE")
d_date = oField_date.CurrentValue
REM 3 - CREER un nouvel enregistrement ---------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:NewRecord", "", 0, Array())
oForm = ThisComponent.DrawPage.Forms("GAF_ENT_SORT")
oField_ID = oForm.getByNAME("fmtID")
REM oField_ID.Value = CSTR(s_cle6)
oField_ID.Text = s_cle6
oField_ID.commit
oField_date = oForm.getByNAME("datDATE")
oField_date.Date = d_Date
End Sub
REM ------- CreateNexRecord10by10 -------------------------------------------------------------------
REM ===================
Sub CreateNexRecord1by1
REM ===================
dim document, dispatcher, oForm, oField_date, oField_ID as object
DIM d_date As Date
Dim lid as Long
Dim repMsgBox As Integer
Dim sid, sfid As String
REM 1 Récupérer les informations de l'enregistrement en cours : ID et date
REM -----------------------------------------------------------------------
oForm = ThisComponent.DrawPage.Forms("GAF_ENT_SORT")
oField_ID = oForm.getByNAME("fmtID")
lid = oField_ID.CurrentValue + 1
sid = Cstr(lid)
sfid = LEFT(sid,2) & " " & MID(sid,3,3) & " " & RIGHT(sid,1)
msgbox "nouvelle clef :"+sfid
oField_date = oForm.getByNAME("datDATE")
d_date = oField_date.CurrentValue
REM 2 Demander confirmation
REM -----------------------
REM Affiche un MsgBox avec les boutons OK et Annuler
repMsgBox = MsgBox("êtes vous-sûr que la clef"+Cstr(lid)+" n'existe pas ?", 1, "Confirmation")
If repMsgBox = 2 Then
REM Si l'utilisateur clique sur Annuler, sortez de la macro
REM MsgBox "L'exécution a été annulée.", 64, "Information"
Exit Sub
REM ==============================================>>>>>>>>>>>>>>>>>>>>>>
End If
REM 3 CREER un nouvel enregistrement
REM --------------------------------
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:NewRecord", "", 0, Array())
REM 4 Initiliser dans ce nouvel enregistrement la clef ID et le champ formatté datDATE
REM ----------------------------------------------------------------------------------
oForm = ThisComponent.DrawPage.Forms("GAF_ENT_SORT") REM FORMS.getbyNAME("GAF_ENT_SORT") ne marche pas
oField_ID = oForm.getByNAME("fmtID")
oField_ID.Text = lid
oField_date = oForm.getByNAME("datDATE")
oField_date.Date = d_date REM avec cette méthode Date en bleu ça marche
REM oField_date.Text = sa ne marche pas (Text en bleu)
REM il affiche JJ/MM/AA dans le champ mais à l'enregistrement il dit qu'il y a rien
oField_ID.commit
oField_date.commit
end Sub
REM ----------------- CreateNexRecord1by1 -----------------------------------
REM ======================
Sub CreateNexRecordNewYear
REM ======================
Dim oForm, oField_ID, oField_date, oField_montant, oField_comment As Object
Dim dDate As Date
Dim ia AS Integer
Dim lmontant As Currency
Dim sd, snd, s, sna, sk As String
REM les champs s'appellent : datDATE ID fmtMONTANT
REM datDATE est de type date et le format est DD/MM/AA
REM ----------------------------------------------
REM 1 Se mettre sur le tout dernier enregistrement
REM ----------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:LastRecord", "", 0, Array())
REM ------------------------------------------------------------------
REM 2 Récupérer l'année du dernier enregistrement pour changer d'année
REM ------------------------------------------------------------------
oForm = ThisComponent.DrawPage.Forms("GAF_ENT_SORT")
oField_date = oForm.getByNAME("datDATE")
sd = oField_date.CurrentValue
REM on obtient une chaîne 20251106
sa = MID(sd,3,2) REM on prend 25 donc le 3e et 4e car
ia = VAL(sa)+1 REM puis on y ajoute 1
sna = CSTR(ia)
REM sk = sna + "0000"
sk = sna & " 000 0"
snd = "01/01/20" + sna
REM snd = "20" & sna & "0101"
dDate = Cdate(snd)
msgbox "Nouvelle clé : "+sk+" Date : "+snd+" ddat = "+CSTR(dDate)
oField_montant = oForm.getByNAME("fmtMONTANT")
lmontant = oField_montant.CurrentValue * -1.0
msgbox "Nouvelle clé : "+sk+" Date : "+snd+" ddat = "+CSTR(dDate)+" et montant:"+Format(lmontant,"0,00")+" €"
REM -------------------------------------
REM 3 - CREER un nouvel enregistrement --
REM -------------------------------------
dispatcher.executeDispatch(document, ".uno:NewRecord", "", 0, Array())
REM -----------------------------------------------------------------
REM 4 - Charger la clef et la date 1e janvier de la nouvelle année --
REM -----------------------------------------------------------------
oForm = ThisComponent.DrawPage.Forms("GAF_ENT_SORT")
oField_ID = oForm.getByNAME("fmtID")
oField_ID.Text = sk
REM oField_ID.Value = Val(sk)
oField_montant = oForm.getByNAME("fmtMONTANT")
REM oField_montant.Value = lmontant REM méthode inconnue
oField_montant.Text = lmontant
oField_date = oForm.getByNAME("datDATE")
oField_date.Date = dDate
REM oField_date.Text = snd ne marche pas, affiche du texte non pris en compte
oField_comment = oForm.getByNAME("txtTXT_COMMENT")
oField_comment.Text = "On verra si ça monte ou si ça baisse"
msgbox("mettre sur le 1er enregistrement de l'année, une variation de Trésorerie avec la valeur négative de la trésorerie")
oField_ID.commit
oField_date.commit
oField_montant.commit
oField_comment.commit
End Sub
REM ------------------------------- CreateNexRecordNewYear -------------------------