[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 !

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

Messagepar plonge » 10 Sep 2019 18:48

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
Pièces jointes
ControlDefault.odb
(5.38 Kio) Téléchargé 9 fois
Dernière édition par plonge le 14 Sep 2019 15:48, édité 1 fois.
LO version 6073 et 6262 sous windows 10 standard, java 1.8.0_221
plonge
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 268
Inscrit le : 09 Sep 2010 20:06

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

Messagepar micmac » 10 Sep 2019 18:55

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.
 
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
 
Message(s) : 6027
Inscrit le : 28 Août 2010 09:45

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

Messagepar Dude » 11 Sep 2019 08:08

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.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20875
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

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

Messagepar plonge » 11 Sep 2019 15:41

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 6073 et 6262 sous windows 10 standard, java 1.8.0_221
plonge
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 268
Inscrit le : 09 Sep 2010 20:06

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

Messagepar Dude » 11 Sep 2019 16:00

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.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20875
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

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

Messagepar plonge » 11 Sep 2019 16:31

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   AgrandirRéduire
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 6073 et 6262 sous windows 10 standard, java 1.8.0_221
plonge
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 268
Inscrit le : 09 Sep 2010 20:06

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

Messagepar Dude » 11 Sep 2019 16:49

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   AgrandirRéduire
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.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20875
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

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

Messagepar plonge » 11 Sep 2019 17:47

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.
Pièces jointes
xray.jpg
LO version 6073 et 6262 sous windows 10 standard, java 1.8.0_221
plonge
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 268
Inscrit le : 09 Sep 2010 20:06

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

Messagepar Dude » 12 Sep 2019 08:02

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.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20875
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

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

Messagepar plonge » 12 Sep 2019 16:28

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 édition par plonge le 12 Sep 2019 20:36, édité 1 fois.
LO version 6073 et 6262 sous windows 10 standard, java 1.8.0_221
plonge
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 268
Inscrit le : 09 Sep 2010 20:06

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

Messagepar Dude » 12 Sep 2019 18:18

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.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20875
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

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

Messagepar plonge » 12 Sep 2019 20:36

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   AgrandirRéduire
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.
Pièces jointes
6.jpg
6.jpg (17.5 Kio) Consulté 150 fois
LO version 6073 et 6262 sous windows 10 standard, java 1.8.0_221
plonge
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 268
Inscrit le : 09 Sep 2010 20:06

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

Messagepar OOotremer971 » 12 Sep 2019 23:37

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   AgrandirRéduire
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   AgrandirRéduire
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
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Ubuntu
OpenSuse Leap
Avatar de l’utilisateur
OOotremer971
HédOOniste
HédOOniste
 
Message(s) : 2048
Inscrit le : 16 Avr 2010 14:31

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

Messagepar plonge » 13 Sep 2019 16:08

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   AgrandirRéduire
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 6073 et 6262 sous windows 10 standard, java 1.8.0_221
plonge
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 268
Inscrit le : 09 Sep 2010 20:06

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

Messagepar Dude » 13 Sep 2019 19:02

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   AgrandirRéduire
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.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20875
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

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

Messagepar plonge » 13 Sep 2019 19:28

Pourquoi compliquer les choses alors, que je demandais simplement de compléter ma macro de base ce qu'à bien compris OOotremer971.
LO version 6073 et 6262 sous windows 10 standard, java 1.8.0_221
plonge
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 268
Inscrit le : 09 Sep 2010 20:06

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

Messagepar Dude » 14 Sep 2019 09:06

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.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20875
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

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

Messagepar plonge » 14 Sep 2019 15:47

No comment.
LO version 6073 et 6262 sous windows 10 standard, java 1.8.0_221
plonge
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 268
Inscrit le : 09 Sep 2010 20:06


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : OOotremer971 et 4 invité(s)