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 :

Modifier le dernier caractère d'un champ dans une table.


Sujet :

Requêtes et SQL.

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut Modifier le dernier caractère d'un champ dans une table.
    Bonjour a tous, j ai une base de donnée en Access dans celle-ci plusieurs tables dont deux tables qui nous intéresse:

    -Dans ma Table 1: deux champs(1 Texte, clé primaire contenant 14(lettres/chiffres)
    Ex: 1aoice050505001H et le 2 ème champs contient aussi des lettres/chiffres
    Ex: AB18858)

    -Dans la Table 2: deux champs qui nous intéresse celui avec une date et un autre qui est le même que le 2 ème champ de ma table 1).

    Le problème c'est que je dois modifier: le champs 1 de ma Table 1 uniquement remplacé le dernier caractère (le H par I pour toutes les dates >=01/01/08).

    Il a trop d'enregistrement pour que je puisse le faire a la main, j avais pensé le faire avec une application visual basic 6 mais le problème c'est que je ne peux pas convertir la base de donnée Access en Version 97 (car la base de donnée n'est pas a moi) pour pouvoir l'utiliser avec le data controle de VB6.

    en VB j avais pensé faire une recherche sur le 1 er champ de ma table 1 et quand celui-ci trouve un H comme dernier caractère regardé dans la 2 ème table (en relation) dans l'enregistrement courant si la date est >= a 01/01/08 remplacé alors le H par un I dans la 1 er table .

    Savons nous le faire en requette ??

    Que me conseillé vous merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Il y a probablement moyen par requête, mais j'ai ceci sous la main.
    Peut-être pour faire ton bonheur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Sub ModifierH()
    Dim Rs As DAO.Recordset
    Set Rs = CurrentDb.OpenRecordset("Table1")
    Do Until Rs.EOF
     Rs.Edit
     If Rs("date") >= #1/1/2008# Then
         If Right(Rs("Champ1"), 1) = "H" Then
           Rs("Champ1") = Left(Rs("Champ1"), Len(Rs("Champ1")) - 1) & "I"
         End If
      End If
    Rs.Update
    Rs.MoveNext
    Loop
    End Sub
    Reviens si tu veux absolument une requête.

  3. #3
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Tant qu'à faire voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Table1 SET Table1.Champ1 = Left([champ1],Len([champ1])-1) & "I" WHERE (((Table1.date)>=#1/1/2008#));

  4. #4
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    OUPS pas bien lu : date n'est pas dans table 1
    Belgium zero point !
    Merci Vodiem

  5. #5
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    C'est la bonne, j'espère !

    Un 1ère requête appelée "1R" pour sélectionner les "cas"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Table1.Champ1
    FROM Table1 INNER JOIN Tables2 ON Table1.Champ2 = Tables2.AutreComme2
    WHERE (((Tables2.date)>#1/1/2008#) AND ((Right([champ1],1))="H"));
    Une seconde requête qui modifie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Table1 INNER JOIN 1R ON Table1.Champ1 = [1R].Champ1 SET Table1.Champ1 = Left([table1].[Champ1],Len([table1].[champ1])-1) & "I";
    Attention ceci suppose une relation 1 à 1 entre champ2 et AutreComme2

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut
    Merci je vais essayé et vous tiens au courant.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut
    Bonsoir voci ma requete 1R j ai des soucis de plus les noms des tables et des champs sont écrit avec des espaces donc suis obligé de mettre des crochets de plus j ai deux champs dans chaque table qui se nomme Ref DOC:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [N° Lots dans DOC.n° lot]
    FROM [N° Lots dans DOC] INNER JOIN [Gestion des lots] ON  [N° Lots dans DOC].[Ref DOC] = [Gestion des lots].[Ref DOC]
    WHERE ((([Gestion des lots.Date départ])>#1/1/2008#) AND ((Right([n° lot],1))="H"));
    ;

    ça me revoit incohérence de type dans une expression


    PS: les deux tables sont en relation par l'intermédiaire d'une autre table (Many to Many)

  8. #8
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Peux-tu poster les noms exacts:
    Nom de la table1 :
    Nom du champ1 : son type :
    Nom du champ2 : son type :

    Nom de la table2 :
    Nom du CommeChamp2 : son type :
    Nom du champDate : son type : date

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut
    Nom de la table1 : N° Lots dans DOC
    Nom du champ1 : son type :n° lot texte
    Nom du champ2 : son type :Ref DOC numerique

    Nom de la table2 : Gestion des lots
    Nom du CommeChamp2 : son type :Ref DOC texte
    Nom du champDate : son type : Date départ date/heure

    Mais les deux champ commun sont pas de même type, peut être en utilisant la table intermédiaire:


    Merci de ton aide

  10. #10
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Cette fois, c'est la bonne ?
    Puisque les champs Ref DOC n'ont pas le même type, une première requête pour sélectionner les "H" et se créer la bonne structure
    R1(H etRefTxt)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [N° Lots dans DOC].[n° lot], CStr([ref doc]) AS ReTxt
    FROM [N° Lots dans DOC]
    WHERE (((Right([n° lot],1))="H"));
    R2(H 08) pour sélectionner les "H" de 2008
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [R1(H etRefTxt)].[n° lot]
    FROM [Gestion des lots] INNER JOIN [R1(H etRefTxt)] ON [Gestion des lots].[Ref DOC] = [R1(H etRefTxt)].ReTxt
    WHERE ((([Gestion des lots].[Date départ])>=#1/1/2008#));
    et finalement R3(MàJ) pour modifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE [R2(H 08)] INNER JOIN [N° Lots dans DOC] ON [R2(H 08)].[n° lot] = [N° Lots dans DOC].[n° lot] SET [N° Lots dans DOC].[n° lot] = Left([N° Lots dans Doc].[n° lot],Len([N° Lots dans Doc].[n° lot])-1) & "I";
    Prennez d'abord un copie de la DB dans l'état actuel et bonne chance.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut
    J ai un problème avec la deuxième requête ça ne m'affiche une colonne vide comme nom n° lot

    Quand la colonne est convertir en str la donnée change exemple: BL16534 en 85695.

    Je viens de me rendre conte que les deux champs sont numérique. dsl

    J ai essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [N° Lots dans DOC].[n° lot]
    FROM [Gestion des lots] INNER JOIN [N° Lots dans DOC] ON [Gestion des lots].[Ref DOC] = [N° Lots dans DOC].[Ref DOC]
    WHERE ((([Gestion des lots].[Date départ])>=#1/1/2008#));
    Mais ca ne fonctionne pas

  12. #12
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    OK ça change évidemment.
    Mais je crois que tu as compris la philosophie.
    1° sélectionner dans N° Lots dans DOC les éléments qui sont candidats à la modif (ils se terminent par H) et leur associer une donnée "Ref doc" exprimée dans le même type que le champ "Ref doc" de l'autre table. D'après ce que tu annonces maintenant il faut convertir du texte en nbre. La fonction est donc
    cdbl() au lieu de cstr()
    2° détecter les candidats dont la date impose la modification du H en I
    3° la mise à jour proprement dite.

    A toi de jouer maintenant !

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut
    Bonsoir,

    Quand je convertis du texte en numérique ça me renvois #Erreur et si je convertis un champ numérique en texte la valeur change exemple: BL16534 en 85695.

    Que faire ?

  14. #14
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonsoir,


    Convertir BL16534 (txt) en 85695 (numérique) c'est impossible : cela donnerait une erreur.
    Par contre si tu constates que 85695 devient BL16534, j'ai le sentiment que tu te mêles les pinceaux dans le nom des champs.
    85695 numérique s'affiche aligné à droite tandis que cstr(85695) s'affiche aligné à gauche.
    Remarque CDbl(#15/08/2134#) donnerait 85695

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 661
    Points : 244
    Points
    244
    Par défaut
    Non en faite dans mon champs c est du texte qui contient BL1234 et quand je le change en numérique il me donne un chiffre genre 8983 et si je fais l'inverse:
    je change un champ numérique contenant BL1234 en texte il me met #Erreur.

  16. #16
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Non en faite dans mon champs c est du texte qui contient BL1234
    Veux-tu dire :
    Tu as une table, avec un champ actuellement défini en texte.
    Ce champ contient la valeur BL1234.

    et quand je le change en numérique
    Veux-tu dire :
    que tu modifies brutalement la définition de ta table, en redéfinissant "Numérique" le type de ce champ.

    Si c'est ça, alors c'est l'origine de tes misères.
    Si c'est pas ça, je donne ma langue au chat.

Discussions similaires

  1. [AC-2010] Augmenter la taille "nombre de caractères" d'un champ dans une requête
    Par albayt dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 23/11/2013, 22h59
  2. Comment modifier un champ dans une Table importée?
    Par Peter89 dans le forum Access
    Réponses: 1
    Dernier message: 06/09/2012, 20h36
  3. Modifier la valeur d'un champs dans une table mysql en fonction du temps.
    Par VaSss dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/05/2010, 11h30
  4. Réponses: 3
    Dernier message: 04/07/2008, 11h33
  5. Comment modifier un champ dans une table liée ?
    Par HookerSeven dans le forum Access
    Réponses: 11
    Dernier message: 05/02/2006, 23h50

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