Discussions sur le module de base de données Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.
Modérateur :Vilains modOOs
Règles du forum
Cette section est dédiée au module Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
Pour accélérer les réponses, vous pouvez mettre en ligne votre base en joignant un fichier ODB : comment faire.
Sub OuvrirFC (PysEvt as object)
REM recupération valeur liste déroulante
dim ActivFrm as object
Dim Tableau() As String
Dim i As Integer
Dim Statement As Object
Dim ResultSet As Object
ActivFrm = PysEvt.source.model.Parent 'On "remonte" au parent (le formulaire)
with ActivFrm.getByName("Liste")
If .currentValue <> "" then 'Si la liste n'est pas vide (chargement du formulaire)
'La fonction Split permet d'extraire les données d'une chaine en fonction
'du séparateur spécifié. (espace dans l'exemple)
Tableau = Split(.currentvalue, " " & chr(124) & " ")
Else Exit Sub
end if
end with
For n = LBound(Tableau) To UBound(Tableau)
If instr(tableau(n),"'")>0 then trim(tableau(n))=replace(tableau(n),"'","''")
Next n
Statement = createStatement()
ResultSet = Statement.executeQuery.SQL( "SELECT * FROM ""IDENTITE"" WHERE ""tab_num"" = " & chr(39) & Tableau(1) & chr(39) )
If Not IsNull(ResultSet) Then
oFormConsult = ThisDataBaseDocument.FormDocuments.getByName("Consultation").open()
SourceFormConsult(oFormConsult, SQL)
Else
msgbox "Pas d'enregistrements"
exit sub
Endif
End Sub
Qu'est ce que je dois déclarer ou modifier pour que cela fonctionne ? Inutile de préciser que je suis nul en programmation
Merci
Dernière modification par Kilin le 07 avr. 2018 23:28, modifié 2 fois.
Version: 5.4.5.1.M2 Obligation de version travail
Windows 7
Sub OuvrirFC (PysEvt as object)
REM recupération valeur liste déroulante
dim ActivFrm as object
Dim Tableau() As String
Dim i As Integer
dim maRequete as Object, resultat as Object
dim selectSQL as String
oConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
ActivFrm = PysEvt.source.model.Parent 'On "remonte" au parent (le formulaire)
with ActivFrm.getByName("Liste")
If .currentValue <> "" then 'Si la liste n'est pas vide (chargement du formulaire)
'La fonction Split permet d'extraire les données d'une chaine en fonction
'du séparateur spécifié. (espace dans l'exemple)
Tableau = Split(.currentvalue, " " & chr(124) & " ")
Else Exit Sub
end if
end with
For n = LBound(Tableau) To UBound(Tableau)
If instr(tableau(n),"'")>0 then trim(tableau(n))=replace(tableau(n),"'","''")
Next n
selectSQL = "SELECT * FROM ""IDENTITE"" WHERE ""tab_num"" = " & chr(39) & Tableau(1) & chr(39)
maRequete = oConnexion.createStatement()
resultat = maRequete.executeQuery(selectSQL)
If IsNull(resultat) Then
msgbox "Pas d'enregistrements"
Else
oFormConsult = ThisDataBaseDocument.FormDocuments.getByName("Consultation").open()
SourceFormConsult(oFormConsult, selectSQL)
Endif
End Sub
En revanche, si je met une donnée erronée pour lancer ma requête, j'ai l'erreur suivante: Valeur ou type de données incorrect, index hors de la plage définie.
Du coup je m'interroge si c'est bien la fonction dont j'ai besoin ??
Version: 5.4.5.1.M2 Obligation de version travail
Windows 7
Kilin a écrit :Du coup je m'interroge si c'est bien la fonction dont j'ai besoin ??
En l'absence de fichier reproduisant l'erreur tu es le seul à le savoir.
Kilin a écrit :Cette portion de code est déjà reprise d'un post du forum
Merci de préciser lequel.
A priori tu veux ouvrir un formulaire en le filtrant à partir de la valeur d'une liste déroulante d'un autre formulaire.
Tu peux voir du coté de Ouverture d'un formulaire sur un enregistrement
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
En soit mes formulaires fonctionnent correctement, c'est juste que je souhaiterais gérer à partir du formulaire Accueil une erreur rentrée manuellement par l'utilisateur dans la liste déroulante
---> si la requête existe, j'affiche le formulaire consultation
--> sinon j'affiche une msgbox d'erreur
Merci
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Version: 5.4.5.1.M2 Obligation de version travail
Windows 7
Sub OuvrirFC (PysEvt as object)
REM recupération valeur liste déroulante
dim ActivFrm as object
Dim Tableau() As String
Dim i As Integer
dim maRequete as Object, resultat as object
dim selectSQL as String
oConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
ActivFrm = PysEvt.source.model.Parent 'On "remonte" au parent (le formulaire)
with ActivFrm.getByName("Liste")
If .currentValue <> "" then 'Si la liste n'est pas vide (chargement du formulaire)
'La fonction Split permet d'extraire les données d'une chaine en fonction
'du séparateur spécifié. (espace dans l'exemple)
Tableau = Split(.currentvalue, " " & chr(124) & " ")
Else Exit Sub
end if
end with
For n = LBound(Tableau) To UBound(Tableau)
If instr(tableau(n),"'")>0 then trim(tableau(n))=replace(tableau(n),"'","''")
Next n
selectSQL = "SELECT * FROM ""IDENTITE FIJAIS"" WHERE ""tab_num_fijais"" = " & Tableau(1)
maRequete = oConnexion.createStatement()
resultat = maRequete.executeQuery(selectSQL)
If resultat.next Then
oFormConsult = ThisDataBaseDocument.FormDocuments.getByName("Consultation").open()
SourceFormConsult(oFormConsult, selectSQL)
Else
msgbox "Pas d'enregistrements"
exit sub
Endif
End Sub
Devrait le faire.
Après pas sur que ce soit la meilleure solution. Déjà un combo à la place d'une liste.
Ensuite le filtrage par SQL, je pense que le filtre de formulaire est mieux adapté et surtout plus simple.
La manip sur l'apostrophe est inutile puisque tu récupères la valeur du dernier indice du tableau qui ne peut pas contenir d'apostrophe.
Un petit exemple de ce qu'il est possible de faire avec l'évolution de LibO sur les listes déroulantes.
Sub OuvrirFC2(oEv as Object)
Dim oFormConsult as Object
oFormConsult = ThisDataBaseDocument.FormDocuments.getByName("Consultation").open()
With oFormConsult.drawpage.forms.getbyname("Consultation")
.Filter="""tab_num_fijais"" =" & oEv.Source.Model.SelectedValue
.Applyfilter = True
.reload
End With
End Sub
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
J'avais pensé a faire ce genre de modification, cependant ma base de données est considérable, et pour éviter de scroller toute la liste déroulante, je préférais autoriser l'utilisateur a taper les premières lettres du nom dans la liste déroulante pour arriver directement sur les noms intéressants.
C'est la raison pour laquelle je voulais tester la saisie, si elle est correcte, j'affiche le formulaire consultation, sinon petit message d'erreur pour entrer une valeur valide avant de lancer le formulaire consultation !
Version: 5.4.5.1.M2 Obligation de version travail
Windows 7
Kilin a écrit :cependant ma base de données est considérable, et pour éviter de scroller toute la liste déroulante, je préférais autoriser l'utilisateur a taper les premières lettres du nom
Il est possible de limiter les entrées de la liste à la ou aux lettres tapées dans une zone de texte.
Sub LimiterListe(oEv as Object)
Dim oForm as Object, maListe as Object
oForm = oEv.Source.Model.Parent
maListe = oForm.getByName("lsttab_nom")
strSQL = "SELECT CONCAT( CONCAT( ""tab_nom"", ' ' ), ""tab_prenom"" ) AS ""Identite"", ""tab_num_fijais"" FROM ""IDENTITE FIJAIS"" WHERE UCASE(CONCAT( CONCAT( ""tab_nom"", ' ' ), ""tab_prenom"" )) LIKE " & Apos(UCase(oEv.Source.Text) & "%") & " ORDER BY ""Identite"" ASC"
maListe.ListSource = Array(strSQL)
maListe.Refresh
If maliste.ItemCount = 0 Then
MsgBox("Pas de concordance dans la liste")
oEv.Source.Text = ""
Exit Sub
End If
End Sub
La macro est affectée à l'événement Texte modifié de la zone de texte.
Ajout : Modification de la macro
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