[Résolu][Base] Comment utiliser la propriété ControlDefault

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 !
plonge
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 297
Inscription : 09 sept. 2010 19:06

[Résolu][Base] Comment utiliser la propriété ControlDefault

Message par plonge »

Bonsoir à tous,
Mon problème : je bute sur l'utilisation de la propriété 'ControlDefault' d'un champ.
Explication : j'ai un champ parasité avec une valeur par défaut du nombre 6, j'ai besoin de passer cette valeur à null par macro et non manuellement (corriger le champ serait trop simple). Mon code plante à la ligne 37, avez-vous une idée?
Un seul post dans le forum avec ControlDefault mais non significatif.
Merci par avance
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par plonge le 14 sept. 2019 14:48, modifié 1 fois.
LO version 7.4.5.1 sous windows 10 et 11 standard, java 1.8.0_341
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9254
Inscription : 28 août 2010 08:45

Re: [Base] Comment utiliser la propriété ControlDefault

Message par micmac »

Bonjour,

Votre dernier message attend une suite.
Pensez-y afin de ne pas laisser en suspens un sujet que vous avez ouvert.
 Ajout : Message privé reçu de plonge le 10 Sep 2019 21:05
Je voulais donner une suite positive pour clôturer le fil, mais je n'en ai pas pour l'instant. Donc on verra plus tard Firebird étant ce qu'il est malheureusement.
 
Touche Ctrl de Windows = touche cmd⌘ sur Mac
Outils > Options sur Windows = OpenOffice > Préférences sur Mac
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Comment utiliser la propriété ControlDefault

Message par Dude »

Comme d'habitude, on n'a pas forcément envie de télécharger moult documents.
Donc, nous faciliter le travail est un minimum qui se concrétise par :
  1. insérer dans le corps du message le code de la macro exposant le problème
  2. fournir un mode pas-à-pas permettant de reproduire ce qui a été fait ou ce que vous cherchez à faire pour arriver au problème
  3. ajouter des copies écran (situation avant / après) si cela permet de mieux comprendre
Et enfin :
plonge a écrit :je bute sur l'utilisation de la propriété 'ControlDefault' d'un champ
D'un champ QUOI ? Précise de quel type de contrôle de formulaire il s'agit.
plonge
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 297
Inscription : 09 sept. 2010 19:06

Re: [Base] Comment utiliser la propriété ControlDefault

Message par plonge »

