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 :

erreur avec HExécuteRequêteSQL


Sujet :

WinDev

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 56
    Points : 22
    Points
    22
    Par défaut erreur avec HExécuteRequêteSQL
    Bonjour,

    je travail avec MySQL 5.5

    losque j'essaie d'executer une requete d'insert avec la commande HExécuteRequêteSQL() j'obtiens l'erreur suivante:

    La requête <sdInsertSQL> n'a pas été préparée ni exécutée au préalable. La réexécution de la requête n'est pas possible. Vous devez spécifier un code SQL.

    Dans le code ci-dessous
    la variable FusionParTable.gstrBaseFinale:sNomCrp contient le nom de la connexion

    et la commande bResult = HExécuteRequêteSQL(sdRequeSQL, FusionParTable.gstrBaseFinale:sNomCrp, "select Max(nIdVaccination) as compteur from t_vaccination") renvoie vrai

    alors que la ligne bResult = HExécuteRequêteSQL(sdInsertSQL)
    renvoie faux

    voici le code:

    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
    sdRequeSQL, sdInsertSQL est une Source de Données
     
    HPrépareRequêteSQL(sdInsertSQL, FusionParTable.gstrBaseFinale:sNomCrp, hRequêteSansCorrection, "INSERT INTO t_vaccination (nIdVaccination, nIdVaccin, nIdVacProtocole, nIdPatient, nIdUtilisateur, sDateInjection, nNumInjection, sNumLot, nRappel, sLibelle, sAction, sDH_REPLIC) SELECT 251,41,4,53,1,'20030528','0','W5770-2',0,'DTP - REVAXIS','A 20130521170623','2013-05-21 17:06:23' FROM t_vaccination  WHERE NOT EXISTS (SELECT nIdVaccin, nIdVacProtocole, nIdPatient, nIdUtilisateur FROM t_vaccination WHERE nIdVaccin =:IdVaccin and nIdVacProtocole =:IdVacProtocole and nIdPatient =:IdPatient and nIdUtilisateur =:IdUser ) LIMIT 1")
     
    TANTQUE 
                 .....
     
    	bResult = HExécuteRequêteSQL(sdRequeSQL, FusionParTable.gstrBaseFinale:sNomCrp,  "select Max(nIdVaccination) as compteur from t_vaccination")
    	sdInsertSQL.IdVaccin		= Val(sIdVaccin)
    	sdInsertSQL.IdVacProtocole = Val(sIdVacProtocole)
    	sdInsertSQL.IdPatient		= Val(sIdPatient)
    	sdInsertSQL.IdUser			= Val(sIdUser)
    	//bResult = HExécuteRequêteSQL(sdInsertSQL, FusionParTable.gstrBaseFinale:sNomCrp,  sInsertSQL)
    	bResult = HExécuteRequêteSQL(sdInsertSQL)
     
                .....
    FIN
    Votre aide sera la bienvenue

    Cordialement,

    Motti

  2. #2
    Membre éprouvé

    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 402
    Points : 915
    Points
    915
    Par défaut
    Bonjour,

    sur une base non Hyperfile je vous conseille la synthaxe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    txtSQL est une chaîne
    txtSQL = "SELECT %1 FROM %2 WHERE nNumInjection='%3' "
    MaRequeteSQL est une chaîne = ChaîneConstruit(txtSQL , "IdPatient", "t_vaccination","12345")
     
    HExécuteRequêteSQL(sdRequeSQL, FusionParTable.gstrBaseFinale:sNomCrp,hRequêteSansCorrection,MaRequeteSQL)
    Bon dev

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 56
    Points : 22
    Points
    22
    Par défaut
    Bonjour Atsibat,

    En fait c'est la solution pour laquelle j'avais en premier mais j'obtiens l'erreur suivante:

    Erreur de l'accès natif MySQL.

    et voici le code correspondant:


    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
    sClauseInsert	= "INSERT INTO t_vaccination (nIdVaccination, nIdVaccin, nIdVacProtocole, nIdPatient, nIdUtilisateur, sDateInjection, nNumInjection, sNumLot, nRappel, sLibelle, sAction, sDH_REPLIC) "
    sClauseSelect1	= "SELECT %1 FROM t_vaccination  WHERE NOT EXISTS "
    sClauseSelect2	= "(SELECT nIdVaccin, nIdVacProtocole, nIdPatient, nIdUtilisateur FROM t_vaccination WHERE nIdVaccin =%2 and nIdVacProtocole =%3 and nIdPatient =%4 and nIdUtilisateur =%5 ) LIMIT 1"
    sInsertQuery	= sClauseInsert + sClauseSelect1 + sClauseSelect2
     
    nCpt = 1
    nMaxIdVaccination ++
     
    TANTQUE 
                ......	
                sIdVaccin		= Milieu(sRowValues, nPosVirgule+1, nLength)
                .....
                sIdVacProtocole	= Milieu(sRowValues, nPosVirgule2+1, nLength)
                .....
                sIdPatient		= Milieu(sRowValues, nPosVirgule+1, nLength)
                .....
                sIdUser			= Milieu(sRowValues, nPosVirgule2+1, nLength)
    	sInsertSQL =  ChaîneConstruit(sInsertQuery, sRowValues, sIdVaccin, sIdVacProtocole, sIdPatient, sIdUser)
    	bResult = HExécuteRequêteSQL(sdRequeSQL, FusionParTable.gstrBaseFinale:sNomCrp,  "select Max(nIdVaccination) as compteur from t_vaccination")
    	bResult = HExécuteRequêteSQL(sdInsertSQL, FusionParTable.gstrBaseFinale:sNomCrp,  sInsertSQL)
     
                 .....
    FIN
    la aussi la commande HExécuteRequêteSQL marche avec la requete:
    "select Max(nIdVaccination) as compteur from t_vaccination")

    mais pas avec la requete insert

    c'est pourquoi j'ai essayé avec la deuxieme possibilité que j'ai envoyé dans le premier message

    Cordialement,

    Motti

  4. #4
    Membre éprouvé

    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 402
    Points : 915
    Points
    915
    Par défaut
    Mettez un trace() juste avant la commande hexecuterequetesql(insert...)
    pour voir le texte de votre requête d'insert
    et si vous ne trouvez pas l'erreur envoyer nous le texte de la requête.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 56
    Points : 22
    Points
    22
    Par défaut
    Atsibat,

    voici le texte de la requete qui s'execute bien lorsque je la lance a partir de Heidi SQL:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO t_vaccination (nIdVaccination, nIdVaccin, nIdVacProtocole, nIdPatient, nIdUtilisateur, sDateInjection, nNumInjection, sNumLot, nRappel, sLibelle, sAction, sDH_REPLIC) SELECT 289,NULL,NULL,1445,1,'20020927','1','',0,'DTP - REVAXIS','','2010-01-01 00:00:00' FROM t_vaccination  WHERE NOT EXISTS (SELECT nIdVaccin, nIdVacProtocole, nIdPatient, nIdUtilisateur FROM t_vaccination WHERE nIdVaccin =NULL and nIdVacProtocole =NULL and nIdPatient =1445 and nIdUtilisateur =1 ) LIMIT 1

    Cordialement,

    Motti

  6. #6
    Membre du Club
    Homme Profil pro
    WinDev Senior Developer
    Inscrit en
    Janvier 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : WinDev Senior Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 28
    Points : 54
    Points
    54
    Par défaut
    bonjour,

    je suis surpris de
    SELECT 289,NULL,NULL,1445,1,'20020927','1','',0,'DTP - REVAXIS','','2010-01-01 00:00:00' FROM
    apres un select cela devrait etre les noms des champs et pas des valeurs fixes mais je n'ai peut-être pas tout saisi dans cette requete

    bon dev

    Jean-Jacques

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Je suis également un peu surpris par la syntaxe, mais je suis loin d'être un pro du SQL, j'utilise pour ma part la syntaxe de base suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO `NomTable` (`Rubrique1`, `Rubrique2`, `Rubrique3`) VALUES ('Valeur 1', 'Valeur 2', 'Valeur 3');
    Je ne vois pas le mot clé VALUES dans ta requête, est-ce gênant ?

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 56
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    La forme de la requete est ainsi faite afin d'eviter l'insertion de doublons.

    Le probleme n'est pas dans la forme de la requete d'insertion, puisque lorsque je prends la valeur de la chaine sInsertSQL en debuggant et execute avec un editeur comme Heidi SQL, la ligne est inséré dans la table si ce n'est pas un doublon.

    le probleme vient du fait qu'il m'affiche le message d'erreur:
    Erreur de l'accès natif MySQL.

    alors qu'avec une requete select, cela marche tres bien.

    Cordialement,

    Motti

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Si tu demandes le détail de l'erreur, tu n'as pas plus d'infos que 'Erreur de l'accès natif MySQL' ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SI PAS HExécuteRequêteSQL(sdInsertSQL, FusionParTable.gstrBaseFinale:sNomCrp,  sInsertSQL) ALORS
    Erreur(HErreurInfo())
    FIN

  10. #10
    Membre actif
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Septembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 176
    Points : 297
    Points
    297
    Par défaut
    Bonjour,

    En ce qui me concerne, ta requête ne me choque pas, on peut voir ça sur SQLPro Insertion en auto référence pour ceux qui veulent plus d'infos.
    Bref, je pars du principe que MySQL accepte cette syntaxe.

    Par contre, ce qui pourrait gêner dans ta requête c'est la valeur de sLibelle. Si cette variable contient une quote, tu pourrais te retrouver avec une requête foireuse. A voir.

    Fait comme cladoo a dit pour intercepter l'erreur, mais ajoute ta requête pour voir les valeurs qui plantent exactement.

    Bonne continuation.
    L’aléatoire n’existe pas en informatique, c’est juste un moyen de dire que l’on a pas encore compris.

  11. #11
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    Erreur de l'accès natif MySQL
    Ta connexion fonctionne ???
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  12. #12
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    Peut-être devrais-tu utiliser l'option "hRequêteSansCorrection" pour que la requête ne soit pas modifiée ... ?

  13. #13
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    Citation Envoyé par Motti2 Voir le message

    alors que la ligne bResult = HExécuteRequêteSQL(sdInsertSQL)
    renvoie faux
    Je prends la discussion en route mais... il faut préciser une variable de type "source de donnée" en premier paramètre... n'est-ce pas là ton problème ?
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  14. #14
    Membre émérite
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Points : 2 562
    Points
    2 562
    Par défaut
    Citation Envoyé par michel.souris Voir le message
    Je prends la discussion en route mais... il faut préciser une variable de type "source de donnée" en premier paramètre... n'est-ce pas là ton problème ?
    oui je me suis fait la réflexion aussi au départ mais en fait il y a sdInsertSQL comme source de données et sInsertSQL qui est une chaine pour la requête ...

Discussions similaires

  1. Erreur Avec Interbase
    Par smokemon dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/10/2004, 07h24
  2. Erreur avec procédure LockWorkStation ...
    Par simonseztech dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 16/08/2004, 15h33
  3. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45
  4. Erreur avec les ADO
    Par megane dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/03/2004, 21h37
  5. Erreur avec WM_COMMAND (BN_CLICKED)
    Par cyberlewis dans le forum Windows
    Réponses: 2
    Dernier message: 09/02/2004, 00h25

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