[Résolu][Base]Mise à jour de champ formaté dans un formulaire

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Frankygir
Membre lOOyal
Membre lOOyal
Messages : 29
Inscription : 20 févr. 2025 09:36

[Résolu][Base]Mise à jour de champ formaté dans un formulaire

Message par Frankygir »

Bonjour

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 -------------------------
Formulaire.jpg
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Frankygir le 05 mai 2025 14:15, modifié 6 fois.
Apache Open Office 4.1.15 -- Oracle Report Builder 1.2.1 -- Windows 11
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25977
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Dude »

Salut,


La description dans ton message est trop complexe.
Commence par simplifier en fournissant un ODB contenant juste ce qu'il faut pour analyser :
Un formulaire avec le seul champ formaté et la table concernée pour la mise à jour.
En faisant cet exercice, il y a même de grandes chances que tu résolves ton problème.

Frankygir a écrit : 15 avr. 2025 17:13 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
Bizarre, il faudrait installer XRay et voir ce qu'il y a dans ton objet Forms.
Frankygir
Membre lOOyal
Membre lOOyal
Messages : 29
Inscription : 20 févr. 2025 09:36

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Frankygir »

Je suis novice en Basic et je n'ai pas trouvé d'information sur comment manipuler les divers champs
mon problème est que quand je veux affecter un champ formatté fmtXXX de mon formulaire je ne sais pas quelle méthode utiliser.

oForm = ThisComponent.DrawPage.Forms("GAF_ENT_SORT")
oField_fmtXXX = oForm.getByNAME("fmtXXX")


si XXX est ma clef numérique, fmtXXX est formatté ##\ ###\ # j'essaye
oField_fmtXXX.Value => erreur basic, cette méthode n'existe pas
Si pour l'affecter j'utilise .Text cela affiche bien le bon texte mais quand je veux enregistrer il me dit que le champ est vide
oField_fmtXXX.text = "25 010 0"
oField_fmtXXX.commit

si XXX est une date, fmtXXX est formatté JJ/MM/AA
oField_fmtXXX.date
oField_fmtXXX.commit ==> marche mais il faut fabriquer une date de type Date, pas toujours facile

si XXX est un numérique fmtXXX est formatté monétaire en euros avec séparateur de milliers
oField_fmtXXX.Value ==> erreur basic, cette méthode n'existe pas
oField_fmtXXX.text = Cstr(montant*-1) ou Format(montant*-1, ....)
oField_fmtXXX.commit ==> quelque chose s'écrit dans le champ du formulaire mais quand je veux enregistrer il refuse car ce champ est obligatoire et il n'y a rien dedans

Pourquoi le commit ne charge-t-il pas le vrai champ XXX de la table à partir du texte mis dans le champ formatté fmtXXX?

Peut-on affecter le vrai champ de la table XXX en plus du champ du formulaire?

Ma base réduite fait encore 1,5Mo et n'est pas joignable
Je vais installer Xray et apprendre à m'en servir
Apache Open Office 4.1.15 -- Oracle Report Builder 1.2.1 -- Windows 11
Jeff
GourOOu
GourOOu
Messages : 9941
Inscription : 18 sept. 2006 09:40
Localisation : France

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Jeff »

Bonjour,
Frankygir a écrit : 16 avr. 2025 10:02 Ma base réduite fait encore 1,5Mo et n'est pas joignable
Tu as essayé de la défragmenter ?
(Voir le point E de ce message : viewtopic.php?t=30518)

A +
À lire avant tout !

Pour télécharger Apache OpenOffice

AOO 4.1.15 / Debian 12.10 "bookworm" / Xfce
Frankygir
Membre lOOyal
Membre lOOyal
Messages : 29
Inscription : 20 févr. 2025 09:36

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Frankygir »

oui d'ailleurs avant de poster cette question j'avais demandé comment faire
Apache Open Office 4.1.15 -- Oracle Report Builder 1.2.1 -- Windows 11
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25977
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Dude »

