Vb.net listview si un item existe afficher son subitem dans

Jifton Messages postés 9 Date d'inscription jeudi 17 novembre 2022 Statut Membre Dernière intervention 25 novembre 2022 - 17 nov. 2022 à 11:14
Whismeril Messages postés 18011 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 décembre 2022 - 25 nov. 2022 à 18:07

Bonjour à tous.

J'aurais besoin que vous m'éclairiez afin que je puisse avancer dans mon projet.

Cela fait plusieurs jours que je cherche sans pouvoir trouver de réponse je vous explique mon problème.

J'ai une forme qui contient une listeview connecter à une base de données afin de pouvoir la remplir

Cela donne : id | Espèces | Variété | Famille

                        1    Tomate    CDB     Solanacées 

                         2  Courgette  Verte   Cucurbitacées

J'ai également une combobox qui est également rempli par ma base de données avec 

Espèce | Variété 

Et j'aimerais afficher dans un label la Famille en fonction du choix de ma combobox

J'arrive à afficher la famille mais jamais en fonction de ma combo box

Pourriez-vous m'indiquer la marche à suivre

Dans l'attente d'une réponse de votre part

Cordialement jifton

15 réponses

Whismeril Messages postés 18011 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 décembre 2022 618
17 nov. 2022 à 16:53

Houla

 je savais qu'en voyant votre pseudo j'aurais des devoirs. 

Oui, je suis moi-même autodidacte, mais j'ai appris à une époque ou internet n'existait pas encore ou en tout cas seulement dans quelques lieux privilégiés.

Pour "réussir" j'ai dû bosser et ne pas me reposer sur la bonne volonté d'autres sur un forum.

Même si CodeS SourceS, quand il est apparu (sous le nom de VBFrance) m'a été d'une grande utilité.

Aujourd'hui, je donne volontiers de mon temps à celles et ceux qui montrent des efforts de leur côté.

Le 2eme point est l'erreur de la grande majorité des autodidactes (et je ne fais pas exception) de se lancer dans son projet en se disant qu'on apprendra au fur et à mesure. Ça ne marche pas, on passe forcément à côté de fondamentaux et ça finit toujours par coincer. Apprendre les bases est essentiel, donc oui 300 pages de lecture.

Mais elles vont te servir.


 

Ou si l'on peut faire une comparaison est-ce que le .net est un genre de CSS ou PHP pour de l'html?

Non rien à voir.

Je sais également qu'il existe différents types de C. C++ C# et je dois en oublier pourquoi avoir créé du .net 

Ce ne sont pas différents types de C.

C est un langage,

  • ancien (années 70)
  • impératif, on écrit des fonctions qui sont utilisées en séquence
  • bas niveau, c'est-à-dire plus proche de l'ordinateur que de l'homme. Du coup de base, il ne sait pas faire grand-chose, tout est à inventer (alors aujourd'hui, il y a des milliers de bibliothèques, mais rien ne t'empêche de réécrire ton implémentation d'une string) et il faut gérer la mémoire de A à Z.
  • Il est nativement multiplateforme

C++

  • est une évolution orientée objet de C. C'est-à-dire que l'on code des objets qui interagissent entre eux. C'est fondamentalement différent de la programmation impérative.
  • date des années 80.
  • De base multiplateforme, Microsoft s'en empare et crée "son" C++, le C++ win32.
  • Fortement typé
  • assez rigoureux

BASIC est un langage

  • encore plus ancien, 1964
  • A l'époque des cartes perforées et des débuts de Fortran, il est destiné à des scientifiques non informaticien
  • la syntaxe est plus "simple" (quoi que...), un peu plus humaine que machine...
  • Y'en a eu des dizaines de versions, certaines vivotent encore
  • langage assez souple notamment avec les type

Au début des années 90, il est largement en perte de vitesse, quand Microsoft sort Visual Basic, qui va révolutionner la programmation amateure (dans le bon sens du terme).

