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,
C++
BASIC est un langage
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
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
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.
Ha oui, c'est bizarre.
Je l'ai mis là https://cjoint.com/c/LKrvzm2qpOx le lien est valable 4 jours
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionOk 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
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
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)
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
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.
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
Et donc dans ta table "Produit", tu pourrais avoir
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.
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
un ID (1)
le nom de l'espèce (Tomate)
Famille (solanacées)
commencement des semis (mois Février)
fin des semis (mois Avril)
commencement des plantation (mois Mars)
fin des plantation (mois Mais)
première récolte (mois Juin)
comentaire (attaque de pucerons début mais)
Table Variété
un ID (1)
le nom de la variété (Coeur de boeuf)
l'ID de l'espèce à laquelle elle appartient (1)
Distance entre les plant (60 cm)
Table rendement
l'ID de la variété
rendement par pied (théorique 10kg)
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
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
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
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
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
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.
Et là, le choix est essentiellement lié à la proportion :
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 ?
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
Concernant YouTube, voici ce que j'en pense
https://forums.commentcamarche.net/forum/affich-36859630-cours-sur-le-c#10
a et ce liens
https://tahe.developpez.com/dotnet/vbnet/
fonctionne mais pas les source a l'intérieur