Il faut faire ce que je t'ai demandé :
Dude a écrit : 16 avr. 2025 06:56 un ODB contenant juste ce qu'il faut pour analyser :
Un formulaire avec le seul champ formaté et la table concernée pour la mise à jour.
Frankygir
Membre lOOyal
Membre lOOyal
Messages : 29
Inscription : 20 févr. 2025 09:36

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Frankygir »

Exposer son problème oblige à mettre de l'ordre dans ses idées et à trouver tout seul la solution.
J'ai souvent pratiqué auprès de mes pairs et ça marche
mais ici point de pairs, je suis novice en Basic
Dude a écrit : 16 avr. 2025 06:56 En faisant cet exercice, il y a même de grandes chances que tu résolves ton problème.
Réduire et défragmenter une base n'apprend pas grand chose. Je travaille déjà sur une base réduite pour expérimenter mes macros et pas sur ma base opérationnelle et c'est pourquoi je vous expose mes problèmes! Aussi je pense que tu voulais dire :
En faisant cet exercice, il y a même de grandes chances que je résolve ton problème ;)

J'ai supprimé les savantes requêtes et les rapports synthétiques pour réduire la taille. Tant pis pour les autres lecteurs...
GFA_XXXXXX_Compta.odb
Le formulaire contient 4 champs obligatoires pour l'enregistrement : ID, DATE, MONTANT, Type de Mvt bancaire
les 3 premiers sont formattés ##\ ###\ # DD/MM/AA et monétaire en euros et cents avec séparateur de milliers

Pour créer un nouvel enregistrement avec des champs préenregistrés j'ai utilisé des boutons pour appeler des macros pour mémoriser les valeurs souhaitées (en recopiant ce que j'ai vu dans ce forum ou en adaptant Forms.getbyname(" => Forms(" quand le Basic plantait)
puis j'ai recopié du forum une technique pour créer un nouvel enregistrement avec un appel à uno (incompréhensible pour moi) mais expérimentalement qui est efficace
et puis dans le nouvel enregistrement j'ai essayé d'affecter les champs calculés et j'ai eu des problèmes de méthode uniquement avec les champs formattés

ça marche pour les champs numériques comme ANNEE et MOIS que je calcule en macro de sortie du champ Type de Mvt bancaire pour pouvoir lier l'image du relevé bancaire avec cette double clé -- et ne marchait pas quand MOIS était fomatté 01, 02,... 12 -- en le repassant en numérique la macro a marché avec la méthode ".Value" suivi d'un ".commit"

Alors comment diable peut-on affecter un champ_formatté dans un formulaire et être sûr que le champ du dessous (celui de la table) soit bien rempli. J'ai vérifié que les valeurs limites ne gênaient pas en y fixant par erreur valeur max 8 pour le mois. Je demandais 12 et ça forçait à 8

Est-ce que ma technique est trop simpliste et ne marche que pour les champs text avec la méthode texte et les champs numériques avec la méthode Value? Et cette technique ne peut gérer des champs formattés?
Alors faut-il utiliser un autre service uno? et faire un update du champ formatté du formuaire? et un update du champ de la table? j'ai vu un exemple il me semble en posant la question à qwant


-------------------------------------------------------------------------------------------------------------
Je n'ai pas encore réussi à faire fonctionner Xray ce qui pourtant me semble salvateur
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Apache Open Office 4.1.15 -- Oracle Report Builder 1.2.1 -- Windows 11
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25977
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Dude »

Bon, plein de problèmes dans ce que tu fournis.
Et on ne peut pas dire que ton ODB est simple et conforme avec ce que je t'avais demandé.

Concernant ton histoire d'ouverture de formulaire :
capture.png
Avec XRay, on voit qu'en interrogeant la propriété ElementNames, il n'existe pas de formulaire nommé "GAF_ENT_SORT".
Pour plus d'info sur le sujet, lire ceci : https://beaussier.com/sections/viewtopic.php?f=8&t=158