Il s'agit d'une version orientée objet de Basic, où l'on place à la main les composants graphiques (objets appelés contrôles) et dont on utilise les propriétés et les évènements. Mais la grande majorité des codeurs ne cherchent pas à écrire leurs propres contrôles. Et une très petite minorité de ce qui le font savent qu'on peut aussi écrire des objets non graphiques (je n'ai vu qu'un seul pseudo sur les forums en plus de 20 ans, me dire l'avoir fait). Il hérite de la souplesse de BASIC


Au milieu des années 90, C++ truste le milieu professionnel, et en raison de la domination de Microsoft, C++ win32 est le plus répandu.

Sun sort Java

  • nativement multiplateforme (c'est la machine virtuelle qui gère la compatibilité, ça a des limites quand même)
  • haut niveau
  • "tout" objet (le tout ne plait pas à tout le monde, mais dans les faits un simple caractère est déjà un objet donc je le mets ce mot)
  • Gratuit ou presque
  • a une syntaxe héritée du C

Java va piquer des parts de marché à Microsoft.

En 2001, Microsoft riposte avec .Net, et C# le langage dédié.

Ils abandonnent VB et pour ne pas perdre les codeurs amateurs, créent Vb.Net en leur faisant croire que ce n'est qu'une simple évolution

.Net est

  • Nativement multi-windows, avec une machine virtuelle, indûment appelée Framework (aujourd'hui c'est cross plateform)
  • tout objet
  • a une syntaxe héritée du C
  • à partir de la framework 3.5 et WPF, revient à une sorte d'équivalent de MFC pour C++ win32 qui avait un franc succès chez les professionnels 
  • VB.Net est en fait du C#, donc tout objet, déguisé en VB avec des tolérances élargies sur le typage par exemple

Mais ça ne marche, les codeurs VB ont du mal à passer le cap tout objet, ce fut mon cas. On m'a conseillé d'apprendre C#, comme je n'aurais plus l'impression de faire du "faux" vb, ça passerait mieux et ça m'a réussi.

J'en connais aujourd'hui encore qui codent sur Visual studio, en VB.Net comme VB6.


Quand j'étais petit, la mer Morte n'était que malade.
George Burns

1
Whismeril Messages postés 18011 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 décembre 2022 618
17 nov. 2022 à 22:25

Ha oui, c'est bizarre.

Je l'ai mis là https://cjoint.com/c/LKrvzm2qpOx le lien est valable 4 jours


Quand j'étais petit, la mer Morte n'était que malade.
George Burns

1
Whismeril Messages postés 18011 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 décembre 2022 618
17 nov. 2022 à 11:49

Bonjour 

il n'y a pas une marche à suivre, mais plein de marches à suivre.

Et le choix dépend notamment de ce que tu as déjà fait, de ce que tu connais, bref du contexte

  • As tu écrit une ou des classes métier, pour modéliser et afficher tes données ?
  • Est ce que la famille vient d'une seconde table avec une jointure? Est-ce un enum? Etc...
  • Comment peuples tu ta listview?
  • Pourquoi une listview par rapport au datagridview (que l'on peut saisir directement) ?
  • etc...

Quand j'étais petit, la mer Morte n'était que malade.
George Burns

0
Jifton Messages postés 9 Date d'inscription jeudi 17 novembre 2022 Statut Membre Dernière intervention 25 novembre 2022
17 nov. 2022 à 12:32

Bonjour whismeril déjà merci pour votre temps 

Quelques petites précisions : 

Je n'ai pas connaissance de tous les termes techniques...

J'ai bien créé une classe,afin de me connecter.

une autre pour afficher les données de ma base (SQL serveur)dans la listview afin de l'utiliser dans le Load de ma forme et des autres si besoin .

Tout ça en utilisant des requêtes SQL 

J'ai choisi une listview plus qu'une data grid car je trouve le design plus joli 

Et je n'ai qu'une seule table.

Au tout début je passais par des fichiers texte avec lecture écriture exetera mais je trouve ça plutôt limitant.

J'espère ne pas avoir répondu à côté de la plaque

Pour être plus explicite je pourrais publier ce soir mon code

Cordialement 

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 18011 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 décembre 2022 618
17 nov. 2022 à 13:39

Ok pour le design si on s'en tient à Winform, dont le design de base reste pas terrible terrible et faire son propos design est franchement compliqué.

Cependant, avec un datagridview (pas un datagrid, c'est pas pareil), on peut avoir des combobox directement dans les cellules, et on peut utiliser le binding.


Pour poster ton code, il faut faire comme décrit là https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code


Quand au termes techniques se serait bien pratique qu'on ait le même langage.

Voici un cours top, de Tahé que je t'invite à lire de A à Z (oui oui, même le debut quo paraît simple, tu pourrais y découvrir un truc important...) https://tahe.developpez.com/dotnet/vbnet/

A défaut, un série de tutos de mon jus (moins bien que le cours de Tahé) sur la programmation objet https://codes-sources.commentcamarche.net/faq/11239-la-programmation-objet-appliquee-a-net-par-l-exemple-partie-1-sur-3


Quand j'étais petit, la mer Morte n'était que malade.
George Burns

0
Jifton Messages postés 9 Date d'inscription jeudi 17 novembre 2022 Statut Membre Dernière intervention 25 novembre 2022
Modifié le 17 nov. 2022 à 15:28

Je suis bien d'accord avec vous mais du moment qu'une appli reste un minimum jolie et fonctionnel cela me convient

Pardonnez-moi j'ai voulu faire une abréviation en omettant que mon raccourci parlait d'un autre contrôle (object de la boîte d'outils)

Merci pour la source du postage de code j'allais vous le demander.

"Grosse aparté"

J'ai commencé avec Vb10. Puis après une longue pause et un métier (maraîchage) dans lequel on a aucun logiciel de gestion j'aurais voulu créer le mien. Mais j'ai l'impression que ça a bien évolué depuis...

Ayant déjà "regarder" ce que vous m'avez demandé de lire et j'ai une questions afin de comprendre ma lecture...

Visual studio permet de coder (écrire) en .net et,ou en c !? Et d'après ce que j'ai vu des liaisons sont possibles... Mais qu'est-ce qui change exactement. La syntaxe ? ...

Je sais également qu'il existe différents types de C. C++ C# et je dois en oublier pourquoi avoir créé du .net 

Est ce que le  .net est un patois et le C une langue officielle ? 

Ou si l'on peut faire une comparaison est-ce que le .net est un genre de CSS ou PHP pour de l'html?

"Fin d'aparté"

Veuillez pardonner mon ignorance mais apprendre en autodidacte n'est pas simple du tout. Vous ayant déjà suivi sur d'autres topics je savais qu'en voyant votre pseudo j'aurais des devoirs. Donc je ne vous remercie pas pour les 300 pages de lecture. Mais bien obligé de l'admettre je vais m'y atteler.

Cordialement 

0
Jifton Messages postés 9 Date d'inscription jeudi 17 novembre 2022 Statut Membre Dernière intervention 25 novembre 2022
17 nov. 2022 à 18:38

Déjà merci pour cette Historique !

et je suis bien d'accord avec vous ! ce n'est pas a vous de faire ma besogne 

ensuite comme promis voici le code et le visuel 

clase de connexion a la base de donné

Imports System.Data.SqlClient

Module connexion
    Public cn As New SqlConnection("Data Source=LAPTOP\SQLEXPRESS;Initial Catalog=DB_Pots_Gestion;Integrated Security=True")
End Module

3 =Listeview connecter a ma databade avec le code ci dessous 

la table s'appelle Liste

Imports System.Data.SqlClient
Imports System.IO

Public Class Options

    Public dr As SqlDataReader
    Public cmd As New SqlCommand
    '================ sub d'affichage de la database  ================
    Private Sub Afficher()
        cn.Open()
        Dim listeitems As ListViewItem
        Dim str As String = "select * from Liste"
        cmd = New SqlCommand(str, cn)
        dr = cmd.ExecuteReader
        ListView_liste_legume.Items.Clear()

        While (dr.Read)
            listeitems = Me.ListView_liste_legume.Items.Add(dr("Id"))
            listeitems.SubItems.Add(dr("Espece"))
            listeitems.SubItems.Add(dr("Variete"))
            listeitems.SubItems.Add(dr("Famille"))
            listeitems.SubItems.Add(dr("Note"))
        End While

        dr.Close()
        cn.Close()
    End Sub

    '================ Action effectuer a l'affichage de la forme options ================

    Private Sub Options_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Button_modifier.Enabled = False
        Button_suprimer.Enabled = False
        Button_enregistrer.Enabled = False

        GroupBox_options.Enabled = False
        Afficher()
    End Sub

    '================ Annule la saisie ================

    Private Sub Button_ajouter_Click(sender As Object, e As EventArgs) Handles Button_ajouter.Click
        Label_id.Text = Nothing
        '
        '
        TextBox_espece.Text = Nothing
        TextBox_variete.Text = Nothing
        TextBox_famille.Text = Nothing
        '
        '
        Button_enregistrer.Enabled = True
        '
        '
        GroupBox_options.Enabled = True
        '
        '
        TextBox_espece.Focus()
    End Sub

    '================ Modifie un item selectionner ================

    Private Sub Button_modifier_Click(sender As Object, e As EventArgs) Handles Button_modifier.Click
        cn.Open()
        cmd.CommandText = "update Liste set Espece ='" & TextBox_espece.Text & "',Variete='" & TextBox_variete.Text & "',Famille='" & TextBox_famille.Text & "',Note='" & TextBox_note.Text & "'where Id=(" & Label_id.Text & ")"
        cmd.ExecuteNonQuery()
        cn.Close()
        Afficher()
        '
        '
        Label_id.Text = Nothing
        '
        '
        TextBox_espece.Clear()
        TextBox_variete.Clear()
        TextBox_famille.Clear()
        TextBox_note.Clear()

    End Sub

    '================ Eregistre dans la database les txtbox ================

    Private Sub Button_enregistrer_Click(sender As Object, e As EventArgs) Handles Button_enregistrer.Click
        If TextBox_espece.Text = Nothing Or TextBox_variete.Text = Nothing Or TextBox_famille.Text = Nothing Then
            MsgBox("veuiller rentré les information avent d'enregistrer", MsgBoxStyle.Exclamation + MsgBoxStyle.OkCancel)
        Else

            cn.Open()
            cmd.CommandText = "insert into Liste values('" & TextBox_espece.Text & "','" & TextBox_variete.Text & "','" & TextBox_famille.Text & "','" & TextBox_note.Text & "')"
            cmd.ExecuteNonQuery()
            cn.Close()
            Afficher()
            '
            '
            Label_id.Text = Nothing
            '
            '
            TextBox_espece.Clear()
            TextBox_variete.Clear()
            TextBox_famille.Clear()
            TextBox_note.Clear()
            '
            '
            Button_enregistrer.Enabled = False
            '
            '
            GroupBox_options.Enabled = False
        End If

    End Sub

    '================Supprime l'item selectionner ================

    Private Sub Button_suprimer_Click(sender As Object, e As EventArgs) Handles Button_suprimer.Click
        cn.Open()
        cmd.CommandText = "delete from Liste where Id='" & Label_id.Text & "'"
        cmd.ExecuteNonQuery()
        cn.Close()
        Afficher()
        '
        '
        Label_id.Text = Nothing
        '
        '
        TextBox_espece.Clear()
        TextBox_variete.Clear()
        TextBox_famille.Clear()
        TextBox_note.Clear()
    End Sub

    '================ Annule la saisie ================

    Private Sub Button_annuler_Click(sender As Object, e As EventArgs) Handles Button_annuler.Click
        Button_modifier.Enabled = False
        Button_suprimer.Enabled = False
        '
        '
        Label_id.Text = Nothing
        '
        '
        TextBox_espece.Clear()
        TextBox_variete.Clear()
        TextBox_famille.Clear()
        TextBox_note.Clear()
        '
        '
        GroupBox_options.Enabled = False
    End Sub

    '================ Affiche l'item selectionner dans les txtbox ================

    Private Sub ListView_liste_legume_Click(sender As Object, e As EventArgs) Handles ListView_liste_legume.Click

        GroupBox_options.Enabled = True
        '
        '
        cn.Open()
        cmd.CommandText = "select * from Liste where Id = '" & ListView_liste_legume.SelectedItems(0).Text.ToString & "'"
        cmd.ExecuteNonQuery()
        '
        '
        Dim dr As SqlDataReader = cmd.ExecuteReader()
        '
        '
        If dr.Read Then
            Me.Label_id.Text = dr.Item(0).ToString
            Me.TextBox_espece.Text = dr.Item(1).ToString
            Me.TextBox_variete.Text = dr.Item(2).ToString
            Me.TextBox_famille.Text = dr.Item(3).ToString
            Me.TextBox_note.Text = dr.Item(4).ToString
            dr.Close()
        End If
        cn.Close()
        '
        '
    End Sub

    '================ gestion des differents button ================

    Private Sub ListView_liste_legume_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListView_liste_legume.SelectedIndexChanged

        If ListView_liste_legume.SelectedItems.Count = 0 Then
            Button_modifier.Enabled = False
            Button_suprimer.Enabled = False
        Else
            Button_modifier.Enabled = True
            Button_suprimer.Enabled = True
        End If
        '
        '
        Label_id.Text = Nothing
        '
        '
        TextBox_espece.Clear()
        TextBox_variete.Clear()
        TextBox_famille.Clear()
        TextBox_note.Clear()
    End Sub

    Private Sub Options_Click(sender As Object, e As EventArgs) Handles MyBase.Click
        Button_modifier.Enabled = False
        Button_suprimer.Enabled = False
        '
        '
        Label_id.Text = Nothing
        '
        '
        TextBox_espece.Clear()
        TextBox_variete.Clear()
        TextBox_famille.Clear()
        TextBox_note.Clear()
    End Sub

End Class

4 = Forme 2 option afficher dans un panel

5 = Forme 1 de démarrage 

1 = combobox lier au donnée de ma database par le code ci dessous 

 Private Sub ComboBox1_Click(sender As Object, e As EventArgs) Handles ComboBox_liste_legume.Click

        ComboBox_liste_legume.Items.Clear()
        cn.Open()
        Dim str As String = "select Espece , Variete from Liste"
        cmd = New SqlCommand(str, cn)
        dr = cmd.ExecuteReader
        While (dr.Read)
            Me.ComboBox_liste_legume.Items.Add((dr("Espece")) & " " & (dr("Variete")).ToString())
        End While

        dr.Close()
        cn.Close()
    End Sub

2 = label ou je veut afficher la famille en fonction de la combobox (1)

0
Jifton Messages postés 9 Date d'inscription jeudi 17 novembre 2022 Statut Membre Dernière intervention 25 novembre 2022
19 nov. 2022 à 13:31

Bonjour à tous,

bon alors après plusieurs feux rouges???? des roues crevées⚙️ des stop ???? j'ai trouvé la réponse à mon problème ! 

Ce n'était qu'un problème de requête SQL

Ce que je tentais de faire était :

Select Famille from Liste where Espèce , Variété ='" & combobox.text & "'"

Et en cherchant je me suis aperçu qu'après le where on ne peut pas mettre deux critères

Il a fallu que je mette deux combobox une pour l'espèce l'autre pour la variété afin que je puisse travailler avec l'une ou l'autre pour faire ressortir ma famille

Conclusion : le code fournit plus haut pour la combobox fonctionne très bien pour la remplir avec deux éléments mais je ne peux le réutiliser pour travailler avec 

Encore merci whismeril pour votre temps.

PS : je n'est pas encore finis ma lecture 

Cordialement 

0
Whismeril Messages postés 18011 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 décembre 2022 618
20 nov. 2022 à 10:25

Bonjour 

Si ça résout ce problème tant, mieux.

Mais, je continue à penser que tu devrais revoir, à la fois la structure de ta base de données et celle de ton code.

Dans ton code, il n'y a pas de classe métier et c'est l'essence de .Net.

On peut bidouiller à l'ancienne comme, tu le fais, mais à chaque recherche c'est l'usine à gaz avec du texte (puisque tu crées des combobox items et des listviewitem) et des boucles et/ou du sql.


Dans ta bdd, je ne suis pas sûr des termes que tu emploies, je suppose que l'espèce pourrait être "Pomme" et la variété "Golden" ou "Pink Lady". Pour la famille, je ne vois pas vraiment (fruit et legume ?) , mais je peux expliquer "mon" raisonnement avec ma vision de espèce et variété (même si elle est fausse, au quel cas, tu me corriges et je transposerais).

Pour bien faire, il faudrait une table Especes dans laquelle il y aurait au moins 2 champs.

  1. un ID (numéro unique, souvent auto incrémenté dans la table)
  2. le nom de l'espèce
  3. tout autre champ qui pourrait être commun à toutes les espèces ou à une majorité d'entre et qui te serait utile. Par exemple la saisonnalité

Ainsi, Pomme serait 1, Banane 2, Haricot 3, Patate 4, etc..., et on pourrait ajouter que les pommes c'est d'automne, le haricot du début de l'été etc...

Il faudrait aussi une table Variété qui aurait au moins 3 champs

  1. un ID (unique et auto incrémenté)
  2. le nom de la variété 
  3. l'ID de l'espèce à laquelle elle appartient 
  4. et tout autre champs commun à une majorité de variétés

Et donc dans ta table "Produit", tu pourrais avoir 

  1. l'ID de la variété 
  2. le prix de reviens (ou d'achat si tu ne le cultives pas )
  3. le prix de vente.

Ensuite grâce à une opération appelée "jointure", tu peux associer chaque variété à son espèce et chaque produit à sa variété et donc remonter à l'espèce depuis le produit.


Revenons au code, il donc au moins une classe métier par table, qui stocke de façon privée ou public (en propriété, jamais de champs public) les infos de tables.

Et en plus tu peux faire des propriétés, des champs ou des méthodes de "traitement".

Par exemple grâce à une jointure (que tu peux faire en sql, mais aussi avec Linq dans le code .Net) tu peux avoir un champ Espece dans la classe Variete, et ce champ retourne directement l'espèce associée, idem pour la variété dans le produit.

Un peu comme le Parent d'un contrôle qui va te retourner le conteneur qui l'englobe.

Supposons un textbox dans un groupbox sur une form, textbox.Parent retourne le groupbox, et textbox.Parent.Parent la form.

De même produit.Variete.Espece va te retourner Pomme ou Haricot.


PS1, je ne sais plus si Linq est abordé dans le cours de Tahé

PS2, on peut mettre plusieurs critères dans un where. Un where, c'est un peu comme un if, lui faut un booléen (vrai ou faux) si ce que tu lui présentes peut-être calculé comme un booléen alors ça marche (en appliquant la bonne syntaxique). Avoir des notions d'algèbre de bool est très utile en programmation. Au moins savoir ce qu'et un Non, un Et, un Ou et un Ou exclusif. Quand je dis savoir, ça veut dire savoir les résultats de A ou B pour chaque valeur de A et B, tu pourrais être surpris par rapport à la vie courante dans laquelle on utilise plutôt le Ou Exclusif.


Quand j'étais petit, la mer Morte n'était que malade.
George Burns

0
Jifton Messages postés 9 Date d'inscription jeudi 17 novembre 2022 Statut Membre Dernière intervention 25 novembre 2022
22 nov. 2022 à 18:48

Whismeril bonjour,

Recapitulatif:

Ma base de données me servait à enregistrer toutes les espèces qui seront amenées à être cultivé.

Exemple théorique :

Id ,Espèces, Variété, famille*,note.

Exemple pratique :

1 ,Tomate , coeur de boeuf , Solanacées, attaque de puceron en avril

2 , chou , milan , brassicacées , la culture s'est bien passée

Je n'avais alors juste besoin de:

-lire ma base de donnée (table)dans une listview

-Écrire dedans avec 4 textbox

-Ré-écrire dedans pour d'éventuelles corrections

-Relire et écrire pour la suppression 

-Lire pour afficher dans les combobox

ensuite,J'ai ajouté des colonnes un peu plus techniques pour chaque espèce comme :

-Le temps de culture 

-Le temps qu'il faut entre le semis et la plantation 

-Le temps qu'il faut de la  plantation jusqu'à la récolte

(et j'ai quand même constaté que lors du débogage le temps d'affichage s'allongeait, est-ce lier ?)

si oui vous avez raison ça va devenir l'usine à gaz !!!

..

Non, vous êtes bon sur votre vision !

1, pomme, pink lady, rosacées

2, pomme, golden, rosacées

*Une famille regroupe différentes espèces de légumes. les tomates, les poivrons, les aubergines,font partie des solanacées

Au même titre que les pommes et les fraises font partie de la famille des rosacées

Alors reprenons si vous le voulez bien !?

mettons que je crée ces tables ci.


 

Première table Espèces

  1. un ID (1)

  2. le nom de l'espèce (Tomate)

  3. Famille (solanacées)

  4. commencement des semis (mois Février)

  5. fin des semis (mois Avril)

  6. commencement des plantation (mois Mars)

  7. fin des plantation (mois Mais)

  8. première récolte (mois Juin)

  9. comentaire (attaque de pucerons début mais)


 

 Table Variété 

  1. un ID (1)

  2. le nom de la variété (Coeur de boeuf)

  3. l'ID de l'espèce à laquelle elle appartient (1)

  4. Distance entre les plant (60 cm)


 

 Table rendement 

  1. l'ID de la variété 

  2. rendement par pied (théorique 10kg)

  3. le prix de vente pour 1 kg. (3.5€)

Maintenant pour ce qui est de la classe métier:

 j'ai lu et je lis encore pour voir en quoi une classe métier me serait utile et j'ai du mal à l'incorporer dans ce projet ! 

J'ai cru comprendre que cela permettait au logiciel d'avoir une vue d'ensemble sur les données que j'allais mettre dans la base de donnée 

Que cela permettait d'archiver des données sans pour autant passer par une base de données

Mais que les deux étaient compatibles

Mais comment m'y prendre 

exemple : fait sur ma première table 

il faut encore que je m'instruise et que je prenne en compte ce que vous m'avez écrit pour le faire sur les nouvelles tables.

Private classe Légumes...

Classe id_legume as string

Classe espèce as string

Classe variété as string

Classe famille as string

Classe T_culture as integer

Classe T_S_P as integer

Classe T_P_R as integer

Classe note as string

End classe

Êtes-vous d'accord avec ce premier exemple où faut-il que je créé des classes pour chaque type de légumes du genre

Private classe tomate...

Classe id_tomate as string

Classe variété as string

Classe famille as string

Classe T_culture as integer

Classe T_S_P as integer

Classe T_P_R as integer

Classe note as string

End classe

Ici l'avantage c'est que les trois avant dernières données sont les mêmes: 

le temps de culture

le temps du semis à la plantation

Et le temps de la plantation à la récolte. Sont les mêmes pour les tomates.

Car le travail n'est pas le même j'ai plus d'une cinquantaine de variétés 

et si jamais j'en ai oublié une comment faire pour l'ajouter ?

Sinon je peux aussi faire ça par famille ça raccourcirait le code 

Private classe Famille...

Classe id_famille as string

Classe espèce as string

Classe variété as string

Classe T_culture as integer

Classe T_S_P as integer

Classe T_P_R as integer

Classe note as string

End classe

Mai je perd l'avantage cité plus haut

Mais ici l'avantage est qu'une famille regroupe plusieurs variétés.

Afin de mieux comprendre :

Quand vous avez fait votre jeu du kilomètre. Et que vous avez décrit ce qu' était un feu rouge. Est-ce une classe métier ?

et si vous avez des sources pour moi je suis preneur.

et je n'est encore rien lu sur le linq 

ps: je n'est pas encore finis de le lire 

faire et refaire c'est apprendre 

Bien a vous 

0
dysorthographie Messages postés 56 Date d'inscription jeudi 27 janvier 2022 Statut Membre Dernière intervention 29 novembre 2022 4
Modifié le 24 nov. 2022 à 17:42

Bonjour,

j'ai bien compris que tu ne vois pas l'intérêt de diviser ton projet en couche Client,Métier,base de données,

mais sache que pour la maintenance évolutive et/ou  curative ça facilite la vie!

si tu change d'avis!

'************************************************************************************************************
'Class Client 
'............................................................................................................
Imports System.IO
Public Class Options
    Dim Mt As New MetierOptions("LAPTOP\SQLEXPRESS", "DB_Pots_Gestion")
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.ListBox1.DataSource = Mt.Afficher
    End Sub
    Private Sub Button_enregistrer_Click(sender As Object, e As EventArgs) Handles Button_enregistrer.Click
        If Mt.modifier(TextBox_espece.Text, extBox_variete.Text, TextBox_famille.Text, TextBox_note.Text) Then
            MessageBox.Show("Mise à jour effectué!")
        End If
    End Sub

    Private Sub Form1_Closed(sender As Object, e As EventArgs) Handles Me.Closed
        Mt.Dispose()
        Mt = Nothing
    End Sub
End Class
'************************************************************************************************************
'Class Métier
'............................................................................................................
Public Class MetierOptions
    Inherits BDD
    Implements IDisposable
    Dim disposed As Boolean = False
    Public Overloads Sub Dispose() Implements IDisposable.Dispose

        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
    Protected Overloads Sub Dispose(ByVal disposing As Boolean)
        If disposed = False Then
            If disposing Then
                disposed = True
            End If
        End If
    End Sub
    Public Sub New(Source As String, Catalog As String)
        MyBase.New(Source, Catalog) 'ascenseur
    End Sub
    Public Function Afficher() As DataTable
        Return OpenQuerry("select * from Liste")
    End Function
    Public Function modifier(Espece As String, Variete As String, famille As String, note As String) As Boolean
        Dim sql As String = "insert into Liste values(@Espece,@Variete,@Famille,@Note)"
        Dim prm(3) As ParmCmd
        prm(0) = New ParmCmd With {.Name = "@Espece", .Type = TypeParm.adNVarChar, .Size = 50, .Value = Espece}
        prm(1) = New ParmCmd With {.Name = "@Variete", .Type = TypeParm.adNVarChar, .Size = 50, .Value = Variete}
        prm(2) = New ParmCmd With {.Name = "@famille", .Type = TypeParm.adNVarChar, .Size = 50, .Value = famille}
        prm(3) = New ParmCmd With {.Name = "@note", .Type = TypeParm.adNVarChar, .Size = 50, .Value = note}
        Return Execute(sql, prm)
    End Function

End Class
'************************************************************************************************************
'Class Base de données
'............................................................................................................
Imports System.Data.SqlClient

Public Class BDD

    Private _SQLConn As SqlConnection = Nothing, _Source As String = "", _Catalog As String = ""
    Protected Sub New(Source As String, Catalog As String)
        _SQLConn = New SqlConnection
        _Source = Source : _Catalog = Catalog
    End Sub
    Private Sub Connection()
        _SQLConn = New SqlConnection($"Data Source={_Source};Initial Catalog={_Catalog};Integrated Security=True")
        _SQLConn.Open()
    End Sub
    Public Enum TypeParm
        adInteger = 3
        adNVarChar = SqlDbType.NVarChar
        adAddNew = 16778240
        adAffectAllChapters = 4
        adAffectCurrent = 1
        adAffectGroup = 2
        adApproxPosition = 16384
        adArray = 8192
        adAsyncConnect = 16
        adAsyncExecute = 16
        adAsyncFetch = 32
        adAsyncFetchNonBlocking = 64
        adBigInt = 20
        adBinary = 128
        adBookmark = 8192
        adBookmarkCurrent = 0
        adBookmarkFirst = 1
        adBookmarkLast = 2
        adBoolean = 11
        adBSTR = 8
        adChapter = 136
        adChar = 129
        adClipString = 2
        adCmdFile = 256
        adCmdStoredProc = 4
        adCmdTable = 2
        adCmdTableDirect = 256
        adCmdText = 1
        adCmdUnknown = 8
        adCollectionRecord = 1
        adCompareEqual = 1
        adCompareGreaterThan = 2
        adCompareLessThan = 0
        adCompareNotComparable = 4
        adCompareNotEqual = 3
        adCopyAllowEmulation = 4
        adCopyNonRecursive = 2
        adCopyOverWrite = 1
        adCopyUnspecified = -1
        adCreateCollection = 8192
        adCreateNonCollection = 0
        adCreateOverwrite = 67108864
        adCreateStructDoc = -2147483648
        adCriteriaAllCols = 1
        adCriteriaKey = 0
        adCriteriaTimeStamp = 3
        adCriteriaUpdCols = 2
        adCRLF = -1
        adCurrency = 6
        adDate = 7
        adDBDate = 133
        adDBTime = 134
        adDBTimeStamp = 135
        adDecimal = 14
        adDefaultStream = -1
        adDelayFetchFields = 32768
        adDelete = 16779264
        adDouble = 5
        adEditAdd = 2
        adEditDelete = 4
        adEditInProgress = 1
        adEditNone = 0
        adEmpty = 0
        adErrBoundToCommand = 3707
        adErrCannotComplete = 3732
        adErrCantChangeConnection = 3748
        adVarChar = 200
        adParamInput = 1
    End Enum
    Protected Structure ParmCmd
        Public Name As String
        Public Type As TypeParm
        Public Direction As TypeParm
        Public Size As Long
        Public Value As Object
    End Structure
    Protected Function OpenQuerry(ByVal Sql As String, Name As String) As DataTable
        If _SQLConn.State = ConnectionState.Closed Then Connection()
        Try
            Using dataadapter As New SqlDataAdapter
                Using cmd As New SqlCommand(Sql, _SQLConn)
                    cmd.CommandTimeout = 60
                    dataadapter.SelectCommand = cmd
                    Dim ds As New DataTable With {
                        .TableName = Name
                    }
                    dataadapter.Fill(ds)
                    Return ds
                End Using
            End Using
        Catch ex As Exception
            Return Nothing
        Finally
        End Try
    End Function
    Protected Function OpenQuerry(ByVal Sql As String) As DataTable
        If _SQLConn.State = ConnectionState.Closed Then Connection()
        Try
            Using dataadapter As New SqlDataAdapter
                Using cmd As New SqlCommand(Sql, _SQLConn)
                    cmd.CommandTimeout = 60
                    dataadapter.SelectCommand = cmd
                    Dim ds As New DataTable
                    dataadapter.Fill(ds)
                    Return ds
                End Using
            End Using
        Catch ex As Exception
            Return Nothing
        Finally
        End Try
    End Function
    Protected Function OpenQuerry(ByVal Sql As String, Name As String, ByVal Param() As ParmCmd) As Object
        If _SQLConn.State = ConnectionState.Closed Then Connection()
        Try
            Using dataadapter As New SqlDataAdapter
                Using cmd As New SqlCommand(Sql, _SQLConn)
                    cmd.CommandTimeout = 60
                    dataadapter.SelectCommand = cmd
                    For Each c As Object In Param
                        If c.Size <> 0 Then
                            dataadapter.SelectCommand.Parameters.AddWithValue(c.Name, c.Value)
                        End If
                    Next

                    Dim ds As New DataTable With {
                        .TableName = Name
                    }
                    dataadapter.Fill(ds)
                    Return ds
                End Using
            End Using
        Catch ex As Exception
            Return Nothing
        End Try
    End Function
    Protected Function Execute(ByVal Sql As String) As Boolean
        If _SQLConn.State = ConnectionState.Closed Then Connection()
        Try
            Using cmd As New SqlCommand(
               Sql, _SQLConn)
                cmd.CommandTimeout = 60
                Dim reader As SqlDataReader = cmd.ExecuteReader()
                reader.Close()
                cmd.Dispose()
                Return True
            End Using
        Catch ex As Exception
            Return False
        End Try
    End Function
    Protected Function Execute(ByVal Sql As String, ByVal Param() As ParmCmd) As Boolean
        If _SQLConn.State = ConnectionState.Closed Then Connection()
        Try
            Using cmd As New SqlCommand(Sql, _SQLConn)
                cmd.CommandTimeout = 60
                For Each c As Object In Param
                    If c.Size <> 0 Then
                        cmd.Parameters.AddWithValue(c.Name, c.Value)
                    End If
                Next
                Dim reader As SqlDataReader = cmd.ExecuteReader()
                reader.Close()
                Return True
            End Using
        Catch ex As Exception
            Return False
        End Try
    End Function

    Protected Overrides Sub Finalize()
        If _SQLConn.State <> ConnectionState.Open Then
            _SQLConn.Close()
            _SQLConn.Dispose()
            _SQLConn = Nothing
        End If
        MyBase.Finalize()
    End Sub
End Class
0
Jifton Messages postés 9 Date d'inscription jeudi 17 novembre 2022 Statut Membre Dernière intervention 25 novembre 2022
24 nov. 2022 à 18:02

Dysorthographie bonjour

Ce n'est pas le temps que je n'y vois pas d'intérêt mais plus que je cherche à comprendre

Quand j'ai posté mon premier message et que whismeril m'a répondu je n'avais encore jamais entendu parler de classe métier ou d'organiser son code en couche 

Je vais pas m'étaler plus longtemps...

un grand merci a vous

Ça va beaucoup m'aider !

cordialement

0
Whismeril Messages postés 18011 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 décembre 2022 618
25 nov. 2022 à 10:55

Bonjour

désolé pour le délai de réponse, j'ai une grosse semaine et un autre sujet sur le forum, nécessitant comme le tien, réflexion et temps de rédaction.

Concernant, la proposition de créer une table pour les familles et une pour les espèces, cela ne vient pas de moi, mais de gens qui ont bien réfléchi sur la gestion de données.

Ça évite de faire des requêtes compliquées pour peupler un combobox avec toutes les familles, car

  • Puisqu'une famille regroupe plusieurs espèces, cette table sera plus petite que celle des espèces
  • on affiche la totalité de la table, au lieu de faire une requête qui va lire toutes les espèces pour en extraire quelques valeurs (gain de temps)
  • ça devrait limiter le risque de te retrouver avec Solanacées et Solenaces

Et donc, idem pour la table espèce, etc...

J'ai cru comprendre que cela permettait au logiciel d'avoir une vue d'ensemble sur les données que j'allais mettre dans la base de donnée 

Que cela permettait d'archiver des données sans pour autant passer par une base de données

Oui et non.

.Net a été conçu pour faciliter le développement par couche avec notamment la notion de binding (qui permet d'afficher des collections d'objet dans la majorité des contrôles, mais pas la ListView WinForm entre autres)

Et ça c'est très pratique à coder, sauf pour la listview...

Il n'empêche que tu peux faire en sorte que la classe Variété, génère directement le listviewItem qui la représente et qu'elle sache établir le dialogue qui va bien avec l'IHM pour l'affichage, la mise à jour, la création d'un nouvel enregistrement ou la suppression d'un autre.

Ayant ça en tête, par rapport à la base de données, il y a 2 grandes façons de faire

  • tout charger dans des collections de classe métiers, et n'interagir qu'épisodiquement avec la BDD quand il faut enregistrer un changement (et donc là ça correspondrait à avoir une vue d'ensemble des données)
  • ne charger que le strict minimum et dialoguer constamment avec la BDD

Mais dans les 2 cas, je te conseille de mettre tes données dans des classes métiers, justement parce que ces classes peuvent faire plus que "simplement contenir les informations".

Par contre, les classes, c'est volatil, si tu ne sauvegardes pas les données de temps à autre, une fois le logiciel étend, toutes les modifications sont perdues. Donc quelle que soit ta façon de faire, il faut enregistrer à un moment ou un autre dans la BDD

Private classe Légumes

  Classe id_legume as string

  Classe espèce as string

  Classe variété as string

  Classe famille as string

  Classe T_culture as integer

  Classe T_S_P as integer

  Classe T_P_R as integer

  Classe note as string

End classe

Pas exactement

Private classe Légumes 'il faudra probablement qu'elle soit Friendly ou public
  Propriété id_legume as string 'string ou integer c'est toi qui vois, souvent les BDD font des integer autoincrémentés
  Propriété variété as Variete 'là c'est l'instance de la classe Variete associée qui doit apparaitre, et dans cette classe, il y aura la bonne instance de Espece, qui elle-même aura Sa Famille et donc directement depuis cette instance, l'info est accessible

  Propriété T_culture as integer
  Propriété T_S_P as integer
  Propriété T_P_R as integer
  Propriété note as string

  Champ privé ou Propriété ID_Variété 'ça, c'est ce qui est stocké dans la BDD et on peuple la propriété Variété grâce à une requête sur la collection de Variétés et cet ID
End classe

Comme tu le vois, la classe possède en propriété son parent directement, et le parent son parent etc...

Donc d'une instance de parent en parent, tu a accès à toutes les informations, qui elles ne sont stocké en RAM qu'une fois.

Attention, c'est à la fois un avantage (moins de ressource et toutes modifications d'une famille, sera prise en compte pour toutes les Especes et toutes les Variete) et un inconvénient (toute modification d'un Parent sera prise en compte pour tous les enfants et descendants => un Parent ne doit contenir que des infos strictement communes à ses enfants)

Par exemple, il y a des variétés d'orge qui se plantent au printemps et d'autres à l'automne.

Et là, il te faut faire un choix.

  • Si tu choisis de mettre les infos dates de semis dans la table (et donc la classe) Variete, tu devras saisir pour chaque variété ces infos, alors que plus haut, tu m'as dit que c'est commun à toutes les Tomantes
  • Si tu choisis de mettre ces infos dans la table (et donc la classe Especes), tu devras saisir 2 variantes d'orge, les orges d'hiver et les orges de printemps
  • Si ces 2 choix ne te conviennent pas, il faudra une table (et donc une classe)  "sous epèces"

Et là, le choix est essentiellement lié à la proportion :

  • si la majorité (2/3 au moins) des espèces ont des dates communes pour leurs variétés, alors il faut le mettre au niveau de la table Espece, et parfois saisir 2 espèces sœurs
  • si la majorité des espèces, ont des dates différentes pour leurs variétés, alors il faut les mettre dans la table variété, et saisir ces dates pour chaque variété
  • si c'est partagé, ben, c'est comme tu le sens, la sous-espèce peut être une solution, mais c'est une étape de plus dans l'arborescence

Quand vous avez fait votre jeu du kilomètre. Et que vous avez décrit ce qu' était un feu rouge. Est-ce une classe métier ?

Non, mais j'aurais pu.

J'ai créé une classe abstraite Carte, qui a dérivé de 4 enfants, les kilomètres, les embuches, les parades et les bottes.

Là, j'ai fait le choix, de distinguer le feu rouge, la panne d'essence et l'accident par une propriété de la classe Embuche, mais j'aurais pu tout aussi bien faire de la classe Embuche, une classe abstraite et écrire une classe dérivée pour chacune.

En gros, la classe métier doit te permettre de correspondre au travail à faire.

As-tu besoin de savoir utiliser une cafetière filtre, une cafetière à capsule et un distributeur dans ton métier, ou as-tu besoin de savoir comment elles sont fabriquées pour les réparer ?


Quand j'étais petit, la mer Morte n'était que malade.
George Burns

0
Jifton Messages postés 9 Date d'inscription jeudi 17 novembre 2022 Statut Membre Dernière intervention 25 novembre 2022
25 nov. 2022 à 17:55

Whismeril bonjour,

Ne vous excusez pas ! je trouve déjà fort altruiste le fait que vous preniez le temps pour moi .

Je vais déjà commencer par m'exercer afin d'assimiler et de comprendre un peu mieux toutes ces réponses qui m'ont été fournies.

Ce n'est pas grand chose mais encore merci à toutes les personnes qui ont pris le temps !

PS : dois-je mettre ce sujet comme résolu où puis-je le garder tel quel si jamais je coince( ce qui va probablement être le cas) ?

PS2: si jamais une personne tombe sur ce topic et qu'il aime faire des vidéos YouTube faut pas hésiter à traiter ce sujet 

Cordialement jifton 

0
Whismeril Messages postés 18011 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 décembre 2022 618
25 nov. 2022 à 18:07

Concernant YouTube, voici ce que j'en pense

https://forums.commentcamarche.net/forum/affich-36859630-cours-sur-le-c#10


Quand j'étais petit, la mer Morte n'était que malade.
George Burns

0
Jifton Messages postés 9 Date d'inscription jeudi 17 novembre 2022 Statut Membre Dernière intervention 25 novembre 2022
Modifié le 17 nov. 2022 à 18:43

a et ce liens 

 https://tahe.developpez.com/dotnet/vbnet/

fonctionne mais pas les source a l'intérieur 

-1