Besoin de suggestions de code

Signaler
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
-
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
-
Bonjour tout le monde.

Pas souvent de ce coté de la barrière, je requiert des suggestions de code, en vue d'illustrer un futur article.

voilà le topo :

+-------------------------------------------------------------------------------
| Une Form1 contient une facture (articles, montant, tva, etc.)
| sur cette Form1, un bouton Command1 qui permet d'afficher Form2
|
| Form2 contient une ListView1, qui affiche les principales informations concernant les clients.
|
| Form2 sert à séléctionner le client dont le ClientID (champ de la base de données) sera lié à la facture.
| Il est possible de cliquer sur le bouton Ok ou Annuler de Form2.
| De plus, une fois un client validé, si je reclique sur le Command1 de la Form1, Form2 se réaffiches,
| bien entendu, avec le client lié à la facture toujours séléctionné.
+--------------------------------------------------------------------------------

En gros, l'article permettra de montrer ces diverses approches, et une manière de faire cela, de manière efficace, propre et réutilisable (dont je me serts dans tous mes codes professionnels...). Nul doute que d'autres me soumettrons un code similaire au miens, mais bon. On verra bien ce que va donner cette petite expérience.

Merci pour vos propositions et retours

31 réponses

Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut ,
Effectivement tu n'est pas souvent de ce coté.

Peux tu apporter des précisions sur ce que tu attends de nous exactement?

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
les controles étant posés, je ne pense pas qu'il soit nécessaire d'expliciter ceux-ci davantage.
concernant ce que je souhaites voir réaliser :

ouverture de Form2, selection (eventuelle) du client précedemment choisi
validation (ou non) de Form2 avec impact (si validation) sur Form1 (affichage du Nom et du N° de client, par exemple)

ce que je voudrais que vous me fournissiez, c'est le code de Form1 / Form2 nécessaire à cette maquette.

si nécessaire, table de la base de données serait :

Table Clients
--------------
NumClient (Numérique auto)
NomClient (chaine de caractères, non nulle)


si d'autres questions, n'hésitez pas...
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
14
Salut,

Ben....Renfield...Que t'arrives-Tu ?? Cela fait bizarre comme le dit Jrivet(Salut), de te lire de ce côté...lol..

A+
Exploreur

 Linux a un noyau, Windows un pépin
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
je voudrais simplement quelques approches, de ce cas de figure...

l'idée n'est pas de se moquer, de balancer des AAAAhhhhh OOooohhh, Beeuhhuueeuuheuehhee...

mais d'illustrer mes (futurs) propos, avec du "vrai" code susceptible d'être employé ici ou là.
je ne mettrai pas de nom, renommerais les variables, etc (pour homogeneiser)...

j'accpete même les participations par MP, si vous ne voulez pas exposer vos maquettes à la vue de tous ^^
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Ces Forms doive être capable d'afficher de l'UTF-8 ?

Si j'ai bien compris :
Form1 Fiche facture
On y saisie/lit toute les info conserant la facture
Form2 Liste + fiche
On voie apparaitre une liste de tout les clients et les info détaillé du client sélectionné. Si on valide on affecte la facture au client. Il est possible d'y revenir par la suite pour changé de client (pas très comptable sa en revanche... Bof comme tu veut).

Si j'ai bien compris je regarde sa (avec tout les coup de main que tu m'a filé je peut quand même faire sa )

Amicalement
Pensez "Réponse acceptée"
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
oui, tu as bien saisi...
la Form2 contient la liste des clients, une fois selectionné et la Form2 validée, le N° client et son nom apparaissent dans la Form1 (facture)


le coté strictement comptable ne m'interesse qu'accessoirement ici, c'est plutot l'architecture mise en place qui m'interesse dans cet exercice
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Haaaaaa..... Heeeee........
Qu'entant tu par "architecture" ??? Juste la méthode que on utiliserais pour faire un truc du genre ou du code programme qui fait un truc du genre ?

