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

IHM Discussion :

insérer un champ calculé dans la base, à partir d'un formulaire [AC-2003]


Sujet :

IHM

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 21
    Points
    21
    Par défaut insérer un champ calculé dans la base, à partir d'un formulaire
    Bonjour à tous

    J'ai un petit problème concernant un champ calculé, dans mes formulaires. Voila, j'ai un formulaire servant à saisir les enregistrements d'une table de ma base de données. Cette table contient un champ "Total". Le formulaire comprend un sous formulaire, possédant à chaque ligne un champ "SousTotal". Je voudrai que mon champ "Total" calcule la somme des "SousTotaux" et l'enregistre dans la base.

    Pour cela, dans le pied de page de mon sous formulaire, j'ai créé un champ TotalSF ayant pour formule "=somme(SousTotal)".
    J'ai ensuite, dans le champ Total de mon formulaire, inscrit "=SousForm.Formulaires!TotalSF" ("SousForm" représentant le nom de mon sous formulaire).

    Cela fonctionne, le champ "Total" calcule bien la somme demandée.

    Mais comment insérer celui-ci dans la base de données ?


    J'ai d'abord essayé un RecordSet avec un AddNew, puis une requête sql UPDATE avec un RunSQL, mais aucun n'a marché... (le premier me dit qu'il est impossible d'insérer un champ null dans une clé principale, le deuxième me parle d'incompatibilité de type)
    Une idée ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Points : 8 489
    Points
    8 489
    Par défaut
    et Bienvenu sur le forum

    Pourquoi stocker le total alors que tu peux le retrouver aisément par une requete ?
    Jeannot

    Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., Sources VBA

    Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Merci

    Hum.. Parce que je dois ensuite mettre ce champ Total dans un de mes états. Or, les SousTotaux ne seront (je crois) plus accessibles depuis cet endroit là.

  4. #4
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour.

    Jeannot m'a coupé l'herbe sous les pieds.

    D' après ce que j'ai compris en lisant le forum régulièrement, c'est qu'il faut éviter de mettre un champ calculé dans une table.

    Il faut faire autant d'enregistrement qu'il y aurait de ligne à ajouter, quitte en effet à passer par des sous formulaires.

    Pour un état, cela pose-t-il vraiment de souci? Avez vous essayé?

    Je sais que ce genre de questions est assez régulier. Fouillez dans le forum, vous trouverez votre bonheur.

    Pierre

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Non, c'est vrai que l'inclure dans la base n'est peut-être pas indispensable, mais comment faire, alors ?
    Lorsque je tape dans mon état "[Formulaires]![F_FormPrinc]![Total]", il me met le total du premier sous formulaire à chaque ligne :/

    Comment le différencier pour chaque enregistrement du sous formulaire ?

    Je n'ai pas encore trouvé de réponse avec la fonction recherche... =/

  6. #6
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    En cherchant vite fait, j'ai trouvé cela http://www.developpez.net/forums/d69...rmulaire+total

    Mais, je me demande s'il n'y a pas confusion, car vous posez la question à propos de formulaire, mais je crois comprendre que au final vous voulez faire un état.

    Peut-être faut-il commencer par nous expliquer le but final?

    Pierre

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Son problème n'est pas le même que le mien.

    Je n'ai pas confondu formulaire et état, j'ai juste mal formulé ma question ^^

    Mon but final est d'afficher tous les champs "Total" de ma table dans un état et d'en faire la somme.

    Total, qui est donc un champ de ma table (ou pas, puisque vous me le déconseillez ^^), et qui est chaque fois calculé dans mon formulaire, est lui même la somme de tous les "SousTotal" contenus dans mon sous formulaire.


    Pour l'afficher dans l'état, je pensais en faire un champ, dans ma base de données, mais visiblement ce n'est pas la bonne solution. Je pourrai donc faire le calcul directement dans l'état, comme je l'ai fait dans le formulaire, mais je n'y parviens pas.. En effet, au lieu de me calculer un Total différent pour chaque sous formulaire (mon sous formulaire change en fonction des données de son formulaire), il ne calcule que le premier, et l'affiche à chaque ligne de l'état.


    (J'en profite pour ajouter un deuxième problème : comment, ensuite, calculer la somme des "Total", toujours dans l'état ?
    J'ai essayé la formule "=Somme([Total])" dans le pied de page et le pied d'état, sans résultat (le premier indique une erreur, le deuxième n'affiche rien du tout) )


    C'est plus clair ?

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    En attendant de trouver une meilleure solution qui n'obligerait pas à entrer le total dans la base de données, je suis repartie sur cette idée (c'est celle sur laquelle j'avais le plus d'idées pour résoudre mon problème).

    J'ai essayé trois nouveaux codes différents :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
     
    Set db = CurrentDb()
    Set rst = db.OpenRecordset("T_Facture")
     
    rst.Edit
        rst("Total") = Total
    rst.Update
     
    rst.Close
    Set rst = Nothing
    Set db = Nothing
    Celui-ci est encore celui qui fonctionne le mieux. Le problème est qu'il ne met à jour qu'un seul enregistrement de ma table T_Facture, toujours le même, y compris si on passe à l'enregistrement suivant dans le formulaire.



    J'ai ensuite essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Dim sql As String
     
        sql = " UPDATE T_Facture "
        sql = sql + " SET T_Facture.Total = '*" & Me.Total & "*' WHERE "
        sql = sql + " T_Facture.NoFac = '*" & Me.NoFac & "*'"
     
        DoCmd.SetWarnings False
        DoCmd.RunSQL sql
        DoCmd.SetWarnings True
    Celui-ci n'a aucun effet. Aucune erreur, aucune mise à jour...



    Enfin, j'ai testé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Dim db As DAO.Database
        Dim rst As DAO.Recordset
     
        Set db = CurrentDb()
        Set rst = db.OpenRecordset("SELECT * FROM [T_Facture] WHERE [NoFAc] =" & Forms!F_Facture.NoFac)
     
        rst.Edit
            rst("Total") = Total
        rst.Update
     
        rst.Close
        Set rst = Nothing
        Set db = Nothing
    Lui me marque une erreur, uniquement quand je ferme le formulaire ou que je change d'enregistrement (je précise que tous ces codes sont dans "Total_LostFocus" (j'ai fait en sorte de mettre le focus sur le champ Total à chaque fois qu'il doit changer, pour l'actualiser)). Access me marque "type de données incompatible dans l'expression du critère" à la ligne du SELECT. Mes noms de champ sont corrects, les deux "NoFac" sont bien de même type...

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Problème résolu.


    Si jamais il y en a que ça intéressait, voila la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Dim db As DAO.Database
        Dim rst As DAO.Recordset
     
        Set db = CurrentDb()
        Set rst = db.OpenRecordset("SELECT * FROM [T_Facture] WHERE [NoFac] = '" & Forms!F_Facture.NoFac & "'")
     
        rst.Edit
            rst("Total") = Total
        rst.Update
     
        rst.Close
        Set rst = Nothing
        Set db = Nothing

    (Autrement dit il manquait des quotes autours de "NoFac".)
    Mon champ "Total" sera donc bien dans la base, mais men fous, ça marche =)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/12/2014, 20h32
  2. Réponses: 0
    Dernier message: 12/01/2014, 14h01
  3. [AC-2010] Champ calculé dans une table à partir d'une constante
    Par claire_arts dans le forum Modélisation
    Réponses: 4
    Dernier message: 12/05/2011, 17h37
  4. [A-02] Insérer un champ calculé dans un tableau croisé dynamique
    Par atoffoli75 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 23/11/2008, 08h55

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