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

Requêtes et SQL. Discussion :

Champ Vide à passer à zéro [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    rjl
    rjl est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 129
    Points
    129
    Par défaut Champ Vide à passer à zéro
    Bonjour à tous,
    Il y a bien longtemps que je n'ai pas eu à retravailler en ACCESS mais je suis impressionné de la manière dont on peut perdre des notions préalablement évidentes.

    Je travaille en requêtes mise à jour directes (non SQL, ni VBA) donc au plus simple et n'arrive pas à tester un champ semble-t-il vide pour le remplacer par 0 dans une colonne (déclarée en numérique) mais j'ai aussi essayé en texte depuis que j'ai repris la base.
    Je tente de passer à 0 (zéro) un champ vide mais sans succès : en essayant préalablement la sélection avant la mise à jour, j'obtiens une feuille vide face aux 37000 enregistrements présents (tous vides pour cette colonne) car ce n'est qu'un jeu d'essai face à une base de 1 000 000 de lignes
    Dans la ligne Critère pour le colonne considérée, je mets simplement EstVide([Tout].[Champ14]) mais tous les autres essais ont également échoué !

    Je dois faire une faute évidente, impardonnable… sans pour autant être capable de la voir, ni savoir corriger !
    Merci de votre aide et @ bientôt
    RJL2b10

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 866
    Points
    56 866
    Billets dans le blog
    40
    Par défaut
    Hello rjl !

    Citation Envoyé par rjl Voir le message
    je mets simplement EstVide([Tout].[Champ14]) mais tous les autres essais ont également échoué !
    tu as essayé avec Est Null ?

  3. #3
    rjl
    rjl est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 129
    Points
    129
    Par défaut
    Bonsoir f-leb,

    Merci de ta réponse ; Bien sûr, j'ai essayé avec EstNull mais le problème est le même c'est à dire que les lignes avec le champ vide sont simplement ignorées et donc non sélectionnables à ce titre.
    Je penche pour un champ vide car ce choix est proposé en filtre direct... et dans ce cas, les lignes sont sélectionnées !

    Je pense que c'est la syntaxe de EstVide que je ne sais pas implémenter dans ce cadre d'utilisation.
    @+ et encore merci RJL2b10

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 866
    Points
    56 866
    Billets dans le blog
    40
    Par défaut
    Bizarre, un champ numérique vide est normalement à Null.

    pour un champ texte, soit il est à Null, soit égal à une chaîne vide (="").

    Tu peux basculer ta requête "mise à jour" en "mode SQL" et poster le code ici ?

  5. #5
    rjl
    rjl est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 129
    Points
    129
    Par défaut
    Re,

    Merci de tes efforts pour m'appuyer.
    J'ai écrit ma requête Update pour un seul Champ (à titre d'exemple) pour traiter les champs dont le code serait inférieur à 1 ou Null ou Vide et imposer alors un zéro que je pourrai traiter sans difficulté.

    Actuellement, je ne récupère aucun enregistrement sur les 119000 alors que quelques dizaines de milliers correspondent à ce cas !

    J'ai ensuite basculé la requête en SQL plus simple pour moi (et plus didactique) que de l'écrire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UPDATE Tout SET Tout.Champ2 = 0
    WHERE (((Tout.Champ2)<1)) OR (((Tout.Champ2)=IsNull([Tout].[Champ2]))) OR (((Tout.Champ2)=IsEmpty([Tout].[Champ2])));
    Merci de ton éclairage et à ta disposition si nécessaire. @bientôt RJL2b10

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 866
    Points
    56 866
    Billets dans le blog
    40
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (((Tout.Champ2)=IsNull([Tout].[Champ2])))
    Ce serait plutôt (en retirant quelques parenthèses superflues):
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    (Tout.Champ2 IS NULL)
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (((Tout.Champ2)=IsEmpty([Tout].[Champ2])))
    là ce serait plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (IsEmpty([Tout].[Champ2]))
    mais cette condition là est sans doute inutile, un champ numérique non rempli est à Null

  7. #7
    rjl
    rjl est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 129
    Points
    129
    Par défaut
    Bonjour,
    Je ne me suis pas précipité pour répondre, des parenthèses superflues (générées pour partie) ne sont certes pas élégantes mais malgré tout inoffensives !
    Pour une meilleure compréhension du problème, je présente les quelques premiers enregistrements de la table (en réalité 119000 en extrait de la table complète supérieure à 1 000 000 de lignes !).
    Alors, bien sûr, je sais ce qui ne va pas... sans savoir le résoudre !


    Uploaded with ImageShack.us
    En fait, les enregistrements sont ignorés dès lors que je teste un champ apparemment vide !
    Pour autant, je ne pouvais rester sans solution pour ce test (119 000 lignes) et j'ai dans un premier temps supprimé le test qui me fait plonger en cherchant à remplacer ces champs "vides" par zéro ! Même problème, les sélections pour des codes > 99 ne m'intéressant pas, j'ai pu remplacer ces codes par zéro... mais même problème, les lignes contenant des "vides" étaient abandonnées dès que je testait un champs d'une des 6 colonnes participant à la sélection ! Comme dans cet extrait, le Champ14 ne contient aucune valeur ma sélection était de 0 enregistrements contre 37 000 prévus !
    Car la sélection, j'ai pu la faire sur l'échantillon mais, certes, de manière bestiale !
    Pour cela, j'ai filtré mon fichier successivement avec chacune des 6 colonnes de sélection en ne récupérant que les champs réputés "vides" ou inférieurs à 100 (cochant chacune des 99 valeurs de chaque champ concerné).
    C'est lourd, ça a fonctionné sur cet extrait sans résoudre mon problème de fond !

    J'espère que cet éclairage sera constructif.
    Bon dimanche et encore merci
    @Bientôt RJL2b11

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 866
    Points
    56 866
    Billets dans le blog
    40
    Par défaut
    bonjour rjl,

    J'ai tenté cette petite expérience sur une table Tout remplie vite fait (copie d'écran ci-jointe).
    La requête de sélection me retourne bien les ID dont le champ2 est vide ou inférieur à 1.

    Si chez toi la requête ne retourne toujours rien, c'est que quelque chose nous a échappé et je ne vois pas encore ce que ça peut être

    Tu me confirmes que Champ2 est bien de type numérique (entier long ?)
    Sinon fait un tour dans les propriétés du champ (un format particulier ? valeur par défaut ? Null interdit est bien à Non ?

    Au pire, tu peux essayer de mettre un extrait de cette table en pièce-jointe avec la requête (juste quelques lignes hein) et je regarderai.

    Bon dimanche
    Images attachées Images attachées  

  9. #9
    rjl
    rjl est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 129
    Points
    129
    Par défaut
    Bonsoir Fabien,
    Toutes mes excuses déjà pour la transmission image plutôt qu'en code mais pour autant ce point est dépassé !
    Grâce à tes observations (et image de ton essai), j'ai pu corriger un problème majeur la sélection se fait en partie :
    Ayant été longtemps déphasé d'Access, j'avais oublié des points essentiels pour sélectionner par Expr: les champs avec expression dont
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Expr:EstNull([Champ14])
    avec Vrai en critère associé à un test de valeur en Ou donc plus classique et simplement installé sur la ligne suivante dans sa propre colonne.
    Ce serait parfait… si je n'avais à reproduire cette sélection avec 5 autres champs (par Et) et là ça se gâte !
    J'ai tenté avec le traitement normal mais aussi par SQL pour lequel je pensais que l'empilement serait plus facile mais rien n'a fonctionné !
    J'ai aussi tenté sans succès de mettre des zéros pour les valeurs qui ne m'intéressaient pas (Null ou > 99) car ça me semblait aussi assez simple d'associer la sélection par Et de 6 tranches … mais je n'avais pas des choix heureux ce jour et là encore, loupé !

    Je continue encore à chercher un peu mais referai appel si je n'aboutis vraiment pas !
    @ bientôt donc que ce soit pour un appui ou dire comment j'ai résolu ma difficulté.
    Encore merci de ton appui RJL2b11

  10. #10
    rjl
    rjl est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 129
    Points
    129
    Par défaut
    Bonjour f-leb,

    Je craignais de devoir revenir pour redemander de l'aide !
    J'ai cherché à travers les Tutos, les Forums et fait des essais multiples... sans succès !

    J'ai 6 champs (toujours les mêmes) ; je souhaite passer à 0 (codif impossible permettant un choix facile par la suite) chaque champ lorsqu'il EstNull.

    Ce n'est qu'un exemple mais une des réponses les plus fréquentes est un nom réputé invalide (j'ai essayé sans le nom de table, ni en ligne 2 (Table), ni en composante du nom ([Tout][....)
    Bien entendu, j'ai aussi tenté sans succès de mettre directement le nom de la table en deuxième ligne ou encore de le supprimer du contenu du nom testé : rien n'y fait !
    Merci de ton aide si tu vois comment je peux me sortir de ce mauvais pas !
    @Bientôt RJL2b12

  11. #11
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 866
    Points
    56 866
    Billets dans le blog
    40
    Par défaut
    bonjour rjl,

    - pour la mise à jour sur un champ, tu peux envisager la requête:

    et avec 6 requêtes du même genre sur tes 6 champs (on peut les lancer à la suite en VBA), tu as ta mise à jour complète.


    - Si tu veux faire ça en une seule requête, on s'en sort en bricolant avec la fonction Nz:

    (avec 3 champs)

    reste à savoir laquelle des deux méthodes est la plus rapide sur une table volumineuse...
    (le résultat de tes tests m'intéresse d'ailleurs).

    à+
    Images attachées Images attachées   

  12. #12
    rjl
    rjl est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 129
    Points
    129
    Par défaut
    Bonsoir f-leb,

    Il est temps que j'arrête car c'est la 3ème tentative de réponse !!
    J'ai d'ailleurs cumulé les problèmes en n'obtenant pas d'enregistrement pour la première des 6 sélections :
    Je me demande maintenant si Numprix n'est pas le seul champ sans Null à travers ses 119700 enregistrements !

    Ensuite, j'ai fait les changements de Null > 0 par Nz et globalement ça a fonctionné ; j'ai ensuite sélectionné les 6 champs dont les valeurs étaient inférieures à 0 et, à ma grande surprise, j'ai trouvé quelques valeurs à 100, voire à 700 !

    Comme les filtres ne fonctionnent pas au-delà de 3 colonnes, j'ai repris ma sélection Nz avec 3 champs à chaque passage... au cas où !
    Là encore, j'ai dû faire une erreur car lorsque je demande la table totale, les 3 colonnes traitées dans un second temps ne participent pas à la première table et dans le second cas, je n'ai que ces 3 colonnes.
    Il faudra donc que je fasse une requête Union mais là encore, il faudra que je retrouve commet on les écrit (car c'est pour moi de l'histoire ancienne).

    La table complète, ai-je appris ferait 1 800 000 de lignes !

    @+ et encore merci RJL2b13

  13. #13
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 621
    Points : 56 866
    Points
    56 866
    Billets dans le blog
    40
    Par défaut
    bonjour rjl,

    oula, ça part tous azimuts, va falloir reprendre les problèmes un par un rjil, je n'ai pas compris

    Apparemment tu dois mettre à 0 des valeurs qui ne t'intéressent pas. Voilà un exemple si ça peut t'aider:
    Images attachées Images attachées  

  14. #14
    rjl
    rjl est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 129
    Points
    129
    Par défaut
    Bonjour,

    Je n'avais pas oublié mais coincé entre mes propres problèmes et ceux de mon fils que j'appuie pour ce travail, je prends parfois du temps (plus encore lorsque j'y ajoute la perte de ma réponse préparée à une heure bien tardive et non reprise au moment !).
    Félicitation pour ton dernier envoi, exemple qui m'a permis de finaliser ce travail (à mon niveau). En pratique, je confondais Est Null avec EstNull() qui m'imposait de mettre le nom d'un champ et alors, plus rien ne collais !
    J'ai calqué simplement l'exemple que tu m'as donné d'où une réponse immédiate répondant exactement à la demande :
    Du coup, j'ai abandonné complètement le Nz qui m'imposait une seconde requête pour la sélection même si celle-ci était rapide, voire, ensuite, un complément pour supprimer les zéros ne simplifiant pas la lecture.

    La seule inquiétude que j'ai est de faire réaliser une seconde méthode pour tester les temps ! Or, ceux-ci n'ont de valeur que comparativement, la performance étant d'abord liée au serveur.

    En tout cas, si j'ai du nouveau en ce sens, je reviendrai… tout en étant un peu pessimiste pour cela.

    Un grand merci encore et bon week-end RJL2b16

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

Discussions similaires

  1. [quick report]bandes des sous détail et champs vides
    Par Zatoobux dans le forum Bases de données
    Réponses: 2
    Dernier message: 04/06/2004, 16h01
  2. Pb de tri avec champs vide
    Par nesbla dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2004, 17h42
  3. Test sur un champs vide
    Par PrinceMaster77 dans le forum ASP
    Réponses: 2
    Dernier message: 27/04/2004, 12h54
  4. [conception] champs vides ou plusieurs tables ?
    Par in dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 17/02/2004, 08h41
  5. tri avec les champs vides en dernier
    Par r-zo dans le forum Requêtes
    Réponses: 11
    Dernier message: 03/09/2003, 13h40

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