Exporter une table de bdd dans un tableau multidimensionnel [Résolu]

Signaler
Messages postés
26
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
22 juillet 2008
-
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
-
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






lblMin.Visible = True
lblMoy.Visible = True
lblMax.Visible = True
lblTitre2.Visible = True
   
Select Case List1.ListCount






Case "1"






    Text1(0).Visible = True
   
    For j = 0 To 2
    Check1(j).Visible = True
    Next j
   
Case "2"






    For i = 0 To 1
    Text1(i).Visible = True
    Next i
  
    For j = 0 To 5
    Check1(j).Visible = True
    Next j






Case "3"






    For i = 0 To 2
    Text1(i).Visible = True
    Next i
   
    For j = 0 To 8
    Check1(j).Visible = True
    Next j






Case "4"






    For i = 0 To 3
    Text1(i).Visible = True
    Next i
   
    For j = 0 To 11
    Check1(j).Visible = True
    Next j






Case "5"






    For i = 0 To 4
    Text1(i).Visible = True
    Next i
   
    For j = 0 To 14
    Check1(j).Visible = True
    Next j






Case "6"






    For i = 0 To 5
    Text1(i).Visible = True
    Next i






    For j = 0 To 17
    Check1(j).Visible = True
    Next j






End Select






    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
   
    cmdCalc.Refresh






End Sub






Private Sub Form_Load()

Dim i As Integer
Dim j As Integer






    lblMin.Visible = False
    lblMoy.Visible = False
    lblMax.Visible = False
    lblTitre2.Visible = False
   
        For i = 0 To 5
        Text1(i).Visible = False
        Next i






        For j = 0 To 17
        Check1(j).Visible = False
        Next j






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

25 réponses

Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
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.
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
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.
Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1
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

    myField2(i) = .field(2).value

    myField3(i) = .field(3).value
    i = i + 1
 loop


myTable(0) = myField0
myTable(1) = myField1
myTable(2) = myField2
myTable(3) = myField3

msgbox myTable(0)(1)

     

<hr size="2" width="100%" />  zen69 aka Ortho Le Profett
  [site web]
Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1
oups .movenext avant loop

<hr size="2" width="100%" />  zen69 aka Ortho Le Profett
  [site web]
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
@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
    
       myTable(i,0)=.Fields(0)
       myTable(i,1)=.Fields(1)
       myTable(i,2)=.Fields(2)
       myTable(i,3)=.Fields(3)
     
       i=i+1
     .MoveNext
    Loop
End With


End Sub






 





<hr />... Y'en a même qui disent qu'ils l'ont vu voler.
Messages postés
26
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
22 juillet 2008

Merci pour vos réponses. Je m'y mets et vous tiens au courant
++
Messages postés
26
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
22 juillet 2008

J'ai choisi de passer par un tableau:
Dim myTable() As Variant
Dim K As Integer

With Adodc1.Recordset
  If .BOF And .EOF Then Exit Sub
   ReDim Preserve myTable(.RecordCount - 1, 3)
   .MoveFirst
    k = 0
   Do While Not .EOF
    
       myTable(k, 0) = .Fields(0)
       myTable(k, 1) = .Fields(1)
       myTable(k, 2) = .Fields(2)
       myTable(k, 3) = .Fields(3)
     
       k = k + 1
     .MoveNext
    Loop
End With

Quand j'essaye de le parcourir à l'aide de ce code :

Dim l As Integer
For l = 0 To Adodc1.Recordset.RecordCount
If Text1(0).Text = myTable(l, 1) Then
Check1(0).Caption = myTable(l, 2)
End If
Next l

 
J'ai une erreur a la ligne If text1(0).text = mytable(l , 1) Then

"Subscribe out of range"
Je ne comprends pas pourquoi. Si quelqu'un avait eu un problème similaire, ou en connaitrait la raison, ca m'aiderait.

Cdt,
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
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.
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
et ajoutes un Exit For .Pas la peine de continuer quand tu trouves.

For l = 0 To Adodc1.Recordset.RecordCount -1
If Text1(0).Text = myTable(l, 1) Then
Check1(0).Caption = myTable(l, 2)
Exit For
End If
Next l

<hr />... Y'en a même qui disent qu'ils l'ont vu voler.
Messages postés
26
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
22 juillet 2008

Ca marche parfaitement. Je n'avais jamais eu de réponse aussi clair et détaillée sur un forum. Merci +++
Messages postés
26
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
22 juillet 2008

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
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
j' avoue ne pas comprendre le fait que tu sélectinnes plusieurs prestations à la fois !
<hr />... Y'en a même qui disent qu'ils l'ont vu voler.
Messages postés
26
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
22 juillet 2008

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 :)
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
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.
Messages postés
26
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
22 juillet 2008

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.
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
>>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.
Messages postés
26
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
22 juillet 2008

J'ai fais quelques tests et le problème vient du tableau et de sa déclaration:

With Adodc1.Recordset
If .BOF And .EOF Then Exit Sub
ReDim Preserve myTable(.RecordCount - 1, 3)
.MoveFirst
k = 0
Do While Not .EOF

myTable(k, 0) = .Fields(0)
myTable(k, 1) = .Fields(1)
myTable(k, 2) = .Fields(2)
myTable(k, 3) = .Fields(3)

k = k + 1
.MoveNext
Loop
End With

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.
Messages postés
26
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
22 juillet 2008

En fait c'est peut etre cette ligne :
If .BOF And .EOF Then Exit Sub
Il n'y a pas de End If et cela n'est pas détecté par le compilateur.
Messages postés
26
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
22 juillet 2008

J'ai trouvé le problème, c'était bien cette ligne la fautive:
If .BOF And .EOF Then Exit Sub

With Adodc1.Recordset
If Not .BOF And .EOF Then <= Changé
ReDim Preserve myTable(.RecordCount - 1, 3)
.MoveFirst
k = 0
Do While Not .EOF

myTable(k, 0) = .Fields(0)
myTable(k, 1) = .Fields(1)
myTable(k, 2) = .Fields(2)
myTable(k, 3) = .Fields(3)

k = k + 1
.MoveNext
Loop
End If
Exit Sub
End With

En tout cas merci pour ta patience Libre_Max
++
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
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
    
       myTable(k, 0) = .Fields(0)
       myTable(k, 1) = .Fields(1)
       myTable(k, 2) = .Fields(2)
       myTable(k, 3) = .Fields(3)
      
       k = k + 1
     .MoveNext
    Loop
End With


End Sub




Et l' appel se fera donc lors du Click sur la listE


 Call Remplir


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