je veux réaliser une requête qui permet d'afficher le nom de la marque suivant code_marque. j'utilise vb6.
voici mon essai
Rs3.Open "select * from marques ", cnn, adOpenKeyset, adLockOptimistic
If Rs3.RecordCount > 0 Then
i = 1
Rs3.AbsolutePosition = 1
MSFlexGrid1.Rows = 1
Do While Not Rs3.EOF
MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
c = Rs3.Fields("nom_marque")
i = i + 1
Rs3.MoveNext
Loop
End If
Rs.Open "select * from serveur", cnn, adOpenKeyset, adLockOptimistic
If Rs.RecordCount > 0 Then
i = 1
Rs.AbsolutePosition = 1
MSFlexGrid1.Rows = 1
Do While Not Rs.EOF
MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
MSFlexGrid1.TextMatrix(i, 1) = Rs.Fields(0)
MSFlexGrid1.TextMatrix(i, 2) = Rs.Fields(1)
MSFlexGrid1.TextMatrix(i, 3) = c
MSFlexGrid1.TextMatrix(i, 4) = Rs.Fields(3)
i = i + 1
Rs.MoveNext
Loop
End If
Rs.Close
rs3.close
le probléme c'est que dans l'exécution le champ nom marque est vide
Première précaution : Supprime tous les "On Error Resume Next" présents dans ton code : ils masquent les erreurs réelles. A n'utiliser que dans certains cas précis.
De quels types sont tes objets cnn, Rs, rs3; comment sont-ils déclarés ?
As-tu suivi ton programme pas-à-pas pour vérifier, par exemple, ce que renvoie .RecordCount ?
Débogage :
- F9 sur une ligne de code
Le programme s'y arrêtera au prochain passage
Survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape
? maVariable
pour qu'elle s'inscrive dans la fenêtre.
- F8 (VB6) ou F10 (.Net) pour avancer d'une ligne de code
- F5 pour continuer normalement
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
La prochaine fois, merci d'utiliser la coloration syntaxique (3ème icone à droite) pour coller ton code = plus facile à lire + conserve les indentations en début de ligne.
Option Explicit
Dim Rs As New ADODB.Recordset
Dim Rs3 As New ADODB.Recordset
Public cnn As New ADODB.connection
Private Sub Form_Load()
Rs3.Open "select * from marques ", cnn, adOpenKeyset, adLockOptimistic
If Rs3.RecordCount > 0 Then
i = 1
Rs3.AbsolutePosition = 1
MSFlexGrid1.Rows = 1
Do While Not Rs3.EOF
MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
c = Rs3.Fields("nom_marque")
i = i + 1
Rs3.MoveNext
Loop
End If
Rs.Open "select * from serveur", cnn, adOpenKeyset, adLockOptimistic
If Rs.RecordCount > 0 Then
i = 1
Rs.AbsolutePosition = 1
MSFlexGrid1.Rows = 1
Do While Not Rs.EOF
MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
MSFlexGrid1.TextMatrix(i, 1) = Rs.Fields(0)
MSFlexGrid1.TextMatrix(i, 2) = Rs.Fields(1)
MSFlexGrid1.TextMatrix(i, 3) = c
MSFlexGrid1.TextMatrix(i, 4) = Rs.Fields(3)
i = i + 1
Rs.MoveNext
Loop
End If
Rs.Close
Rs3.close
end sub
j'ai suivi le programme, mais toujours le champ nom marque est vide !!
pouvez-vous m'aider ?!
1)Pourquoi faire 2 SELECT totalement indépendants, nom_marque devant nécessairement être inclue dans les 2 tables, rajoutes une clause WHERE.
2) Est-il normal que tu remplisses la même Grid ?
3) Evites d'utiliser MSFlexGrid qui n'est pas DataBound, utilises pour les cas simples la DataGrid et pour les plus complexes MSHFlexGrid. Pour les 2 tu fais
Set maGrid.DataSource = mon_Recordset
au lieu de faire une itération qui prend du temps.
Enfin, as-tu fait comme le disait Jack à l'aide de la touche F9 et cie. Si oui, donne-nous le résultat avec précision (ligne, valeur de variable, etc...)
Oui, quelle est la valeur de .RecordCount après chaque requète ?
Remarques anodines qui ne sont pas source d'erreur :
- A quoi sert ta variable 'i' ?
- .AbsolutePosition : je ne connais pas. Essaye d'utiliser le simple .MoveFirst
- Pour alléger la relecture de ton code, tu peux remplacer
Rs.Fields(1)
par l'une de ces syntaxes, plus lisibles
Rs.Fields("le nom du champ").Value
Rs![le nom du champ]
- Pour éviter de créer mille variables, tu peux réutiliser le même RecordSet pour chaque requète, suffit de lui faire un .Close avant de le réutiliser.