[Base] Filtre sur formulaire à partir de case à cocher

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.
Marc_swx77
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 11 juil. 2008 17:08

[Base] Filtre sur formulaire à partir de case à cocher

Message par Marc_swx77 »

Open Office Basic Module Base - ver 2.4
objet case à cocher | coché = filtrer formulaire | non coché = ne plus filtrer
Je suis parti d'une idée simple : puis-je cocher une case à cocher pour demander à ce que le formulaire applique le filtrage de mes rendez-vous. J'ai fait un formulaire qui affiche les données de la "requete1"
Formulaire.jpg
Pour Filtrer sur commande situé sur le formulaire lui même
ici par critère de date lorsque la case à cocher est coché
ajouter au formulaire une case ici "op-Filtre" et un zone de texte "F_Dat"
qui vont permettre de recuperer la commande de filtrage ou non
le reste de fromulaire est geré automatiquement par sa methode .Execute() du formulaire
qui remet à jour les données du formulaire en fonction du sql cuisiné.
Le sql du formulaire est une requete appelé "Requete1" que l'on change selon
les besoins de filtrage ou non par la routine elle même.
Il suffit ensuite de lier le sub avec l'évènement de changement de valeur sur
la case à cocher Op_Filtre

Voici la routine sub :

Code : Tout sélectionner

Sub Filtrer 
   'ici il faut changer la requete pour filtrer ou non les enregistrement
	Dim aForm, C1, C2, C3, C4, C5, Fr, DSource, DBDoc, Rq as object
	Dim s, d as String
	Dim mm, dd, yy as string
	Dim IName as string
	Dim nF, Numero, i as Integer	
   'Cette partie trouve le "Frames" courant 
   IName = "com.sun.star.comp.dba.ODatabaseDocument" 
   nF = StarDesktop.Frames.Count
   Numero = -1
   For i = nF-1 To 0 Step -1
   Fr = StarDesktop.Frames.getByIndex( i )
   If (IName = Fr.Controller.Model.ImplementationName) Then Numero = i
   Next i
   If Numero = -1 Then Exit sub
   'on obtient dans Fr le Frames que l'on utilise
   Fr = StarDesktop.Frames.getByIndex( Numero )
   'on se branche sur son datasource
   DSource = Fr.Controller.DataSource
   'Le document de la base de donnée auquel est liée ...
   DBDoc = DSource.DatabaseDocument
   'Notre requete "Requête1" à éditer par routine
   Rq = DBDoc.DataSource.QueryDefinitions.GetByName("Requête1")
   'puis lire les contrôles du formulaires qui 
   'permettent de demander le filtrage par date 
	aForm = thiscomponent.DrawPage.Forms.GetByName("MainForm")' le formulaire
	'quand la case Option Filtre est cochée, on filtre sur 
	'F_Dat zone de texte de la date
        'recuperons les controles
	C1 = aForm.getByName("Op_Filtre")
	C2 = aForm.getByName("F_Dat")
	C3 = aForm.getByName("TextBox3")
	C4 = aForm.getByName("MainForm_Grid")
	C5 = C4.getByName("Date")
	If c1.CurrentValue = 0 then 
	   'quand C1 est à zero (non coché) pas de condition where, on affiche tout
	   s = "SELECT ""ID_Num"", ""Date"", ""Heure"", ""Nom_Numero"" FROM ""Rendez_Vous"""
	   s = s + " ORDER BY ""Date"" ASC, ""Heure"" ASC"
	   Rq.Command = s
	   aForm.Execute()
	   Exit Sub
	End If 
	d = C2.Text
	If d = "" Then exit sub 
        'petit test sur date
	'si la date n'est pas entrée on sort
	dd = Trim(Str(Day(d)))
	mm = Trim(Str(Month(d)))
	yy = Trim(Str(Year(d)))
	'on transfert la date en texte compatible sql
	d = yy + "-" + mm + "-" +dd
	'revoyons notre sql
	s = "SELECT ""ID_Num"", ""Date"", ""Heure"", ""Nom_Numero"" FROM ""Rendez_Vous"""
	s = s + " WHERE ""Date"" = {D '" + d + "' }"
	s = s + " ORDER BY ""Date"" ASC, ""Heure"" ASC"
	'Refaisons la requete à notre volonté
        Rq.Command = s
        'mise à jour du formulaire et ses sous objets:
	aForm.Execute()
