[Résolu][Base] filtrer avec listes liées dont une date

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: 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 !
Avatar de l’utilisateur
LeSemeur
Fraîchement OOthentifié
Messages : 5
Inscription : 17 févr. 2020 10:04

[Résolu][Base] filtrer avec listes liées dont une date

Message par LeSemeur »

Bonjour à tous,

Je cherche à réaliser un formulaire où je pourrai faire une recherche suivant un client et les dates liées à ce client.
Pour faire les listes liées, je me suis inspirée de ce fil :https://forum.openoffice.org/fr/forum/v ... 29&t=14662
Pour faire la recherche, je me suis inspirée de ce fil : https://forum.openoffice.org/fr/forum/v ... =8&t=49886
Cependant, dans mon essai, la recherche ne fonctionne pas. A priori, je pense à une difficulté avec la date... mais je ne sais pas ce qui cloche. Voici mon code :

Code : Tout sélectionner

sub PysRefresh
ThisComponent.DrawPage.Forms.getByName("Standard").getByName("ReqClient").refresh
end sub

'************************************************************************************************
sub PysMajListe
'************************************************************************************************
'Lancée sur modification de la liste des marques pour mettre à jour la liste des modèles
'************************************************************************************************

DIM var_id_client as integer

'Recupere les composants liste

PysLstClient = ThisComponent.DrawPage.Forms.getByName("Standard").getByName("ReqClient")
PysLstDate = ThisComponent.DrawPage.Forms.getByName("Standard").getByName("ReqDate")

'Recupere l'id de la marque selectionnée

'Syntaxe si le champ n'est pas lié à un champ de la base
'var_id_marque = PysLstMarque.SelectedItems(0) 

'Syntaxe si le champ est lié à un champ de la base
var_id_client = PysLstClient.valueItemList(PysLstClient.SelectedItems(0))

'Modifie la requete SQL de la liste des voitures :

PysLstDate.ListSource() = array("SELECT Date_arrivée_P, Client_P FROM Particuliers WHERE Client_P =" & var_id_client & " ORDER BY Date_arrivée_P DESC")
PysLstDate.refresh 

end sub

Sub Filter(oEv as Object)
Dim oForm as Object, fDate as Object, fArmes as Object
Dim strSQL as String, maDate
   'Le formulaire
   oForm = oEv.Source.Model.Parent
   'La liste déroulante des dates de séances de tir
   fDate  = oForm.getByName("ReqDate")
   'La liste déroulante des armes
   fClient = oForm.getByName("ReqClient")
   'l'instruction SQL affichant tout
   strSQL = "SELECT * FROM Particuliers"
   'Sélection du bouton sur lequel on a cliqué
   Select Case oEv.Source.Model.Name
      'Si c'est le bouton afficher tout
      Case "cmdAfficher"
         'On défini l'instruction à l'affichage de tous les enregistrements
         strSql = strSQL
         'on supprime les sélections éventuelles dans les listes déroulantes
         fDate.SelectedItems = Array()
         fClient.SelectedItems = Array()
      'Si c'est le bouton filtrer   
      Case Else
         'S'il y a une sélection dans la liste des dates
         If fDate.CurrentValue <> "" Then
            'On applique un filtre sur le champ date de l'instruction SQL
            strSQL = strSQL & " WHERE ""Particuliers"".""Date_arrivée_P"" = " & DateUS(cDate(fDate.CurrentValue)) & ""
         End If
         'S'il y a une sélection dans la listes des clients
         If fClient.CurrentValue <> "" Then
            'On applique un filtre sur le champ client
            strSQL = strSQL & " AND ""Particuliers"".""Client_P"" =" & Apos(fClient.CurrentValue) & ""
         End If
      End Select
   'On défini la commande du formulaire à l'instruction SQL   
   oForm.Command = strSQL
   'On recharge le formulaire
   oForm.Reload                  
End Sub

Function Apos(ByVal chaine As String) As String
	Apos = "'" & join(split(chaine, "'"), "''") & "'"
End Function

Function DateUS(dte as Date) as String
   DateUS = "{D '" & Format(dte,"YYYY-MM-DD") & "' }"
End Function 
Merci à ceux qui voudront bien m'aider... et merci pour ce site qui est une vraie aide et une belle aventure humaine.
 Ajout : Désolée !! J'avais mis deux fois le même lien. Quelle bleue :oops: J'ai rectifié 
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par LeSemeur le 01 mars 2020 14:10, modifié 1 fois.
Windows10
LibreOffice 6.3.4
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25170
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Base] filtrer avec listes liées dont une date

Message par Dude »

Salut,

Il faudrait nous donner un mode pas-à-pas pour arriver à l'erreur.
On ouvre quoi, on clique où, on sélectionne quel élément, etc.
LeSemeur a écrit : dans mon essai, la recherche ne fonctionne pas. A priori, je pense à une difficulté avec la date
Teste tes requêtes avant directement dans l'éditeur SQL : http://beaussier.com/sections/viewtopic.php?f=8&t=1577
Avatar de l’utilisateur
LeSemeur
Fraîchement OOthentifié
Messages : 5
Inscription : 17 févr. 2020 10:04

Re: [Base] filtrer avec listes liées dont une date

Message par LeSemeur »

Bonjour Dude,

Merci à toi de t'être penché sur la question. Tu as raison mon premier message était peu explicite. Je vais essayer de faire mieux.
Dans un premier temps, j'ai testé la requête : elle fonctionne si je lui donne une date fixe. Ce que confirme aussi le fait que l'ordinateur ne me renvoie pas à une erreur de code mais me dit qu'il ne trouve pas l'enregistrement que je cherche.