Ensuite le fait d'imposer une clé primaire qui va contenir un assemblage d'années et de mois n'est pas une bonne idée.
Tu déclares ça avec un entier (INTEGER) qui sera bloqué dès lors que tu vas atteindre la limite de ce qu'il peut contenir.
Tu ferais mieux de mettre ça en tant que chaîne puisqu'il ne semble pas y avoir à faire de calcul avec.

Pour moi, il faut déjà revoir ton modèle relationnel.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Frankygir
Membre lOOyal
Membre lOOyal
Messages : 29
Inscription : 20 févr. 2025 09:36

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Frankygir »

Mille excuses
je n'avais mis à jour les macros dans cette base réduite
GFA_XXXXXX_Compta.odb
Le Groupent Foncier Agricole XXXXXX s'appelait autre fois GAF mais depuis GAF est une autre forme de société
Aussi au renouvellement de société GAF est devenu GFA mais on l'appelle toujours GAF et quelquefois je me mélange les pinceaux
comme dans cette vieille macro

Je ne comprends absolument pas tes remarques sur l'analyse relationnelle ni sur les débordements de clefs
Je suis novice dans ce basic mais pas en conception de Bases de Données

Je reçois les relevés bancaire chaque mois de chaque année. La clef est donc Année & Mois et ne peut déborder
Cette table contient les Débit Crédits et l'image du relevé
Pour vérifier d'éventuelles erreurs de frappe, une requête sur ma table des mouvements d'entrées-sorties GFA ENT SORT exclut les jeux et retrouve les totaux par mois pour l'année en remplaçant toute dépense remise par une entrée (et réciproquement)
Remise : quand EDF te rembourse l'argent trop perçu c'est une entrée dans tes comptes mais pour tes dépenses de l'année en électricité c'est une dépense négative remisée.

La table des mouvements GFA ENT SORT contient plusieurs années et la clef est "25 064 8" avec 25 pour 2025, 064 car j'ai eu parfois plus de 100 mouvements donc 3 chiffres et 8 pour les jeux d'écriture qui vont par deux, j'enlève une valeur au montant versé et je l'affecte à autre chose
"25 064 8" est donc supérieur à 2^15 mais inférieur à 2^31
Je peux aller jusqu'en 2099 mais en 2053 j'aurai déjà 100 ans
donc je ne vois pas de quel débordement tu parles

Le formulaire de GFA ENT SORT me permet de visualiser en même temps que je recopie une entrée ou une sortie à telle DATE le relevé du mois de ma banque. Avec un classeur deux colonnes contenant deux formules auraient suffit YEAR(DATE) & MONT(DATE). Ici je suis obligé de mettre une macro qui se déclenche quand je quitte le dernier champ obligatoire pour calculer les champs ANNEE et MOIS de mon formulaire à partir de la date du mouvement et, dès que j'enregistre, le sous-formulaire sur la table des relevés me présente l'image du relevé bancaire du mois de l'année correspondante.
Nota : j'ai retravaillé l'image du formulaire pour ne présenter que la partie utile car je ne crois pas que je puisse insérer un objet OLE image avec des ascenseurs et un zoom et puis rezoomer au bon endroit à chaque entrée serait fastidieux

j'ai toujours une erreur au lancement de Xray
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Apache Open Office 4.1.15 -- Oracle Report Builder 1.2.1 -- Windows 11
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25977
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Dude »

Frankygir a écrit : 17 avr. 2025 10:15 Je ne comprends absolument pas tes remarques sur l'analyse relationnelle ni sur les débordements de clefs
Tant pis, on va revenir au problème initial de mise à jour de champ formaté.
Que faut-il faire pour arriver à l'erreur ?
Parce que je vois ceci :

Code : Tout sélectionner

    oField_ID = oForm.getByNAME("fmtID")
    REM oField_ID.Value = CSTR(s_cle6)
    oField_ID.Text = s_cle6
    oField_ID.commit
