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

Langage SQL Discussion :

Test d'éxistence avec un RecordSet


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Test d'éxistence avec un RecordSet
    Bonjour à tous !

    Mon problème est le suivant:
    J'ai une première requête qui me renvoi plusieurs lignes,dont un numéro de produit .
    Pour chacune de ces lignes, je dois insérer dans une table une partie de ma requête si cette table ne contient pas déja le numéro de produit et dans le cas ou elle contient déja le numéro de produit, je dois mettre à jour cette ligne.
    Je ne sais pas comment faire pour tester l'éxistence de ce numéro de produit . Pour le moment, j'utilise un premier recordset rst, qui éxécute ma requête, et j'en utilise un second avec lequel je voulais tester la présence du numéro de produit dans ma table (si le select ne renvoi rien, le produit n'y est pas, sinon il y est.)
    Mais lorsque le produit n'éxiste pas dans la table, j'obtiens un message d'erreur comme quoi il n'y a aucun enregistrement correspondant... et je ne sais pas comment faire pour écrire du code dans ce cas la.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    rst.Open "SELECT PUB_SOFA.ofdatdp as ofdatdp1, PUB_SOFC.proref as proref1, ...;", cn, adOpenForwardOnly, adLockReadOnly
     
        rst.MoveFirst
        While Not rst.EOF
     
            Dim rst2 As New ADODB.Recordset, fld2 As ADODB.Field
    '-------------> Comment tester ?
            rst2.Open "SELECT numproduit from tabletemp where numproduit = " & rst!proref1, cn, adOpenForwardOnly, adLockReadOnly
    '------------->        
     
            rst2.close        
            rst.MoveNext
     
        Wend
    Je voudrais utiliser un " IF " mais je ne vois pas comment faire... je ne connais pas bien le fonctionnement des recordset.

    Si vous pouvez m'aider...
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    en une seule requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT PUB_SOFA.ofdatdp as ofdatdp1, PUB_SOFC.proref as proref1, ..
    WHERE EXISTS
                   (SELECT 1
                        FROM from tabletemp where numproduit = proref1)

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    ok merci bcp, j'essayerai dés q je pourrais, et je mettrai le [résolu] si ca marche.
    merci bcp pour le temps que vous passez a nous aider, c'est vraiment super sympa !

  4. #4
    Candidat au Club
    Inscrit en
    Avril 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Je ne vois pas comment utiliser cette requête.. Il faut que j'insere dans la table "tabletemp" mes valeurs si le produit n'éxiste pas déja dans celle si, et que je fasse une mise a jour de la ligne de ce produit dans le cas ou il existe.

    Lorsque je lance ma premiere requête, la table tabletemp est vide.La requête me renvoi +/- 500 enregistrements, et je les lis un par un sois pour les inserer dans tabletemp si c'est la premiere fois que le produit est rencontré, soit pour faire une mise a jour de stock sur ce produit... :

    si (pas ce produit dans tabletemp) alors (insertion valeurs)
    sinon (update de ce produit)

    Or ta requête ne me permet que de récuperer les infos concernant un produit qui éxiste déja dans tabletemp. Comment faire pour inserer le produit s'il n'éxiste pas encore dans tabletemp ?

    J'espere ne pas etre tro vague...
    merci d'avance

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    je comprends pas tout là

    Peut tu envoyer les requêtes entières séparément et dire ce qu'elles font (l'une une sélection et l'autre l'insertion d'après ce que j'ai compris )

  6. #6
    Candidat au Club
    Inscrit en
    Avril 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Je vais essayer d'etre un peu plus clair

    J'ai une premiere requete ( appelons la R1) qui récupère des infos depuis plusieurs tables (date de besoin du produit, numéro de produit, qté en stock, qté besoin, etc...) trié par date de besoin.

    Je dois ensuite lire un a un les enregistrements ramenés par cette requête, pour les inserer dans une nouvelle table (tabletemp) qui me permettra de savoir quels produits seront manquants a leur date de besoin ( c'est a dire les produits dont la qté en stock est inferieure a la qté du besoin). Pour cela, je dois donc inserer dans ma table tabletemp le produit, la date de besoin, la qté en stock et la qté de besoin.

    le probleme arrive ici :
    pour chaque produit ramené par ma requete qui n'est pas encore dans tabletemp, je dois inserer ce produit, sa date besoin, sa qté en stock et sa qté besoin. (requete d'insertion)
    lorsque ma requete me ramene ensuite ce mê produit , je dois également inserer la ligne mais en mettant a jour le stock en fonction de la qté de besoin précedement utilisé (insertion puis maj)

    Mon probleme ne vient pas de ces deux requetes (que je n'ai pas encore faites), mais seulement du test pour savoir si la table tabletemp contient ou non le produit ramené par ma premiere requete R1.

    J'ai mis ma requete R1 dans un recordset, et je parcours un a un les enregistrements qu'elle me ramene. C'est a ce moment la que je dois pouvoir savoir si le produit ramené par R1 éxiste deja dans tabletemp. Si il existe je fais mon insertion puis ma maj, sinon je fais une simple insertion.

    Mais je ne sais pas comment faire pour tester l'existence de ce produit ("proref" dans R1, "numproduit" dans tabletemp)
    le code est celui situé au dessus.Il me faut juste savoir comment faire pour savoir si le proref de R1 est présent dans numproduit de tabletemp...

    j'espere avoir été plus clair, mais ce n'est pas simple a expliquer...
    j'espere q tu pourras m'aider...

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    alors le EXISTS fonctionne comme çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT blabla
    FROM <les tables>
    WHERE <les conditions de la requête>
    AND EXISTS (SELECT 1 FROM <la table des produits>
    WHERE <id_produit de la table produit> = <id produit de la reqûete R1 ci dessus>)
    Est-ce clair ?

    la requête que je t'ai donné doit pas être trop loin de ce que tu recherches

  8. #8
    Candidat au Club
    Inscrit en
    Avril 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Je ne comprend pas comment je peux faire pour utiliser cette requête...

    ce que j'aimerai pouvoir faire un test sur le deuxieme recordset, un peu comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if ( rst2.Open "SELECT numproduit from tabletemp where numproduit = " & rst!proref1, cn, adOpenForwardOnly, adLockReadOnly ) = null then sql="insert..." docmd.runsql sql
    else
    sql="insert.." docmd.runsql sql
    sql="update ..." docmd.runsql sql
    end if
    mais le probleme c'est que je n'arrive pas adapter ce code a vba... Lorsque la requete de rst2 ne ramene pas d'enregistrement, j'obtien un message d'erreur... "No value given for one or more required parameters"
    Moi je voudrais pouvoir lui dire d'inserer les valeurs retournées par ma requete R1 dans ce cas la... et de faire son insert et son update sinon...

    Je suis désolé de te prendre du temps et d'insister... mais je ne vois vraiment pas comment faire...
    merci beaucoup en tout cas !

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ce que je propose n'est pas de tester l'existence où non du produit, c'est de tout faire en une seule passe... ceci dit voila comment tester l'existence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from tabletemp where numproduit = ?
    > 0 -> le produit existe

  10. #10
    Candidat au Club
    Inscrit en
    Avril 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup !!! je n'y avais pas pensé ...
    merci pour tout, et désolé de t'avoir pris tant de temps juste pour ca...

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    y'a pas de mal

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

Discussions similaires

  1. [Tests] Quels Benchmark avec rapports chiffrés ?
    Par morph12345 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 30/11/2005, 18h20
  2. Test sur formulaire avec liste des erreurs
    Par Nicos77 dans le forum Langage
    Réponses: 37
    Dernier message: 17/11/2005, 10h22
  3. Problème avec ADODB.Recordset
    Par Edouard Kaiser dans le forum ASP
    Réponses: 13
    Dernier message: 09/08/2005, 17h54
  4. Réponses: 7
    Dernier message: 26/07/2005, 16h41
  5. Test PostgreSQL v8 avec NAMEDATALEN = 128 caracteres
    Par hondjack dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/10/2004, 00h32

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