Bonsoir Dude,
Je ne comprend vraiment pas ta demande? :roll:
1: la macro? Il n'y en a qu'une dans le fichier il suffit de la regarder.
2: pas à pas? Il suffit de lancer la macro pour voir que la ligne 37 bloque (en plus c'est précisé).
3: copie d'écran? le message, tu le vois en faisant fonctionner le code.
Tout est dit dans la ligne 37.
Le champ: voir ligne 37 champ DS valeur défaut = 6
Le formulaire ou le control?? Je ne veux nullement changer un contrôle de formulaire??
Précisions si tu ne comprend pas: il s'agit seulement de compléter ma ligne 37 de code pour que celle-ci change la valeur 6 à null du champ DS de la table tb_famille en utilisant du code rien d'autre. ControlDefault est donné par xray (que tu peux activer). pour te rendre compte.
Suis je claire pour toi.
A+
LO version 7.4.5.1 sous windows 10 et 11 standard, java 1.8.0_341
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Comment utiliser la propriété ControlDefault

Message par Dude »

plonge a écrit :Je ne comprend vraiment pas ta demande?
Qu'est ce que tu ne comprends pas dans :
Dude a écrit :on n'a pas forcément envie de télécharger moult documents
Donc merci de publier le code de cette fameuse macro dans un message.
plonge
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 297
Inscription : 09 sept. 2010 19:06

Re: [Base] Comment utiliser la propriété ControlDefault

Message par plonge »

Re,
Cette discussion devient complétement stérile!
Le code pour le voir tu ouvre tout simplement le fichier joint 'ControlDefault.odb' joint au message de tête. C'est pourtant simple!
Je ne vois pas pourquoi tu ne veux pas ouvrir ce fichier???? Puisque de toute façon il faudra l'ouvrir pour résoudre le problème. :roll: :roll:
Néanmoins pour faire plaisir à Mr Dude , je vais publier ce code.

Code : Tout sélectionner

Sub Modif() 
Dim LaTable As String, listeNoms() As String, Latable1 As String
Dim maRequete As Object, lesTables As Object, uneTable As Object, lesColonnes As Object, laColonne As Object, Statement As Object, instrSQL As Object
Dim reponse As Boolean
Dim t As Long, i As Long, nombreColonnes As Long
Dim maConnexion AS Object
Dim props(0) As New com.sun.star.beans.PropertyValue
	ThisDatabaseDocument.CurrentController.connect("","")
	maConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
	lesTables = maConnexion.Tables
	listeNoms = LesTables.getElementNames
t = 0
Do
	If t = 1 Then
		Exit Do
	Else
	Endif
	If t = 0 Then
		LaTable1 = "tb_famille"
		LaTable = LaTable1	
	Else
	Endif
	reponse = LesTables.hasByName (LaTable)
	If reponse then   
		uneTable = LesTables.getByName(LaTable)
		lesColonnes = uneTable.Columns
		nombreColonnes = lesColonnes.Count
		for i = 0 to nombreColonnes -1  
			laColonne = lesColonnes(i)  			
			If lacolonne.Name = "DS" Then
			'xray lacolonne
				
				' Ci-dessous il faut utiliser la propriété ControlDefault pour passer le valeur 6 à NULL mais comment???
				
				instrSQL = "ALTER TABLE """ & LaTable & """ALTER COLUMN ""DS"" ControlDefault NULL"
				maRequete = maconnexion.createStatement()
				maRequete.executeUpdate(instrSQL)
				maRequete.Close	
				MsgBox "Mise à jour -DS- faite. " & LaTable ' pour test
				Exit Sub
			End If
		next i 	
	Else
		MsgBox("La table " & LaTable & " n'existe pas", 48, " ")
		Exit Sub
	Endif
	T = T + 1
Loop
LesTables.refresh()	'A placer après chaque insertion dans une table
End Sub
Dans ton prochain post ne me demande pas aussi de mettre la réponse, je ne l'ai pas.
LO version 7.4.5.1 sous windows 10 et 11 standard, java 1.8.0_341
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Comment utiliser la propriété ControlDefault

Message par Dude »

plonge a écrit :Je ne vois pas pourquoi tu ne veux pas ouvrir ce fichier????
Peut-être que si tu répondais aux autres sur ce forum, tu comprendrais.
Chaque semaine, tu as 100 questions donc je te laisse faire le calcul du nombre de documents à inspecter.

Revenons à ton code (enfin) publié, je vois ceci :

Code : Tout sélectionner

instrSQL = "ALTER TABLE """ & LaTable & """ALTER COLUMN ""DS"" ControlDefault NULL"
Je t'invite à lire ce tutoriel et notamment la partie "ne pas partir tête baissé" : http://beaussier.com/sections/viewtopic.php?f=8&t=1577
C'est une instruction SQL que je prends la peine de tester :
capture.png
Que dit le message d'erreur : ControlDefault n'existe pas en SQL :shock:
Où as-tu été pêcher ça ?

La syntaxe pour ALTER TABLE est à relire : http://hsqldb.org/doc/1.8/guide/ch09.ht ... le-section

Conclusion : pas besoin de télécharger quoi que ce soit.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
plonge
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 297
Inscription : 09 sept. 2010 19:06

Re: [Base] Comment utiliser la propriété ControlDefault

Message par plonge »

Re,
Si toi tu veux passer tes journées sur le forum c'est ton problème.
Je n'est pas attendu ton post pour répondre à des questions.
Mais bref ces remarques c'est toujours stérile, j'en revient à la question de base.
Je répète je suis OBLIGE de passer par du code.
Dude a écrit :Que dit le message d'erreur : ControlDefault n'existe pas en SQL
Où as-tu été pêcher ça ?
ici
avec xray laColonne
Si j'ai confondu les propriétés ou les colonnes il suffit de le dire.
S'obstiner à ne pas vouloir ouvrir un fichier à pour l'instant seulement servi à encombré le serveur de 5 messages inutiles.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LO version 7.4.5.1 sous windows 10 et 11 standard, java 1.8.0_341
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Comment utiliser la propriété ControlDefault

Message par Dude »

Tu mélanges des pommes et des bananes.
En l’occurrence, le langage SQL et l'accès à l'API.

Bis repetitae :
Dude a écrit :La syntaxe pour ALTER TABLE est à relire : http://hsqldb.org/doc/1.8/guide/ch09.ht ... le-section
Une simple requête UPDATE permet de réinitialiser le champ de colonne à NULL.
plonge
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 297
Inscription : 09 sept. 2010 19:06

Re: [Base] Comment utiliser la propriété ControlDefault

Message par plonge »

Bon on reprend:
Pourquoi j'ai besoin de passer la valeur défaut du champ à nul par une macro et non par le SQL, par UPDATE ou autre.
Des tables existantes 'tb_famille' sont alimentées par un formulaire qui affecte ou non un '6' dans le champ 'DS' en fonction de certains critéres.
Mais comme le champ 'DS' contient la valeur par défaut ''6' celle-ci est affectée d'office au champ 'DS sans distinction.
Ces tables je ne les maîtrises pas. Donc je ne peux pas les corrigées directement.
Pour les corriger je suis obligé de mettre à disposition une nouvelle version des bases sans données, qui contient une procédure automatique de migration des tables avec données, alimentées par l'utilisateur final qui m'est inconnu. Les tables migrées contenant donc toujours des '6' dans tous les champs.
Ensuite dans cette nouvelle version dés que les anciennes tables sont incorporées dans la nouvelle version, je purge par macro automatique les tables des '6' parasites.
A ce moment l'utilisateur à retrouver une table correcte sous réserve que dans la macro j'ai pu effacer la valeur défaut '6' sinon, dés qu'il alimentera à nouveau la table le '6' sera mis sans distinction dans tous les champs'DS'.
D'où l'obligation de faire cela pour M A C R O.
Suis-je clair!
Dernière modification par plonge le 12 sept. 2019 19:36, modifié 1 fois.
LO version 7.4.5.1 sous windows 10 et 11 standard, java 1.8.0_341
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Comment utiliser la propriété ControlDefault

Message par Dude »

Oui, très clair.
Donc, tu passes ta requête UPDATE par macro.
Comme tu le fais dans le code que tu exposes où tu lances ton ALTER TABLE.
plonge
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 297
Inscription : 09 sept. 2010 19:06

Re: [Base] Comment utiliser la propriété ControlDefault

Message par plonge »

UPDATE ne marche pas pour résoudre le problème ci-dessus.
Si le code ci-dessous que j'ai écrit permet de purger le champ 'DS' du '6' indésirable, il ne permet nullement de supprimer la valeur par défaut du champ d'origine de la table.

Code : Tout sélectionner

Sub Modifier
	maConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
	Statement = maConnexion.createStatement()
	instrSQL = "UPDATE ""tb_famille"" SET ""DS"" = NULL  WHERE ""GENRE"" = 'AN' " 
	maRequete = maConnexion.createStatement() 
	nbLignesEcrites = maRequete.executeUpdate(instrSQL) 
	instrSQL = "UPDATE ""tb_famille"" SET ""DS"" = NULL  WHERE ""GENRE"" = 'DC' " 
	maRequete = maConnexion.createStatement() 
	nbLignesEcrites = maRequete.executeUpdate(instrSQL) 
	instrSQL = "UPDATE ""tb_famille"" SET ""DS"" = NULL  WHERE ""GENRE"" = 'SD' " 
	maRequete = maConnexion.createStatement() 
	nbLignesEcrites = maRequete.executeUpdate(instrSQL) 
	'MsgBox("Nombre d'enregistrements modifiés : " & nbLignesEcrites)  
End Sub
C'est cela qu'il faut remettre à null, sinon l'erreur persiste.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LO version 7.4.5.1 sous windows 10 et 11 standard, java 1.8.0_341
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 13:31

Re: [Base] Comment utiliser la propriété ControlDefault

Message par OOotremer971 »

Bonjour,

Avant tout je précise que Base n'est pas du tout mon terrain de jeu habituel :aie: :?
plonge a écrit :C'est cela qu'il faut remettre à null, sinon l'erreur persiste.
est-ce que tu peux tester :

Code : Tout sélectionner

lacolonne.ControlDefault = ""
apparemment ça fonctionne (le champs se remet bien à zéro) mais j'aimerai que tu confirmes (ou pas) au cas où un truc m'échappe dans la compréhension du pb.
Plonge.png
ensuite, si j'alimente la table manuellement, la valeur par défaut se met bien à zéro.

Ton code complet modifié en conséquence :

Code : Tout sélectionner

REM  *****  BASIC  *****
Option explicit
Sub Modif() 
Dim LaTable As String, listeNoms() As String, Latable1 As String
Dim maRequete As Object, lesTables As Object, uneTable As Object, lesColonnes As Object, laColonne As Object, Statement As Object, instrSQL As Object
Dim reponse As Boolean
Dim t As Long, i As Long, nombreColonnes As Long
Dim maConnexion AS Object
Dim props(0) As New com.sun.star.beans.PropertyValue
	ThisDatabaseDocument.CurrentController.connect("","")
	maConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
	lesTables = maConnexion.Tables
	listeNoms = LesTables.getElementNames
t = 0
Do
	If t = 1 Then
		Exit Do
	Else
	Endif
	If t = 0 Then
		LaTable1 = "tb_famille"
		LaTable = LaTable1	
	Else
	Endif
	reponse = LesTables.hasByName (LaTable)
	If reponse then   
		uneTable = LesTables.getByName(LaTable)
		lesColonnes = uneTable.Columns
		nombreColonnes = lesColonnes.Count
		for i = 0 to nombreColonnes -1  
			laColonne = lesColonnes(i)  			
			If lacolonne.Name = "DS" Then
				lacolonne.ControlDefault = ""	
				Exit Sub
			End If
		next i 	
	Else
		MsgBox("La table " & LaTable & " n'existe pas", 48, " ")
		Exit Sub
	Endif
	T = T + 1
Loop
LesTables.refresh()	'A placer après chaque insertion dans une table
End Sub
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
plonge
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 297
Inscription : 09 sept. 2010 19:06

Re: [Base] Comment utiliser la propriété ControlDefault

Message par plonge »

Bonsoir OOotremer971,
Brovo :bravo: bien compris le problème, heureusement que tu dis ne pas être familiarisé avec base :lol: Le code marche bien et s'incorpore bien dans l'ensemble de ma procédure.
Si tu regarde l'image xray ci-dessus, c'est bien sur 'ControlDefault' qu'il fallait agir. Mais dans le fichier en tête j'ai mal interprété l'information. J'ai essayé d'agir sur le champ alors qu'il fallait agir sur la colonne.

Code : Tout sélectionner

instrSQL = "ALTER TABLE """ & LaTable & """ALTER COLUMN ""DS"" ControlDefault NULL"
Je laisse ce fil ouvert jusqu'à demain, si tu veux ajouter qq chose.
Encore merci.
Cordialement, plonge
LO version 7.4.5.1 sous windows 10 et 11 standard, java 1.8.0_341
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Comment utiliser la propriété ControlDefault

Message par Dude »

plonge a écrit :UPDATE ne marche pas pour résoudre le problème ci-dessus.
Ca ne marche pas car il faut d'abord altérer la table pour que la colonne accepte le NULL.

En clair et comme dit plus haut, deux requêtes SQL et 10 lignes de code plus tard :

Code : Tout sélectionner

Sub Modif()
    sUrl = ThisDatabaseDocument.URL
    oDC = CreateUnoService("com.sun.star.sdb.DatabaseContext")
    oSrc = oDC.getByName(sUrl)
    oDB = oSrc.getConnection("","")
    oCnx = oDB.createStatement()
    sReq = "alter table ""tb_famille"" alter column ""DS"" SET DEFAULT NULL"
    sRet = oCnx.executeUpdate(sReq)
    sReq = "update ""tb_famille"" set ""DS""=NULL"
    sRet = oCnx.executeUpdate(sReq)
    oCnx.dispose
    msgbox "Nombre de MàJ : " & sRet
End Sub
no_problemo.gif
Ainsi le travail est réalisé par le SGBD et non par l'API.
Ce qui peut s'avérer coûteux dans le cas où le volume de données dans la table est important.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
plonge
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 297
Inscription : 09 sept. 2010 19:06

Re: [Base] Comment utiliser la propriété ControlDefault

Message par plonge »

Pourquoi compliquer les choses alors, que je demandais simplement de compléter ma macro de base ce qu'à bien compris OOotremer971.
LO version 7.4.5.1 sous windows 10 et 11 standard, java 1.8.0_341
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] Comment utiliser la propriété ControlDefault

Message par Dude »

En quoi ces 10 lignes de code sont plus compliquées ? :lol:
Je n'ai fait que corriger ta mauvaise syntaxe d'altération de table et la compléter par une mise à jour SQL.
Rien de plus simple.
plonge
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 297
Inscription : 09 sept. 2010 19:06

Re: [Base] Comment utiliser la propriété ControlDefault

Message par plonge »

No comment.
LO version 7.4.5.1 sous windows 10 et 11 standard, java 1.8.0_341