[Résolu][Base] Copier valeur Champ enregistrement précédent

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 !
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

[Résolu][Base] Copier valeur Champ enregistrement précédent

Message par Piaf »

Bonsoir
Pour répondre à ce fil Répéter une valeur dans un champ
Le principe de la macro :
Pour un nouvel enregistrement :
  • Intercepter les touches quand un contrôle a le focus ;
  • récupérer le nom et le type du champ ;
  • aller à l'enregistrement précédent ;
  • récupérer la valeur du champ ;
  • copier cette valeur dans le contrôle en cours.

Code : Tout sélectionner

Sub Main(oEv as Object)
Dim oForm as Object, rst as Object
Dim NomColonne As String, TypeColonne as Long
	If (oEv.Modifiers = com.sun.star.awt.KeyModifier.MOD1)  AND (oEv.keycode = com.sun.star.awt.Key.A) Then
		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		
		If oForm.isNew Then
			NomColonne = oEv.Source.Model.DataField
			TypeColonne = oForm.Columns.getByName(NomColonne).Type
			rst = oForm.CreateResultset
			rst.Last
			Select Case TypeColonne
				Case com.sun.star.sdbc.DataType.DATE
					oForm.Columns.getByName(NomColonne).UpdateDate(rst.Columns.getByName(NomColonne).getDate)
				Case com.sun.star.sdbc.DataType.BIT, com.sun.star.sdbc.DataType.TINYINT
					oForm.Columns.getByName(NomColonne).UpdateByte(rst.Columns.getByName(NomColonne).getByte)
				Case com.sun.star.sdbc.DataType.SMALLINT
					oForm.Columns.getByName(NomColonne).UpdateShort(rst.Columns.getByName(NomColonne).getShort)
				Case com.sun.star.sdbc.DataType.INTEGER
					oForm.Columns.getByName(NomColonne).UpdateInt(rst.Columns.getByName(NomColonne).getInt)
				Case com.sun.star.sdbc.DataType.BIGINT
					oForm.Columns.getByName(NomColonne).UpdateLong(rst.Columns.getByName(NomColonne).getLong)
				Case com.sun.star.sdbc.DataType.FLOAT, com.sun.star.sdbc.DataType.REAL,com.sun.star.sdbc.DataType.DECIMAL, _
					com.sun.star.sdbc.DataType.NUMERIC,com.sun.star.sdbc.DataType.DOUBLE
                	oForm.Columns.getByName(NomColonne).UpdateFloat(rst.Columns.getByName(NomColonne).getFloat)
				Case com.sun.star.sdbc.DataType.CHAR, com.sun.star.sdbc.DataType.VARCHAR, _
                	com.sun.star.sdbc.DataType.LONGVARCHAR
                	oForm.Columns.getByName(NomColonne).UpdateString(rst.Columns.getByName(NomColonne).getString)
            	Case com.sun.star.sdbc.DataType.TIME
            		oForm.Columns.getByName(NomColonne).UpdateTime(rst.Columns.getByName(NomColonne).getTime)
            	Case com.sun.star.sdbc.DataType.TIMESTAMP
            		oForm.Columns.getByName(NomColonne).UpdateTimeStamp(rst.Columns.getByName(NomColonne).getTimeStamp)
            	Case com.sun.star.sdbc.DataType.BOOLEAN
            		oForm.Columns.getByName(NomColonne).UpdateBoolean(rst.Columns.getByName(NomColonne).getBoolean)
			End Select
		End If
	End If
End Sub
Les touches interceptées : Ctrl + A.
La macro est censée fonctionner pour un formulaire contenant les données par enregistrement ou en feuille de données.
Je n'ai fais que quelques tests, donc... :lol:
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Résolu][Base] Recopier valeurs Champs

Message par Piaf »

Bonjour
En complément du message précédent.
Il est également possible de recopier plusieurs champs de l'enregistrement précédent dans un nouvel enregistrement.
Le principe des macros :
Déclenchement par un bouton. Si la recopie concerne un sous-formulaire, veillez à position le bouton dans le bon formulaire.
L'appuie sur ce bouton appel la procédure CopierRegPrec.

Code : Tout sélectionner

