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

WinDev Discussion :

Classe et base de données [WD16]


Sujet :

WinDev

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 125
    Points : 121
    Points
    121
    Par défaut Classe et base de données
    Bonjour,
    quelqu'un peut il me dire le moyen le plus efficace de remplir un tableau dynamic dans une class à partir de la base de données ?

    Petit exemple de ce que je fais actuellement:

    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
     
    //Déclaration de ma classe commande
    cCommande est classe
    PRIVÉ
    	Numero est entier 		//Numéro de la commande
    	NumeroClient est entier	//Numéro du client
    	date est une Date 		//Date de la commande
    	Operateur est chaîne //Nom de la personne ayant pris la commande
    FIN
     
    //Déclaration de ma classe client 
    cClient est classe 
    PRIVÉ 
    	NumeroClient est entier //Numero du client 
    	Nom est chaîne 		//Nom du client 
    	ListeCommande est tableau de cCommande dynamique //Liste des commande du client 
    FIN 
     
    //Constructeur de cClient
    PROCEDURE Constructeur(IdClient)
    //Chargement du client
    SI HLitRecherchePremier(FClient,NumeroClient,IdClient) ALORS
    	FichierVersMémoire(objet,FClient)
     
    	//Chargement de la liste des commandes du client
    	Filtre est chaîne = HFiltreIdentique(FCommande,NumeroClient,IdClient)
    	FichierVersTableau(ListeCommande,FCommande,Filtre)
     
    FIN
    Je suis d'accord, ce n'est pas très efficace.
    En plus, souvent dans les commandes, je dois charger les produits. Immaginez vous un client qui a 100 commandes de plus de 100 produits chaqu'un.

    Merci de vos suggestions.

    Cordialement.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 239
    Points : 12 869
    Points
    12 869
    Par défaut
    Bonjour,
    Tu peux faire du "chargement à la demande".
    Dans tes classe, au lieu de charger les commandes du client et les produits des commandes dans le constructeur, tu passes par des propriétés.
    Dans la classe client, tu ajoutes une propriété pour l'accès aux commandes. Dans cette propriété (dans la partie lecture), si le tableau des commandes est vide, tu charges les commandes.
    Dans la classe commande, tu fais de même pour les produits des commandes.

    J'ai fait des tests il y a quelques temps pour quelque chose de similaire:
    J'ai une classe Article, qui contient un tableau dynamique de champs utilisateurs. Plutôt que de charger ceux-ci à chaque fois, j'ai déclaré une propriété pour l'accès à ce tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    PROCEDURE p_tabClassification()
     
    SI Dimension(:m_tabClassification) = 0 ALORS
    	:ChargeClassification()
    FIN
    RENVOYER :m_tabClassification
     
     
    PROCEDURE p_tabClassification(Valeur est un tableau dynamique)
    TableauCopie(Valeur,:m_tabClassification)
    Ainsi tant que mon code n'accède pas aux champs utilisateurs, ils ne sont pas chargés.
    Et ça fonctionne même avec le DataBinding, si je lie ce tableau à un champ table. L'affichage de la table déclenche le chargement des champs.

    Tatayo.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 125
    Points : 121
    Points
    121
    Par défaut
    Bonjour tatayo.
    Merci de ta réponse.
    Ta solution me parrait très interressante.
    Par contre, deux petites question :
    - si je dois afficher toutes les commandes (dans une table par databinding) d'un client à l'ouverture de la fenêtre client, je n'aurais pas de gain.
    - Dans la methode ChargeCommande(), je suis obligé de faire un code du genre ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    lsFiltre est chaîne = HFiltre(FCommande,NumeroClient,NumeroClient)
    HLitPremier(FCommade,lsFiltre)
    TANTQUE HTrouve(FCommande)
    	lobjCommande est cCommande(FCommande.NumeroCommande)
    	Ajoute(mTabCommande,lobjCommande)
    	HLitSuivant(FCommande,lsFiltre)
    FIN
    HDésactiveFiltre(FCommande)
    Et ainsi de suite pour les produits. Ou il y a t'il mieux ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 239
    Points : 12 869
    Points
    12 869
    Par défaut
    1. En fait ça dépend. Si tu ne fais qu'afficher la liste des commandes sans les lignes, tu peux utiliser la même méthode dans la classe commande. Ainsi les lignes ne seront chargées que quand tu veux les afficher. Donc à part si tu affiches toutes les lignes de toutes les commandes du client, tu as ici un gain de temps.

    2. Tu peux optimiser en vérifiant si les commandes ont déjà été chargées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SI DIMENSION(:mTabCommande) = 0 ALORS
    	lsFiltre est chaîne = HFiltre(FCommande,NumeroClient,:NumeroClient)
    	HLitPremier(FCommade,lsFiltre)
    	TANTQUE HTrouve(FCommande)
    		lobjCommande est cCommande(FCommande.NumeroCommande)
    		Ajoute(:mTabCommande,lobjCommande)
    		HLitSuivant(FCommande,lsFiltre)
    	FIN
    	HDésactiveFiltre(FCommande)
    fin
    Ainsi la recherche ne sera faite qu'une seule fois.
    Pour le chargement en lui-même, peut-être qu'une requête serait un peu plus rapide, mais à vérifier. En effet, avec hFiltre/hLitPremier ici tu récupères tout l'enregistrement correspondant à ta commande, alors que tu n'as besoin que du numéro. Mais je ne sais pas si ça fera une grosse différence...

    Tatayo.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 125
    Points : 121
    Points
    121
    Par défaut
    Merci beaucoup de ta réponse.
    Cela me rassure d'etre sur la bonne voie.
    Petit problème lorsque je lie une table à la propiété pTabCommande, je n'ai pas accès aux membres de cCommande. Donc impossibilité de lier les colones de la table aux membres.

    As tu une idée d'ou cela peut venir ?

    Cordialement.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 239
    Points : 12 869
    Points
    12 869
    Par défaut
    J'avais noté ça avec la version 15, je n'ai pas eut le temps de vérifier si c'était corrigé avec la 16, mais visiblement non.
    Quoi qu'il en soit tu peux faire la liaison "à la main", dans le code d'initialisation de la colonne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MoiMême..LiaisonFichier = "gclArticleCourant:p_tabChpUts:p_sNom"
    C'est moins bien que de le faire directement dans les propriétés de la table, mais ça fonctionne.

    Tatayo.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 125
    Points : 121
    Points
    121
    Par défaut
    Merci de ta réponse.
    Tout fonctionne parfaitement.
    Merci encore de ton aide.

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

Discussions similaires

  1. Classe connexion base de données
    Par siva27 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 21/12/2013, 20h38
  2. Classe connection base de données (Oracle)
    Par Jinkas dans le forum C#
    Réponses: 9
    Dernier message: 18/03/2012, 15h43
  3. Réponses: 0
    Dernier message: 25/07/2011, 17h49
  4. classes JPA ==> Base de données
    Par goldenman84 dans le forum Spring Web
    Réponses: 0
    Dernier message: 24/06/2010, 01h22

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