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

Access Discussion :

Transférer les valeurs d'une table à une autre en fonction de la valeur d'un champ [AC-2013]


Sujet :

Access

  1. #1
    Membre du Club Avatar de Boxtell
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2016
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2016
    Messages : 81
    Points : 50
    Points
    50
    Par défaut Transférer les valeurs d'une table à une autre en fonction de la valeur d'un champ
    Bonjour,

    J'explique mon problème qui est très très précis, j'ai besoin d'un expert

    J'ai une table (Liste_OP) listant un ensemble d'opérations ayant chacune différents champs (Un numéro, un temps d'éxécution, un outil à utiliser, un emplacement de travail etc...).

    L'un des champs (OP_Statut) nous dit si l'opération a été réalisé ou pas (C'est la personne qui réalisera l'opération qui clic sur un bouton d'une interface qui inscrit le mot "effectuée" dans le champ OP_Statut de l'opération correspondante).

    J'aimerais alors créer une table (Liste_OP_Effectuées) qui serais vide au départ et se remplirais au fur et à mesure des opérations qui ont pour OP_Statut la valeur : "Effectuée". Cela est-il possible ?

    C'est à dire qu'à chaque fois que quelqu'un validera une opération (Statut : Effectuée), l'ensemble des infos de la ligne de l'opération viendra s'ajouter dans la table Liste_OP_Effectuées.

    JE vous avoue que je croise les doigts pour que cela soit possible.

    MERCI
    Cordialement

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Oui bien sûr c'est tout à fait réalisable il y a rien de bien sorcier à cela.

    Sur le principe, ce qui me dérange un peu ce que tu veux vider la table avant et là il faudra clarifier par des explications car il faudra prendre la décision de qui efface la table avant d'y mettre de nouvelles données.

    Pour ma part je n'effacerai pas la table complètement mais je marquerai comme supprimé avec un champ supplémentaire qui les définira comme tel.

    Sur le plan fonctionnel, si les données sont saisies à partir d'un formulaire, il suffira de faire une insertion par l'intermédiaire d'une procédure SQL qui sera définie dynamiquement en fonction du fait que la condition est remplie ou pas.

    Argy

  3. #3
    Membre du Club Avatar de Boxtell
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2016
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2016
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    Bonjour,

    Merci pour la rapidité du retour

    Par rapport aux explications que tu as pu me donner je vais clarifier mon besoin :

    -Je ne souhaite pas spécialement vider la table, je disais seulement que je démarrais d'une table vide au tout début, elle se remplira au fur et à mesure sans nécessité de supprimer les anciennes valeurs.

    -Deuxièmement je ne suis pas tout à fait sur qu'on soit totalement en phase par rapport au système que j'imagine. J'ai une table qui existe déjà avec un certains nombre de données par ligne. Dans mon formulaire l'utilisateur ne fait que renseigner une seule de ces données par un clic bouton (le statut de l'opération). Ce clic bouton pourrais tout de même permettre de transférer l'ensemble des données de ma ligne dans mon autre table ?

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Boxtell Voir le message
    Ce clic bouton pourrais tout de même permettre de transférer l'ensemble des données de ma ligne dans mon autre table ?
    Bah oui, si la condition est remplie pour le faire, donc pour toi : OP_Statut la valeur : "Effectuée" alors on peut envoyer...

    Ca donnerait un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    Option Compare Database
    Option Explicit
     
    Private Sub cmdValider_Click()
        If MsgBox("Enregistrer la fiche ?", vbQuestion + vbYesNo, "Confirmer") = vbYes Then
            Call SauverLaFiche(Me.Identifiant)
            If Me.OP_Statut.Value = "Effectuée" Then
                If AlimenterTableListeOP(Me.Identifiant) = False Then
                    MsgBox "Le remplissage de la table 'Liste_Op' a échoué", vbExclamation
                End If
            End If
        End If
    End Sub
     
    Private Function AlimenterTableListeOP(ByVal ID As Long) As Boolean
    '[...]
     
        On Error GoTo L_ErrAlimenterTableListeOP
        'si tu n'a=s pas les valeurs présente ici tu passes par un recordset
     
        'si tu as toutes les valeurs, tu fait un INSERT
        CurrentDb.Execute "INSERT INTO Liste_OP (champ1texte, champ2num, champ3date...) VALUES ('valeur1', valeur2, #valeur3#);"
     
        AlimenterTableListeOP = True
        On Error GoTo 0
    L_ExAlimenterTableListeOP:
        Exit Function
     
    L_ErrAlimenterTableListeOP:
        AlimenterTableListeOP = False
        Resume L_ExAlimenterTableListeOP
    End Function
     
    Private Sub SauverLaFiche(ByVal ID As Long)
     
        On Error GoTo L_ErrSauverLaFiche
        If FicheCompletee Then
            DoCmd.RunCommand acCmdSaveRecord
        End If
     
        On Error GoTo 0
    L_ExSauverLaFiche:
        Exit Sub
     
    L_ErrSauverLaFiche:
        MsgBox Err.Description, 48, Err.Source
        Resume L_ExSauverLaFiche
    End Sub
     
    Private Function FicheCompletee() As Boolean
    'Renvoie True si la fiche est complète
        On Error GoTo L_ErrFicheCompletee
     
     
        FicheCompletee = True
        On Error GoTo 0
    L_ExFicheCompletee:
        Exit Function
     
    L_ErrFicheCompletee:
     
        FicheCompletee = False
        Resume L_ExFicheCompletee
    End Function
    Bon c'est très schématisé mais sur le fond, c'est une piste d'inspiration...

    Argy

  5. #5
    Membre du Club Avatar de Boxtell
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2016
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2016
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    Merci pour ta réponse.

    Je suis en train de travailler dessus cependant, ce n'est pas la première fois que je bute la dessus, qu'est ce que tu veux dire quand tu met Me.Identifiant dans ton code ? (C'est quelque chose que je doit remplacer par un nom de table et un nom de champ ?)

    Cordialement

  6. #6
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Me.Identifiant représente un champ permettant d'identifier l'enregistrement en cours de façon unique (en général, c'est une clé primaire de type NuméroAuto).

    Argy

  7. #7
    Membre du Club Avatar de Boxtell
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2016
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2016
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    OK !

    Donc si j'ai bien compris si ma table s'appelle OP et le champ identifiant l'enregistrement s'appelle OP_Num, je remplace Me.Identifiant par OP.OP_Num

    (OP_Num est la clef primaire de ma table, cependant c'est un Texte Court et non un NumAuto mais je ne pense pas que cela ai est un impact)

    Merci
    Cordialement

  8. #8
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Non, à ceci près que ton WHERE devra être « enquoté » si tu passes par une chaîne SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ...WHERE OP = '" & Me.OP &"' AND...
    ou s'il tu utilises le paramètre de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Function AlimenterTableListeOP(ByVal ID As String) As Boolean
    '[...]
    ...WHERE OP = '" & ID &"' AND...

    N.B. le type du paramètre ID doit être changé (String au lieu de Long).

    Argy

  9. #9
    Membre du Club Avatar de Boxtell
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2016
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2016
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    Désolé, je ne comprend pas bien comment je doit intégrer ce WHERE OP ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Function AlimenterTableListeOP(ByVal ID As String) As Boolean
    '[...]
     
    WHERE OP = '" & OP.OP_Num"' AND ...
     
        On Error GoTo L_ErrAlimenterTableListeOP
        'si tu n'a=s pas les valeurs présente ici tu passes par un recordset
     
      etc etc
    Je n'ai pas bien compris s'il faut remplacer le ID comme j'ai fait ni ce qu'il faudrait mettre après le AND ni si je l'ai intégré au bon endroit. Désolé mais c'est ce "WHERE" qui m'a perdu.

  10. #10
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Le principe est simple :
    soit tu pars du formualire sur validation par le quidam qui rempli auquel cas tu as les données du formulaire et donc tu peux utiliser le champ OP de l'objet Me.
    soit tu veux que ça se fasse par une autre procédure externe, qui tourne avec un Timer par exemple, auquel cas, tu es bien obligé de chercher les enregsitrement qui :
    1. ne sont pas déjà présents dans la table
    2. qui possèdent bien l'ID attendu
    3. qui ont la valeur "Effectué"


    => de ce fait tu doit créer une requête qui conditionne tous ces éléments, par exmple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSQL="SELECT * FROM TABLE_TRUC WHERE OP='" & ID & "' AND OP_Statut = 'Effectuée';"
    De ce SELECT, tu peux faire un INSERT avec les paramètres d'erreur idoines à considérer (dbFailOnError ou dbConsistent selon tes besoins - voir l'aide)

    J'ai le sentiment de viser un peu haut mais tu as demandé une certaine expertise ; je te la fournis, enfin j'espère...

    Dis moi...

    Argy

  11. #11
    Membre du Club Avatar de Boxtell
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2016
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2016
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    En potassant ta solution je me dis que je n'ai peut-être pas les compétences pour la mettre en place. J'ai essayé de repartir à 0 et de tourner le problème d'une autre manière.

    Pourrais-je créer une requête d'insertion de ce type :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO OP_Archivage (OP_Num, Article, OP_Qte_Initiale_Presse)
    VALUES (OP.OP_Num, OP.OP_Qte_Initiale_Presse, OP.Article_Num)
    FROM [OP]
    WHERE (((OP.OP_Statut)="Effectuées"));

    qui viendrait chercher les données "Effectuées" dans la table OP pour les insérer dans la table OP_Archivage.

    CEPENDANT ma requête ne veut pas prendre le FROM en compte... Comment mettre un FROM OP (Pour lui dire d'aller chercher les valeurs dans la table OP) dans une requête INSERT INTO ?

    (J'assignerais cette requête à un bouton et l'utilisateur ferait par exemple une fois par jour l'exportation des OP effectuées de la table OP vers la table OP_Archivage).

  12. #12
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    En fait, il y a plusieurs solutions...
    Si tu choisi un INSERT / SELECT, cela suppose que tu saches comment aller chercher les données directement dans les tables

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub InsereSQL()
    Dim strInsert As String
    Dim strSelect As String
     
     
        On Error GoTo L_ErrInsereSQL
     
        strInsert = "INSERT INTO TABLE_CIBLE (Champ1Num, Champ2Date, Champ3Text) "
        strSelect = "SELECT Champ1Num, Champ2Date, Champ3Text FROM TABLE_SOURCE WHERE ChampCondition = 'Valeur';"
        CurrentDb.Execute strInsert & strSelect, dbFailOnError
     
        On Error GoTo 0
    L_ExInsereSQL:
        Exit Sub
     
    L_ErrInsereSQL:
        MsgBox Err.Description, 48, Err.Source
        Resume L_ExInsereSQL
    End Sub
    sinon, tu peux aussi faire du INSERT /VALUES, depuis le formulaire cette fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    Sub InsereForm()
    Dim strInsert As String
    Dim strValues As String
     
     
        On Error GoTo L_ErrInsereSQL
     
        strInsert = "INSERT INTO TABLE_CIBLE (Champ1Num, Champ2Date, Champ3Text) "
        strValues = "VALUES (" & Me.Identifiant & ", #" & Format(Me.UneDate, "mm/dd/yyyy") & "#,'" & Me.Commentaires & "');"
        CurrentDb.Execute strInsert & strValues, dbFailOnError
     
        On Error GoTo 0
    L_ExInsereSQL:
        Exit Sub
     
    L_ErrInsereSQL:
        MsgBox Err.Description, 48, Err.Source
        Resume L_ExInsereSQL
    End Sub
    Essaye comme ça en live pour tester...

    Après, il y a encore la solution du RecordSet mais c'est un peu plus élaboré...

    Argy

  13. #13
    Membre du Club Avatar de Boxtell
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2016
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2016
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    J'ai donc créé la requête INSERT / SELECT suivante :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO OP_Archivage ( OP_Num, Article, OP_Qte)
    SELECT OP_Num, Article, OP_Qte
    FROM [OP]
    WHERE (((OP.OP_Statut)="Effectuées"));

    Elle répond à mon "nouveau" besoin.

    Merci pour l'aide !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 29/10/2014, 16h42
  2. [Vxi3] Requête Valeurs sans occurrences d'une table à l'autre
    Par DamienBC dans le forum Designer
    Réponses: 1
    Dernier message: 16/12/2013, 15h32
  3. [Toutes versions] Eclater une table en plusieurs en fonction d'un critère dans un champ
    Par Invité dans le forum Contribuez
    Réponses: 2
    Dernier message: 09/05/2011, 18h46
  4. Transférer des données d'une table à une autre
    Par picoloto dans le forum Langage SQL
    Réponses: 8
    Dernier message: 20/12/2005, 10h01
  5. TRansférer des données d'une table à l'autre
    Par kernel57 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 06/10/2005, 14h05

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