Sub CopierRegPrec(oEv as Object)
Dim oForm as Object, Champs as Variant
	oForm = oEv.Source.Model.Parent
	Champs = Array("maDate","monTexte","monInteger","monDouble","monBoleen","monHeure","maDateHeure")
	Copie(oForm,Champs)
End Sub
Dans cette procédure, un tableau est rempli avec le champ de données (pas le nom du contrôle) de chaque contrôle dont on veut recopier la valeur de l'enregistrement précédent.
Puis la procédure Copie est appelée avec l'objet formulaire et le tableau en paramètres.

Code : Tout sélectionner

Sub Copie(oForm,Champs())
Dim rst as Object
Dim NomColonne As String, TypeColonne as Long
	rst = oForm.CreateResultset
	rst.Last
	If oForm.isNew Then
		For n = 0 To UBound(Champs)
			NomColonne = Champs(n)
			TypeColonne = oForm.Columns.getByName(NomColonne).Type
			Select Case TypeColonne
				Case com.sun.star.sdbc.DataType.DATE
					oForm.Columns.getByName(NomColonne).UpdateDate(rst.Columns.getByName(NomColonne).getDate)
				Case com.sun.star.sdbc.DataType.BIT, com.sun.star.sdbc.DataType.TINYINT
					oForm.Columns.getByName(NomColonne).UpdateByte(rst.Columns.getByName(NomColonne).getByte)
				Case com.sun.star.sdbc.DataType.SMALLINT
					oForm.Columns.getByName(NomColonne).UpdateShort(rst.Columns.getByName(NomColonne).getShort)
				Case com.sun.star.sdbc.DataType.INTEGER
					oForm.Columns.getByName(NomColonne).UpdateInt(rst.Columns.getByName(NomColonne).getInt)
				Case com.sun.star.sdbc.DataType.BIGINT
					oForm.Columns.getByName(NomColonne).UpdateLong(rst.Columns.getByName(NomColonne).getLong)
				Case com.sun.star.sdbc.DataType.FLOAT, com.sun.star.sdbc.DataType.REAL,com.sun.star.sdbc.DataType.DECIMAL, _
					com.sun.star.sdbc.DataType.NUMERIC,com.sun.star.sdbc.DataType.DOUBLE
                	oForm.Columns.getByName(NomColonne).UpdateFloat(rst.Columns.getByName(NomColonne).getFloat)
				Case com.sun.star.sdbc.DataType.CHAR, com.sun.star.sdbc.DataType.VARCHAR, _
                	com.sun.star.sdbc.DataType.LONGVARCHAR
                	oForm.Columns.getByName(NomColonne).UpdateString(rst.Columns.getByName(NomColonne).getString)
            	Case com.sun.star.sdbc.DataType.TIME
            		oForm.Columns.getByName(NomColonne).UpdateTime(rst.Columns.getByName(NomColonne).getTime)
            	Case com.sun.star.sdbc.DataType.TIMESTAMP
            		oForm.Columns.getByName(NomColonne).UpdateTimeStamp(rst.Columns.getByName(NomColonne).getTimeStamp)
            	Case com.sun.star.sdbc.DataType.BOOLEAN
            		oForm.Columns.getByName(NomColonne).UpdateBoolean(rst.Columns.getByName(NomColonne).getBoolean)
			End Select
		Next n	
	End If
Le principe est le même que la macro du message précédent mais cette fois, boucle sur chaque champ du tableau et si l'on est situé dans un nouvel enregistrement ces champs sont renseignés.
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
GUIRAUD Michel
Fraîchement OOthentifié
Messages : 1
Inscription : 30 août 2020 19:47

Re: [Résolu][Base] Copier valeur Champ enregistrement précéd

Message par GUIRAUD Michel »

Bonjour

Dans la seconde partie de code (sub copie), [Dim n as integer] a été oublié. Cela m'a fait chercher longtemps.

Merci de corriger.

Votre site n'en est pas moins formidable.
LibreOffice 7.3.4.2 sous Ubuntu 20.04
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25167
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Résolu][Base] Copier valeur Champ enregistrement précéd

Message par Dude »

Salut,

Pour la prochaine fois, il suffit d'insérer Option Explicit pour détecter toute variable mal ou non déclarée.