Si c'est un entier, il faut passer par la propriété CurrentValue.
Frankygir
Membre lOOyal
Membre lOOyal
Messages : 29
Inscription : 20 févr. 2025 09:36

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Frankygir »

j'ai essayé
erreur currentValue.jpg
de plus un champ formatté a l'air d'être du texte???
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Apache Open Office 4.1.15 -- Oracle Report Builder 1.2.1 -- Windows 11
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25977
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Dude »

Pourquoi prendre un champ formaté qui stocke au final un entier ?
Bis repetitae :
Dude a écrit : 17 avr. 2025 12:12 Que faut-il faire pour arriver à l'erreur ?
Frankygir
Membre lOOyal
Membre lOOyal
Messages : 29
Inscription : 20 févr. 2025 09:36

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Frankygir »

dans la macro non corrigée du bouton 1, quand tu crée un nouvel enregistrement avec le bouton, la nouvelle clef apparait comme souhaité "25 002 0"
tu mets une date, un montant, tu choisis un mouvement bancaire et quand tu sors de ce dernier champ l'année et le mois sont calculés
mais si tu veux enregistrer pour faire apparaître le relevé il te dit qu'il n'y a rien dans le champ ID ????? alors que du texte y est visible
tu retapes ce qui était écrit et il est content

Je pensais qu'un champ puisque formatté était du texte et je pensais que quand je faisais le commit c'était comme moi quand je tape du texte sur ce champ formatté

bien sûr avec un champ entier ça marchait et était moins joli je pouvais donc m'en passer
mais j'ai voulu aussi charger un monétaire qui est forcément formatté
j'ai eu le même problème avec une date qui est formatté
Chaque fois j'ai un texte écrit sur le formulaire mais à l'enregistrement OO me disait que le champ était vide

c'est pourquoi je pose la question en général : comment assigner un champ formatté

---------------------------------------------------------------------------------------------------------------------
en demandant à Qwant j'ai trouvé ça mais il se complique la vie en revenant sur l'enregistrement précédent
il manipule des trucs que je ne comprends pas les ResultSet
et des Colonnes mais je suis dans un Formulaire

est ce que je pourrais utiliser

Code : Tout sélectionner

oForm.getbyname("fmtXXX").updateString("montexteformatté")
si un champ formatté est de type String
Sinon pour un entier

Code : Tout sélectionner

oForm.getbyname("fmtXXX").updateInteger("25 011 7")
et pour une date

Code : Tout sélectionner

oForm.getbyname("fmtXXX").updateDate(Cdate("01/01/2025"))
et pour un monétaire

Code : Tout sélectionner

oForm.getbyname("fmtXXX").updateCurrency(CCurrency("-14 600,57 €"))"
------------------------------------------------------ réponse qwant ---------------------------------------------------------------------
OpenOffice Basic : Recopie d'une partie d'un enregistrement sur un autre

Pour réaliser une macro en OpenOffice Basic qui permet de recopier une partie d'un enregistrement sur un autre, vous pouvez vous inspirer du code que vous avez fourni dans le contexte. Voici un exemple simplifié qui illustre comment copier une valeur d'un champ d'un enregistrement précédent vers un nouvel enregistrement.
Exemple de Macro

Code : Tout sélectionner

Sub CopierValeurChamp(oEv As Object)
    Dim oForm As Object
    Dim rst As Object
    Dim NomColonne As String
    Dim TypeColonne As Long

    ' Vérifier si la combinaison de touches est celle désirée
    If (oEv.Modifiers = com.sun.star.awt.KeyModifier.MOD1) AND (oEv.keycode = com.sun.star.awt.Key.A) Then
        ' Identifier le formulaire
        If oEv.Source.Model.Parent.ServiceName = "stardiv.one.form.component.Form" Then
            oForm = oEv.Source.Model.Parent
        Else
            oForm = oEv.Source.Model.Parent.Parent
        End If
        
        ' Vérifier si c'est un nouvel enregistrement
        If oForm.isNew Then
            NomColonne = oEv.Source.Model.DataField
            TypeColonne = oForm.Columns.getByName(NomColonne).Type
            
            ' Créer un jeu de résultats pour accéder à l'enregistrement précédent
            rst = oForm.CreateResultset
            rst.Last ' Aller à l'enregistrement précédent
            
            ' Copier la valeur selon le type de colonne
            Select Case TypeColonne
                Case com.sun.star.sdbc.DataType.STRING
                    oForm.Columns.getByName(NomColonne).UpdateString(rst.Columns.getByName(NomColonne).getString)
                ' Ajouter d'autres types de données selon les besoins
            End Select
        End If
    End If
