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 :

Ecritures sur les requêtes de type UNION [WD18]


Sujet :

WinDev

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 7
    Points
    7
    Par défaut Ecritures sur les requêtes de type UNION
    Bonjour à tous.
    J'ai un petit soucis dont je me tord le pouces depuis un bon moment déjà. Voilà, j'ai 3 fichiers HFSQL dont :
    - A1
    - B1
    - C1
    Ces 3 fichiers ne sont pas liés entre elles.
    J'ai également une fenêtre contenant une Zone Répétée qui est remplis par une requête UNION (REQ_unionABC). Cette requête UNION est la somme de 3 requêtes interrogeant chacune un fichier de ma base.
    Ma ZR se remplit correctement sans problème. Et lorsque je fais un double clic sur ma ZR, une fenêtre de modification s'ouvre pour me permettre de modifier les informations affichées dans les champs.
    Je rappel que dans la fenêtre de modification, les champs sont liés à la requête UNION.

    Nom : Forum.png
Affichages : 321
Taille : 130,4 Ko

    Dans la fenêtre modification, j'ai tapé le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Fin d'initialisation de FEN_Modification
    FichierVersEcran()
    HExécuteRequête(REQ_unionABC, hModifieFichier)
    Sur le bouton Modifier, j'ai tapé ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //Clic sur BTN_Modifier
    EcranVersFichier()
    HModifie()
    Ferme()
    Mais lorsque je clic sur le bouton modifier, il me dit
    "Les écritures sur les requêtes de type UNION ou imbriquées ne sont pas autorisées."
    Alors je me suis dit que je devais passer par les fonctions HLitxxx pour accéder et modifier les enregistrements de chaque fichiers respectifs depuis la requête, mais ça ne marche toujours pas.

    Pouvez-vous m'aider svp ?
    Merci d'avance pour vos réponses

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    La modification n'est pas possible sur une requête union, puisqu'ici le moteur ne peut pas savoir quel fichier modifier.
    Le mieux à faire est d'ajouter dans la requête l'Id et le nom de chaque fichier.
    Ainsi chaque ligne identifie l'enregistrement et le fichier concerné.
    Ensuite dans la fenêtre de modification tu récupères ces deux valeurs, et tu sais quel enregistrement de quel fichier modifier.
    Par contre si tu bases les champs de la fenêtre sur la requête UNION, tu devras coder l'enregistrement à la main, un EcranVersFichier() ne sera pas utilisable.

    Maintenant que tout ceci est dit, je trouve quand même ton analyse "un peu bizarre", avec 3 fichiers ayant la même structure.
    Avec une analyse un peu plus normalisée tu n'auras pas eut ce problème.

    Tatayo.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    "Le mieux à faire est d'ajouter dans la requête l'Id et le nom de chaque fichier."
    Je l'ai fait, mais je ne m'en sort toujours pas. C'est en utilisant cette fois-ci l'ID que je suis passé par les fonctions HLitxxx.
    La base que j'ai montré là sert juste à illustré mon problème, elle n'est en réalité pas comme ça.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Si tu as le nom du fichier et l'Id de l'enregistrement, je ne vois pas ce qui t'empêche de retrouver le bon enregistrement pour le modifier...
    Mais sans voir ton code difficile d'en dire plus.

    Tatayo.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Voici ce que j'ai fais.
    Quand je fais un double clic sur la zone répétée, je veux que la fenêtre de modification s'ouvre avec les données dans chaque champs.
    Dans mes requête j'ai également ajouté l'ID, donc il se répercute aussi dans la requête UNION.

    Mais malheureusement au lancement de la fenêtre, les champs ne se remplissent pas. Je sais que je fais mal quelque chose, mais je sais pas où.

    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
    //Fin d'initialisation de FEN_Modification
     
    HExécuteRequête(REQ_unionABC)
     
    HLitRecherchePremier(REQ_unionABC, REQ_unionABC.ID, SAI_ID)
     
    SI HTrouve(A1) = Vrai ALORS
    	FichierVersEcran(FEN_Modification, A1)
    	SAI_Nom = A1.Nom_A1
    	SAI_Prénom = A1.Prénom_A1
    	SAI_CodePostal = A1.CodePostal_A1
    FIN
     
    SI HTrouve(B1) = Vrai ALORS
    	FichierVersEcran(FEN_Modification, B1)
    	SAI_Nom = B1.Nom_B1
    	SAI_Prénom = B1.Prénom_B1
    	SAI_CodePostal = B1.CodePostal_B1
    FIN
     
    SI HTrouve(C1) = Vrai ALORS
    	FichierVersEcran(FEN_Modification, C1)
    	SAI_Nom = C1.Nom_C1
    	SAI_Prénom = C1.Prénom_C1
    	SAI_CodePostal = C1.CodePostal_C1
    FIN

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    D'après ton code:
    1. Tu lances ta requête
    2. Tu récupères la première ligne du résultat
    3. Si tu as trouvé une ligne dans le fichier A1 alors...
    4. Si tu as trouvé une ligne dans le fichier B1 alors...
    5. Si tu as trouvé une ligne dans le fichier C1 alors...

    Mais à AUCUN moment tu ne fais de recherche sur les fichiers en question !
    Au sens WinDev il n'y a aucun lien entre une ligne résultat de la requête et les fichiers impliqués dans la requête. Donc le fait de pointer sur une ligne du résultat n'a aucun effet sur les fichiers A1, B1 et C1. Ca me paraissait tellement évident que je n'avais pas pris la peine de le préciser...

    La méthode que j'indiquais était de récupérer sur la ligne sélectionnée le nom du fichier concerné, ainsi que l'id de l'enregistrement, puis de faire une recherche sur ce fichier pour récupérer l'enregistrement en question.

    Tatayo.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Ok, je comprend que je me suis trompé...
    Mais je ne sais pas s'il existe une fonction qui permet de récupérer le nom du fichier HFSQL d'appartenance (à moins que j'ajoute une rubrique indiquant ce nom dans le fichier).
    Maintenant ce que j'ai fais, c'est de passer en paramètre l'ID de la zone sélectionnée lorsqu’on fait un double clic dessus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Bouton gauche double clic sur ZR_ABC
    Ouvre(FEN_Modif, ATT_ID)
     
    // Déclaration globale de FEN_Modif
    PROCEDURE FEN_Modif(ATT_ID)
    - A ce moment, comment dois-je faire pour faire la recherche dans le fichier auquel correspond l'ID récupéré ?
    - Si je fais un HLitRecherche(), c'est sur quel fichier exactement étant donnée qu'il y a 3 fichiers dans la requête UNION qui alimentent la ZR ?
    - J'ai compris également que je ne peux pas lier les champs de la fenêtre FEN_Modif à la requête REQ_unionABC, comment je peux faire à ce niveau ?

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Suite à vos conseils, j'en suis arrivé là...
    1 - Je passe en paramètre l'ID de la zone sélectionnée lorsqu’on fait un double clic dessus.
    2 - Dans la fenêtre FEN_Modification, j'appelle la fonction HLitRecherche() sur chacun des trois fichiers A1, B1 et C1. Cette recherche se fait sur l'ID passé en paramètre.
    3 - Pour chaque fonction HLitRecherche(), je fais un HTrouve() sur chacun des fichiers A1, B1 et C1.
    4 - Si l'ID est trouvé dans un fichier, les champs sont liés à ce fichier, puis remplis avec les données correspondantes

    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
     
    // Bouton gauche double clic sur ZR_ABC
    Ouvre(FEN_Modification, ATT_ID)
     
    // Déclaration globale de FEN_Modification
    PROCEDURE FEN_Modification(ATT_ID)
     
    //Fin d'initialisation de FEN_Modification
    FichierVersEcran()
     
    HLitRecherche(A1, A1.ID_A1, SAI_ID)
    SI HTrouve(A1) = Vrai ALORS
    	SAI_Nom = A1.Nom_A1
    	SAI_Prénom = A1.Prénom_A1
    	SAI_CodePostal = A1.CodePostal_A1
    FIN
     
    HLitRecherche(B1, B1.ID_B1, SAI_ID)
    SI HTrouve(B1) = Vrai ALORS
    	SAI_Nom = B1.Nom_B1
    	SAI_Prénom = B1.Prénom_B1
    	SAI_CodePostal = B1.CodePostal_B1
    FIN
     
    HLitRecherche(C1, C1.ID_C1, SAI_ID)
    SI HTrouve(C1) = Vrai ALORS
    	SAI_Nom = C1.Nom_C1
    	SAI_Prénom = C1.Prénom_C1
    	SAI_CodePostal = C1.CodePostal_C1
    FIN
    Les données sont lues dans les champs.

    Maintenant j'aimerai savoir si un simple HModifie() est suffisant pour modifier les enregistrements dans les fichiers. Parce que apparement ça ne marche pas

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Finalement tout est fonctionnel, même la modification des enregistrements dans les fichiers.
    Je met tout le code à disposition pour ceux qui plus tard se retrouverai dans la même situation que moi, c'est à dire MODIFIER LES DONNÉES ISSUES D'UNE REQUÊTE UNION.

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    //************************************************ Fenêtre principale
    // Bouton gauche double clic sur ZR_ABC
    Ouvre(FEN_Modification, ATT_ID)
     
     
     //************************************************ Fenêtre de modification
    // Déclaration globale de FEN_Modification
    PROCEDURE FEN_Modification(ATT_ID)
     
    //Fin d'initialisation de FEN_Modification
    FichierVersEcran()
     
    HLitRecherche(A1, A1.ID_A1, SAI_ID)
    SI HTrouve(A1) = Vrai ALORS
    	SAI_Nom = A1.Nom_A1
    	SAI_Prénom = A1.Prénom_A1
    	SAI_CodePostal = A1.CodePostal_A1
    FIN
     
    HLitRecherche(B1, B1.ID_B1, SAI_ID)
    SI HTrouve(B1) = Vrai ALORS
    	SAI_Nom = B1.Nom_B1
    	SAI_Prénom = B1.Prénom_B1
    	SAI_CodePostal = B1.CodePostal_B1
    FIN
     
    HLitRecherche(C1, C1.ID_C1, SAI_ID)
    SI HTrouve(C1) = Vrai ALORS
    	SAI_Nom = C1.Nom_C1
    	SAI_Prénom = C1.Prénom_C1
    	SAI_CodePostal = C1.CodePostal_C1
    FIN
     
     
    //************************************************ Bouton de validation 
    // Clic sur BTN_Modifier
    HLitRecherche(A1, A1.ID_A1, SAI_ID)
    SI HTrouve(A1) = Vrai ALORS
    	A1.Nom_A1 = SAI_Nom
    	A1.Prénom_A1 = SAI_Prénom
    	A1.CodePostal_A1 = SAI_CodePostal
    	EcranVersFichier(FEN_Modification, A1)
    	HModifie(A1)	
    FIN
     
    HLitRecherche(B1, B1.ID_B1, SAI_ID)
    SI HTrouve(B1) = Vrai ALORS
    	B1.Nom_B1 = SAI_Nom
    	B1.Prénom_B1 = SAI_Prénom
    	B1.CodePostal_B1 = SAI_CodePostal
    	EcranVersFichier(FEN_Modification, B1)
    	HModifie(B1)
    FIN
     
    HLitRecherche(C1, C1.ID_C1, SAI_ID)
    SI HTrouve(C1) = Vrai ALORS
    	C1.Nom_C1 = SAI_Nom
    	C1.Prénom_C1 = SAI_Prénom
    	C1.CodePostal_C1 = SAI_CodePostal
    	EcranVersFichier(FEN_Modification, C1)
    	HModifie(C1)
    FIN
     
    Ferme()
    Je vous remercie sincèrement tatayo, du temps que vous avez pris à me répondre et à me guider. J'espère un jour pouvoir aussi vous aider .

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Tu peux faire plus simple!
    Citation Envoyé par MDeacon7 Voir le message
    Mais je ne sais pas s'il existe une fonction qui permet de récupérer le nom du fichier HFSQL d'appartenance (à moins que j'ajoute une rubrique indiquant ce nom dans le fichier).
    C'est très précisément ce que je disais:
    Citation Envoyé par tatayo Voir le message
    Le mieux à faire est d'ajouter dans la requête l'Id et le nom de chaque fichier.
    Ainsi chaque ligne identifie l'enregistrement et le fichier concerné.
    Bref avec une petite modification de la requête, chaque ligne identifie LE FICHIER ainsi que l'enregistrement dans ce fichier.
    De plus avec ton code si un id se trouve dans deux fichiers différents, tu cours le risque de te "tromper" de fichier.

    Tatayo.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Il n'y a pas de risque de confusion sur l'ID, car j'ai pris toutes les précautions dans ce sens.
    En fait, comme je l'ai dit plus haut, ceci n'est ni la vraie base HFSQL, ni le vrai programme sur lequel je travaille. J'ai monté cela à des fins d'explication.
    La base que j'utilise est bien plus élaborer que celle-ci.
    En fait, ce qu'il faut peut-être préciser à ceux qui utiliseront peut-être ce code qu'ils peuvent, à la place de l'ID, utiliser une autre clé (identifiant unique) de leur fichier et le passer en paramètre.

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

Discussions similaires

  1. problème de doublon sur les requêtes
    Par laurent7474 dans le forum Oracle
    Réponses: 6
    Dernier message: 08/12/2006, 10h31
  2. Indexe sur les champs de type DATETIME
    Par Thierry8 dans le forum Requêtes
    Réponses: 9
    Dernier message: 25/06/2006, 19h45
  3. Renseignements sur les requêtes
    Par Virgile59 dans le forum Access
    Réponses: 1
    Dernier message: 07/02/2006, 20h09
  4. Calcul de Statistics sur les requêtes
    Par Rahustro dans le forum Oracle
    Réponses: 3
    Dernier message: 17/01/2006, 06h19
  5. Optimisations mysql sur les requêtes SELECT: index
    Par leo'z dans le forum Débuter
    Réponses: 2
    Dernier message: 29/11/2003, 13h23

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