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 :

[Etat] Gestion d'une Requête [WD15]


Sujet :

WinDev

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut [Etat] Gestion d'une Requête
    Bonjour, j'ai un état dans lequel je voudrai afficher certains éléments d'une requête programmée dans la la fenêtre d'édition. Les éléments sont affichés dans le corps.
    Ma requête a été passée en paramètre à l'état, je voudrai savoir où lancer cette requête (initialisation du bloc corps ou Avant Impression du bloc corps) et savoir comment l'état fait pour avoir autant de bloc corps que de ligne dans la requête.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 136
    Points : 241
    Points
    241
    Par défaut
    Tu reçoit donc à l'ouverture de ton état une chaine contenant le code SQL de ta requête.

    Dans cette même zone de code, tu exécutes la requêtes en mettant en variable globale à l'état la source de données qui va recevoir le résultat.
    Tu fais aussi à ce niveau là le hlitpremier (ou SQLPremier selon ce que tu utilises)
    Tu as donc un code qui ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Procedure OuvreEtat(ge_p_s_TxtRequeteSQL est une chaine)
     
    Global
        ge_sd_Data est une source de donnees
     
     
    SI PAS HExecuteRequeteSQL(ge_sd_Data, HRequeteDefaut, ge_p_s_TxtRequeteSQL)
      Erreur(Erreurinfo())
    SINON
        HLitPremier(ge_sd_Data)
    FIN
    Puisque tu as dit que tu géré toi même la source de données de ton état, tu dois avoir une zone de code "Lecture des données".
    On passe dans cette zone à chaque ligne du corps.
    Si cette zone renvoie Vrai, il continue l'impression de l'état, si ça renvoi faux, il arrête.
    Tu as donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Si hendehors(ge_sd_Data) alors
         renvoyer faux
    sinon
         zoneCorps1 = ValeurDeMaRequeteAAficher
         ...
     
        HLitSuivant(ge_sd_Data)
     
         renvoyer vrai
    fin
    Tu as aussi le droit à une zone Filtre
    On passe dedans à chaque ligne de corps (même il peut ne pas y avoir de code). Si ça renvoi Vrai, la ligne est affichée, si c'est faux la ligne n'est pas affiché.

    En espérant avoir été claire.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut
    Je croyais que votre solution avait marché or je me rend compte qu'il n'y passe qu'une seule fois. Voici le code de l'ETAT :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    //Ouverture de ETAT_RibsClient
     
    PROCEDURE ETAT_RibsClient(requete est une chaîne)
     
    i,IdFichier est un entier
    client est une chaîne
    requete1 est une Source de Données
     
    fCrée("C:\TEST\Test.txt")
    IdFichier=fOuvre("C:\TEST\Test.txt",foLectureEcriture)
    fEcrit(IdFichier,requete)
     
    SI PAS HExécuteRequêteSQL(requete1,hAvecTransaction,requete) ALORS
    	Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo())
    	RETOUR
    SINON
    	//Lecture du premier enregistrement de la requête
     
    	HLitPremier(requete1)
    FIN
     
    //Lecture des données de ETAT_RibsClient
     
    SI HEnDehors(requete1) ALORS
    	RENVOYER Faux
    SINON
    	RUB_CLI_CP1=requete1.CLI_CP
    	RUB_CLI_NOM1=requete1.CLI_NOM
    	RUB_CLI_NUM1=requete1.CLI_NUM
    	RUB_CLI_RIB1=requete1.CLI_RIB
    	RUB_CLI_VILLE1=requete1.CLI_VILLE
    	RUB_RIB_BIC1=requete1.RIB_BIC
    	RUB_RIB_CD_BK1=requete1.RIB_CD_BK
    	RUB_RIB_CLE1=requete1.RIB_CLE
    	RUB_RIB_GUICHET1=requete1.RIB_GUICHET	
    	RUB_RIB_IBAN1=requete1.RIB_IBAN
    	RUB_RIB_REFTIR1=requete1.RIB_REFTIR
    	RUB_RIB_DOMI1=requete1.RIB_DOMI
     
     
    	HLitSuivant(requete1)
     
    	RENVOYER Vrai
    FIN
    J'ai tester la requête, elle renvoie bien plusieurs lignes. Je me demandais si le fait qu'il y ait aussi du code dans la partie "Avant Impression du Corps" pouvait poser problème ?

  4. #4
    Membre éclairé Avatar de Raptor92
    Homme Profil pro
    Directeur des opérations & Innovation
    Inscrit en
    Juin 2009
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur des opérations & Innovation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 970
    Points : 766
    Points
    766
    Par défaut
    Bonjour,

    Cette partie du code ne devrait elle pas se trouver dans l'initialisation de l'état

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SI PAS HExécuteRequêteSQL(requete1,hAvecTransaction,requete) ALORS
    	Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo())
    	RETOUR
    SINON
    	//Lecture du premier enregistrement de la requête
     
    	HLitPremier(requete1)
    FIN
    Et la deuxième partie comme vous l'avez très justement positionnée dans la lecture des données

    Bonne journée

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut
    La première partie du code se trouve dans la partie "Ouverture de l'ETAT" , il n'y a pas de Partie "Initialisation de l'ETAT" dans la partie Code de l'état.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 136
    Points : 241
    Points
    241
    Par défaut
    requete1 est-elle bien une variable globale ? (A priori oui)

    Quel est le code dans "Avant Impression corps ?"

    Lorsqu'on passe dans la "lecture des données", quel est l'état de HEndehors() ?

    Quel est l'intérêt d'exécuter la requête avec "hAvecTransaction" ?

    Si on place le code suivant juste après le HLitPremier, les enregistrements s'affichent-ils bien ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TANTQUE PAS HEnDehors(requete1) 
       Trace(RUB_CLI_CP1=requete1.CLI_CP)
     
       HLitSuivant(requete1)
    FIN
    Dans la description de l'état, Dans l'onglet "Données", est-il bien précisé que les données imprimées viennent de la programmation ?


    PS : Penser à bien nommer les variables ça facilite le travail de tout le monde (requete et requete1 sont pour moi toute deux très mal nommée).

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Bonjour,

    Lisez l'aide index "État, Programmer entièrement un état" puis le chapitre "Programmer la lecture des enregistrements".

    Ce n'est pas compliqué (3 notions) et c'est la seule bonne manière de programmer le parcours des données d'un état.

    Repartez de zéro en suivant cette logique et ça devrait rouler. Si vous ne comprenez pas quelque chose, vous pouvez toujours revenir demander.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut
    Alors "Avant Impression Corps", il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    depart:
    SI i = 0 ALORS 
    	client=ETAT_RibsClient.CORPS.RUB_CLI_NUM1
    	activeVisibilité(Vrai)
    FIN
     
    SI i > 0 ET  ETAT_RibsClient.CORPS.RUB_CLI_NUM1=client ALORS
    	activeVisibilité(Faux)
    SINON SI ETAT_RibsClient.CORPS.RUB_CLI_NUM1<>client
    	i=0
    	GOTO depart
    FIN
     
    i++
    C'est juste pour activer ou désactiver les rubriques selon leurs contenus.
    - HEndehors()=false (donc les rubriques sont bien initialisés)
    -Si j'insère ton code après HlitPremier(), il me donne comme info qu'il n'y a pas de données à imprimer.

    Vmolines je vais y regarder attentivement et je te redirai si j'ai un problème

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 136
    Points : 241
    Points
    241
    Par défaut
    Pour ne pas qu'il affiche qu'il n'y a pas de données à imprimer, il faut refaire un hlitpremier. mais ce qui m'intéressait, c'était le contenu de la fenêtre Trace (la fenêtre jaune) et notamment le nombre de ligne qui s'y trouvait.

    Essayes ton etat en mettant en commentaire le code 'Avant impression Corps'

    Citation Envoyé par Hors Sujet Total
    OMG !!! Tu n'as que 20 ans et tu programmes avec des GOTO...
    J'ai un colègue qui part à la retraite qui en mis dans son code et je l'ai copieusement critiqué pour ça.
    On peux utiliser des procédures pour rendre le code plus lisible.
    Ou dans ton cas, d'abord faire ton test avec i>0 puis celui avec i=0.
    Ou regarder la notion de bloc de rupture (ça semble être ce que tu essayes de faire).

    Ou alors c'est moi qui devient vieux et le GOTO est quelque chose d'absolument géniale.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut
    Mettre en commentaire la partie "Avant impression du Corps" , cela ne change rien. Sinon dans le trace il y a une 20aine de lignes (un "0" par ligne) ce qui correspond au nombre d'enregistrements prévu de la requête ^^

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    136
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 136
    Points : 241
    Points
    241
    Par défaut
    Là, je vois pas où se trouve le soucis. Désolé.

    Si dans la zone 'Lecture des données', on renvoit Vrai, il doit obligatoire repasser dans cette zone ne serais-ce que pour renvoyer Faux par a suite (D'ailleurs, dans cette zone, parès le HLitSuivant, Hendehors() est-il bien toujours à faux ?)

    Bon courage, pour trouver la solution que j'espère lire rapidement.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    390
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 390
    Points : 127
    Points
    127
    Par défaut
    Merci Windev...j'ai relancé Windev et là ça marche . Merci à vous

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

Discussions similaires

  1. Remplir un Etat automatiquement avec une requête.
    Par Dramon dans le forum WinDev
    Réponses: 16
    Dernier message: 04/03/2010, 15h19
  2. Ouvrir etat à partir d'une requête paramêtré
    Par damien27000 dans le forum VBA Access
    Réponses: 4
    Dernier message: 06/03/2008, 19h34
  3. [MySQL] solution de gestion d'une requête en php
    Par osseili20 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 18/05/2007, 17h18
  4. Etat issu d'une requête d'analyse croisée
    Par loutsky dans le forum Access
    Réponses: 3
    Dernier message: 18/03/2006, 16h19
  5. Réponses: 4
    Dernier message: 05/10/2005, 16h07

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