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

Windows Forms Discussion :

[VB.NET]Méthodes sur un Dataview ?


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut [VB.NET]Méthodes sur un Dataview ?
    Bonjour à tous


    J’aimerais savoir si quelqu’un connaît un moyen d’appliquer en VB.NET une méthode sur un dataView (ou toute autre technique qui permettra d’appliquer des calculs sur chaque ligne d’une table autrement bien sûr qu’en l’incluant dans le code SQL)

    Si j’ai une table nommée AccessTBL qui contient
    ChampUn
    12
    15
    23
    Ce n’est donc PAS une instruction du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select ChampUn * 3 as myChampCalculé from AccessTBL
    que je cherche MAIS ce qui en Access peut se résoudre comme suit :

    Mettre dans un module la fonction suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function TripleMaValeur(myVal As Long) as Long
        TripleMaValeur = myVal * 3
    End Function

    et puis écrire la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT AccessTBL.ChampUn, TripleMaValeur([champun]) AS myChampCalculé
    FROM AccessTBL;

    Qui donnera le résultat

    12........36
    15........45
    23........69

    Ceci est terriblement puissant puisque ça permet de mélanger la puissance du SQL avec des tests et calculs très complexes. Y a –t’il un équivalent, ais-je été clair ?

    Avant de lire vos nombreuses remarques, faut-il mettre en Code et citation du code qui n'est pas VB, comme dans ce cas ci du code Access ?

    édité par neguib pour les balises |code| et |quote|

  2. #2
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    un truc comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim MaTable As New DataTable
    Me.OleDbDataAdapter1.Fill(MaTable)
    MaTable.Columns.Add("Calcul", System.Type.GetType("System.Decimal"), "[ChampUn] * 3")
    Me.DataGrid1.DataSource = MaTable

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Oui, je suppose.

    C'est sans doute de devoir travailler au niveau de la table qui créait un "blocage" dans le sens ou pour moi, une donnée calculée ne devrait pas être mise au niveau de la table mais plutôt au niveau d'une vue (mais ça j'ai lu que ce n'est pas possible).

    Merci pour ton aide

  4. #4
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par Golzinne
    Oui, je suppose.
    C'est sans doute de devoir travailler au niveau de la table qui créait un "blocage" dans le sens ou pour moi, une donnée calculée ne devrait pas être mise au niveau de la table mais plutôt au niveau d'une vue (mais ça j'ai lu que ce n'est pas possible).
    Merci pour ton aide
    L'erreur que tu commet dans ton raisonnement vient du fait que tu utilise le mot 'table', ceci est le terme approprié côté BDD, mais côté appli ce sont des resultat de requêtes donc en quelque sorte une DataTable est déjà une vue, rien n'empêche de déjà travailler directement avec des DataTable comme source de données d'un DataGrid, le DataView n'est qu'un objet fonctionnel supplementaire du design
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Merci pour cette précision, tu as bien détecté l'origine du problème(ou plutôt de la confusion).

  6. #6
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    alors
    Bouton en bas à gauche
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Trop beau pour être vrai...

    Bidou à écrit
    MaTable.Columns.Add("Calcul", System.Type.GetType("System.Decimal"), "[ChampUn] * 3")
    C'est presque ça mais si j'ai la classe suivante, je voudrais qu'elle puisse, à chaque ligne de ma dataTable me recalculer "ValeurTriplee "

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        Public Class TrippleMonChamp
            Public ValeurTriplee As Integer
            Sub New(ByVal MyValeur as integer)
                'Calcul complexe
                ValeurTriplee = 3 * MyValeur
            End Sub
     
        End Class
    avec une instruction du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ComTBL.Columns.Add("MyClasse", System.Type.GetType("System.Decimal"), New TrippleMonChamp(ComTBL.columns(0).ValeurTriplee))
    c'est évidemment le New TrippleMonChamp(ComTBL.columns(0).ValeurTriplee)) qui est peut-être une utopie, mais en fait je voudrais pour chaque ligne de ma dataTable instancier ma classe TrippleMonChamp sur base de ComTBL.columns(0) qui représente ChampUn et retourner la ValeurTriplée.

  8. #8
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Il est pas utopique, il est surtout inutile
    Quel intérêt de passer par l'instanciation d'un objet qui va juste multiplier la valeur connue dans un champs pour le reexposer au travers d'un champs
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Neguib a écrit
    Il est pas utopique, il est surtout inutile
    Avant de dire que c’est inutile, il faut évidemment savoir le genre de calcul qu’il y a à faire derrière. Mon exemple ne servait évidemment qu’à explicité le besoin. Mais imagines un instant qu’il faille, plutôt qu’une multiplication par trois, effectuer un calcul sur base d’autres tables, qu’en fonction que l’une ou plusieurs conditions soient ou ne soient pas rencontrées, le calcule diffère et doive encore aller chercher des données dans encore d’autres tables….

    Bref, je suis en train de convertir une application relativement complexe d’Access vers Dot.NET et je demande, si tu relis le message original, si, comme c’est le cas en access, c'est possible d’utiliser une « fonction définie par l’utilisateur» sur chaque ligne d’une requête ?

    Maîtrisant le SQL, je peux t’assurer, qu’ il me parait difficile, voire impossible, de le réaliser par requête même successives. De plus, je suis relativement "bloqué" quant à la modification de la structure de la base de donnée originale et ce pour maintenir la compatibilité avec d'autres structures existantes.

    Je reconnais que je ne suis peut-être pas au top au niveau du vocabulaire, classe méthode,…. Mais j’espérais que par mon exemple j’aurais été compris.

  10. #10
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Pas de souci cette fois j'ai pigé, j'ai juste pas le temps ce soir de poursuivre la discussion. Je m'y remet demain promis
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Merci, je suis impatient ...

    J'ai remarqué ta très grande implication dans ce site et je trouve ça formidable de partager ses connaissances avec d'autres.

  12. #12
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Salut Golzinne
    Comme promis j'ai passé un peu de temps ce matin à décortiquer la problématique. L'indice initial étant celui-ci:
    Citation Envoyé par Golzinne
    Mais imagines un instant qu’il faille, plutôt qu’une multiplication par trois, effectuer un calcul sur base d’autres tables, qu’en fonction que l’une ou plusieurs conditions soient ou ne soient pas rencontrées, le calcule diffère et doive encore aller chercher des données dans encore d’autres tables….
    Il est donc evidemment nécessaire d'externaliser une méthode (pas nécessairement par le biais d'une instance de classe); soit par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public Class ValuesManager
     'othersDT correspond à des données provenant d'autres
     ' DataTables sous la forme  d'un tableau de DataRows, c'est
     ' juste un exemple
     Public Shared Function GetNewValue(ByVal value As Long, ByVal othersDT As DataRow()) As Long
        Dim newValue As Long
        'Implementer les differents calculs conditionnels
        Return newValue       
     End Function
    End Class
    Enfin c'est l'idée grossière à developper concernant la transformation d'une valeur
    Donc pour en revenir à la DataTable de départ, il s'agit toujours au moins de declarer et d'ajouter une nouvelle colonne mais cette fois sans définir une expression (eventuellement une valeur par defaut si tu le souhaites), tu peux te contenter du Type et du Nom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub AddNewColumn()
     Dim dc As New DataColumn ("MyNewField")
     dc.DataType = GetType(Int64)
     dc.DefaultValue = 0
     '...
     Me.MyDataTable.Columns.Add(dc)
    End Sub
    Il te faut aussi maintenant initialiser les valeurs de cette colonne pour chaque enregistrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub InitNewField()
     Dim MyRows() As DataRow
     ' récupérer les DataRows par exemple qui
     ' serviront aux calculs conditionnels
     '... puis
     Dim dr As DataRow
     For Each dr In Me.MyDataTable.Rows
       dr("MyNewField") = ValuesManager.GetNewValue(dr("MyField"), MyRows)
     Next
    End Sub
    il suffit maintenant de lancer quelque part la procedure suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    '...
    Me.AddNewColumn()
    Me.InitNewField()
    '...
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    J'ai bien reçu ton code, je dois encore essayer de le tester et de voir si c'est ça que je cherche.

    Ca m'a l'air un peu compliqué, mais je vais m'y ateler. En VBAccess, c'est si simple. Y-aurait-il une faiblesse
    dans DOTNET ?

    Par rapport à mon problème expliqué de manière plus réelle peut-être peux-tu me dire si ta solution va être applicable ?


    Voici encore en simplifié ce que je faisais en access et que je voudrais faire en dot.net.
    Il s’agit en fait de calculer quels montants sont dus chaque mois par des clients qui louent un matériel déterminé à partir de la "dateDeb" pour "NbrPer" mois.

    Si j’ai une commande qui va entraîner 36 paiements j’aurai dans ma table commande :

    ComId=1 ; DateDeb=1/10/2005 ; NbrPer=36 ; Loyer=1000
    Je veux en fait me construire un ensemble de donnée (une requête access) qui me dit pour chaque commande la somme due par mois et je décide de me limiter à un tableau de 12 mois :

    .............Janvier_06 .........février_06........mars_06.....décembre_06

    Com1........1000...............1000................1000...........1000
    Com2..............................1000...............1000............1000
    Com3........333...................386................333..............333
    il affiche également de avril à novembre...

    Je dois donc pour la commande1 et janvier 2006, voir si un loyer est du ou pas.
    J’obtiens l’info en faisant un test sur les données de ma commande pour janvier 2006.

    Je crée donc une mini fonction avec comme paramètres des champs de ma table sauf MyColumnMois qui indique pour quelle période
    je désire voir si un loyer est du.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Function Loyer(myComId as long, myDateDeb as date, myNbrPer as integer, myLoyer as double, MyColumnMois as date) as double 
      If myColumnMois >= myDateDeb and myColumnMois <= dateadd( "month" , myNbrPer,myDateDeb) then
        Loyer= myLoyer
      else
        Loyer=0
       end if
    end function
    et je crée ma requête SQL access :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select ComID, Loyer([ComId],[DateDeb],[NbrPer],[Loyer],#1/1/2006#),Loyer([ComId],[DateDeb],[NbrPer],[Loyer],#2/1/2006#)... from CommandeTBL
    J'utilise donc 12 fois ma fonction "Loyer" pour les 12 mois de l'année. Il est clair que dans la pratique les dates du 1/1/2006 et suivantes sont variables...


    Cette requête me retourne les bonnes valeurs pour mes 3 commandes ci-dessus.

    La commande 3 a une valeur différente pour le mois de février car il y a une taxe "spéciale" qui se rajoute tous les mois de février pour ce contrat.

    J'ai donc une table taxeTbl qui comprend:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TaxeId= 1 ; TaxeComId=3; moisDeLaTaxe; février; montantTaxe=53

    il me suffit de modifier ma fonction Loyer comme suit

    'faire un select de ma table TaxeTbl pour la commande en cours (ComId)

    'si j'ai un enregistrement, c'est que j'ai une taxe, dès lors je valide que le mois en cours (MyColumnMois) est bien égal au mois pour lequel la taxe doit être appliquée. Si oui: Loyer=loyer + taxe


    Ma requête elle reste parfaitement identique et me retourne 12 colonnes et toutes mes commandes.

    Je peux "compliquer" ma fonction à souhait car en fait, j'ai trois sortes de taxes, des montants qui sont parfois majorés
    pour le premier loyer, des valeurs résiduelles ou pas à la fin des contrats, ...

    ce qui explique que je t'avais dit ne pas pouvoir régler ce problème par requête.

  14. #14
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Effectivement c'est du Access donc grande faiblesse par rapport à SqlServer
    Si tu ne peut améliorer côté SGBDR (c'est ce qui est normalement recommandé) en reportant au maximum tous les traitements possibles par des macros ou equivalents de procedures stockées.
    Il te faut créer côté appli ta propre couche "Business" qui sera un ensemble de classe mappant tes données, effectuant les calculs que tu souhaites de façon la plus dynamique possible et les exposant par des accesseurs (Propriétés) sous forme de DataTable ou même d'un DataSet pour la couche "Graphique" (Interface utilisateur).
    Je suppose tout de même que ta difficulté principale est ton passage d'un langage procéduriel à une conception "Objet" pour imaginer que VBNet serait plus lacunaire que VBA
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Citation Envoyé par neguib
    Je suppose tout de même que ta difficulté principale est ton passage d'un langage procéduriel à une conception "Objet" pour imaginer que VBNet serait plus lacunaire que VBA
    oui, effectivement ce passage ne se fait pas sans mal. Je n'avais jamais trouvé de limites à mon imagination alors que maintenant je n'arrive pas à convertir d'anciens développements.

  16. #16
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par Golzinne
    Citation Envoyé par neguib
    Je suppose tout de même que ta difficulté principale est ton passage d'un langage procéduriel à une conception "Objet" pour imaginer que VBNet serait plus lacunaire que VBA
    oui, effectivement ce passage ne se fait pas sans mal. Je n'avais jamais trouvé de limites à mon imagination alors que maintenant je n'arrive pas à convertir d'anciens développements.
    Je te comprend au combien puisque moi même vbciste repenti
    je ne sais pas pour toi, mais d'un point de vue conceptuel le fait de me familiariser avec UML m'a permis de mieux revoir ma copie. .Net doit me permettre de concretiser ce que je conçois ainsi liberer de la notion de langage ensuite c'est comme tu le sens pour le choix de celui-ci(C++, C#, Vbnet, Delphi.Net)
    Les pointures de ce site doivent pouvoir encore mieux te conseiller que moi en la matière.
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    J'ai appliqué ton code et ça fonctionne Nickel. Comme quoi c'est toi LA pointure de ce site.

    Merci

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

Discussions similaires

  1. Rendre accessible une web méthode sur le net
    Par Shargat dans le forum ASP.NET
    Réponses: 3
    Dernier message: 04/06/2009, 10h22
  2. [ASP.NET] question sur DataView.RowFilter
    Par spiksou dans le forum ASP.NET
    Réponses: 3
    Dernier message: 20/04/2007, 13h24
  3. [VB.NET] Pb sur update à partir champs Textbox
    Par patdez dans le forum ASP.NET
    Réponses: 5
    Dernier message: 28/06/2006, 09h28
  4. Réponses: 2
    Dernier message: 02/05/2006, 22h09
  5. [VB.NET] Action sur l'évènement IMPRESSION
    Par stephane93fr dans le forum ASP.NET
    Réponses: 3
    Dernier message: 27/04/2004, 17h03

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