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 les données d'un formulaire dans la base de données sur une période precise [AC-2016]


Sujet :

IHM

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 75
    Points
    75
    Par défaut insérer les données d'un formulaire dans la base de données sur une période precise
    Bonjour et bonne fête de Pâques à vous tous,

    j' aimerais insérer les données d'un formulaire dans la base de données Access sur une période precise sans utiliser de boucle. car la boucle ralentit énormément l'affichage des données dans un formulaire.
    Avant d'insérer les données dans la base de données,j' aimerais vérifier que la somme de la valeur actuelle du formulaire et celle contenu déja contenue dans la base pour un marque de véhicule par jour est inférieure ou érgale à 20.

    voici le formulaire pour saisie de données

    Marque:

    Opel
    Période debut: 01.04.2019
    Période fin: 16.04.2019
    Valeur: 7




    Les données doivent être stocker sous cette forme dans la base de données

    Marque Période Valeur
    Opel 01.04.2019 7
    Opel 02.04.2019 7
    Opel 03.04.2019 7
    Opel 01.04.2019 7
    Opel 04.04.2019 7
    Opel 05.04.2019 7
    Opel 06.04.2019 7
    Opel 07.04.2019 7
    Opel 08.04.2019 7
    Opel 09.04.2019 7
    Opel 10.04.2019 7
    Opel 11.04.2019 7
    Opel 12.04.2019 7
    Opel 13.04.2019 7
    Opel 14.04.2019 7
    Opel 15.04.2019 7
    Opel 16.04.2019 7



    Merci beaucoup et surtout d'avance pour votre futur aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    bonjour,

    une solution via requête pour insérer les lignes dans la table :
    1) Créer une table nommée 'tNombre' avec une colonne numérique entier nommée 'n' et déclarée comme clef primaire
    2) ajouter 31 lignes dans la table avec les nombres de 1 à 31
    Cette table va permettre de générer les dates de la période à insérer dans la table tMarquePeriodeValeur (avec colonne 'Marque' en format texte court, 'Période' en date/heure et 'valeur en numérique entier.

    la requete paramétrée d'insertion des lignes sur une période :
    Code SQL : 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
     
    PARAMETERS _marque TEXT ( 255 ), _debperiode DATETIME, _finperiode DATETIME, _valeur LONG;
     
    INSERT INTO tmarqueperiodevaleur
                (marque,
                 période,
                 valeur)
    SELECT [_marque]                                                             AS M,
           Dateserial(Year([_debperiode]) + [annee.n] - 1, [mois.n], [jour].[n]) AS D,
           [_valeur]                                                             AS V
    FROM   tnombre AS Annee,
           tnombre AS Mois,
           tnombre AS jour
    GROUP  BY [_marque],
              Dateserial(Year([_debperiode]) + [annee.n] - 1, [mois.n], [jour].[n]),
              [_valeur]
    HAVING Dateserial(Year([_debperiode]) + [annee.n] - 1, [mois.n], [jour].[n]) BETWEEN [_debperiode] AND [_finperiode]


    avec tout ça l'essentiel est fait, il suffi d'ajouter un peu de cosmétique en VBA :
    1) vérifier que la valeur dans formulaire <= 20 et pareil dans table sur la période pour la marque
    2) supprimer lignes existantes dans la table pour la marque et periode
    3) insérer les lignes grace à la requete d'insertion paramétrée



  3. #3
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 75
    Points
    75
    Par défaut
    Merci déjà pour la requête. C est un truc dans ce genre que je voulais.
    j'ai deux autres difficultés:

    1. le champ valeur n'est pas seulement numérique. il peut aussi être V pour vendu ou R pour revision.
    en un jour donnée on ne doit pas avoir un mélange chiffre et lettre ou bien V et R. l'exemple1, l'exemple2
    et l'exemple 3(somme par jour supériuer à 20) ne sont pas permis par contre l'exemple 4 ( somme par jour est inférieure à 20 ), l'exemple 5, l'exemple 6 sont permis.


    exemple1:
    Marque
    Opel
    Opel
    Période
    01.04.2019
    01.04.2019
    Valeur
    V
    7

    exemple2:
    Marque
    Opel
    Opel
    Période
    01.04.2019
    01.04.2019
    Valeur
    V
    R



    exemple3:
    Marque
    Opel
    Opel
    Période
    01.04.2019
    01.04.2019
    Valeur
    10
    11

    exemple4:
    Marque
    Opel
    Opel
    Période
    01.04.2019
    01.04.2019
    Valeur
    10
    7


    exemple5:
    Marque
    Opel
    Opel
    Période
    01.04.2019
    01.04.2019
    Valeur
    V

    exemple6:
    Marque
    Opel
    Opel
    Période
    01.04.2019
    01.04.2019
    Valeur
    R



    2. vérifier que la valeur dans formulaire <= 20 et pareil dans table sur la période pour la marque
    j 'arrive pas. Est ce que vous pouvez m'aider?

    Merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    la conception de la table est très mal faite car valeur peut contenir du texte des nombre,...

    bref, deux autres questions :
    1) si un jour de la période définie dans le formulaire n'est pas acceptable selon les critères du post précédent que fait-on ? On insert une ligne dans la table pour les jours OK ou rien pour l'ensemble de la période ?
    2) Y'a t'il un nombre maxi de ligne par marque et date dans la table car dans le post précédent je vois que 2 lignes par date/marque ?

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 75
    Points
    75
    Par défaut
    Bonjour,


    1) si un jour de la période définie dans le formulaire n'est pas acceptable selon les critères du post précédent que fait-on ? On insert une ligne dans la table pour les jours OK ou rien pour l'ensemble de la période ?

    On insere une ligne dans la table pour les jours OK et un message d'erreur pour dire que tous les données ne sont pas inserées

    2) Y'a t'il un nombre maxi de ligne par marque et date dans la table car dans le post précédent je vois que 2 lignes par date/marque ?

    non il n'y en a pas. Le post précédent était juste un exemple

    Merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    il faut enregistrer la requête paramétrée d'insertion ci-dessous et la nommer <rInsertMarquePeriodeValeur>
    Remarques :
    1) Dans la requete, j'ai considéré que la table s'appelle <tmarqueperiodevaleur>, si ce n'est pas le cas, changer le nom de la table dans la requete ci-dessous (2 fois en rouge)
    2) Dans la requete, j'ai considéré que le nom des colonnes de la table sont <marque>, <période> et <valeur>, si ce n'est pas le cas le changer dans la requete (voir couleurs)
    3) Il faut créer la table tNombre décrite précédemment
    4) Créer un évènement sur le bouton de validation des saisies dans le formulaire et appeler la fonction AjoutMPV avec les paramètres saisies par l'utilisateur, voir code de la fonction ci-dessous

    Code SQL : 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
    PARAMETERS lamarque TEXT (255), debperiode DATETIME, finperiode DATETIME, lavaleur TEXT (255);
    
    INSERT INTO tmarqueperiodevaleur
                (marque,
                 période,
                 valeur)
    SELECT [lamarque]                                                         AS M,
           Dateserial(Year([debperiode]) + [annee.n] - 1, [mois.n], [jour.n]) AS d,
           [lavaleur]                                                         AS v
    FROM   tnombre AS Annee,
           tnombre AS Mois,
           tnombre AS jour
    GROUP  BY [lamarque],
              [lavaleur],
              Dateserial(Year([debperiode]) + [annee.n] - 1, [mois.n], [jour].[n])
    HAVING Dateserial(Year([debperiode]) + [annee.n] - 1, [mois.n], [jour.n])
           BETWEEN
                  [debperiode] AND [finperiode]
           AND Dateserial(Year([debperiode]) + [annee.n] - 1, [mois.n], [jour.n])
               NOT IN (
               SELECT T.période
               FROM
                   tmarqueperiodevaleur AS T
               WHERE
                   T.marque = [lamarque]
                   AND T.période BETWEEN [debperiode] AND [finperiode]
               GROUP
                   BY T.période
                   HAVING SUM(Val([valeur] & "")) + Val([lavaleur]) > 20
                           OR ( SUM([valeur] = "v") + ( [lavaleur] = "v" ) <> 0
                                AND SUM([valeur] = "r") + ( [lavaleur] = "r" ) <> 0
                              )
                           OR Abs(SUM([valeur]="v")) + Abs([lavaleur]="v") > 1
                           OR Abs(SUM([valeur]="r")) + Abs([lavaleur]="r") > 1
                           OR ( SUM(Val([valeur] & "")) + Val([lavaleur]) <> 0
                                AND ( SUM([valeur] = "v") + ([lavaleur] = "v") <> 0
                                      OR SUM([valeur] = "r") + ([lavaleur] = "r") <> 0)
                              )
                  )

    la fonction a coller dans le module de code du formulaire ou dans un module de code de l'application :
    Code VBA : 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
     
    Public Function AjoutMPV(ByVal Marque As Variant, ByVal DebPeriode As Variant, ByVal FinPeriode As Variant, ByVal Valeur As Variant) As Boolean
        On Error GoTo catch
        Dim oDb As DAO.Database, oQd As DAO.QueryDef, sMsg As String, n As Long
        If IsDate(DebPeriode) And IsDate(FinPeriode) And Nz(DebPeriode) <= Nz(FinPeriode) And _
           Nz(Marque) <> "" And Nz(Valeur) <> "" Then
     
            DebPeriode = DateValue(DebPeriode): FinPeriode = DateValue(FinPeriode)
     
            Set oDb = CurrentDb: Set oQd = oDb.QueryDefs("rInsertMarquePeriodeValeur")
            With oQd.Parameters
                !LaMarque = Marque: !DebPeriode = DebPeriode: !FinPeriode = FinPeriode: !LaValeur = Valeur
            End With
            oQd.Execute dbFailOnError
            n = oQd.RecordsAffected
     
            If n = 0 Then
                sMsg = "Aucune insertion sur la période..."
            ElseIf n < FinPeriode - DebPeriode + 1 Then
                n = FinPeriode - DebPeriode + 1 - n
                sMsg = "Valeur non insérée pour " & n & " date(s)..."
            Else
                sMsg = "Ajout effectué sur toute la période."
            End If
        Else
            sMsg = "Marque, période ou valeur non conforme(s)..."
        End If
        MsgBox sMsg, vbInformation
    fin:
        Set oDb = Nothing: Set oQd = Nothing
        Exit Function
    catch:
        MsgBox "Une erreur s'est produite..." & vbCrLf & "Err n°" & Err.Number & " - Description : " & Err.Description, vbExclamation, "AjoutMPV()"
        Resume fin
    End Function

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 75
    Points
    75
    Par défaut
    Merci beaucoup.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/04/2019, 14h29
  2. Excel/Vba insérer les données d'une feuille excel dans le corps d'un email
    Par shakapouet dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/10/2011, 12h02
  3. [MySQL] comment insérer les informations d'un formulaire dans une table
    Par eljed dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 03/05/2011, 12h01
  4. Réponses: 1
    Dernier message: 03/10/2009, 13h52
  5. Réponses: 2
    Dernier message: 20/10/2007, 02h24

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