IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenOffice & LibreOffice Discussion :

Sélection d'un enregistrement a l'aide d'une liste déroulante. [LibreOffice][Base de données]


Sujet :

OpenOffice & LibreOffice

  1. #1
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 207
    Points : 308
    Points
    308
    Par défaut Sélection d'un enregistrement a l'aide d'une liste déroulante.
    Bonjour le Forum.

    Dans le titre se trouve mon problème..

    Je dispose d'une table contenant des enregistrements avec des membres. (nom, prenom, adresse,etc......)

    Je crée un formulaire qui affiche ces enregistrement un par un.

    Mais je voudrais pouvoir sélectionner un enregistrement depuis une liste déroulante ou un combBox.

    J'ai trouver des tuto expliquant comment changer la valeur d'un champ d'un enregistrement via une liste, mais si certain disent que il est possible de sélectionner un enregistrement à l'aide soit d'une liste déroulante, soit d'une combo box, je n'ai pas trouvé la manière de faire.

    Faut-il passer par une requête SQL, j'ai déjà essayé plusieurs truc, mais rien n'y fait...

    Je rame, je rame (et pourtant je suis dans le sable...

    Merci

    Michel

  2. #2
    Membre averti Avatar de Amélie Ladoque
    Inscrit en
    Novembre 2004
    Messages
    259
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 259
    Points : 319
    Points
    319
    Par défaut
    S'il n'y a qu'une table, je ne vois pas l'intérêt d'une liste déroulante.
    Préférez un formulaire avec un contrôle table.

  3. #3
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 207
    Points : 308
    Points
    308
    Par défaut
    Bonjour Amélie.

    Je ne comprend pas bien ta réponse.
    Pour moi la liste déroulante me permet de choisir un champs dans la table, puis via une requete SQL d'afficher tout les champ que je désire éditer.

    Je ne vois pas comment faire avec un contrôle table pour sélectionner un enregistrement, l'afficher, l'éditer, puis faire l'update des donnée. Mais je vais me pencher sur cet partie des base de donnée.

    Mais en attendant j'ai trouvé un code que j' ai adapté pour mon problème sur le site
    suprême code

    Je poste aussi ici la manière dont je m'y suis pris:
    Je dispose d'une table "Tmembre" qui contient mes enregistrement composé par des champ nommés, "ID", "nom","prenom",......
    Je crée un formulaire vierge, sur le quel on place un Combo Box destiné à recevoir les nom qui créeront la condition "WHERE" de la requête SQL.
    Je définit dans les données du combo box le contenu de liste comme
    "SELECT DISTINCT "nom" FROM "Tmembre" ORDER BY "nom".
    Le Combo Box contient maintenant la liste des noms selectionné par la requête SQL (tous les nom de la table "Tmembre"
    Dans la partie du Comb Box "Evenements" dans "Texte modifié" je définit la macro éditée dans le formulaire de la DB (Outils/Macro/Editer les Macro) Attention le chemin des menus peut varier en fonction de la version de libre Office
    Je place des champs(zone de texte) sur le formulaire( en définissant les noms des champs)
    J’écris le code Basic dans le Basic de libre Office

    code Basic pour résoudre le problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Sub AfficheNom	
    	dim oDoc as object
    	dim oForm as object
    	dim oNom as string
    	dim oAdresse as string
    	dim oVille as string
    	dim oRet as object
     
    	oDoc = ThisComponent 
    	oForm  = oDoc.DrawPage.Forms.getByName("FormSaisie") 
    	oNom = oForm.getByName("cbNom").Text
     
    	' Creation d'une jeu de lignes pour la requête SQL
    	oRet = createUnoService("com.sun.star.sdb.RowSet")
       	oRet.DataSourceName = "Dbmembre"
       	oRet.CommandType = com.sun.star.sdb.CommandType.COMMAND 
     
       	req = "SELECT * FROM Tmembre WHERE NOM = '"+ oNom + "'"
    	oRet.SetPropertyValue("Command",req)
     
        oRet.Execute()
     
    	if oRet.RowCount > 0 then
    		oRet.next()
    		oForm.getByName("cID").text = CorrigeString(oRet.getString(1))
    		oForm.getByName("cNom").text =  CorrigeString(oRet.getString(2))
    		oForm.getByName("cPrenom").text = CorrigeString(oRet.getString(3) )
    		oForm.getByName("cAdresse").text = CorrigeString(oRet.getString(4) )
    		oForm.getByName("cNumero").text = CorrigeString(oRet.getString(5) )
    		oForm.getByName("cCP").text = CorrigeString(oRet.getString(6) )
    		oForm.getByName("cVille").text = CorrigeString(oRet.getString(7) )
    		oForm.getByName("cGSM").text = CorrigeString(oRet.getString(9) )
    		oForm.getByName("cTel").text = CorrigeString(oRet.getString(8) )
    		oForm.getByName("cMail1").text = CorrigeString(oRet.getString(10) )
    		oForm.getByName("cMail2").text = CorrigeString(oRet.getString(11) )
    		oForm.getByName("cAG").text = CorrigeString(oRet.getString(12) )
    		oForm.getByName("cActif").State = oRet.getString(13) 
    		oForm.getByName("cSexe").text = CorrigeString(oRet.getString(14) )
    		oForm.getByName("cCot").text = CorrigeString(oRet.getString(15) )
    		oForm.getByName("cMontant").text = CorrigeString(oRet.getString(16) )
    		oForm.getByName("cLicence").text = CorrigeString(oRet.getString(17) )
    		oForm.getByName("cNaissance").text = CorrigeString(oRet.getString(18) )
     
    		if(oRet.getString(13) )="false" then
    			oForm.getByName("cActif").State =0
    		else
    			oForm.getByName("cActif").State =1
    		end if
    		oForm.getByName("cAG").text = CorrigeString(oRet.getString(12) )
    		oForm.getByName("cCot").text = CorrigeString(oRet.getString(15) )
    		oForm.getByName("cMontant").text = CorrigeString(oRet.getString(16)) 
    		oForm.getByName("cbPrenom").text =""
     
    	endif
    	oDoc.drawpage.forms
    End Sub
    '********************************************************************
    '***     Supprime le caractére " ' " dans une chaine et le remplace par un espace 
    function CorrigeString(lachaine as String)
    	Dim newchain as string
    	newchain =	Replace(lachaine,"'","`",1)
    	CorrigeString= newchain
    end Function
    Les première lignes sont les définitions de variables,
    puis on assigne des variables au document( la DB je suppose !!), au formulaire (FormSaisie), au nom du champ Combo Box (cbNom)

    On crée la requête SQL avec la condition "WHERE nom =" le contenu texte du combo box.

    et on exécute la requête.

    Si le code SQL est correct, on reçoit un tableau de chaîne correspondant au résultat de la requête.
    Il n'y a plus qu'a remplir les zone de texte correspondantes au contenu du tableau.

    Et voila

    J'ai commencé avec la version 7.0 de libre Office, mais pendant la recherche je suis passé à la version 24.2.1.2....en français...

    Voila,

    J'ai du créer un code Basic sur le même principe pour faire l'update des modifications du formulaire dans les enregistrements de la table.
    Il faut aussi se méfier des caractères dans le texte , le caractère " ' " n'est pas apprécié dans l'écriture des requête SQL. Moi je le remplace systématiquement par le caractère "`"(char(96)). D’où la fonction
    function CorrigeString(lachaine as string)
    Voila.
    Je pense avoir résolu mon problème, je marque donc comme résolu

    Merci de vous être penché sur mon problème

    Michel

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 311
    Points : 39 689
    Points
    39 689
    Billets dans le blog
    9
    Par défaut
    Bonjour Michel,

    Quelques remarques concernant la sémantique :

    Il faut distinguer le "champ" qui est une zone d'un formulaire ou d'un état d'une "colonne" qui est un attribut d'une table relationnelle.
    Il faut aussi distinguer l'"enregistrement" qui est une occurrence d'écriture dans un fichier, d'une "ligne" qui est une occurrence d'une table.


    Ensuite dans la ligne 18 du code, on trouve cette requête :

    req = "SELECT * FROM Tmembre WHERE NOM = '"+ oNom + "'".

    Deux remarques à son sujet :

    • il ne faut JAMAIS coder SELECT * dans un livrable. Voyez mon billet de blog à ce sujet ICI
    • Attention aux injections SQL : si oNom est un champ alimenté depuis une zone du formulaire dans lequel l'utilisateur met une valeur suivie de "OR 1=1" alors on aura accès à toutes les lignes de la table !

  5. #5
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 207
    Points : 308
    Points
    308
    Par défaut "SELECT *"
    Bonjour escartefigue

    Concernant la sémantique, merci des remarques (je ne suis pas toujours très strict la dessus

    Concernant le "Select *", j'ai été voir ton article.

    Dans le cadre d'une DB ouverte à un large public je comprend.
    Dans mon cas, la table (la base aussi d'ailleurs) n'est utilisée que par moi en local sur mon PC.

    Ma table contient 18 colonnes que je veux afficher sur mon formulaire.
    Dois-je écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID,NOM,PRENOM,.........  FROM MEMBRES
    Il faut remplacer les point par les 18 noms de colonnes ?
    Cela fait un peu long non ?

    Bon je suis fainéant, je le sais mais.....

    Ou y a t-il un autre moyen SQL de remonter toutes les colonnes de la ligne de la DB ?

    Merci

    Michel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2000] Rechercher des enregistrements à l'aide d'une barre de recherche
    Par Theo64 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 16/05/2012, 13h53
  2. [AC-2007] Supprimer un jeu d'enregistrements à l'aide d'une boucle For
    Par lakhdar16 dans le forum VBA Access
    Réponses: 3
    Dernier message: 18/10/2011, 12h58
  3. Réponses: 2
    Dernier message: 07/08/2006, 11h51
  4. Réponses: 2
    Dernier message: 01/08/2006, 23h24
  5. Réponses: 1
    Dernier message: 06/06/2006, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo