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 :

[DAO]Incrémenter un champs à chaque fois qu'une valeur est rencontrée.


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut [DAO]Incrémenter un champs à chaque fois qu'une valeur est rencontrée.
    Bonjour,

    je cherche le moyen d'incrémenter un champs à chaque fois qu'une valeur est rencontrée plusieurs fois dans une table.

    J'ai une table de la structure suivante:

    clé | jour | date | code cadence de livraison
    1 Lundi 30/04/07 71
    1 Lundi 30/04/07 111
    1 Lundi 30/04/07 124
    1 Lundi 30/04/07 130
    1 Lundi 30/04/07 135
    1 Lundi 30/04/07 500
    3 Mercredi 02/05/07 113
    3 Mercredi 02/05/07 130
    3 Mercredi 02/05/07 135
    3 Mercredi 02/05/07 401
    3 Mercredi 02/05/07 500

    et dans cette table je voudrais rajouter un champs qui en face de chaque ligne indique le nombre de fois que le code cadence de livraison a été rencontré. C'est-à-dire:

    clé | jour | date | code cadence de livraison | Nouveau champs
    1 Lundi 30/04/07 71 1
    1 Lundi 30/04/07 111 1
    1 Lundi 30/04/07 124 1
    1 Lundi 30/04/07 130 1
    1 Lundi 30/04/07 135 1
    1 Lundi 30/04/07 500 1
    3 Mercredi 02/05/07 113 1
    3 Mercredi 02/05/07 130 2
    3 Mercredi 02/05/07 135 2
    3 Mercredi 02/05/07 401 1
    3 Mercredi 02/05/07 500 2


    Merci d'avance!!!! ;-)

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Points : 52
    Points
    52
    Par défaut
    Bonsoir,

    En alimentant un tableau de la taille de ton "code cadence de livraison" au fur et à mesure du parcours d'un recorset de ta table ?

    pour chaque enregistrement
    lire le "code cadence de livraison"
    incrémenter tableau(code cadence de livraison)
    UPDATE de l'enregistrement de la table correpondant avec tableau(code cadence de livraison)
    Next

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    merci de ton aide;
    mais le probleme est qu'il faut que je garde la valeur du nombre de fois que l'on a rencontré le code à chaque date. Car par la suite, suivant la date il faut que j'utilise le nombre pour faire mes calculs.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Points : 52
    Points
    52
    Par défaut
    Et bien cela devrait marcher comme tu l'entend puisque on UPDATE la table lors du remplissage du tableau.

    Si je reprend ton exemple :
    RAZ du tableau
    lecture enregistrement 1 => tableau(71)++ = 1 => update de lenregistrement avec tableau(71)=1
    lecture enregistrement 2 => tableau(111)++ = 1 => update de lenregistrement avec tableau(111)=1
    ....
    lecture enregistrement 4 => tableau(130)++ = 1 => update de lenregistrement avec tableau(130)=1
    ...
    lecture enregistrement 8 => tableau(130)++ = 2=> update de lenregistrement avec tableau(130)=2

    Il faut juste etre sur de parcourir la table dans le bon ordre.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Ok, j'ai compris ta démarche (je suis un petit débutant ;-)), et en effet tu as raison!!
    Maintenant je vais essayer de trouver la syntaxe correcte pour coder cette procédure. si tu as quelques pistes à me donner n'hésite pas ;-)

    @+

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Points : 52
    Points
    52
    Par défaut
    A prendre avec des pincettes, je ne maitrise pas assez bien pour écrire du code juste, sans tester au fur et à mesure.


    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
    'déclaration des variables
    Dim rst As Recordset
    Dim MonTableau(Code cadence de livraison maximum) as Integer
    Dim i as Integer
    
    'Raz du tableau (il y a peut etre une fonction pour remplir ou vider un tableau automatiquement mais je la connais pas)
    for i=1 to Code cadence de livraison maximum : MonTableau(i)=0 : next
    
    'Création et ouverture du recordset 
    Set rst = CurrentDb.OpenRecordSet ("SELECT * FROM MaTable")
    
    'Parcours du recordset
    rst.MoveFirst 
    While Not rst.Eof
        MonTableau(rst.field("code cadence de livraison").value)=MonTableau(rst.field("code cadence de livraison").value)+1
        Docmd.runsql "UPDATE code cadence livraison WHERE ..... ' je ne connais pas la clef de ta table
        rst.MoveNext
    Wend
    
    ' Fermeture du Recordset
    rst.Close
    Ne pas oublier de trier ton recordset dans le bon ordre si la clef primaire ne correpond pas au meme tri.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    re!!
    Merci pour ton code!!
    J'ai pu créer ma procédure mais maintenant j'ai une erreur et j'arrive pas à voir pourquoi.

    Je te donne le code de ma procédure:

    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
    Public Sub TableauPositionJour()
     
    Dim TableauPositionJour(500) As Integer
    Dim i As Integer
    Dim Bdd As Database
    Dim tbl As TableDef
    Dim chp As Field
    Dim rs As Recordset
    Dim ind As Index
    Dim mySQL As String
    Dim mySQL2 As String
    Dim obj As AccessObject
     
    Set Bdd = CurrentDb
    'Etudier chaque objet dans la collection AllTables.
    For Each obj In Application.CurrentData.AllTables
     
    'Si la table en cours s'appelle "T_POSITION_JOUR"
    If obj.Name = "T_POSITION_JOUR" Then
    'et si "T_POSITION_JOUR" est ouverte (chargée)...
    If obj.IsLoaded Then
    '...fermer "T_POSITION_JOUR"
    DoCmd.Close acTable, "T_POSITION_JOUR", acSaveNo
    End If
     
    ' Supprime la table "T_POSITION_JOUR" (qui est fermée)
    DoCmd.DeleteObject acTable, "T_POSITION_JOUR"
    End If
    Next obj
     
    Set tbl = Bdd.CreateTableDef("T_POSITION_JOUR")
    'Création de la structure de la table "T_POSITION_JOUR"
    With tbl
        .Fields.Append .CreateField("Clé", dbLong)
        .Fields.Append .CreateField("Date", dbDate)
        .Fields.Append .CreateField("Code", dbLong)
        .Fields.Append .CreateField("Position", dbLong)
     
    End With
     
    ' Création de la clé primaire de type autonumérique
    tbl.Fields("Clé").Attributes = dbAutoIncrField
    Bdd.TableDefs.Append tbl
    Set ind = tbl.CreateIndex("Clé")
    Set chp = ind.CreateField("Clé", dbLong)
    ind.Fields.Append chp
    ind.Primary = True
    'Ajout de l'index de recherche à la collection des Indexes
    tbl.Indexes.Append ind
    tbl.Indexes.Refresh
     
    ' On libère la place mémoire occupée par la structure
    Set tbl = Nothing
     
    'Insérer dans mySQL, par morceaux, une longue instruction SQL
    mySQL = "INSERT INTO T_POSITION_JOUR ( [Date], Code )"
    mySQL = mySQL + " SELECT R_JOURS_OUVRABLES_4_PERIODES.Date, T_CADENCE_DE_LIVRAISON.Cat___Code_cadence_de_livraison"
    mySQL = mySQL + " FROM R_JOURS_OUVRABLES_4_PERIODES INNER JOIN (T_JOUR INNER JOIN T_CADENCE_DE_LIVRAISON ON"
    mySQL = mySQL + " T_JOUR.N° = T_CADENCE_DE_LIVRAISON.N°_jour)"
    mySQL = mySQL + " ON (T_CADENCE_DE_LIVRAISON.Numéro_de_semaine_periode = R_JOURS_OUVRABLES_4_PERIODES.[N° semaine])"
    mySQL = mySQL + " AND (R_JOURS_OUVRABLES_4_PERIODES.Jour = T_JOUR.Jour)"
    mySQL = mySQL + " ORDER BY R_JOURS_OUVRABLES_4_PERIODES.Date, T_CADENCE_DE_LIVRAISON.Cat___Code_cadence_de_livraison"
     
    'Désactiver les avertissements et ajouter les enregistrements comme spécifié dans l'instruction SQL
    DoCmd.SetWarnings False
    DoCmd.RunSQL mySQL
    DoCmd.SetWarnings True
     
     
    'Calcul des positions
     
    'Raz du tableau "TableauPositionJour"
    For i = 1 To 500: TableauPositionJour(i) = 0: Next
     
    'Création et ouverture du RecordSet
    Set rs = CurrentDb.OpenRecordset("SELECT T_POSITION_JOUR.* FROM T_POSITION_JOUR ORDER BY T_POSITION_JOUR.Date, T_POSITION_JOUR.Code")
     
    'Parcours du RecordSet
    rs.MoveFirst
     
    While Not rs.EOF
     
        TableauPositionJour(rs.Fields("Code").Value) = TableauPositionJour(rs.Fields("Code").Value) + 1
     
        mySQL2 = "UPDATE T_POSITION_JOUR SET T_POSITION_JOUR.[Position] = [" + TableauPositionJour(rs.Fields("Code").Value) + _
        "] WHERE (T_POSITION_JOUR.[Clé] = [" + rs.Fields("Clé").Value + "])"
     
        DoCmd.RunSQL mySQL2
     
        rs.MoveNext
     
    Wend
     
    'Fermeture du RecordSet
    rs.Close
     
    End Sub

    Et le problème vient de ma requête de mise à jour.
    Quand J'essai d'éxécuter ma procédure, j'ai une erreur qui me dit :
    "Incompatibilité de type"!
    Voici la requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        mySQL2 = "UPDATE T_POSITION_JOUR SET T_POSITION_JOUR.[Position] = [" + TableauPositionJour(rs.Fields("Code").Value) + _
        "] WHERE (T_POSITION_JOUR.[Clé] = [" + rs.Fields("Clé").Value + "])"
    Pour info, toutes les déclarations de la tables sont au début de la procédure.
    Et je n'arrive pas à comprendre d'où vient l'incompatibilité.

    Merci d'avance!!

  8. #8
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    pour infos : pour effacer un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Erase TableauPositionJour()

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci pour la solution pour alléger le codage!! Mais est-ce que tu vois d'où peut venir l'incompatibilité. Quand je passe la souris sur la variable mySQL2, il me dit qu'elle contient rien (mySQL2 = "") alors que ça devrait m'afficher ma requête.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Points : 52
    Points
    52
    Par défaut
    je pense que ca viens de la difference de type entre ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim TableauPositionJour(500) As Integer
    et ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fields.Append .CreateField("Position", dbLong)
    puis que tu essaie de faire ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE T_POSITION_JOUR SET T_POSITION_JOUR.[Position] = [" + TableauPositionJour(rs.Fields("Code").Value) + "]

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta piste de recherche de solution. Le problème venait bien d'une incompatibilité. Comme la variable qui contenait la requête était de type String, il faut par conséquent que les variables utilisées dans la requête soient également de type String.

    Voilà encore merci pour l'aide que tu m'as apporté!!!! Ciao

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

Discussions similaires

  1. [AC-2007] Incrémenter un champs à chaque changement de Nom
    Par Brasileiro dans le forum Access
    Réponses: 13
    Dernier message: 03/09/2012, 19h09
  2. recevoir un mail à chaque fois qu'une personne entre dans mon site avec son login
    Par soleilgym64 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 11
    Dernier message: 14/08/2012, 10h45
  3. Réponses: 2
    Dernier message: 26/06/2011, 17h04
  4. Réponses: 7
    Dernier message: 28/01/2010, 14h44
  5. Réponses: 6
    Dernier message: 03/07/2009, 09h32

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