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

VB.NET Discussion :

Mettre à jour une collection (sorteddictionary)


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2008
    Messages : 23
    Points : 19
    Points
    19
    Par défaut Mettre à jour une collection (sorteddictionary)
    Bonjour,

    Voici mon problème :

    Je dois mettre à jour chaque élément d'une collection (en fait un sorteddictionary) en fonction d'un savant calcul.

    L'élément value de mon sorted dictionary est formé de la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Friend Structure Donnees
        dim YearWeek as string    'Clé
        dim StkIni as long
        dim QteDispo as long
        dim BesoinBrut as long
        dim StkMin as long
        dim StkMax as long
        dim BesoinNet as long
    End Structure
    Cette collection représente les données d'un article pour une plage de semaines (d'ou la clé YearWeek) allant de S1 à SZ

    La formule de calcul de BesoinNet est la suivante (pour la semaine SN courante)
    Calculer volume = StkMin(SN) - (StkIni (S1) + SOMME(QteDispo(de S1 à SZ))) + SOMME(BesoinBrut (de S1 à SN))

    Si volume > 0
    BesoinNet = volume - SOMME(BesoinNet(de S1 à SN-1))
    Sinon
    BesoinNet = 0
    Fsi
    Dans un premier temps, j'alimente mon sorteddictionary en créant les enregistrements dedans pour la plage de semaine.

    Après avoir inseré la dernière semaine, j'appelle la sub calcul suivante :
    Initialiser les variables locale

    Parcourir la collection pour calculer SOMME(QteDispo)

    Mémoriser les informations concernant S1

    Pour tout les enregistrements de la collection
    Calculer SommeBesoinBrut = SommeBesoinBrut + BesoinBrut(SN)

    Calculer Volume = StkMin(SN) - (StkIni(S1) + SOMME(QteDispo)) + SommeBesoinBrut

    Si Volume > 0
    BesoinNet(SN) = Volume - TotBesNet
    Sinon
    BesoinNet(SN) = 0
    Fsi

    TotBesNet = TotBesNet + BesoinNet(SN)

    FPour
    Ce que j'ai traduit par le code suivant :
    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
     
        Public Sub calcul()
     
            Dim Volume As Long
            Dim Sem1 As Boolean = True
            Dim RecSem1 As RecordDonnesCalcul
            Dim TotQteDispo As Long = 0
            Dim TotBesBrut As Long = 0
            Dim TotBesNet As Long = 0
     
            For Each RecSem As RecordDonnesCalcul In Values
                TotQteDispo += RecSem.QteDispo
            Next
     
            For Each RecSem As RecordDonnesCalcul In Values
                If (Sem1) Then
                    RecSem1 = RecSem
                    Sem1 = False
                End If
     
                TotBesBrut += RecSem.BesoinBrut
     
                Volume = RecSem.Stockmin - (RecSem1.StockInitial + TotQteDispo) + TotBesBrut
     
                If (Volume > 0) Then
                    RecSem.BesoinNet = Volume - TotBesNet
                Else
                    RecSem.BesoinNet = 0
                End If
     
                TotBesNet += RecSem.BesoinNet
     
            Next
     
        End Sub
    Les calculs se font bien (j'ai vérifié sous débug) par contre, la collection n'est pas mise à jour (lorsque je veux récupérer les information d'une semaine, BesoinNet est toujours à zéro).

    Je soupçonne que "RecSem" n'est pas un pointeur sur la "Value" courante mais une copie de celle-ci.

    Ma question est la suivante :
    Comment parcourir une collection en récupérant un pointeur vers l'élément "Value" courant.

    Merci de votre aide.

    Joël

  2. #2
    Expert confirmé Avatar de Lapinpanda
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    3 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 230
    Points : 4 913
    Points
    4 913
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maCollection.ContainsValue(of int32, maValue)
    peux être?
    Merci d'utiliser en cas de résolution de votre problème

    N'oubliez pas non plus le petit pouce vert pour récompenser celui que vous a aidé

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2008
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Merci LapinPanda,

    2 problèmes dans ta solution :

    1. C'est une collection particulière puisque SortedDictionary
    2. L'élément Valeur n'est pas de type entier, mais est une structure (ça je devrais être capable de translater)


    Mais ta réponse m'a ouvert une solution possible. Si elle fonctionne, je l'ajoute en fermant le topic.

    Joël

  4. #4
    Expert confirmé Avatar de Lapinpanda
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2009
    Messages
    3 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 230
    Points : 4 913
    Points
    4 913
    Par défaut
    j'ai mis "of int32" pour l'exemple, on peut très bien choisir un autre type, bonne chance
    Merci d'utiliser en cas de résolution de votre problème

    N'oubliez pas non plus le petit pouce vert pour récompenser celui que vous a aidé

  5. #5
    Membre confirmé Avatar de Redouane
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    435
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 435
    Points : 569
    Points
    569
    Par défaut
    Bonjour,
    Tu peux travailler avec la méthode GetEnumerateur() pusique SortedDictionnary implemente de l'interface IEnumerator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim enumerator As IEnumerator = TonDictionnaire.Values.GetEnumerator()
    While (enumerator.MoveNext())
       Response.Write("<br>" + enumerator.Current.ToString())
    End While
    l'interface IEnumerator fournit la propriété Current qui renvoie la valeur courante de l'itération, et les méthodes MoveNext, qui permet d’avancer de un dans l’itération et qui retourne false si l’on a atteint la fin de la collection, et Reset, qui permet de recommencer l’itération du début.

    NB : Tu peux récupérer avec, les clés aussi "TonDictionnaire.Values.GetEnumerator()"
    et même récupérer les deux "TonDictionnaire.GetEnumerator()"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Redouane me = new Redouane();
    if (me.Connect())
        me.ShareInformations();

  6. #6
    Membre confirmé Avatar de Redouane
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    435
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 435
    Points : 569
    Points
    569
    Par défaut
    En fait : IEnumerable est une interface permettant de déployer un énumérateur sur une collection.
    Cet énumérateur est un tableau qui ne peut être parcouru que dans un seul sens.
    Sa seule méthode GetEnumerator retourne un énumérateur de type IEnumerator que nous pourrons utiliser avec une boucle while comme dans le précédant exemple

    Toutefois, toute collection implémentant IEnumerable pourra être parcourue de manière plus aisée et plus optimisée grâce à une boucle foreach.
    Son avantage par rapport aux autres boucles traditionnelles est qu’il va nous permettre de définir le type des objets que nous voulons sortir de la collection.
    Si nous maitrisons le contenu de notre collection, nous pourrons ainsi éviter un cast inutile quand nous extrayons les valeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Redouane me = new Redouane();
    if (me.Connect())
        me.ShareInformations();

  7. #7
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Donnees est une structure (type valeur), tu récupères donc une copie comme tu l'as compris. Si à la place tu déclares une classe (type référence) ça devrait aller beaucoup mieux. Attention avec les types valeur et les types référence
    Pas de questions techniques par MP

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2008
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Comme je le précisais hier, j'ai trouvé une autre solution qui fonctionne et que je vous soumet ici.

    Je pars du postulat que je connais la liste des semaines donc des clés, stockée, elle aussi, dans un SortedDictionary.

    Je vais utiliser la propriété Item(clé) pour mettre à jour les données
    Ci-dessous, la modification de la dernière boucle "FOR EACH"

    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
     
            For Each Semaine As String In pSemaines.Values
     
                If (TryGetValue(Semaine, RecSem)) Then
     
                    If (Sem1) Then
                        RecSem1 = RecSem
                    End If
     
                    TotBesBrut += RecSem.BesoinBrut
     
                    Volume = RecSem.Stockmin - (RecSem1.StockInitial + TotDispoLot) + TotBesBrut
     
                    If (Volume > 0) Then
                        RecSem.BesoinNet = Volume - TotBesNet
                    Else
                        RecSem.BesoinNet = 0
                    End If
     
                    Me.Item(RecSem.YearWeek) = RecSem
     
                    If (Sem1) Then
                        RecSem1.BesoinNet = RecSem.BesoinNet
                        Sem1 = False
                    End If
     
                    TotBesNet += RecSem.BesoinNet
                End If
            Next
    Un grand merci à tous pour vos précisions, bout de code, etc... que je note précieusement pour un usage futur.

    Cordialement,
    Joël

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

Discussions similaires

  1. Mettre à jour une collection d'objets
    Par root76 dans le forum Hibernate
    Réponses: 10
    Dernier message: 19/12/2008, 15h28
  2. Prb mettre à jour une table via un fichier excel
    Par antier dans le forum Access
    Réponses: 3
    Dernier message: 02/12/2005, 10h31
  3. Mettre à jour une base sous SQL SERVER 2000
    Par FilipeVV dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 11/02/2005, 12h24
  4. Comment mettre à jour une ligne sans doublon via déclencheur
    Par fuelcontact dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/08/2004, 15h56
  5. Mettre à jour une table depuis une autre
    Par rsc dans le forum SQL
    Réponses: 4
    Dernier message: 09/07/2004, 10h08

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