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 :

[Requête] Création de table


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut [Requête] Création de table
    Bonjour,

    J'ai une requête de création de table dont les champs sont les suivants :
    Volume, Poids, Coût, Fréquence.

    Je souhaite ajouter à cette table les champs nb_contenant_80, nb_contenant_120, nb_contenant_180, nb_contenant_240 et nb_contenant_340.

    Les valeurs des champs nb_contenant_x est soumise à conditions : je dois donc imbriquer des fonctions If...Then...Else dont les arguments sont Volume, Fréquence.

    Est-il possible de la faire directement depuis la requête initiale (donc en sql) ou faut-il passer par une procédure VB ?

    Dans les deux cas, comment faire ???

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 174
    Points : 178
    Points
    178
    Par défaut
    bonjour,
    je n'ai pas bien compris, tes champs nb_contenant_x, ils contiennent le résultat d'un calcul genre volume*fréquence ?

  3. #3
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut
    voila ce qui serait l'équivalent VB du calcul des nb_contenant_x :

    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
     
    Dim volume As Double
     
    If [volume papiers].Value = 0 Or [freq1].Value = 0 Then
    	[nb cont 80].Value = 0
    	[nb cont 120].Value = 0
    	[nb cont 180].Value = 0
    	[nb cont 240].Value = 0
    	[nb cont 340].Value = 0
    Elseif [volume papiers].Value / [freq1].Value / 52 <= 80 Then
    	[nb cont 80].value = 1
    Elseif [volume papiers].Value / [freq1].Value / 52 >= 81 And [volume papiers].Value / [freq1].Value / 52 <= 120 Then
    	[nb cont 120].Value = 1
    ElseIf [volume papiers].Value / [freq1].Value / 52 >= 121 And [volume papiers].Value / [freq1].Value / 52 <= 180 Then
    	[nb cont 180].Value = 1
    ElseIf [volume papiers].Value / [freq1].Value / 52 >= 181 And [volume papiers].Value / [freq1].Value / 52 <= 240 Then
    	[nb cont 240].Value = 1
    ElseIf [volume papiers].Value / [freq1].Value / 52 >= 241 And [volume papiers].Value / [freq1].Value / 52 <= 340 Then
    	[nb cont 340].Value = 1
    Else
    	[nb cont 340].Value = Int([volume papiers].value / freq1 / 52 / 340)
    	volume = [volume papiers].Value / freq1 / 52 - 340 * [nb cont 340].Value
     
    	If volume <= 80 Then
    		[nb cont 80].value = 1
    	Elseif volume >= 81 And volume <= 120 Then
    		[nb cont 120].Value = 1
    	ElseIf volume >= 121 And volume <= 180 Then
    		[nb cont 180].Value = 1
    	ElseIf volume >= 181 And volume <= 240 Then
    		[nb cont 240].Value = 1
    	Else 
    		[nb cont 340].Value = [nb cont 340] + 1
    Mon souci est de convertir ce code en sql pour l'insérer directement dans ma requête, ou si ce n'est pas possible, d'avoir la procédure afin de créer ma table depuis VB !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Va jeter un coup d'oeil au tuto sur DAO ici, tu devrais trouver ton bonheur à partir de et lit le reste.


    Starec

  5. #5
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut
    Merci, je vais consulter !

  6. #6
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut
    Alors voila, j'ai consulté, et j'ai essayé ceci qui ne fonctionne pas !

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    Private Sub Commande111_Click()
    On Error GoTo Err_Commande111_Click
     
    Dim stDocName As String
     
    stDocName = "M_synthèse"
    DoCmd.RunMacro stDocName
     
     
    Dim oDb As DAO.Database
    Dim oTbl As DAO.TableDef
    Dim oFld As DAO.Field
     
    Set oDb = CurrentDb
    Set oTbl = oDb.TableDefs("T_Synthèse")
     
    'Etape 1 : Créer le champ 1
    Set oFld = oTbl.CreateField("nb cont papiers 80", dbInteger)
    'Etape 2 : Définit les propriétés
    oFld.AllowZeroLength = False 'Chaine vide autorisée : oui
    oFld.Required = True         'Null interdit : non
    'Etape 3 : Ajout du champ à la table
    oTbl.Fields.Append Fld
     
    'Créer le champ 2
    Set oFld = oTbl.CreateField("nb cont papiers 120", dbInteger)
    oFld.AllowZeroLength = False 'Chaine vide autorisée : oui
    oFld.Required = True         'Null interdit : non
    oTbl.Fields.Append Fld
     
    'Créer le champ 3
    Set oFld = oTbl.CreateField("nb cont papiers 180", dbInteger)
    oFld.AllowZeroLength = False 'Chaine vide autorisée : oui
    oFld.Required = True         'Null interdit : non
    oTbl.Fields.Append Fld
     
    'Créer le champ 4
    Set oFld = oTbl.CreateField("nb cont papiers 240", dbInteger)
    oFld.AllowZeroLength = False 'Chaine vide autorisée : oui
    oFld.Required = True         'Null interdit : non
    oTbl.Fields.Append Fld
     
    'Créer le champ 5
    Set oFld = oTbl.CreateField("nb cont papiers 340", dbInteger)
    oFld.AllowZeroLength = False 'Chaine vide autorisée : oui
    oFld.Required = True         'Null interdit : non
    oTbl.Fields.Append Fld
     
    'Rafraichit la collection
    oTbl.Fields.Refresh
     
     
    Dim volume As Double
     
    If [volume papiers].Value = 0 Or [freq1].Value = 0 Then
        [nb cont papiers 80].Value = 0
        [nb cont papiers 120].Value = 0
        [nb cont papiers 180].Value = 0
        [nb cont papiers 240].Value = 0
        [nb cont papiers 340].Value = 0
    ElseIf [volume papiers].Value / [freq1].Value / 52 <= 80 Then
        [nb cont papiers 80].Value = 1
    ElseIf [volume papiers].Value / [freq1].Value / 52 >= 81 And [volume papiers].Value / [freq1].Value / 52 <= 120 Then
        [nb cont papiers 120].Value = 1
    ElseIf [volume papiers].Value / [freq1].Value / 52 >= 121 And [volume papiers].Value / [freq1].Value / 52 <= 180 Then
        [nb cont papiers 180].Value = 1
    ElseIf [volume papiers].Value / [freq1].Value / 52 >= 181 And [volume papiers].Value / [freq1].Value / 52 <= 240 Then
        [nb cont papiers 240].Value = 1
    ElseIf [volume papiers].Value / [freq1].Value / 52 >= 241 And [volume papiers].Value / [freq1].Value / 52 <= 340 Then
        [nb cont papiers 340].Value = 1
    Else
        [nb cont papiers 340].Value = Int([volume papiers].Value / freq1 / 52 / 340)
        volume = [volume papiers].Value / freq1 / 52 - 340 * [nb cont papiers 340].Value
        If volume <= 80 Then
            [nb cont papiers 80].Value = 1
        ElseIf volume >= 81 And volume <= 120 Then
            [nb cont papiers 120].Value = 1
        ElseIf volume >= 121 And volume <= 180 Then
            [nb cont papiers 180].Value = 1
        ElseIf volume >= 181 And volume <= 240 Then
            [nb cont papiers 240].Value = 1
        Else
            [nb cont papiers 340].Value = [nb cont papiers 340].Value + 1
        End If
    End If
     
     
    Exit_Commande111_Click:
        Exit Sub
     
    Err_Commande111_Click:
        Select Case err.Number
     'Si impossible de trouver l'élément dans la collection
     Case 3265
      'Si tbl=nothing alors tbl est la cause de l'erreur
      If tbl Is Nothing Then
        MsgBox "Impossible de trouver la table : " & strNomTable
      Else
        MsgBox "Impossible de trouver le champ : " & strAncienNomChamp
      End If
      Case 3010, 3191: MsgBox "Le champ " & strNouveauNomChamp & " existe déjà"
      Case Else: MsgBox "Une erreur inattendue est survenue"
    End Select
    MsgBox err.Description
        Resume Exit_Commande111_Click
     
    End Sub
    L'erreur retournée est "Une inattendue est survenue", et "Opération non valide".

    Remarque : la macro est exécutée correctement, donc l'erreur est après !


  7. #7
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut
    les remarques dans les codes ne sont pas les bonnes, il inverser le oui et le non à chaque fois...

  8. #8
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut
    Finalement j'ai bidouillé, et je me suis concocté un petit code qui à l'air de fonctionner.

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    Dim volume As Double
     
                 [nb cont papiers 80].Value = 0
    	[nb cont papiers 120].Value = 0
    	[nb cont papiers 180].Value = 0
    	[nb cont papiers 240].Value = 0
    	[nb cont papiers 340].Value = 0
     
    If [volume papiers].Value <> 0 And [freq1].Value <> 0 Then
                 If [volume papiers].Value / [freq1].Value / 52 <= 80 Then
    	              [nb cont papiers 80].value = 1
                 Elseif [volume papiers].Value / [freq1].Value / 52 >= 81 And [volume papiers].Value / [freq1].Value / 52 <= 120 Then
    	              [nb cont papiers 120].Value = 1
                 ElseIf [volume papiers].Value / [freq1].Value / 52 >= 121 And [volume papiers].Value / [freq1].Value / 52 <= 180 Then
    	              [nb cont papiers 180].Value = 1
                 ElseIf [volume papiers].Value / [freq1].Value / 52 >= 181 And [volume papiers].Value / [freq1].Value / 52 <= 240 Then
    	              [nb cont papiers 240].Value = 1
                 ElseIf [volume papiers].Value / [freq1].Value / 52 >= 241 And [volume papiers].Value / [freq1].Value / 52 <= 340 Then
    	              [nb cont papiers 340].Value = 1
                 Else
    	              [nb cont papiers 340].Value = Int([volume papiers].value / freq1 / 52 / 340)
    	              volume = [volume papiers].Value / freq1 / 52 - 340 * [nb cont papiers 340].Value
    	              If volume <= 80 Then
    		             [nb cont papiers 80].value = 1
    	              Elseif volume >= 81 And volume <= 120 Then
    		             [nb cont papiers 120].Value = 1
    	              ElseIf volume >= 121 And volume <= 180 Then
    		             [nb cont papiers 180].Value = 1
    	              ElseIf volume >= 181 And volume <= 240 Then
    		             [nb cont papiers 240].Value = 1
    	              Else 
    		             [nb cont papiers 340].Value = [nb cont papiers 340].Value + 1
    	              End If
    End If
     
    Dim rst As Recordset
     
    Set rst = CurrentDb.OpenRecordset("T_synthèse")
     
    If IsNull(DLookup("n°siret", "T_synthèse", "n°siret=""" & Me.n°SIRET & """")) Then
          rst.AddNew
          rst.Fields(0) = Me.n°SIRET
          rst.Fields(1) = Me.nom_entr
          rst.Fields(2) = Me.annee
          rst.Fields(3) = Me.Nb_cont_papiers_80
          rst.Fields(4) = Me.Nb_cont_Papiers_120
          rst.Fields(5) = Me.nb_cont_papiers_180
          rst.Fields(6) = Me.Nb_cont_Papiers_240
          rst.Fields(7) = Me.Nb_cont_Papiers_340
    Else   
          If IsNull(DLookup("annee", "T_synthèse", "annee=" & Me.annee)) Then
                rst.AddNew
                rst.Fields(0) = Me.n°SIRET
                rst.Fields(1) = Me.nom_entr
                rst.Fields(2) = Me.annee
                rst.Fields(3) = Me.Nb_cont_papiers_80
                rst.Fields(4) = Me.Nb_cont_Papiers_120
                rst.Fields(5) = Me.nb_cont_papiers_180
                rst.Fields(6) = Me.Nb_cont_Papiers_240
                rst.Fields(7) = Me.Nb_cont_Papiers_340
          Else
                rst.Delete
                rst.AddNew
                rst.Fields(0) = Me.n°SIRET
                rst.Fields(1) = Me.nom_entr
                rst.Fields(2) = Me.annee
                rst.Fields(3) = Me.Nb_cont_papiers_80
                rst.Fields(4) = Me.Nb_cont_Papiers_120
                rst.Fields(5) = Me.nb_cont_papiers_180
                rst.Fields(6) = Me.Nb_cont_Papiers_240
                rst.Fields(7) = Me.Nb_cont_Papiers_340
          End If
    End If
     
    rst.Update
    rst.Close
    Set rst = Nothing
    A la suite de quoi je crée une petite requete pour lier les tables qui vont bien et le tour est joué... enfin ça en a l'air !

    L'intérêt de la manoeuvre étant d'avoir accès aux valeurs Nb_cont_papiers_xx afin de les éditer au moyen d'un Etat !

  9. #9
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut
    En fait, ça ne marchait pas terrible !
    Mais ça, oui !

    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
    66
    67
    68
    69
     
    Dim rst As Recordset
    Dim rst2 As Recordset
    Dim strsql As String
    Dim volume As Double
     
    'efface la table T_synthèse
    DoCmd.SetWarnings False
    strsql = "Delete T_Synthèse.*"
    strsql = strsql + " From T_Synthèse;"
    DoCmd.RunSQL strsql
     
    'rempli la table T_synthèse
    Set rst = CurrentDb.OpenRecordset("T_Synthèse")
    Set rst2 = CurrentDb.OpenRecordset("T_Synthèse2")
     
     
    While Not rst2.EOF      'Pour chaque enregistrement de T_Synthèse2
     
        rst.AddNew          'Ajout d'un nouvel enregistrement dans T_Synthèse
     
        rst.Fields(0) = rst2.Fields(0)
        rst.Fields(1) = rst2.Fields(1)
        rst.Fields(2) = rst2.Fields(3)
     
        'Définition des nombres de contenant papier
        If rst2.Fields(4) <> 0 And rst2.Fields(31) <> 0 Then
            If rst2.Fields(4) / rst2.Fields(31) / 52 <= 80 Then
                rst.Fields(3) = 1
            ElseIf rst2.Fields(4) / rst2.Fields(31) / 52 >= 81 And rst2.Fields(4) / rst2.Fields(31) / 52 <= 120 Then
                rst.Fields(4) = 1
            ElseIf rst2.Fields(4) / rst2.Fields(31) / 52 >= 121 And rst2.Fields(4) / rst2.Fields(31) / 52 <= 180 Then
                rst.Fields(5) = 1
            ElseIf rst2.Fields(4) / rst2.Fields(31) / 52 >= 181 And rst2.Fields(4) / rst2.Fields(31) / 52 <= 240 Then
                rst.Fields(6) = 1
            ElseIf rst2.Fields(4) / rst2.Fields(31) / 52 >= 241 And rst2.Fields(4) / rst2.Fields(31) / 52 <= 340 Then
                rst.Fields(7) = 1
            Else
                rst.Fields(7) = Int(rst2.Fields(4) / rst2.Fields(31) / 52 / 340)
                volume = rst2.Fields(4) / rst2.Fields(31) / 52 - 340 * rst.Fields(7)
                If volume <= 80 Then
                    rst.Fields(3) = 1
                ElseIf volume >= 81 And volume <= 120 Then
                    rst.Fields(4) = 1
                ElseIf volume >= 121 And volume <= 180 Then
                    rst.Fields(5) = 1
                ElseIf volume >= 181 And volume <= 240 Then
                    rst.Fields(6) = 1
                Else
                    rst.Fields(7) = rst.Fields(7) + 1
                End If
            End If
        End If
     
        'Calcul des nombres totaux de contenant par type
        rst.Fields(43) = rst.Fields(3) + rst.Fields(8) + rst.Fields(13) + rst.Fields(18) + rst.Fields(23) + rst.Fields(28) + rst.Fields(33) + rst.Fields(38)
     
        'Mise à jour de l'enregistrement
        rst.Update
        'Passage à l'enregistrement suivant
        rst2.MoveNext
     
    Wend
     
    rst.Close
    rst2.Close
    Set rst = Nothing
    Set rst2 = Nothing
    DoCmd.SetWarnings True

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

Discussions similaires

  1. Définir le futur type de champ dans une requête création de table
    Par Fredo67 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 16/02/2007, 18h19
  2. Requête création de table
    Par Kiwix dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 07/02/2007, 14h27
  3. Requête création de table sur base mise en réseau
    Par boss dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/01/2007, 15h49
  4. Requête création de table et autonumber
    Par steps5ive dans le forum Access
    Réponses: 1
    Dernier message: 11/05/2006, 09h58
  5. Réponses: 9
    Dernier message: 17/11/2005, 14h58

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