End Sub
Explication du Code

Interception des touches : La macro commence par vérifier si une combinaison de touches spécifique (par exemple, MOD1 + A) a été pressée.

Identification du formulaire : Elle identifie le formulaire actif pour déterminer où copier les données.

Vérification de l'enregistrement : La macro vérifie si l'enregistrement est nouveau (oForm.isNew).

Accès à l'enregistrement précédent : Elle crée un jeu de résultats et se déplace à l'enregistrement précédent pour récupérer la valeur à copier.

Mise à jour de la valeur : Selon le type de colonne, elle met à jour la valeur dans le champ actuel avec celle de l'enregistrement précédent.

Conclusion

Cette macro permet de copier une valeur d'un champ d'un enregistrement précédent vers un nouvel enregistrement dans OpenOffice Base. Vous pouvez adapter le code pour gérer d'autres types de données selon vos besoins. Assurez-vous de tester la macro dans votre environnement pour vérifier son bon fonctionnement.
Dernière modification par Oukcha le 18 avr. 2025 04:06, modifié 1 fois.
Raison : Balises [code] et [/code] = lecture et sélection simplifiées de votre macro
Apache Open Office 4.1.15 -- Oracle Report Builder 1.2.1 -- Windows 11
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25977
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Dude »

Ta colonne ID est un entier sur 6 positions.
Le format numérique de ton contrôle me semble incorrect :
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Frankygir
Membre lOOyal
Membre lOOyal
Messages : 29
Inscription : 20 févr. 2025 09:36

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Frankygir »

Merci de ta perspicacité
mais c'est diabolique je rentre ##\ ###\ # (que j'avais trouvé dans un post sur les numéros de téléphone)
les valeurs min et max sont 12 000 0 et max 99 999 9
j'enregistre et puis il met n'importe quoi à la place, ce que tu as trouvé.

J'ai essayé avec un format nombre classique avec une séparation de milliers
et j'ai toujours la même erreur

bug format clé 3.jpg
le problème reste présent avec un champ formatté assigné avec une méthode qui ne lui convient pas
erreur bouton 1 avec nombre séparé en deux.jpg
Par ailleurs sur le Forms("GFA_ENT_SORT) qui marche au lieu de Forms. getByName("GFA_ENT_SORT) qui plante
j'ai vu que le Forms(0) marchait (sans doute parce que je ne suis pas dans le sous-formulaire)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Apache Open Office 4.1.15 -- Oracle Report Builder 1.2.1 -- Windows 11
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25977
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Dude »

Frankygir a écrit : 17 avr. 2025 15:15le problème reste présent avec un champ formatté assigné avec une méthode qui ne lui convient pas
Sûrement parce que la valeur retenue après le formatage ne correspond pas à un entier.
Et donc refus d'enregistrement en table.
Comme je te l'ai déjà dit, ce n'est pas une bonne chose que d'avoir une clé primaire de ce genre.
Frankygir a écrit : 17 avr. 2025 15:15Par ailleurs sur le Forms("GFA_ENT_SORT) qui marche au lieu de Forms. getByName("GFA_ENT_SORT) qui plante
Je t'ai déjà expliqué que tu n'as pas de formulaire de ce nom.
On le voit avec XRay dans ma copie écran du 17/04/2025 08:01.
Frankygir
Membre lOOyal
Membre lOOyal
Messages : 29
Inscription : 20 févr. 2025 09:36

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Frankygir »