(Si c'est la méthode facile : je place des valeurs dans des variables, j'affiche certaines de ces valeurs en fonction d'évènements et de procédures, les valeurs sont lut et sauvegarder dans une base de données en utilisant du l'SQL....)
LOL : je me doute que ce n'est pas une banalité pareil que tu veut

Heeee au faite quel type d'objet souhaite tu utilisé en final (peut être que tu t'en fout pour le moment) ?
Que du VB standard (donc par exemple VB.Label ou Forms2.Label) ou des objets d'autre type (type VkLabel par exemple)
Comment ta connections est t'elle faite ? Objet ADODB ou autre ?
Pour la liste des client tu serais plutôt listbox/combobox/datagridview/label indexé loader par code (lol, sa je ne pense pas ) ?

Amicalement
Pensez "Réponse acceptée"
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
pas besoin de tant de précision.... le type de controle/connection importe peu, je veux juste le code, pas besoin de form...

juste un bref déscriptif, si nécessaire...

genre :

Dans un Module1
*------------------
Public NomClient As String
Public NumClient As Long

Dans Form1
*---------------------
Private Sub Command1_Click()
NumClient = TextBox_NumClient.Text
Form2.Show
End Sub

...
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Ok je m'y colle

Amicalement
Pensez "Réponse acceptée"
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Pour être générique à mort je ferais sans doute comme sa :

Une classe gérant les factures (nommé ClassFacture ici, 2 classe nécessaire en final avec la connections) :
    Gérant tout ce qui concerne les factures (réf à la facture et réf client concerné y compris). La sauvegarde et la lecture en base de données se feras ici aussi (en passant de préférance par une autre classe s'occupant de la connection, la sauvegarde/lecture des paramétres de connection, et fonction public pour executé des requetes SQL). Les requete SQL seront sauvegardé dans un fichier (ini par exemple c'est simple d'y lire/écrire avec les API ou à la main (attention dans ce cas à transformé les retours chariot en caractéres de controle, ou plus simple les interdire voir les remplacés par des espaces, les retours chariots n'aillant aucune influance sur les requete SQL)) à fin de pouvoir les modifier simplement si le SGBD venais à changé.
    Cette class doit également retourné le nombre, le nom, et la valeur, des informations facture en utilisant un index (à moin que tu ne voie un autre moillen de faire) à fin de préparé la mise en page de Form1 (et de pouvoir accéder à toutes les info par la même procédure).

Une classe gérant les clients :
    Identique dans le fonctionement à ClassFacture mais avec les infomation de TOUT les client disponible dans la base. (+ procédure AddClient, recevant un tableau contenant les info ou une collection, voir autre des conteneurs de données c'est pas sa qui manque)

Form1 :
Mit à "visible = false" au load.

Création d'une procédure Initilise (par exemple) :
<li> recoi une référance à un objet basé sur ClassFacture déjà initialisé (j'entand par la renségné au minimum sur le nombre et le nom des informations Facture)</li><li>En fonction de cette objet on fait la mise en page de Form1 (il est aussi imaginable que ce soit ClassFacture qui recoive une référance à un objet Form1 et qui s'occupe de la mise en page). Si on la fait en utilisant des labels on peut passé la propriété AutoSize mise à true (Attention à l'objet utilisé j'ai remarqué que certain s'étirais vers le bas au lieu de la droite, mais je ne sait plus les quel ) à fin de trouvé quel est le label le plus long et pouvoir aligné proprement par la suite les textbox de saisie. Etant donné que la classe facture retourne les informations en fonction d'un index on accéde à toutes les informations grace à tres peut de procédures. Donc qu'il y ais 15 000 ou 2 infos les même procédure seront utilisé </li><li>Sauvegarde des tailles des objets pour les resize à eventuelement faire par la suite (en % de largeur de la form par exemple). Il est même imaginable de modifier la taille des police en fonction de la taille de la form.
</li><li>Renseigne les textbox/label chargé précédemment.
</li><li>Passe le form à visible = true
</li>Form2 :Pour récup la liste des clients soit on execute une requete directement au load (mais je n'aime pas trop faire se genre de chose en générale, c'est pour sa que je propose la classe Client plus haut) soit comme pour Form1 "visible false" au load et procédure Initilise recevant un objet contenant le liste des clients et leur informations passant à "visible true" une fois terminer).
La procédure Initialise de Form2 (recevant un objet Client, Facture, Num facture) :
    Comme pour Form1 on commance par la mise en page de la form (j'insérerais tout les détails un frame, si aucun client n'est selectioné cette frame est invisible et la liste des client est étiré pour occupé toute la form).
Prévoir dans la liste des client une valeur "Nouveau client" et autorisé la saisie des informations client dans ce cas.
    Si on valide on envoie simplement l'ID client à l'objet facture si non on décharge simplement la form.

Pour finir :
A toi de décidé si tu travail en mode connecté et que les informations sont lut/écrit au coup par coup dans la base. Ou en mode déconnecté où tu lit d'un coup toutes les données, les sauvegardes en local (mémoire ou fichier temporaire), et te déconnecte de la base (les deux mode on leur avantage et inconvenants). Voir prévoir les deux mode possible et le chois se passe au niveau de la config de ton appli (perso c'est ce que je ferais)

