[Résolu] [Base] Consultation d'une table avec l'unicité d'un champ
Modérateur : Vilains modOOs
Règles du forum
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 !
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 !
-
- Membre lOOyal
- Messages : 40
- Inscription : 16 sept. 2014 13:46
[Résolu] [Base] Consultation d'une table avec l'unicité d'un champ
Bonjour,
Suite à mon sujet dans la partie Modules - Base de données, j'en viens à la partie macro de mon problème. Je vous remets en pièce jointe mon fichier .odb en pièce jointe pour vous donner un ordre d'idée du projet. J'ai refait le fichier par rapport à l'autre discussion pour que la base de données ne soit plus "Firebird".
Il me semble que deux macros devraient intervenir pour finaliser mon projet :
1) la première vise à empêcher de pouvoir saisir un nouvel enregistrement dans la table de données s'il y en a déjà un de présent identique.
2) la deuxième vise à permettre à des utilisateurs de consulter le contenu de la table en saisissant juste dans une case texte le N° SIREN qu'ils veulent consulter.
Tout d'abord, concernant le N° SIREN, inutile d'en vérifier la validité au sens de son calcul, on part du principe que c'est juste une série de 9 chiffres sans espace, rien de plus. Dans l'autre sujet, un message à ce sujet révélait une particularité liée à la prise en compte des SIREN en particulier, j'ai pas très bien compris ne maitrisant que très peu Base, et encore moins les macros Mais si ça peut simplifier la chose, oublié qu'il s'agit d'un numéro SIREN, partez du principe que c'est juste une série de 9 chiffres sans espace, dont il ne doit pas y avoir de doublon dans la table de données.
Ensuite, concernant la consultation, comme indiqué précédemment, je souhaiterais qu'en saisissant juste une série de 9 chiffres dans une case texte, les données de l'enregistrement apparaissent dans les cases respectives, et si ce numéro à 9 chiffres saisi n'est pas présent dans la table, alors que rien n'apparaisse (ou un message qui prévient qu'il n'y a aucun résultat).
Enfin, mais ce n'est pas primordial, on va dire que ca serait la cerise sur le gâteau, si une macro pouvait faire en sorte que lorsqu'on ouvre le formulaire d'Ajout/Modification, celui-ci ne comporte que des cases vides (le formulaire s'ouvre sur un enregistrement vierge) ça serait top !
Si je dois faire un sujet par macro n'hésitez pas à me l'indiquer, mais je pense que les 3 sont assez étroitement liées.
Enfin, je suis en train de commencer à me former aux macros, au tout début ! Jusque là j'utilisais juste l'enregistreur de macro, et le moins souvent possible. Je vais sûrement galérer à comprendre vos solutions proposées, c'est pas que j'y mettrais de la mauvaise volonté, mais j'risque d'être une quiche avec mes questions à venir
Si vous avez besoin de davantage de détails, n'hésitez pas.
Suite à mon sujet dans la partie Modules - Base de données, j'en viens à la partie macro de mon problème. Je vous remets en pièce jointe mon fichier .odb en pièce jointe pour vous donner un ordre d'idée du projet. J'ai refait le fichier par rapport à l'autre discussion pour que la base de données ne soit plus "Firebird".
Il me semble que deux macros devraient intervenir pour finaliser mon projet :
1) la première vise à empêcher de pouvoir saisir un nouvel enregistrement dans la table de données s'il y en a déjà un de présent identique.
2) la deuxième vise à permettre à des utilisateurs de consulter le contenu de la table en saisissant juste dans une case texte le N° SIREN qu'ils veulent consulter.
Tout d'abord, concernant le N° SIREN, inutile d'en vérifier la validité au sens de son calcul, on part du principe que c'est juste une série de 9 chiffres sans espace, rien de plus. Dans l'autre sujet, un message à ce sujet révélait une particularité liée à la prise en compte des SIREN en particulier, j'ai pas très bien compris ne maitrisant que très peu Base, et encore moins les macros Mais si ça peut simplifier la chose, oublié qu'il s'agit d'un numéro SIREN, partez du principe que c'est juste une série de 9 chiffres sans espace, dont il ne doit pas y avoir de doublon dans la table de données.
Ensuite, concernant la consultation, comme indiqué précédemment, je souhaiterais qu'en saisissant juste une série de 9 chiffres dans une case texte, les données de l'enregistrement apparaissent dans les cases respectives, et si ce numéro à 9 chiffres saisi n'est pas présent dans la table, alors que rien n'apparaisse (ou un message qui prévient qu'il n'y a aucun résultat).
Enfin, mais ce n'est pas primordial, on va dire que ca serait la cerise sur le gâteau, si une macro pouvait faire en sorte que lorsqu'on ouvre le formulaire d'Ajout/Modification, celui-ci ne comporte que des cases vides (le formulaire s'ouvre sur un enregistrement vierge) ça serait top !
Si je dois faire un sujet par macro n'hésitez pas à me l'indiquer, mais je pense que les 3 sont assez étroitement liées.
Enfin, je suis en train de commencer à me former aux macros, au tout début ! Jusque là j'utilisais juste l'enregistreur de macro, et le moins souvent possible. Je vais sûrement galérer à comprendre vos solutions proposées, c'est pas que j'y mettrais de la mauvaise volonté, mais j'risque d'être une quiche avec mes questions à venir
Si vous avez besoin de davantage de détails, n'hésitez pas.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par MaUn78 le 18 janv. 2023 16:24, modifié 1 fois.
Obligation de version : LibreOffice 6.2.7.1lin1 (x64)
Windows 10
Windows 10
-
- Membre cOOnverti
- Messages : 357
- Inscription : 29 mai 2009 08:51
- Localisation : Guyane
Re: [Base] Consultation d'une table avec l'unicité d'un champ
Bonjour,
Pour ce :
A Tester!
@+
Pour ce :
, il y a cette solution : Dans la nouvelle ébauche jointe, le formulaire "Ajout - Modification1" présente une zone de liste des N° SIREN unique; ce champ ainsi que le bouton " RéInitialiser" est géré par un macro.1) la première vise à empêcher de pouvoir saisir un nouvel enregistrement dans la table de données s'il y en a déjà un de présent identique
A Tester!
@+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.14 et LO 7.3.7.2 sous OsX 10.13.6 High Sierra ; Windows 10 sous AOO 4.1.14 et LibO 7.3.7.2
-
- Membre lOOyal
- Messages : 40
- Inscription : 16 sept. 2014 13:46
Re: [Base] Consultation d'une table avec l'unicité d'un champ
Merci ! Je regarde ça dans l'après midi ! Ça me semble à première vue déjà pas mal du tout ! En tout cas j'en apprends déjà un peu plus sur Base, merci
Obligation de version : LibreOffice 6.2.7.1lin1 (x64)
Windows 10
Windows 10
-
- SuppOOrter
- Messages : 1468
- Inscription : 18 janv. 2008 09:02
- Localisation : Val de Marne
Re: [Base] Consultation d'une table avec l'unicité d'un champ
Bonjour,
Bien joué HRk2o !
Le problème reste le test de l'unicité au moment de la saisie. Le message d'erreur en cas de mauvaise saisie (SIREN déjà présent) n'est pas très cool pour un utilisateur.
Il y a deux solutions :
Bien joué HRk2o !
Le problème reste le test de l'unicité au moment de la saisie. Le message d'erreur en cas de mauvaise saisie (SIREN déjà présent) n'est pas très cool pour un utilisateur.
Il y a deux solutions :
- Intercepter l'erreur (je ne sais pas faire, du moins pas encore)
- Brancher une macro sur l'événement changement d'enregistrement et chercher son existence dans la table. Faisable
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
-
- Grand Maître de l'OOffice
- Messages : 17084
- Inscription : 03 mars 2006 16:02
- Localisation : Venise verte
Re: [Base] Consultation d'une table avec l'unicité d'un champ
Et pour la consultation d'une table avec l'unicité d'un champ, tu peux mettre en pratique le tutoriel du forum qui permet cette consultation sans Macro.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice : Version : 24.8.2 (x64)(10 novembre 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
-
- Membre lOOyal
- Messages : 40
- Inscription : 16 sept. 2014 13:46
Re: [Base] Consultation d'une table avec l'unicité d'un champ
Alors tout d'abord, merci HRk2o pour sa réponse ! C'est quasiment parfait, et ça pourrait même en rester ainsi, mais y a-t-il moyen que la liste déroulante pour la recherche par SIREN ne soit pas déroulante, mais juste une case où on saisi 9 chiffres avant de valider ? Le problème de la liste déroulante c'est que lorsqu'il y aura des centaines ou des milliers de numéros SIREN, la liste va être très longue et ça prendra du temps pour retrouver un SIREN bien précis. Je sais qu'on peut saisir le(s) premier(s) caractère(s) pour accélérer la recherche, mais si y a 50 SIREN qui commencent par "444" par exemple, c'est un peu gênant. Ceci dit, c'est vraiment pour "chipoter".
Merci aussi à jeanmi2403. Effectivement, le message d'erreur en cas de doublon de SIREN dans la solution de HRk2o n'est pas "jolie" (ou du moins compréhensible par des utilisateurs néophytes), mais s'il n'y a que ça, c'est pas trop gênant, il suffit d'en informer les utilisateurs (un message du genre "si vous avez un message d'erreur c'est que ce SIREN est déjà dans la base de données" devrait suffire). Je vais étudier ta solution pour la consultation sans macro. Il me semble que j'avais essayé au tout début mais j'avais bloqué sans comprendre pourquoi. Maintenant que je maitrise un peu mieux Base, ça passera peut-être mieux.
Merci aussi à jeanmi2403. Effectivement, le message d'erreur en cas de doublon de SIREN dans la solution de HRk2o n'est pas "jolie" (ou du moins compréhensible par des utilisateurs néophytes), mais s'il n'y a que ça, c'est pas trop gênant, il suffit d'en informer les utilisateurs (un message du genre "si vous avez un message d'erreur c'est que ce SIREN est déjà dans la base de données" devrait suffire). Je vais étudier ta solution pour la consultation sans macro. Il me semble que j'avais essayé au tout début mais j'avais bloqué sans comprendre pourquoi. Maintenant que je maitrise un peu mieux Base, ça passera peut-être mieux.
Obligation de version : LibreOffice 6.2.7.1lin1 (x64)
Windows 10
Windows 10
-
- Membre cOOnverti
- Messages : 357
- Inscription : 29 mai 2009 08:51
- Localisation : Guyane
Re: [Base] Consultation d'une table avec l'unicité d'un champ
Bonjour,
Compte-tenu du volume de données, vous devriez tester avec la totalité du fichier Siren concerné pour voir si Base est en mesure de répondre à vos besoins.
@+
Comparer les 2 méthodes mais la préférence est la liste déroulante.la recherche par SIREN ne soit pas déroulante, mais juste une case où on saisi 9 chiffres avant de valider
Compte-tenu du volume de données, vous devriez tester avec la totalité du fichier Siren concerné pour voir si Base est en mesure de répondre à vos besoins.
@+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.14 et LO 7.3.7.2 sous OsX 10.13.6 High Sierra ; Windows 10 sous AOO 4.1.14 et LibO 7.3.7.2
-
- Membre lOOyal
- Messages : 40
- Inscription : 16 sept. 2014 13:46
Re: [Base] Consultation d'une table avec l'unicité d'un champ
Alors franchement, avec les deux méthodes sur le même formulaire c'est parfait ! Chacun utilisera la méthode qu'il préfère...
J'ai pas encore eu trop le temps d'étudier comment tu avais fait tout ça, mais déjà au niveau des contrôles et des formulaires ça me semble assez simple finalement... Je vais étudier ça de plus près pour pouvoir me débrouiller seul les prochaines fois sur cette question là.
Quant à la macro, il va me falloir un peu de temps pour la disséquer, l'analyser et la comprendre (partant de quasiment zéro en la matière), mais ça me semble bien présenté et relativement clair.
Merci pour le boulot.
Je vais mettre le sujet en [Résolu], mais si éventuellement y a une solution pour "embellir" le message d'erreur en cas de doublon de SIREN, je reste preneur
Encore merci à vous 2
J'ai pas encore eu trop le temps d'étudier comment tu avais fait tout ça, mais déjà au niveau des contrôles et des formulaires ça me semble assez simple finalement... Je vais étudier ça de plus près pour pouvoir me débrouiller seul les prochaines fois sur cette question là.
Quant à la macro, il va me falloir un peu de temps pour la disséquer, l'analyser et la comprendre (partant de quasiment zéro en la matière), mais ça me semble bien présenté et relativement clair.
Merci pour le boulot.
Je vais mettre le sujet en [Résolu], mais si éventuellement y a une solution pour "embellir" le message d'erreur en cas de doublon de SIREN, je reste preneur
Encore merci à vous 2
Obligation de version : LibreOffice 6.2.7.1lin1 (x64)
Windows 10
Windows 10
-
- SuppOOrter
- Messages : 1468
- Inscription : 18 janv. 2008 09:02
- Localisation : Val de Marne
Re: [Résolu] [Base] Consultation d'une table avec l'unicité d'un champ
Bonsoir,
Il n'y avait pas une question sur le contrôle des dates ?
Bonne soirée,
Il n'y avait pas une question sur le contrôle des dates ?
Bonne soirée,
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
-
- Membre lOOyal
- Messages : 40
- Inscription : 16 sept. 2014 13:46
Re: [Résolu] [Base] Consultation d'une table avec l'unicité d'un champ
Bonjour,
Le contrôle des dates ? C'est à dire ? Normalement j'ai indiqué dans la table que seule la 1ere date était "obligatoire", et j'ai réglé le format de la date (type dd/mm/yyyy). Y a autre chose à régler au niveau de ces dates ?
Le contrôle des dates ? C'est à dire ? Normalement j'ai indiqué dans la table que seule la 1ere date était "obligatoire", et j'ai réglé le format de la date (type dd/mm/yyyy). Y a autre chose à régler au niveau de ces dates ?
Obligation de version : LibreOffice 6.2.7.1lin1 (x64)
Windows 10
Windows 10
-
- SuppOOrter
- Messages : 1468
- Inscription : 18 janv. 2008 09:02
- Localisation : Val de Marne
Re: [Résolu] [Base] Consultation d'une table avec l'unicité d'un champ
Bonsoir,
Je regarde tout de même comment squeezer le message d'erreur. Comme disait un de mes formateurs "Ça fait pas propre" !!!
Bonne soirée,
Je croyais avoir lu que Date3>Date2>Date1, mais j'ai rêvé, c'est sur un autre projet.
Je regarde tout de même comment squeezer le message d'erreur. Comme disait un de mes formateurs "Ça fait pas propre" !!!
Bonne soirée,
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
-
- Membre lOOyal
- Messages : 40
- Inscription : 16 sept. 2014 13:46
Re: [Résolu] [Base] Consultation d'une table avec l'unicité d'un champ
Ah ok !jeanmi2403 a écrit : ↑20 janv. 2023 17:06 Bonsoir,Je croyais avoir lu que Date3>Date2>Date1, mais j'ai rêvé, c'est sur un autre projet.
Je regarde tout de même comment squeezer le message d'erreur. Comme disait un de mes formateurs "Ça fait pas propre" !!!
Bonne soirée,
Alors certes c'est plus logique si Date 3 > Date 2 > Date 1, mais dans mon cas c'est pas du tout primordial... Du moment que ces dates sont différentes ça fait l'affaire.
Pour le message d'erreur, si tu trouves alors effectivement je ne serais pas contre, ça fera un peu plus "pro"(pre)
Obligation de version : LibreOffice 6.2.7.1lin1 (x64)
Windows 10
Windows 10
-
- SuppOOrter
- Messages : 1468
- Inscription : 18 janv. 2008 09:02
- Localisation : Val de Marne
Re: [Résolu] [Base] Consultation d'une table avec l'unicité d'un champ
Bonsoir,
Comme le problème m'amusait, pour le fun, j'ai programmé un contrôle à la perte du focus du contrôle txtSIREN.
On ouvre une autre connexion et on envoie une requête SQL pour chercher si on a un enregistrement correspondant.
La vérification pourrait aussi se faire sur un événement du formulaire (avant l'action d'enregistrement). Ce qui permettreit en même temps de contrôler que la Date1 n'est pas vide (le message d'erreur n'est pas très "propre" non plus).
Je vais continuer à chercher pour intercepter le message d'erreur, ça serait plus simple ensuite d'envoyer un message en fonction de l'erreur obtenue. Cordialement,
Comme le problème m'amusait, pour le fun, j'ai programmé un contrôle à la perte du focus du contrôle txtSIREN.
On ouvre une autre connexion et on envoie une requête SQL pour chercher si on a un enregistrement correspondant.
Code : Tout sélectionner
Sub VerifieSiren(oEvenement as Object)
Dim oSource as Object, oConnexion as Object, maConnexion as Object, maRequete as Object
Dim dbContexte as Object, resuQuery as Object
Dim iResultat As Long
Dim sSiren as String, sCheminBdd as String, sReqSQL as String
oSource = oEvenement.Source
sSiren = oSource.Text
oConnexion = oSource.Model.Parent.ActiveConnection ' connexion à la base
oDocument = oConnexion.Parent.DataBaseDocument ' la base
sCheminBdd = oDocument.Location ' l'URL de la base
dbContexte = CreateUnoService("com.sun.star.sdb.DatabaseContext")
maSource = dbContexte.getByName(sCheminBdd) ' création d'une autre source de données pour éviter de se marcher sur les pieds
maConnexion = maSource.getConnection("", "") ' se connecter à la source
sReqSQL = "SELECT ""SIREN"" FROM ""T_BNI"" WHERE ""SIREN"" = " & "'" & sSiren & "'"
maRequete = maConnexion.createStatement() ' Envoyer la requête
resuQuery = maRequete.executeQuery(sReqSQL) ' récupérer le résultat
If resuQuery.next Then ' va au premier enregistrement si possible
iResultat = resuQuery.getRow ' vaut 1 si on a trouvé un enregistrement, 0 sinon ( habituellement, avec .last on a le nombre d'enregistrements)
MsgBox ("Le Siren " & sSiren & " existe déjà", MB_ICONSTOP, "Avertissement")
End If
End Sub
Je vais continuer à chercher pour intercepter le message d'erreur, ça serait plus simple ensuite d'envoyer un message en fonction de l'erreur obtenue. Cordialement,
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
-
- Membre cOOnverti
- Messages : 357
- Inscription : 29 mai 2009 08:51
- Localisation : Guyane
Re: [Résolu] [Base] Consultation d'une table avec l'unicité d'un champ
Bonsoir,
encore une petite amélioration visuelle;
dans la recherche textuelle, si le numéro saisi est incorrect, un message s'affiche !
@+
encore une petite amélioration visuelle;
dans la recherche textuelle, si le numéro saisi est incorrect, un message s'affiche !
@+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.14 et LO 7.3.7.2 sous OsX 10.13.6 High Sierra ; Windows 10 sous AOO 4.1.14 et LibO 7.3.7.2
-
- SuppOOrter
- Messages : 1468
- Inscription : 18 janv. 2008 09:02
- Localisation : Val de Marne
Re: [Résolu] [Base] Consultation d'une table avec l'unicité d'un champ
Bonsoir,
Pour en terminer, voici une procédure à brancher sur l'événement "Erreur survenue" du formulaire.
Mais cela ne fonctionne que si le champ est une clé primaire. Dans le cas d'une contrainte unique sur un autre champ, la macro n'est pas exécutée etle message original est affiché...on se demande pourquoi ?
Je ne l'ai pas introduit dans ta base, car il aurait fallu modifier la structure de la table.
A plus,
Pour en terminer, voici une procédure à brancher sur l'événement "Erreur survenue" du formulaire.
Mais cela ne fonctionne que si le champ est une clé primaire. Dans le cas d'une contrainte unique sur un autre champ, la macro n'est pas exécutée etle message original est affiché...on se demande pourquoi ?
Code : Tout sélectionner
Sub FormError(oEvt)
oFormulaire = oEvt.Source
if oFormulaire.ImplementationName <> "org.openoffice.comp.svx.FormController" then exit sub
oErr = oEvt.Reason
oErrNext = oErr.NextException
If oErrNext.ErrorCode = -104 Then
sMessage = oErr.Message
Msgbox sMessage & chr(13) & " ce SIREN existe déjà" , 16, "Erreur SQL "
n = com.sun.star.form.runtime.FormFeature.UndoRecordChanges '= 9
oFormulaire.FormOperations.execute(n)
End If
End Sub
Ajout : Solution de contournement, nommer l'index sur le champ SIREN "SVP_ENTRER_UN_SIREN_UNIQUE" ce qui éclaircira le message standard. |
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
-
- Membre lOOyal
- Messages : 40
- Inscription : 16 sept. 2014 13:46
Re: [Résolu] [Base] Consultation d'une table avec l'unicité d'un champ
Merci Jeanmi !
Je vais tester tout ça, mais ça semble vraiment top.
Excellent boulot. Je vais maintenant essayer d'étudier ces codes Basic pour comprendre comment t'as fais ça
Je vais tester tout ça, mais ça semble vraiment top.
Excellent boulot. Je vais maintenant essayer d'étudier ces codes Basic pour comprendre comment t'as fais ça
Obligation de version : LibreOffice 6.2.7.1lin1 (x64)
Windows 10
Windows 10