1) J'ai changé le formattage et je te montre un champ rempli avec 150 010
si ce n'est pas un entier qui rentre dans la valeur min-max 120 000-999 999 je ne sais pas ce que c'est

J'ai le même problème avec le champ date dans le bouton 2
j'ai le même problème avec le champ date et le champ montant dans le bouton 3
à chaque fois il me dit que les champs sont vides et d'ailleurs l'autre macro calcule une ANNEE et un MOIS erronnés puisqu'il part d'un champ vide

Je ne sais donc toujours pas comment charger par macro un champ formatté entier, date ou monétaire
Je sais afficher à l'emplacement du champ formatté un texte formatté attendu
mais le commit ne le charge pas dans le vrai champ de la table (comme cela se passe quand c'est moi qui tape ces données dans le champ)

Aurais-tu des infos sur comment utiliser updateINTEGER, updateDATE et updateCURRRENCY qui feraient peut-être le boulot?



2) j'avais déjà dit que dans les macros de mon premier envoi il restait une erreur GAF_ENT_SORT au lieu de GFA_ENT_SORT
Mais ce n'est plus le cas dans mon deuxième envoi
Pas besoin de Xray pour voir que mon formulaire a le même nom que ma table, il suffit d'ouvrir l'appli et de voir que le formulaire modifie bien la table
en plus hier Xray n'était pas téléchargeable en ce moment, mon antivirus me disait que ces sites étaient infectés! Encore un coût des Russes?
Aujourd'hui j'ai pu mais il faut que j'apprenne à m'en servir
Apache Open Office 4.1.15 -- Oracle Report Builder 1.2.1 -- Windows 11
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25977
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Dude »

Frankygir a écrit : 18 avr. 2025 09:46Aurais-tu des infos sur comment utiliser updateINTEGER, updateDATE et updateCURRRENCY qui feraient peut-être le boulot?
Avec XRay, tu as les paramètres attendues par les méthodes que tu souhaites appeler :
capture.png

Frankygir a écrit : 18 avr. 2025 09:46Pas besoin de Xray pour voir que mon formulaire a le même nom que ma table
Et pourtant, regarde ma copie écran pour voir que l'objet formulaire qui se trouve dans ton document formulaire ne porte pas ce nom.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Frankygir
Membre lOOyal
Membre lOOyal
Messages : 29
Inscription : 20 févr. 2025 09:36

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Frankygir »

Bonjour

j'ai réussi à charger et lancer Xray
j'ai changé le format de ma clef champ formatté : Nombre + pas de virgule + séparateur de milliers donc 150 010 par exemple
car l'ancien format utilisateur faisait des changements après enregistrement

Dans mon script j'ai changé le nom oField_fmtID car j'ai essayé de mettre à jour le champ oField_ID de la table en plus du champ formatté du formulaire mais sans succès. Basic ne voulait pas.

Volà l'extrait de mon script bouton 1 avec appel à Xray

Code : Tout sélectionner

oForm = ThisComponent.DrawPage.Forms("GFA_ENT_SORT")
    oField_fmtID = oForm.getByNAME("fmtID")            Rem j'ai renommé oField_ID en oField_fmtID pour être plus précis
    msgbox "Nouvelle clé : "+s_cle6+" ou bien :"+Cstr(lid)  REM affiche 150 010 et 150010
    oField_fmtID.Text = s_cle6
    REM oField_ID.Value = lid  REM ne marche pas
    
    oField_fmtID.commit
  
    Xray oField_fmtID
J'ai mis un Xray sur mon champ formatté et il m'affiche
a) Propriétés

Code : Tout sélectionner

Name                      string                            "fmtID"   

EffectiveDefault          variant                           <empty>  may be void 
EffectiveMax              double                             999999  may be void 
EffectiveMin              double                             120000  may be void 

ObjIDinMSO                integer                             65535       ???????????????????????