1. Mon projet : il concerne un atelier de reliure. Un client arrive avec des livres à réparer et ses consignes. La personne qui le reçoit enregistre ensuite sa demande et remplit un formulaire qui permet de préciser ce que chaque secteur de l'atelier (atelier du bas, du haut, dorure) doit faire.Elle remplit une ligne du tableau par livre. Ensuite quand viendra le moment venu il faudra y ajouter la facture. Elle fait une seule facture pour tous les livres d'un client arrivés le même jour. Pour l'instant l'atelier fonctionne sur un classeur Calc mais l'une des personnes l'utilisant a une fâcheuse tendance à effacer des données. D'où l'idée d'utiliser un module plus approprié aux besoins.

2. La question : Sur le formulaire que j'ai joint, je voudrais que la personne puisse sélectionner tous les livres arrivés à la même date pour un client. Dans l'encart "recherche", elle pourrait sélectionner grâce aux zones de liste à la fois le client et la date. Mais je voudrai que seule les dates concernant le client apparaissent. D'où l'idée de passer par des listes liées. Quand le bon client et la bonne date sont sélectionnées la personne appuie sur le bouton "chercher". Quand elle veut retirer le filtre, elle appuie sur le bouton "tout afficher".

3. Hier en cherchant à résoudre le problème, je me suis rendu compte de choses inutiles. Et en te lisant, je me suis dit que je pouvais simplifier mon formulaire en retirant le sous-formulaire qui ne sert à rien pour l'instant. Donc je met de nouveau ma base en PJ. En cherchant, j'ai repéré que la recherche de date ne se fait pas avec la variable date qui s'affiche dans ma liste (31/01/2020 par exemple) mais avec le numéro du client (1;2;...)

J'espère que je ne suis pas trop confuse... avec toute ma reconnaissance !
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Windows10
LibreOffice 6.3.4
ClayStone
Membre lOOyal
Membre lOOyal
Messages : 36
Inscription : 13 mars 2017 07:20

Re: [Base] filtrer avec listes liées dont une date

Message par ClayStone »

Bonjour,
Je suis loin d'être une flèche en matière de macros, prends donc ce que j'écris avec prudence...
LeSemeur a écrit :

Code : Tout sélectionner

strSQL = strSQL & " WHERE ""Particuliers"".""Date_arrivée_P"" = " & DateUS(cDate(fDate.CurrentValue)) & ""
je pense à une difficulté avec la date...
En effet, mais il n'y a pas que ça :wink:
La variable récupérée dans la liste des dates est de type Date
J'aurais écrit

Code : Tout sélectionner

fDate.valueItemList(fDate.SelectedItems(0))
plûtot que

Code : Tout sélectionner

fDate.CurrentValue
Pour l'utiliser dans ta requete strSQL (qui est elle -même une chaîne) tu dois convertir cette variable de type Date en chaîne de caractères avec Cstr() qui convertit les variables de tous types en Chaîne (et pas CDate() qui convertit une variable en date) Voir ce wiki

Afin que cette variable chaîne soit comprise par ta requête SQL, il faut formater (sous la forme { D yyyy-mm-dd } ) cette chaîne de manière à ce que le SQL comprenne que cette chaîne représente une date. C'est ce que fait ta fonction DateUS()
Voir aussi ce fil pour le traitement des dates

Pour le reste, je ne suis pas assez à l'aise avec les macro pour corriger ton code. Tu peux tester celui que j'ai commis et voir si tu peux en tirer quelque chose.
LeSemeur-Date(1).odb
Je me suis passé du bouton "Chercher" en déclenchant les macros à partir des contrôles de liste.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 6.1.5.2 (Build ID 1:6.1.5-3+deb10u5) Obligation de version
Debian Buster - 4.19.0-8-amd64 - sous KDE5
--
L'ignorance est parfois une bonne explication, mais jamais une bonne excuse. Pardonnez-moi quand-même.
Avatar de l’utilisateur
LeSemeur
Fraîchement OOthentifié
Messages : 5
Inscription : 17 févr. 2020 10:04

Re: [Base] filtrer avec listes liées dont une date

Message par LeSemeur »

Bonjour ClayStone,
Vraiment, un GRAND MERCI et Bravo !! :bravo:
C'est exactement ce que je cherchais à faire. Je ne suis pas attachée à mon code... la proposition que tu fais me va parfaitement bien et j'ai pu l'intégrer dans ma base de données sans aucune difficulté. Moi, je ne suis qu'une misérable sangsue en macro. Je pompe chez les autres ce que je pense réussir à mettre en place. Alors merci aussi pour toutes les explications que tu me donnes. Je pense que ça m'aidera pour la suite. C'est donc une mission réussie ! Je passe le sujet en résolu.
Encore merci pour le temps que tu as passé à mettre en place cette solution et pour expliquer comment tu t'y prends.
Windows10
LibreOffice 6.3.4
ClayStone
Membre lOOyal
Membre lOOyal
Messages : 36
Inscription : 13 mars 2017 07:20

Re: [Résolu][Base] filtrer avec listes liées dont une date

Message par ClayStone »

Avec plaisir :D
LeSemeur a écrit : je ne suis qu'une misérable sangsue en macro. Je pompe chez les autres [...]
:lol:
D'où crois-tu que je tire ces quelques lignes ? :mrgreen:
Et je ne pense pas que nous ne soyons que deux dans ce cas ici... J'imagine que c'est une des raisons d'être de ce forum
LibreOffice 6.1.5.2 (Build ID 1:6.1.5-3+deb10u5) Obligation de version
Debian Buster - 4.19.0-8-amd64 - sous KDE5
--
L'ignorance est parfois une bonne explication, mais jamais une bonne excuse. Pardonnez-moi quand-même.