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 :

Update Multiple dans une seule requête [WD23]


Sujet :

WinDev

  1. #1
    Membre émérite
    Avatar de L.nico
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 143
    Points : 2 679
    Points
    2 679
    Par défaut Update Multiple dans une seule requête
    Bonjour à tous,

    je souhaite savoir si vous aussi vous rencontrez ce genre de problèmes.
    Je fais actuellement un audit sur un applicatif windev et il y a parfois dans le code des requêtes de type UPDATE exécutées par lot (donc séparées par des ; )
    Aucun problème sur ce genre de code qui me parait normal.
    Cependant, en y regardant de plus près il y a parfois des requêtes du genre :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE NomTable SET STOCK=STOCK+2 WHERE KEY=1;
    UPDATE NomTable SET STOCK=STOCK+2 WHERE KEY=2;

    Pas de problème en fichier plat mais en C/S l'execution des 2 requêtes simultanément donne +4 sur les 2 lignes.
    en fait il exécute chaque requête autant de fois que le nombre de lignes du bloc.
    Je viens d'envoyer un projet exemple à PC SOFT que je joins à ce fil de discussion.
    Peut-être que je ne fais pas les choses correctement mais ce problème est pour moi très important car il ne nous permet pas de faire des update en bloc ....
    Parfois vous avez besoin de mettre à jour 1000 lignes d'un coup, si pour 1000 lignes il execute 1000000 de requêtes ça fait mauvais genre ....
    Sans compter que dans mon exemple, du fait de la multiplication des exécutions, les résultats sont faussés ...
    que pensez-vous de tout ça ? je suis bien sûr ouvert à la discussion et à la méthode.
    Merci par avance pour vos réponses,
    Bonne journée à tous,

    Nicolas

    EDIT : Il faut rajouter un HCreationSiInexistant dans le cas du Test C/S. Je l'avais fait à la main donc zappé dans le projet.
    Fichiers attachés Fichiers attachés
    A lire avant de poster
    Si vous avez obtenu la réponse à votre question alors cliquez sur le bouton

  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,
    Avec les données de l'exemple, je vois ceci:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE NomTable SET STOCK=STOCK+2 WHERE KEY in (1,2)
    Mais j'imagine que l'exemple est simplifié.
    Par contre on peut faire ceci, pour ajouter une valeur différente en fonction de la valeur de KEY:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE NomTable SET STOCK=STOCK+(case key when 1 then 10 else 20 end) WHERE KEY in (1,2)

    Par contre je suis étonné que le résultat avec 2 requêtes soit faux. Pour moi il s'agit clairement d'un bug.

    Tatayo.

  3. #3
    Membre émérite
    Avatar de L.nico
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 143
    Points : 2 679
    Points
    2 679
    Par défaut
    Bonjour Tatayo,

    Merci pour ta réponse,
    tout à fait d'accord avec tes exemples et oui ce sont des exemples simplifiés.
    Pour moi aussi c'est un bug, mais je trouve assez étrange que personne n'en parle car il est quand même relativement important.
    Le problème existe aussi en Windev 22 (pas testé dans les versions précédentes)


    Nicolas
    A lire avant de poster
    Si vous avez obtenu la réponse à votre question alors cliquez sur le bouton

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 056
    Points : 9 394
    Points
    9 394
    Par défaut
    Et tu es sûr que chacun des 2 update en question est lancé une seule fois ? J'ai des gros doutes. Mon petit doigt me dit qu'il y a une boucle pour key = 1 a 2 quelque part... et qu'on mélange de la programmation classique (basée sur des boucles), avec une logique SQL.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Membre émérite
    Avatar de L.nico
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 143
    Points : 2 679
    Points
    2 679
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Et tu es sûr que chacun des 2 update en question est lancé une seule fois ? J'ai des gros doutes. Mon petit doigt me dit qu'il y a une boucle pour key = 1 a 2 quelque part... et qu'on mélange de la programmation classique (basée sur des boucles), avec une logique SQL.
    Bonjour TBC92
    Merci pour ta réponse,

    Le test en fichier plat montre bien que chaque requête est exécutée une fois. Mais pas en C/S.
    Et je fais ce genre de requêtes en SQL server depuis un paquet de temps et ça marche plutôt bien.
    C'est peut-être une limitation Hyperfile c'est ce que j'aimerai bien comprendre.
    Mais au vu de la différence de comportement ça ressemble plus à un bug.
    A lire avant de poster
    Si vous avez obtenu la réponse à votre question alors cliquez sur le bouton

  6. #6
    Invité
    Invité(e)
    Par défaut
    Si votre vrai code ressemble à celui qui a été fourni dans l'exemple, il serait plus intéressant de construite la requête UPDATE de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    update MaTable set STOCK=Stock+5
    WHERE id in (1,2,3,10,12)

  7. #7
    Membre émérite
    Avatar de L.nico
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 143
    Points : 2 679
    Points
    2 679
    Par défaut
    Bonsoir Romulus,
    Merci pour ton intérêt,
    je comprends parfaitement ta remarque mais il y peut y avoir plusieurs centaines de lignes UPDATE avec des valeurs de stock différentes ex :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE NomTable SET STOCK=STOCK+8 WHERE KEY=1;
    UPDATE NomTable SET STOCK=STOCK+4 WHERE KEY=2;
    UPDATE NomTable SET STOCK=STOCK+12 WHERE KEY=3;

    Pour ma part l'objectif de cette discussion n'est pas de discuter la nature/pertinence du code, mais de savoir si ce comportement d'hyperfile est un bug ou une restriction.
    Je penche bien sûr fortement pour le bug.
    Merci pour vos messages
    A lire avant de poster
    Si vous avez obtenu la réponse à votre question alors cliquez sur le bouton

  8. #8
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 056
    Points : 9 394
    Points
    9 394
    Par défaut
    Et une question sur le code... Es tu dans la configuration 1 ou 2 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    req = [
    UPDATE NomTable SET STOCK=STOCK+8 WHERE KEY=1;
    UPDATE NomTable SET STOCK=STOCK+4 WHERE KEY=2;
    UPDATE NomTable SET STOCK=STOCK+12 WHERE KEY=3;
    ]
    Hexecuterequete(req)
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    req = [
    UPDATE NomTable SET STOCK=STOCK+8 WHERE KEY=1;
    UPDATE NomTable SET STOCK=STOCK+4 WHERE KEY=2;
    UPDATE NomTable SET STOCK=STOCK+12 WHERE KEY=3
    ]
    pour toute chaine sch de req separee par ";" 
      Hexecuterequete(req)
    fin
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  9. #9
    Membre émérite
    Avatar de L.nico
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 143
    Points : 2 679
    Points
    2 679
    Par défaut
    Bonjour,
    dans la configuration n° 1 , le but étant de minimiser les allers retours serveurs et de faire une action commune update sur des lignes multiples.
    Et je le reprécise à nouveau, aucun souci en fichier plat Hyperfile ou en microsoft SQL Server. Le problème ne se pose qu'en Hyperfile C/S.
    Merci pour votre intérêt.
    Dans tous les cas je mettrais à jour ce sujet lorsque j'aurai les éclairages ( ) de PC Soft.

    Bon Week end
    A lire avant de poster
    Si vous avez obtenu la réponse à votre question alors cliquez sur le bouton

  10. #10
    Membre émérite
    Avatar de L.nico
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 143
    Points : 2 679
    Points
    2 679
    Par défaut
    Bonjour,
    Voici la position de PC Soft.
    "La parser SQL n'accepte pas les requêtes multiples donc ce n'est pas autorisé" ...
    Il va sans dire que j'ai un peu insisté et ils ont donc cherché quand même pour finalement me trouver une solution mais sans me donner une réelle explication.
    Pour que les requêtes multiples fonctionnent, il faut passer la connexion à l'instruction HexecuteRequeteSQL ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HExécuteRequêteSQL(NomRs,NomdelaConnexion,hRequêteSansCorrection,QueryBloc)
    Pour ma part je ne précisais pas la connexion parce que c'était la connexion active,
    ils n'ont pas su me dire pourquoi ça part en vrille avec la connexion active non précisée.
    Cependant, j'ai maintenant un moyen de contournement donc je considère ce sujet comme résolu.
    Merci à tous pour votre participation,

    Nicolas
    A lire avant de poster
    Si vous avez obtenu la réponse à votre question alors cliquez sur le bouton

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

Discussions similaires

  1. Regrouper 2 update dans une seule requête
    Par pol2095 dans le forum Requêtes
    Réponses: 12
    Dernier message: 28/10/2011, 21h58
  2. Réponses: 2
    Dernier message: 01/10/2010, 14h00
  3. Réponses: 7
    Dernier message: 12/06/2008, 13h26
  4. Lier trois tables dans une seule requête ?
    Par tempirate dans le forum Requêtes
    Réponses: 2
    Dernier message: 18/06/2006, 19h27
  5. update multiple dans une meme colonne
    Par debdev dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/01/2006, 21h46

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