End Sub
Voilà, j'espère que ça pourra servir qqun même si le code n'est pas très bien fait il fonctionne
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
OpenOffice 2.4
Marc_swx77
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 11 juil. 2008 17:08

Re: [Base] Filtre sur formulaire à partir de case à cocher

Message par Marc_swx77 »

également pour : changer une date à partir de programme j'ai fait une petite routine
Open Office Base / Windows XP / ver 2.4

Code : Tout sélectionner

Sub Changer_Date
	Dim aForm, c1, c2, c3, c4, c5, C6 as object
	Dim maConnexion as Object
    Dim NomSource As String, login As String, password As String
	Dim maSource As Object, monDbContext As Object
	dim maRequete as Object, resultat, Rec, rd, rm, ry as Object
	dim s1, s2, s3, s, sSQL as String
	Dim Id_N, d1, d2 as String
    dim dbDate as new com.sun.star.util.Date

	'se connecter sur le formulaire pour recuperer des valeurs
	aForm = thiscomponent.DrawPage.Forms.GetByName("MainForm")
        'recuperer accès aux controles
	c2 = aForm.getByName("F_Dat")
	c3 = aForm.getByName("F_Date")
    c1 = aForm.getByName("Reporter")
    c4 = aForm.getByName("MainForm_Grid")
    c5 = c4.getByName("ID_Num")
    c6 = c4.getByName("Date")
    'je quitte si il manque la date à remplacer
    If c1.Label = "" then exit sub [color=#0080FF]'il est sauvegardé dans label invisible ca évite des mises à j[/color]
    'Création du contexte et connexion
	NomSource = "Rendez_Vous"
	monDbContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
	maSource = monDbContext.getByName(NomSource)

	'Les paramètres de connexion éventuels
	login = ""
	password = ""
	maConnexion = maSource.getConnection(login, password)
	if IsNull(maConnexion) then
	  MsgBox("Connexion impossible", 16)
  		Stop
	end if
   'pour éditer la date elaborer une sql à exécuter 
   'c1.Label contient la clé primaire de selection de l'enregistrement sur le formulaire ouvert
   sSQL = "SELECT ""ID_Num"", ""Date"", ""Heure"", ""Nom_Numero"" FROM ""Rendez_Vous"" WHERE ""ID_Num"" = " + c1.Label
   maRequete = maConnexion.createStatement()
   'obtenir l'enregistrement en executant SQL
   resultat = maRequete.executeQuery(sSQL)
   If Not resultat.Next then goto closer1
   Id_N = resultat.Columns.getByName("ID_Num").String
   'je recupere l'ancienne date pour la sauvegarder plus tard dans une autre table
   d1 = resultat.Columns.getByName("Date").String
   'mettons dans d2 la nouvelle date à mettre
   'on change dans l'enregistrement Id_N la date qui était à d1 on le remplace par d2
   If c2.Text <>"" then d2 = c2.Text else d2 = c3.Label 'valeur de d2 recuperé dans un label ...
   'ici transformons la date pour pouvoir la mettre en sql
   s1 = Day(d2)
   If Len(s1) = 1 then s1 = "0" + s1
   s2 = Month(d2) + "-" 
   If Len(s2)<5 then s2 = "0" + s2
   s3 = year(d2) + "-" 
   d2 = "'"+ s3 + "-" + s2 + "-" + s1+"'"
closer1:
   'il faut fermer ancienne connexion pour réouvrir en modiffication
   maConnexion.close
   maConnexion.dispose
   'faisons un sql de modiff ; c'est la première fois que j'ai fait ça
   sSQL = "UPDATE ""Rendez_Vous"" SET ""Date"" = " + d2 + " WHERE ""ID_Num"" = " + c1.Label
   maConnexion = maSource.getConnection(login, password)
   maRequete = maConnexion.createStatement()
   resultat = maRequete.executeQuery(sSQL)
   'il est modiffié et on peut se servir des variables sauvegardés pour écrire les modiffications ds une table
   maConnexion.close
   maConnexion.dispose

End Sub
Voilà j'espère que ca servira quelqu'un.
OpenOffice 2.4