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

ASP Discussion :

Manipulation sur recordset


Sujet :

ASP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 151
    Points : 116
    Points
    116
    Par défaut Manipulation sur recordset
    Bonjour à tous !

    Voici mon problème : je récupère suite à une requête SQL un recordset contenant des N° de Packs sous la forme xxxx.xxx

    Je voudrais savoir si, étant donné que par malheur j'ai affaire à des strings, il y a moyen de traiter le recordset pour enlever les résultats inférieurs à 1 et supérieur à 5999 en utilisant les quatres chiffres avant le point, par exemple en splittant le string puis en le convertissant en entier pour faire la comparaison. J'aurais besoin de faire cette opération dès le recordset récupéré par le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rsPack.Open sSQL, connect, adOpenKeyset
    J'ai beau me creuser la tête je ne vois pas comment faire...

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Il a l'air de plus en plus compliqué ton pb.
    C'est comme ça qd on veut qu'un champ serve à plusieurs choses en mm temps.
    Ceci dit, sachant que tes n° de pack on la forme XXXX.XXX, quelles valeurs peuvent prendre tes X (A pour alpha numérique, L pour lettre seulement et 0 pour numérique seulement)?

    étant donné que par malheur j'ai affaire à des strings
    Ca veut dire quoi exactement? Peux-tu donner des exemples?

    Merci.
    "Winter is coming" (ma nouvelle page d'accueil)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 151
    Points : 116
    Points
    116
    Par défaut
    Ces N° de Packs sont composés de chiffres séparés par un point. Un exemple :
    1258.020
    Dans la base de données (Access), ils sont encodés dans des champs textes. La première partie donne le N° de Pack, la seconde le n° de fragment quand il y en a plusieurs. Ce n'est pas moi qui ai fait la base de données, elle existe depuis environ cinq ans et je ne peux malheureusement rien y modifier. Et si le N° de Pack a cette structure peu pratqiue, c'est parce qu'à la base il n'était pas prévu de devoir le traiter informatiquement, vu qu'il a été créé il y a 30 ans.

    Dans la première partie du numéro, donc 1258, je dois exclure le 0 (champ de test auquel je ne peux pas toucher) et tout ce qui est supérieur à 6000 (qui fait partie d'un autre projet qu'il ne faut pas traiter dans ce cas-ci). C'est pour cela que je voudrais le spliter et convertir en numérique mais je ne peux faire ça qu'une fois le recordset enregistré (à moins que quelqu'un connaisse le moyen de faire ça directement dans la requête mais ça me paraîtrait étonnant, comparer une partie d'un champ texte à un nombre...)

    Voilà, j'espère que c'est expliqué assez clairement comme ça. C'est en effet assez compliqué, moi même je m'y perds un peu

  4. #4
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Bonjour,

    Un truc dans ce genre ? (pas testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    rsPack.Open sSQL, connect, adOpenKeyset
    if not rsPack.eof then
       do while not rsPack.EOF
          NumPack = Left(rsPack("Numero"), InStr(".", rsPack("Numero")) - 1)
          if cInt(NumPack) < 6000 then
             ..........
          end if
          rsPack.Movenext
       loop
    end if

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 151
    Points : 116
    Points
    116
    Par défaut
    Merci pour cette idée, elle a l'air pas mal. J'ai un rien modifié pour que le if se fasse si l'enregistrement du recordset ne répond pas au critère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    rsPack.Open sSQL, connect, adOpenKeyset
    if not rsPack.eof then 
       do while not rsPack.EOF 
          NumPack = Left(rsPack("Numero"), InStr(".", rsPack("Numero")) - 1) 
          if cInt(NumPack) >= 6000 or cInt(NumPack) < 1 then 
             ...........
          end if 
          rsPack.Movenext 
       loop 
    end if 
    rsPack.movefirst
    Maintenant il faudrait que j'efface la ligne en cours du recordset si il passe dans la boucle. Y-a-t-il une fonction ou une propriété de l'objet recordset pour faire cela ?

  6. #6
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Tu peux tout à fait effectuer un traitement sur la valeur de tes champs directement dans ta requete. Je le fais souvent dans Access et SQL Server.
    "Winter is coming" (ma nouvelle page d'accueil)

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 151
    Points : 116
    Points
    116
    Par défaut
    Ah bon c'est possible ? Et comment faire alors, par exemple pour cette requête, pour qu'il élimine les résultats ou Pack.Pack est inférieur à 1 et supérieur à 5999 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sSQL = "select Pack_Impression, Pack.Pack from Pack where Num_auteur = " & sID_Auteur & " and ?????? order by Pack"

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 151
    Points : 116
    Points
    116
    Par défaut
    Pour revenir à la solution de pc75, il me mettait une erreur sur le Left, mais j'ai simplifié vu qu'on sait que c'est toujours les quatres premiers caractères qu'il faut prendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    rsPack.Open sSQL, connect, adOpenKeyset
    if not rsPack.eof then 
       do while not rsPack.EOF 
          NumPack = Left(rsPack("Pack"), 4) 
          if cInt(NumPack) >= 6000 or cInt(NumPack) < 1 then 
             response.write NumPack
          end if 
          rsPack.Movenext 
       loop 
    end if 
    rsPack.movefirst
    Comme ceci il m'affiche bien les Packs en question. Maintenant il me suffirait de remplacer le response.write par un code qui m'efface la ligne du recordset et mon problème est résolu !

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 151
    Points : 116
    Points
    116
    Par défaut
    En cherchant la solution (que je n'ai pas encore trouvée, je suis tombé sur cette page vraiment pas mal qui reprend notamment tous les codes d'erreurs, les syntaxes, ...

    Je me suis dit que ça pourrait toujours servir. Si il était judicieux de le mettre dans une rubrique dévolue à ce genre de liens, merci de me dire où j'irai l'y rajouter
    http://fr.wikibooks.org/wiki/Program...des_d.27erreur

  10. #10
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Re,

    Si je comprends, tu ne veux pas récupérer les enregistrements dont les quatre premiers caractères du numéro sont compris entre 1 et 5999 ?

    Tu doit pouvoir faire quelquechose comme ça alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sSQL = "select Pack_Impression, Pack.Pack from Pack where Num_auteur = " & sID_Auteur & " and ( cInt(Left(Pack, 4)) <= 6000 or cInt(Left(Pack, 4)) < 1) order by Pack"

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 151
    Points : 116
    Points
    116
    Par défaut
    J'ai trouvé la méthode delete sur cette page :
    http://www.w3schools.com/ado/met_rs_delete.asp

    Je l'ai appliquée de cette façon (pas sur que ce soit juste) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rsPack.Delete adAffectCurrent
    J'ai l'erreur suivante :
    Le fournisseur ou l'objet ne prend pas en charge cette opération.
    Je suppose que c'est l'objet recordset qui ne permet pas cette opération comme remarqué dans la page, mais comment faire pour qu'il l'accepte ?[/code]

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 151
    Points : 116
    Points
    116
    Par défaut
    merci pc75 ça marche (c'était le contraire je voulais récupérer uniquement ceux entre 1 et 6000 mais bon ). Je savais pas qu'on pouvait mettre du code comme celui-là dans une requête...

    Et c'est quand même plus simple que d'essayer d'aller chipoter dans le recordset... Quoique j'aimerais quand même bien avoir la réponse à cette erreur ça peut toujours servir.

  13. #13
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Re,

    Voila un extrait de MSDN :

    Méthode Delete (objet Recordset d'ADO)


    Supprime l'enregistrement en cours ou un groupe d'enregistrements.

    Syntaxe

    recordset.Delete AffectRecords

    Paramètres

    AffectRecords Valeur AffectEnum qui détermine le nombre d'enregistrements auxquels la méthode Delete sera appliquée. Vous pouvez utiliser l'une des constantes suivantes :

    Constante Description
    adAffectCurrent Valeur utilisée par défaut. Supprime uniquement l'enregistrement en cours.
    adAffectGroup Supprime les enregistrements qui correspondent aux paramètres en cours de la propriété Filter. Pour pouvoir utiliser cette option, vous devez affecter la propriété Filter de l'une des constantes prédéfinies admises.


    Remarques

    L'utilisation de la méthode Delete marque l'enregistrement en cours ou un groupe d'enregistrements d'un objet Recordset en vue d'une suppression. Si l'objet Recordset ne permet pas la suppression d'enregistrements, une erreur se produit. Si vous êtes en mode de mise à jour immédiate, la suppression s'effectue immédiatement dans la base de données. Sinon, les enregistrements sont marqués en vue d'une suppression à partir de la mémoire cache et leur suppression effective n'aura lieu que lorsque vous appellerez la méthode UpdateBatch. (Utilisez la propriété Filter pour afficher les enregistrements supprimés.)

    L'extraction des valeurs des champs de l'enregistrement supprimé génère une erreur. Suite à sa suppression, l'enregistrement demeure en cours jusqu'à ce que vous sélectionniez un autre enregistrement. Par conséquent, dès lors que vous quittez un enregistrement supprimé, celui-ci ne sera plus accessible.

    Si vous imbriquez des suppressions dans une transaction, vous pouvez restaurer les enregistrements supprimés à l'aide de la méthode RollbackTrans. Si vous êtes en mode de mise à jour par lots, vous pouvez annuler une suppression ou un groupe de suppressions en attente à l'aide de la méthode CancelBatch.

    En cas d'échec de la tentative de suppression d'enregistrements, provoquée par un conflit avec les données sous-jacentes (par exemple, un enregistrement ayant déjà été supprimé par un autre utilisateur), le fournisseur renvoie des avertissements à la collection Errors mais n'arrête pas l'exécution du programme. Une erreur d'exécution intervient uniquement en cas de conflit sur tous les enregistrements demandés.

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

Discussions similaires

  1. Err 13 Incompatibilté de type sur recordset
    Par AndréPe dans le forum Access
    Réponses: 3
    Dernier message: 18/01/2007, 16h04
  2. manipulation sur date dans une requête
    Par willis dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 06/07/2006, 15h43
  3. Manipulations sur les bits
    Par ThE_LaSt dans le forum C
    Réponses: 23
    Dernier message: 27/03/2006, 14h22
  4. Manipulation de Recordset avec DAO
    Par Sinclar dans le forum VBA Access
    Réponses: 5
    Dernier message: 26/09/2005, 20h19
  5. probleme de teste sur recordset
    Par julio_097 dans le forum ASP
    Réponses: 3
    Dernier message: 18/07/2005, 11h02

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