[Résolu] Utilisation de createStatement pour test requete

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.
Kilin
Membre OOrganisé
Membre OOrganisé
Messages : 67
Inscription : 21 mars 2018 23:14

[Résolu] Utilisation de createStatement pour test requete

Message par Kilin »

Bonjour,

J'ai essayé d'adapter une partir de code dans ma base pour tester si une requête est possible ou non par le biais de la commande createStatement().

J'ai tenté diverses retouches mais j'ai toujours une erreur, en l'espèce "Variable d'objet non définie sur la ligne Statement = createStatement()

Code : Tout sélectionner

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

Version 6.4.7.2 (x64)
Domicile
Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Base] Comment utiliser createStatement() ?

Message par Piaf »

Bonjour
Une petite recherche peut-être createStatement()
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Kilin
Membre OOrganisé
Membre OOrganisé
Messages : 67
Inscription : 21 mars 2018 23:14

Re: [Base] Comment utiliser createStatement() ?

Message par Kilin »

Cette portion de code est déjà reprise d'un post du forum, j'ai essayé de l'adapter :(

En fait j'ai essayé d'adapter différentes formes de code y a jamais rien qui fonctionne ... :cry:
Version: 5.4.5.1.M2
Obligation de version travail
Windows 7

Version 6.4.7.2 (x64)
Domicile
Windows 10
Kilin
Membre OOrganisé
Membre OOrganisé
Messages : 67
Inscription : 21 mars 2018 23:14

Re: [Base] Comment utiliser createStatement() ?

Message par Kilin »

Voila je suis arrivé a passer une erreur avec le code suivant:

Code : Tout sélectionner

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

Version 6.4.7.2 (x64)
Domicile
Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Base] Comment utiliser createStatement() ?

Message par Piaf »

Re
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
Kilin
Membre OOrganisé
Membre OOrganisé
Messages : 67
Inscription : 21 mars 2018 23:14

Re: [Base] Comment utiliser createStatement() ?

Message par Kilin »

Bonjour Piaf,

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

Version 6.4.7.2 (x64)
Domicile
Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: Utilisation de createStatement pour test requete

Message par Piaf »

Bonjour
Pour ta macro

Code : Tout sélectionner

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.

Code : Tout sélectionner

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
Kilin
Membre OOrganisé
Membre OOrganisé
Messages : 67
Inscription : 21 mars 2018 23:14

Re: Utilisation de createStatement pour test requete

Message par Kilin »

Merci pour votre réponse,

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

Version 6.4.7.2 (x64)
Domicile
Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: Utilisation de createStatement pour test requete

Message par Piaf »

Re
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.
Limite.png

Code : Tout sélectionner

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
Kilin
Membre OOrganisé
Membre OOrganisé
Messages : 67
Inscription : 21 mars 2018 23:14

Re: Utilisation de createStatement pour test requete

Message par Kilin »

C'est exactement ce que je cherchais à faire merci beaucoup !

Juste un détail, est ce qu'il est possible d'afficher dans la liste déroulante les suggestions en fonction de ce qui est tapé dans la textbox ?
Version: 5.4.5.1.M2
Obligation de version travail
Windows 7

Version 6.4.7.2 (x64)
Domicile
Windows 10