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 :

Mise à jour d'un champ oui/non dans une table "A" selon des critères présents dans une table "B" [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 27
    Points : 34
    Points
    34
    Par défaut Mise à jour d'un champ oui/non dans une table "A" selon des critères présents dans une table "B"
    Bonjour,

    J'ai cherché dans le forum, dans la faq, sur le web (pas tout lu quand même), mais je reste bloqué. Donc s'il vous plait j'ai besoin d'un coup de main.

    En effet, je souhaite mettre à jour des champs oui/non : un qui indique si l'interimaire est actif, ie. à un contrat en cours chez nous, un autre s'il a un visa valide s'il est étranger.

    Premier cas : Le contrat

    J'ai une table [APL_rodosha] où sont stockés les rodo_code (numéro auto, clé), noms, prénoms, etc... ainsi que le champ "active" (case à cocher).
    Dans mon autre table, [contract] j'ai "contract_numb" (num auto, clé), "code facturation" (clé primaire aussi), rodo_code, contract_end (date légale de fin de contrat), activity_end (fin effective du contrat = dernier jour de travail de l'intérimaire), etc...

    J'ai donc dans ma table [contract] pour un même travailleur intérimaire plusieurs contrats (finis, en cours...). (On souhaite garder dans la base les contrats finis pour retracer son parcours chez nous).

    Pour ceux qui ont leur contrat fini, c-à-d qu'une date a été imputée dans le champ activity_end, et sans aucun autre contrat en cours, je souhaiterais que la case à cocher soit décochée (valeur 0). Et inversement : s'il a ou pas de contrat fini, mais qu'il a un contrat en cours (c-à-d que pour ce contrat le champ activity_end est vide), la case à cocher doit être cochée.
    Le problème c'est qu'avec le code sql suivant j'ai un intérimaire qui est marqué comme inactif alors qu'il a un autre contrat en cours.

    Voici mon code SQL :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE APL_rodosha INNER JOIN contract ON APL_rodosha.rodo_code=contract.rodo_code SET APL_rodosha.active = IIf(contract.activity_end Is Not Null,0,1);

    Second cas : Les visas

    Je pense que la problématique est sensiblement la même, donc je ne remets pas le code (que de tout de façon je n'ai pas fait)
    La différence c'est que j'aurai plus de conditions à tester.
    - nationalité différente de "japonais" (dans la table [APL_rodosha])
    - type de visa différent de "visa de résident permanent" (dans table [visa_hold])
    - date de fin de visa par rapport à date en cours (date()) (dans la table [visa_hold])

    Donc ma question principale est qu'est ce qui cloche ?
    La question secondaire par rapport au second cas, est-ce que c'est mieux d'imbriquer des iif ou de faire autre chose?

    Merci d'avance.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 27
    Points : 34
    Points
    34
    Par défaut
    Après avoir cherché un petit moment, je suis arrivé à écrire ce code :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE (APL_rodosha INNER JOIN contract ON APL_rodosha.rodo_code = contract.rodo_code) INNER JOIN visa_hold ON APL_rodosha.rodo_code = visa_hold.rodo_code SET APL_rodosha.active = IIf(contract.activity_end<=date(),0,1), APL_rodosha.visa_motsu = IIf(visa_hold.visa_type<>"永住許可" And APL_rodosha.kuni_code<>13 and visa_hold.visa_end<=date() or APL_rodosha.kuni_code=13, 0, iif(APL_rodosha.kuni_code<>13 and visa_hold.visa_type="永住許可" OR visa_hold.visa_end>date(),1,0));

    J'ai modifié le premier code plusieurs fois, et décidé de tester la date plutôt que de savoir si c'est rempli ou pas. Le souci est toujours le même, j'ai toujours une personne avec deux contrats (deux enregistrements dans la table contrat/contract), un fini (date de fin inférieur à date du jour) et un en cours (pas de date de fin), qui n'est pas updaté "active" (case à cocher cochée, table personnel/APL_rodosha).

    La seconde requête a disparu pour les visas, je l'ai écrite dans le même update. Avec la même configuration (deux enregistrements pour une personne dans la table visa/visa_hold, un fini et un encours), je n'ai pas le moindre problème. Chaque case à cochée dans la table personnel/APL_rodosha est bien mise à jour. A noter que les dates de fin de visa sont connues à l'avance.

    Donc je me dis que le problème viendrait :
    - du faite de la valeur nulle dans un champ de type date : je ne peux rien faire là-dessus.
    - de l'indexation : dans la table visa_hold j'ai une clé primaire sur un seul champ, ID visa. Ma table contract a plusieurs champs en clé primaire (voir premier message) : peut être qu'il faudrait que je ne garde que le contract_numb (Num auto) en tant que clé?

    Je ne pense pas qu'il soit nécessaire de créer une table temporaire (comme ici) ou une requête qui trie les contrats sur la date de fin d'activité (null ou pas null) pour arriver à mes fins...

    NB : les caractères en rouge dans le code sont 永住許可 (eijuusha = visa de résident permanent). D'ailleurs j'ai un problème dans VBA pour écrire avec les caractères asiatiques...

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 27
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    J'ai essayé d'enlever la clé primaire sur plusieurs champs mais ça n'a rien changé.

    Merci pour votre aide

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 27
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    Je crois que je tiens une piste.
    La requête suivante a été créée pour compter le nombre de contrat actif : je compte le nombre de numéros de contrat contract_numb qui n'a pas de date de fin d'activité renseigné (le "Having") que je regroupe (activité -> usine/lieu de travail -> entreprise). Je ramène aussi d'autres éléments pour les inclure à un formulaire. Elle fonctionne bien (malgré un code imbuvable).

    Comme un employé ne peut pas avoir qu'un contrat en cours à chaque fois, du coup il semble plus pertinent de travailler sur la clé de la table contrat que sur l'identifiant du travailleur (rodo_code) même si c'est le travailleur qui va avoir son statut updaté.

    Voici la requête qui marche :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT Count(contract.contract_numb) AS CompteDecontract_numb, activity.activity_code, activity.activity_name, APL_kaisha.kaisha_name, kaisha_kojo.kojo_name, kaisha_kojo.postal_code, address_city.ken, address_city.city_name, kaisha_kojo.kojo_adress, APL_kaisha.postal_code, address_city_1.ken, address_city_1.city_name, APL_kaisha.honsha_address
    FROM ((address_city AS address_city_1 RIGHT JOIN APL_kaisha ON address_city_1.postal_code = APL_kaisha.postal_code) INNER JOIN (address_city RIGHT JOIN kaisha_kojo ON address_city.postal_code = kaisha_kojo.postal_code) ON APL_kaisha.kaisha_code = kaisha_kojo.kaisha_code) INNER JOIN (activity INNER JOIN contract ON activity.activity_code = contract.activity_code) ON kaisha_kojo.kojo_code = activity.kojo_code
    GROUP BY activity.activity_code, activity.activity_name, APL_kaisha.kaisha_name, kaisha_kojo.kojo_name, kaisha_kojo.postal_code, address_city.ken, address_city.city_name, kaisha_kojo.kojo_adress, APL_kaisha.postal_code, address_city_1.ken, address_city_1.city_name, APL_kaisha.honsha_address, contract.activity_end
    HAVING (((contract.activity_end) Is Null));

    Je vais tester avec la requête d'update pour voir ce que cela donne.

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

Discussions similaires

  1. [AC-2003] Requête mise a jour de champ Oui/Non
    Par wedge3112 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 28/10/2012, 19h06
  2. [AC-2003] Requête mise a jour de champ Oui/Non
    Par wedge3112 dans le forum Access
    Réponses: 0
    Dernier message: 26/10/2012, 08h30
  3. Réponses: 9
    Dernier message: 22/06/2011, 10h05
  4. Mise à jour d'un champ Oui/Non
    Par mouloudéen dans le forum Access
    Réponses: 3
    Dernier message: 11/03/2006, 22h32
  5. Réponses: 2
    Dernier message: 12/02/2003, 15h26

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