Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
29 avril 2008 à 08:07
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
5 mai 2008 à 13:14
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.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 29 avril 2008 à 09:45
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)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 29 avril 2008 à 10:59
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 ^^
Vous n’avez pas trouvé la réponse que vous recherchez ?
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 29 avril 2008 à 11:07
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 )
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 29 avril 2008 à 11:10
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
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 29 avril 2008 à 11:23
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 ) ?
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 29 avril 2008 à 12:46
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"
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 29 avril 2008 à 14:22
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+
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 29 avril 2008 à 14:33
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.
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 29 avril 2008 à 14:46
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>
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 29 avril 2008 à 14:54
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 ?)
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 29 avril 2008 à 15:04
à 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>