ReadOnly                  boolean                             False   

Text                      string                          "150 010"   
CurrentValue              variant                           <empty>  (get), read-only 

TreatAsNumber             boolean                              True                                    ????????????????????
tout semble normal, le texte affiché aussi et la valeur est vide (c'est bien ce qu'il me dit quand je veux enregistrer)

b)Méthodes
je ne vois pas la méthode .Text qui pourtant fait quelque chose
je vois la méthode .commit
je n'ai pas su voir de méthodes pour charger le champ

.write parle de Outstream d'après Qwant c'est quand on veut charger tout un fichier

c) Services
il me dit qu'il n'y a aucun service disponible

d) La clef de ma table est INTEGER et pas SmallInt
en BASIC je dois mettre un Long et pas un Integer sinon quand je lis la clef sinon ça déborde
Dans XRAY je vois marqué DOUBLE pour les min-max et Integer pour ObjIDinMSO 65536 (qu'est ce que c'est???)
à chaque fois le nom change, il faut juste s'habituer...

2) j'avoue que je ne suis pas assez formé à l'approche objet
J'ai mis un Xray dans ma macro qui calcule année et mois sur le mois pour voir ce qui arrive dans un champ numérique simple
et là pas de méthode???
mais une propriété Value
alors je me dis que quand j'assigne une valeur à une propriété je charge un champ numérique

OField_Mois.value = 3 me permet d'affecter un champ numérique à une valeur
je pensais que c'était une méthode...
je croyais qu'il n'y avait que les méthodes pour toucher les objets

3) EUREKA j'ai trouvé!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Pou le champ clef formatté "150 010" ou même (20)"15 001 0"
Je dois modifier les propriétés .EffectiveValue (et .Text si je veux le voir tout de suite)

Code : Tout sélectionner

oField_fmtID.Text = s_cle6
oField_fmtID.EffectiveValue = lid
Alors Xray me dit que la valeur chargée est bien 150010

Code : Tout sélectionner

EffectiveMax              double                             999999  may be void 
EffectiveMin              double                             120000  may be void 
EffectiveValue            variant                            150010  may be void 
Text                      string                          "150 010"
4) Pour les champs booléens la propriété .State apparait dans Xray
mais bizarrement le commit n'existe pas??? c'est donc appliqué tout de suite

Code : Tout sélectionner

REM Booléen Dépense	(checkBox)
	oField_chkB_DEP  = oForm.getByNAME("chkB_DEP")
	oField_chkB_DEP.State = 1
REM	oField_chkB_dep.commit       REM commit non trouvé
5) Pour les champs monétaires c'est la propriété .EffectiveValue
mais j'ai du passer par un Val. Pourquoi? Pour transformer un currency en nombre?
Je voulais retourner la trésorerie en fin d'année et trésorerie négative en début d'année
J'ai donc créé

Code : Tout sélectionner

Dim c_montant As Currency
REM sur l'enregistrement de départ : on prend la trésorerie en fin d'année
	c_montant         = oField_fmtMontant.CurrentValue * -1.0
REM sur le nouvel enregistrement : on met la trésorerie en début d'année
       oField_fmtMontant = oForm.getByNAME("fmtMONTANT")
       Field_fmtMontant.EffectiveValue = VAL(c_montant)    REM pourquoi le VAL est-il nécessaire?
       oField_fmtMontant.commit
REM sur le nouvel enregistrement

6) Pour les champs textes dans des boîtes combinées déroulantes, propriété .Text
mais il faut assigner une valeur existante dans la table
REM Type de mouvement bancaire : Jeu
oField_Mvt_Banc = oForm.getByNAME("ZC_Mvt_Banc")
oField_Mvt_Banc.Text = "Jeu"
oField_Mvt_Banc.commit

7) bon maintenant il faut que je règle le problème du champ date... qui ne marche pas

Car tous mes champs sont remplis avec 20XXMMDD me dit XRAY
les valeurs min 20000101 et max 20991231
mais si je calcule le 01/01/20 nouvelle année à partir du 31/12/année précédente
avec un DateSerial(20xx,1,1)