un petit schéma illustrant ce que je veut dire :

Voila
J'espère que c'est ce que tu attendais et que j'es été claire
(C'est bien ce que tu attendais au moins )
Amicalement
Pensez "Réponse acceptée"
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Hé mes listes à puces on été perdue

Amicalement
Pensez "Réponse acceptée"
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
et beh! tu ne fais pas les choses a moitié.

je m'interesse ici en fait surtout à ce qui se passe là :

"La procédure Initialise de Form2 (recevant un objet Client, Facture, Num facture)" et

"Si on valide on envoie simplement l'ID client à l'objet facture si non on décharge simplement la form."

une maquette est dispo ici:
http://www.vbfrance.com/codes/BESOIN-SUGGESTIONS_46502.aspx

les réponses peuvent se faire dans les commentaires de cette source.
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
Salut,

J'apporte également ma contribution. Je te dois bien ça.

Je te fais un mail sur ton adresse perso avec le projet zippé.

Bonne prog
++
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
1
Lol
Oui c'est vrais que j'ai du mal à faire les choses à moitié
Comme sa tu à une idée relativement précise de ma façon de faire pour un cahier des cherches de ce type.
Bonne prog, a+

Amicalement
Pensez "Réponse acceptée"
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Bonjour,
Si j' ai bien compris


Dans Form1 (coté Facture)


Private Sub ImgSelect_Click()
 With txtTiers 'zone de texte client ou fournisseur)
 Dim sQuery As String If Me.Tag "achat" Or Me.Tag "Aachat" Then  sQuery "SELECT * FROM _V_TIERS WHERE LCode 'F'" ElseIf Me.Tag "vente" Or Me.Tag "Avente" Then  sQuery "SELECT * FROM _V_TIERS WHERE LCode 'C'"
 End If
 If (.Text <> "") Then
  If IsNumeric(.Text) Then
   sQuery = sQuery & " AND ci=" & Val(.Text)
  Else
   sQuery = sQuery & " AND nom LIKE '" & (.Text) & "*'"
  End If
 End If
  sQuery = sQuery & " ORDER BY nom"
 End With
 
 Load fGet_Tiers (ta form2)
 With fGet_Tiers
 .Tag = "bons"
 GET_TIERS sQuery, .lvT  '=>une procédure qui me permet de remplir ma listview
 
If .lvT.ListItems.Count = 0 Then
  MsgBox "...non défini ou introuvable !", vbOKOnly + vbInformation, "..."
  Unload fGet_Tiers
 Else
  .lvT.ListItems(1).Selected = .lvT.ListItems(1).EnsureVisible
  .Show 1
  SendKeys "{tab}"
 End If
 End With
End Sub




Coté Form2 (liste des fournisseurs ou Clients)
Private Sub lvT_DblClick()
 On Error GoTo err_index
 With lvT
 If .ListItems.Count = 0 Then Exit Sub
 Dim cCode As String, cNom As String, _
 sQuery As String, ctag As String
 ctag = Me.Tag
 cCode = .ListItems(.SelectedItem.Index).Text
 cNom = .ListItems(.SelectedItem.Index).ListSubItems(1).Text
 End With
' Unload Me
 Select Case ctag
 Case "bons"
   With fDetails
     .txtCode.Text = cCode
     .txtNom.Text = cNom
     .txtTiers.Text = Mid(cCode, 2, Len(cCode) - 1) & "  " & cNom
   End With
 Case "règlement"
   With fReglements_
     .Text2.Text = cNom
     .txtTiers.Text = Mid(cCode, 2, Len(cCode) - 1) & "  " & cNom
     .Text1.Text = cCode
   End With
 
 Case "fxPrint3"
   With fxPrint3
     .Text2.Text = cNom
     .txtTiers.Text = Mid(cCode, 2, Len(cCode) - 1) & "  " & cNom
     .Text1.Text = cCode
   End With
  End Select


 Unload Me
Exit Sub
err_index:
MsgBox Err.Description
End Sub
''-------------------------------------------------------------------------
Private Sub lvT_KeyUp(KeyCode As Integer, Shift As Integer)
  If KeyCode = vbKeyReturn Then lvT_DblClick
End Sub

C' est un exemple complet..
Bon tu feras le tri bien sûr, mais ça donne au moins une idée.







<hr />

... Y'en a même qui disent qu'ils l'ont vu voler.




/PRE>
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
CcTxtClient correspond à txtTiers
CcBtnClient  -----          à  ImgSelect
CcLst                          à    lvT
de plus poir l' id, moi j'utilise un TextBox
 en arrière plan .Text1.Text = cCode
et c' est id qui va être rattaché à la facture

<hr />
... Y'en a même qui disent qu'ils l'ont vu voler.
/PRE>
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
ca nous donne donc:

Form1:
Private Sub CcBtnClient_Click()
With Form2
If .CcLst.ListItems.Count = 0 Then
MsgBox "...non défini ou introuvable !", vbInformation, "..."
Unload Form2
Else
.CcLst.ListItems(1).Selected = .CcLst.ListItems(1).EnsureVisible
.Show vbModal
End If
End With
End Sub


Form2:
Private Sub CcBtnOk_Click()
CcLst_DblClick
End Sub

Private Sub CcLst_DblClick()
Dim cCode As Long
Dim cNom As String
On Error GoTo Handler
With CcLst
If .ListItems.Count <> 0 Then
cCode = Mid$(.SelectedItem.Key, 2)
cNom = .SelectedItem.Text

Form1.CcTxtClient.Text = cCode & " - " & cNom
Unload Me
End If
End With
Exit Sub
Handler:
MsgBox Err.Description
End Sub

(j'ai pas remis le Form_Load)



ok, c'est archivé.

C'est pas mal, merci pour cette première proposition.

quelques remarques en vrac:

.ListItems(.SelectedItem.Index).Text
se dit:
.SelectedItem.Text

Mid(cCode, 2, Len(cCode) - 1)
se dit
Mid$(cCode, 2)

pas compris le but de
SendKeys "{tab}"
(pourquoi pas xxx.SetFocus ?)

vbOkOnly vaut 0; inutile, donc, là:
vbOKOnly + vbInformation
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
à vrai dirs j' avais posté en ayant la peur au ventre que ça fasse tache, mais bravo d' avoir fait le ménage
Et merci pour les petites corrections.
Pour le sendkeys, c' est parceque j' ai un ButtonCommand en arrière plan (Cancel=True) qui me permet de décharger (et donc annuler)
en pressant Echap.Or ce button prend toujours le focus en premier(même avec tabindex supérieur à celui de la listview)
D' ou le tab pour passer le focus à la listview.
<hr />
... Y'en a même qui disent qu'ils l'ont vu voler.
/PRE>
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
la peur au ventre ? et beh, me v'là avec une réputation d'ogre des montagnes berzerk...

esperons que ton courage, hardi codeur en motivera d'autres