Stag2
Messages postés26Date d'inscriptionlundi 30 juin 2008StatutMembreDernière intervention22 juillet 2008
-
17 juil. 2008 à 17:15
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 2012
-
22 juil. 2008 à 20:40
Bonjour,
Je dispose d'un base de donnée avec une table "prestation" qui contient 4 champs:
Le nom de la prestation (libelle_prestation), les prix min, moy & max de la prestation (respectivement min_ht, moy_ht et max_ht)
Dans un premier temps une datalist (datalist1) récupere le champs libelle_prestation, lorsque l'utilisateur clique sur le bouton "ajouter" cella l'ajoute sur une listbox (list1).
Une fois que l'on a choisi les prestations voulues, pour chaque prestation son nom apparait dans une textbox ainsi que ces 3 prix associés (checkbox). Mais je n'arrive pas a faire apparaitre les bon prix dans les check box.
Comme je permets le choix de 6 prestations max, il y a donc 18 checkbox associées (1 min, 1 moy et 1 max pour chaque prestation)
Voici le code :
Option Explicit
Dim MaDb As String
Private Sub cmdAdd_Click()
List1.AddItem DataList1.Text
cmdCalc.Refresh
End Sub
Private Sub cmdCalc_Click()
Dim i As Integer
Dim j As Integer
Dim k As Integer
For i = 0 To 5
Text1(i).Text = List1.List(i)
Next i
End Sub
Private Sub cmdCalcFin_Click()
Dim j As Integer
For j = 0 To (3 * List1.ListCount - 1)
If Check1(j).Value = 1 Then
Text2.Text = Val(Text2.Text) + Val(Check1(j).Caption)
End If
'cmdCalcFin.Refresh
Next j
If Text2 <> "" Then
Text3.Text = Text2.Text * 0.804
'cmdCalcFin.Refresh
End If
End Sub
Private Sub CmdQuit_Click()
Unload Me
End Sub
Private Sub cmdRemove_Click()
Dim i As Variant
For i = List1.ListCount - 1 To 0 Step -1
If List1.Selected(i) = True Then
List1.RemoveItem i
Text1(i).Visible = False
Check1(3 * i).Visible = False
Check1(3 * i + 1).Visible = False
Check1(3 * i + 2).Visible = False
End If
Next i
MaDb = App.Path & ".\FiiTCompta.mdb"
With Adodc1
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & MaDb & ";Persist Security Info=False"
.RecordSource = "SELECT * FROM Prestation ;"
End With
Adodc1.Refresh
Set DataList1.DataSource = Adodc1
Set DataList1.RowSource = Adodc1
DataList1.DataField = Adodc1.Recordset.Fields(0).Name
DataList1.ListField = Adodc1.Recordset.Fields(0).Name
Check1(0).Caption = Adodc1.Recordset.Fields(1).Value 'correspond au prix min
Check1(1).Caption = Adodc1.Recordset.Fields(2).Value 'correspond au prix moy
' Check1(2).Caption = Adodc1.Recordset.Fields(3).Value 'correspond au prix max
End Sub
Ma table est tte bete, avec en champs1 les libelle_prestation, champs2 le prix mix, champs3 le prix moy & champs4 le prix max.
Avec Check1(0).Caption = Adodc1.Recordset.Fields(1).Value
je n'obtiens que le premier élement du champs min. J'aimerais pouvoir choisir la ligne correspondante à la bonne prestation. J'ai vu qu'avec getrows je pourrais m'en tirer, mais ni mes recherches sur google, ni msdn ne m'ont permis de comprends comment m'en servir.
Mon idée c'est de faire une boucle ou je compare le contenu du text1 (0) (celui qui récupere la premiere prestation choisie) avec les noms des prestations, pour ensuite mettre les prix corespondants dans les 3 checkbox.
J'ai tenté de commencer avec ca:
With Adodc1.Recordset
.Find "libelle_prestation = " & Text1(0).Text & ""
mais je ne sais pas comment continuer
Sinon je pensais mettre le contenu de ma table dans un tableau a 2 dimensions. Je pourrais y naviguer plus facilement. Mais je m'y perds parmis les array etc.... (je débute)
Désolé pour ce gros pavé, mais je suis dans l'impasse et sans prendre le temps d'expliquer mon prob je doute que l'on puisse m'aider.
Merci
A voir également:
Exporter une table de bdd dans un tableau multidimensionnel
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 18 juil. 2008 à 16:12
Et puis si libelle_prestation est dans la première colonne de ta TABLE,c à d le premier champ, il se retrouvera à la première colonne de tn tableau.C( est donc
myTable(l, 0)
For l = 0 To Adodc1.Recordset.RecordCount -1
If Text1(0).Text = myTable(l, 0) Then
Check1(0).Caption = myTable(l, 1) '2° champ
Exit For
End If
Next l
<hr />... Y'en a même qui disent qu'ils l'ont vu voler.
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 17 juil. 2008 à 18:44
With Adodc1.Recordset
.Find "libelle_prestation= " & Text1(0).Text & ""
If .NoMatch Then
MsgBox "Introuvable"
'Ce qui est improbable puisque le contenu de la textbox
' a été initialement récupèré de la base.Mais c' est juste
' pour la forme.
Exit Sub
End If
'Sinon tu es sur l' enregistrement recherché.
'Tu n' as plus qu' ç récupèrer les champs.
<Traitement>
End With
Sinon je pensais mettre le contenu de ma table dans un tableau a 2 dimensions. Je pourrais y naviguer plus facilement. Mais je m'y perds parmis les array etc.... (je débute)
Dim NbEnr As Integer
Dim MonTableau() As Variant
NbEnr =Adodc1.RecordSet.RecordCount
Redim MonTableau(NbEnr,5)
Tu as donc un tableau de n lignes et 5 colonnes, à l' image de ta table.
Après, avec une boucle, tu recopies ta table dans ce tableau.
Tu effectueras alors ta recherche dans le tableau.
Mais si la première solution marche,ça sera pas
nécessaire de travailler avec un tableau.
<hr />... Y'en a même qui disent qu'ils l'ont vu voler.
zen69
Messages postés584Date d'inscriptionjeudi 28 décembre 2006StatutMembreDernière intervention29 avril 20101 17 juil. 2008 à 22:01
Dim myTable(3)
Dim myField0()
Dim myField1()
Dim myField2()
Dim myField3()
Dim i AS interger, j AS integer
i = 0
j = 0
With rs 'le nom de ton record set
if not .recordcount = 0 then
do while not .eof and not .bof
if not i = 0 then
redim preserve myField0(0 to i)
redim preserve myField1(0 to i)
redim preserve myField2(0 to i)
redim preserve myField3(0 to i)
end if
myField0(i) = .field(0).value
myField1(i) = .field(1).value
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 18 juil. 2008 à 00:15
@Zen69
On entamme jamais une boucle avec
do while not .eof and not .bof
Tu n' entreras jamais si tu es sur le premier Enr.
A supposer que tu étais sur le 2° et que tu entres
i=0
...
if not i = 0 then 'ce qui est faux au premier tour
redim preserve myField0(0 to i)
redim preserve myField1(0 to i)
redim preserve myField2(0 to i)
redim preserve myField3(0 to i)
end if
>Tes tableaux ne sont pas redimensionnés encore.
Et tu fais
myField0(i) = .field(0).value
myField1(i) = .field(1).value
myField2(i) = .field(2).value
...
Est-ce que ça c' est pas plus simple
Sub Remplir()
Dim myTable() As Variant
Dim i As Integer
With rs 'le nom de ton record set
If .Bof And .Eof Then Exit Sub
Redim Preserve myTable(.RecordCount-1,3)
.MoveFirst
i=0
Do While Not .Eof
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 18 juil. 2008 à 16:03
Dim l As Integer
For l = 0 To Adodc1.Recordset.RecordCount -1
If Text1(0).Text = myTable(l, 1) Then
Check1(0).Caption = myTable(l, 2)
End If
Next l
Tu te souviens qu' n a fait
ReDim Preserve myTable(.RecordCount - 1, 3)
Parceque tu commences à 0.Et dnc si tu as 3 enregistrements,
ton tableau sera redimentionné à (2,3)
0
1
2
)a fait 3 passages
Même chose pour le nombre de champs.
Pour 4 champs tu auras
Fields(0),Fields(1),Fields(2),Fields(3)
<hr />... Y'en a même qui disent qu'ils l'ont vu voler.
Stag2
Messages postés26Date d'inscriptionlundi 30 juin 2008StatutMembreDernière intervention22 juillet 2008 18 juil. 2008 à 16:43
En fait il y a un dernier petit probleme bizzard. Lorsque je sélectionne plusieurs prestations, la première est remplacée dans la base de donnée par la derniere.
ex:
Je sélectionne les prestations :
A
B
C
D
Apres avoir cliqué sur calculer, j'obtiens dans la base de donnée:
D (seul libelle_prestation est changé, pas les prix associées oO )
B
C
D
Ce doit être les histoires de passage byval & byref dans la création du tableau
Stag2
Messages postés26Date d'inscriptionlundi 30 juin 2008StatutMembreDernière intervention22 juillet 2008 18 juil. 2008 à 18:14
C'est dans le cadre d'une génération de devis automatique. J'évolue dans la création web. Si la personne veut un site marchand (prestation 1) + des animations flash (prestations 2) + référencement (prestation3) alors il faudrait sélectionner les trois :)
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 18 juil. 2008 à 18:27
et est-ce que le problème est au niveau du calcul de la somme des tarifs des prestations sélectionnées ou est-ce au niveau de l' enregistrement du devis ?
<hr />... Y'en a même qui disent qu'ils l'ont vu voler.
Stag2
Messages postés26Date d'inscriptionlundi 30 juin 2008StatutMembreDernière intervention22 juillet 2008 18 juil. 2008 à 19:19
Ni l'un ni l'autre. C'est juste qu'une fois que la table a été transformée en tableau, le premier élément du champs libelle_prestation est remplacé par le dernier de ce même champs dans la base de donnée.
Le programme n'a pas de probleme, c'est juste une valeure d'un champs de la base de donnée qui est modifié. Je pense qu'il s'agit du tableau.
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 18 juil. 2008 à 19:57
>>C'est juste qu'une fois que la table a été transformée en tableau,
le premier élément du champs libelle_prestation est remplacé par
le dernier de ce même champs dans la base de donnée.
J' essaye de comprendre:
1° je lie mon Ado à ma table order by prestation
2° je rempli ma dataliste order by prestation
3° je copie ma table dans mon tableau order by prestation
Matable MonTableau
A A
B B
C C
D D
MaListe MonTableau
A A
B B
C C
D D
Sinon t' es le seul à pouvoir découvrir le pourquoi
de la chose.
Si ça se trouve, c' est un truc de rien du tout :-)
Un index mal placé ou qq chose du genre.
Bonne continuation..
<hr />... Y'en a même qui disent qu'ils l'ont vu voler.
J'ai tenté de le mettre en ByVal, mais on est obligé de passer un array en ByRef :(
En faisant le tourner le code sur papier, je pense avoir compris le prob dans l'algo, mais je n'arrive pas a le résoudre:
1) On se positionne sur la premiere ligne de la table, K=0
On remplit,
K 0+11
On fait movenext
etc
etc
etc
Jusqu'a k =4 (la derniere ligne)
On remplit
La le code devrait s'arreter, mais on incrémente encore une fois K:
K=4+1=5
.MoveNext
Je pense que c'est a ce moment la que la premiere ligne est remplacée par la derniere. Il faudrait réinitialiser l'ensemble apres la boucle je pense.
LIBRE_MAX
Messages postés1402Date d'inscriptionmardi 1 mai 2007StatutMembreDernière intervention 7 octobre 20126 21 juil. 2008 à 19:22
Salut,
non cher ami :-)
If .BOF And .EOF Then Exit Sub
Est une façon de dire:
Si la table est vide, alors pas la peine de continuer.
En effet si une table est vide, le debut de fichier coincide
avec la fin de fichier.Ils sont tous deux vrais.
Le problème doit résider ailleurs donc !
Résumons:
Partie déclaration
Dim myTable As variant
Private Sub Form_Load
Redim Preserve myTable(0,0)
End Sub
Private Sub Remplir()
Redim Preserve myTable(0,0)
'A mon avis le probl_me réside ici.
En effet si le tableau a été remplt lors
d' un précédent appel,le fait de le rdimentionner
à 0 n' efface pas la 1° ligne pour autant.
Ce qu' il gfaut faire dnc c'est:
myTable(0,0)=""
myTable(0,1)=""
myTable(0,2)=""
myTable(0,3)=""
With Adodc1.Recordset
If .BOF And .EOF Then Exit Sub
ReDim Preserve myTable(.RecordCount - 1, 3)
.MoveFirst
k = 0
Do While Not .EOF