en mémoire Xray me dit que j'ai alors un nombre serial 42xxxx et non pas 20xx0101
et derrière ça coince car j'attendais 20XX0101

Code : Tout sélectionner

	Dim d_Date As Date


	oField_date = oForm.getByNAME("datDATE")
REM Xray oField_date
	oField_date.Date = d_Date
REM oField_date.Date = "01.01.2015" REM charge au 42xxxx

        oField_date.Text = s_nfdate
	oField_date.commit
Xray oField_date
Je ne sais donc toujours pas charger un champ date (formatté DD/MM/YY) avec la propriété .Date au format interne 20XXMMDD
Mais je sais charger le champ extérieur avec la propriété .Text = "01/01/NA"
Apache Open Office 4.1.15 -- Oracle Report Builder 1.2.1 -- Windows 11
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12668
Inscription : 08 nov. 2005 16:23
Localisation : Brest, France

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Bidouille »

Frankygir a écrit : 18 avr. 2025 14:48EUREKA j'ai trouvé
Merci d'ajouter le [Résolu] à ce fil.


Frankygir a écrit : 18 avr. 2025 14:48bon maintenant il faut que je règle le problème du champ date... qui ne marche pas
Et d'ouvrir une nouvelle question avec un titre en rapport puisque ce sujet parle de champ formaté.
Frankygir
Membre lOOyal
Membre lOOyal
Messages : 29
Inscription : 20 févr. 2025 09:36

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Frankygir »

Merci de m'avoir indiqué d'utiliser Xray pour savoir comment assigner plusieurs champs formattés d'un autre type

Eureka! j'ai trouvé comment utiliser Xray pour avoir la liste des propriétés d'un champ

Mais ce fil n'est pas résolu puisque je n'arrive toujours pas à assigner correctement le champ formatté Date dans un formulaire

enfin je réussis à l'assigner avec un nombre serial 42xxx mais il est alors différent de tous les autres champs date de la base qui sont en ISO 20xxMMDD et ça fait planter la macro suivante

Comment assigner la propriété Date avec une valeur Iso et pas un nombre serial?

je lis la date du champ précédent
Champ Date enreg précédent.jpg
je vais dans le champ formatté Date du nouvel enregistrement pour y charger 01/01/15
champ Date nouvel enreg avant chargement.jpg
Je charge le champ avec une nouvelle date calculée avec un dateserial
champ Date nouvel enreg après chargement.jpg
j'ai donc 42205 au lieu de 20150101
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Apache Open Office 4.1.15 -- Oracle Report Builder 1.2.1 -- Windows 11
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25977
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Mise à jour de champ formaté dans un formulaire

Message par Dude »

Frankygir a écrit : 02 mai 2025 19:05 Mais ce fil n'est pas résolu puisque je n'arrive toujours pas à assigner correctement le champ formatté Date dans un formulaire
Ce sont deux contrôles différents. Utilise le bon et rouvre un nouveau fil si cela ne fonctionne pas :
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Frankygir
Membre lOOyal
Membre lOOyal
Messages : 29
Inscription : 20 févr. 2025 09:36

Re: [Base] [Résolu]Mise à jour de champ formaté dans un formulaire

Message par Frankygir »

Je vous remercie

Grâce au https://forum.openoffice.org//fr/forum/ ... 04&start=0

J'ai trouvé qu'il fallait charger le champ fmtDat avec un long
et fabriquer une chaine qui contient une date ISO
s_date = Cstr(i_année + 1) & "0101"
l_date = Val(s_date)
XXXX.Date = l_date

et j'ai oublié de dire que le champ MOIS formatté 01 à 12
j'utilise .EffectiveValue pour le charger

pour ceux que ça interesse
GFA_XXXXXX_Compta-2.odb
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Apache Open Office 4.1.15 -- Oracle Report Builder 1.2.1 -- Windows 11