un recordset qui merde.... [VB] - Programmation
Marsh Posté le 20-04-2001 à 10:04:15
est ce ke tu fais un refresh dès le début??
si tu commences en plein milieu de ta table, au bout d'un moment, tu arrives à la fin. donc là normalement tu a fait un refresh, mais comment il sait ke tu as finit?? il fait peut être une traversée de la table entière; soit donc une la "demi-traversée" (selon où tu l'a fait partir) puis le parcours total de la table
Marsh Posté le 20-04-2001 à 10:07:52
pas bien compris ta reponse, donc je reexplique:
J'ai une tablt avec 10 champc: c1, c2, .., c10.
Je sors un recordset de cette table, et si l'exploitation est du type
xxxx = record!c1
xxxx = record!c2
xxxx = record!c3
xxxx = record!c4
xxxx = record!c5
xxxx = record!c6
xxxx = record!c7
xxxx = record!c8
xxxx = record!c9
xxxx = record!c10.... ca marche bien
xxxx = record!c9
xxxx = record!c10
xxxx = record!c6
xxxx = record!c4
xxxx = record!c1
xxxx = record!c3
xxxx = record!c5
xxxx = record!c2
xxxx = record!c8
xxxx = record!c7.... ca marche pu bien, meme carrement pas
Marsh Posté le 20-04-2001 à 10:15:59
g déjà eu une erreur comme ça à cause d'une * ki était collée à mon from.
mais en fait, avec un filtre, y a plus besoin de select * from
Marsh Posté le 20-04-2001 à 10:28:54
Voici le code source.....attention les yeux PS: je suis pres a repondre instantanement a toutes les kestions dans la mesure ou ca fais avvancer mon pb
Private Sub p_table_Click()
If modifier = True Then 'si on est en modification
Form3.Show 'attention, form3 cree sa propore connection et ecrase les anciens records
'etablissement de la connection
connection
'recherche du materiel selectionne
requete record, "select * from _materiel where id_materiel = " & p_table.TextMatrix(p_table.Row, 0)
'ouverture de la form3 et initialisation de tous les champs
Form3.nouveau = False
Form3.modifier = True
Form3.p_bnumber = record!bnumber
Form3.p_bnumber.Enabled = False
Form3.p_cout = record!cout
Form3.p_date_deb = record!date_rep_debut
Form3.p_date_fin = record!date_rep_fin
Form3.p_divers = record!divers
Form3.p_harddisk = record!harddisk
Form3.p_localisation = record!localisation
Form3.p_processeur = record!processeur
Form3.p_marque = record!marque
Form3.p_modele = record!model
Form3.p_ram = record!ram
Form3.p_reference = record!reference
Form3.p_kind.ListIndex = RTrim(record!Kind)
Form3.p_ip1 = record!ip1
Form3.p_ip2 = record!ip2
Form3.p_ip3 = record!ip3
Form3.p_ip4 = record!ip4
Form3.p_mac1 = record!mac1
Form3.p_mac2 = record!mac2
Form3.p_mac3 = record!mac3
Form3.p_mac4 = record!mac4
'JAURAIS VOULU RAJOUTER ICI LES DEUX DERNIERS CHAMPS; POUR ETRE HOMOGENE DANS LE CODE
If Not IsNull(record!id_user) Then 'si un utilisateur est defini
For Index = 0 To Form3.p_id_user.ListCount - 1 'pour toutes les lignes de la combo box
'si l'item data correspond a l'ID de l'user alors...
If Form3.p_id_user.ItemData(Index) = RTrim(record!id_user) Then
'on affcihe ce user
Form3.p_id_user.ListIndex = Index
Exit For
End If
Next
Form3.p_id_departement.Enabled = False 'on interdit la modification du departement
End If
'idem avec la combo box des factures
For Index = 0 To Form3.p_id_facture.ListCount - 1
If Form3.p_id_facture.ItemData(Index) = RTrim(record!id_facture) Then
Form3.p_id_facture.ListIndex = Index
Exit For
End If
Next
Form3.p_id_facture.Enabled = False
Form3.p_os = record!os
If record!Status = 0 Then 'evaluation du status pour affichage
Form3.p_status1 = True
ElseIf record!Status = 1 Then
Form3.p_status2 = True
ElseIf record!Status = 2 Then
Form3.p_status3 = True
Else: Form3.p_status1 = True
End If
'a cloner sur record?
Dim rec As adodb.Recordset
Set rec = New adodb.Recordset
rec.ActiveConnection = connection1
'remplissage de la combobox avec tous les departements ayant une cle pour ce materiel
requete rec, "select _utilise.id_departement, nom_departement from _utilise,_departement where _utilise.id_departement = _departement.id_departement and id_materiel = " & p_table.TextMatrix(p_table.Row, 0)
With rec
.MoveFirst
Form3.p_id_departement.Clear
Do While Not .EOF
Form3.p_id_departement.AddItem RTrim(!nom_departement)
Form3.p_id_departement.ItemData(Form3.p_id_departement.NewIndex) = .Fields(0)
.MoveNext
Loop
End With
'recherche du departement responsable
requete rec, "select _utilise.id_departement, nom_departement from _utilise,_departement where _utilise.id_departement = _departement.id_departement and id_materiel = " & p_table.TextMatrix(p_table.Row, 0) & " and _utilise.est_responsable = 1"
If IsNull(record!id_user) Then 's'il existe, on l'affiche
For Index = 0 To Form3.p_id_departement.ListCount - 1
If Form3.p_id_departement.ItemData(Index) = RTrim(rec.Fields(0)) Then
Form3.p_id_departement.ListIndex = Index
Exit For
End If
Next
Form3.p_id_user.Enabled = False
End If
Form3.p_ou_rep = record!ou_rep |Voici les champs incriminé
Form3.p_type = record!Type |
Form6.Hide
deconnection
ElseIf attribuer = True Then
Form6.Hide
Form5.Show
Form5.WindowState = 2
Else
MsgBox msg4
End If
End Sub
Merci
Marsh Posté le 20-04-2001 à 10:32:10
Dans la mesure ou on parle exploitation de recordset, comment fait on pour pour exploiter une requete sur plusieur table sans passer par la propriete .fields():
record!table.champ ne marche po :-(
Marsh Posté le 20-04-2001 à 10:48:19
Eh c'est marrant Trictrac je fais la meme chose que toi sauf que dans ma boite personne ne vole plus haut que les macros access !!
Encore heureux que j'ai de l'aide sur le net D
Merci a Waybee en passant
Marsh Posté le 20-04-2001 à 11:11:48
Tu fais aussi ton stage pour l'iut a nancy me semble-t-il
???
C'est koi exactement le libelle de ton stage, tu m'interresse (langage utilise??)
Marsh Posté le 20-04-2001 à 11:14:07
Enlève l'étoile de la requête et remplace par les noms des champs dont tu a besoin
record!table.champ ne marche pas parce que la syntaxe c'est record!champ
Une requête sur plusieurs tables n'est "vu" que comme une table à la sortie
Quand ton * inclu deux noms de hamps identiques mais provenant de deux tables différentes et bah à la sortie tu n'aura plus ton champ
De toute facon, le * est à déconseiller
Marsh Posté le 20-04-2001 à 11:31:54
Pour faire une requête, g modifié une fonction onnée en exempe dans msdn
Function Filtre(EnregTempo As Recordset, Element As String, CodeSaisi As String) As Recordset
' Définit un filtre pour l'objet Recordset indiqué,
' puis ouvre un nouvel objet Recordset.
EnregTempo.Filter = Element & " = '" & CodeSaisi & "'"
Set Filtre = EnregTempo.OpenRecordset
End Function
essai donc de passer par un filtre.
ensuite dans ton source, ça donne ça:
' Ouvre un objet Recordset filtré : où le code de la table Articles est égal au code saisi
Set EnregCode = Filtre(Base_de_donnees_helios.Recordset, "REFERENCE", Code)
With Base_de_donnees_helios.Recordset
' Edite le nombre d'enregistrements pour l'objet Recordset original
' et pour l'objet Recordset filtré.
' Enumère le Recordset.
Message = "CODE = " & Txt_num_piece.Text & vbCr & "Commandes dans le Recordset original : " & Indice & vbCr & "Commandes dans le Recordset filtré : " & EnregCode.RecordCount
MsgBox Message
.Close
End With
ça c le prog ke g fait moi. essai de l'adapter au tien.
et surtout n'oublie pas de faire des refresh
Marsh Posté le 20-04-2001 à 11:38:37
Ben je suis a Luneville en fait
Je dois faire une base pour pouvoir rentre des documents et faire une rechercher dessus, les ouvrir et tout et tout.
Je fais du vba, et pis la je me met a voir tout ce qui est ado, dao etc...
D'ailleurs si quelqu'un sait comment faire un record sur un champ d'un formulaire
Explication:
Dim MyDB As Database
Dim MyRst As DAO.Recordset
Dim MyVar As String
Set MyDB = CurrentDb
MyVar = "SELECT Document.numident, Document.nomredac FROM Document WHERE Document.nomredac Like 'alain*';"
Set MyRst = MyDB.OpenRecordset(MyVar)
MyRst.MoveLast 'Charge complètement l'objet
A la place de alain je voudrais mettre un truc du genre [Forms]![Rechercher des documents]![controle]
thx
Marsh Posté le 20-04-2001 à 11:51:50
Tom64 a écrit a écrit : et surtout n'oublie pas de faire des refresh |
Pourkoi?? ca fais koi les refresh surun record set
Marsh Posté le 20-04-2001 à 12:09:34
déjà, il faut verifier ke ta table contient un élément.
le refresh permet de mettre le "pointeur" de la table sur le premier élément de celle-ci.
moi g vérifier le record.count en faisant un record.last puis après fait un refresh pour revenir au début.
now je me rend compte ke pour ton cas, ce n'est pas nécessaire. mais bon, essai toujours
Marsh Posté le 20-04-2001 à 13:03:56
Pourquoi sous VB vous utiliser DAO ?
Ce vieux truc a été remplacé depuis longtemps par ADO
Marsh Posté le 20-04-2001 à 13:11:38
jutilise un recordset ADODB, et non DAO...
Ou alors je n'est pas compris ta remarque...
PS: ODBC exclus, car trop de contraintes liées au poste...
Marsh Posté le 20-04-2001 à 13:24:39
Moi je met toujours des [] : record![nomdechamps]
J'ai jamais de problème d'ordre et j'utilise souvent *.
Est-tu sure d'avoir des noms pour tous les champs?
Marsh Posté le 20-04-2001 à 13:47:59
Ok ok
Non parce que le refresh c'est en DAO que c'est utile
En ADO, tu choisit le bon type de recordet ca suffit
Et pis y'a pas de propriété Count, c'est RecordCount, à utiliser avec prudence d'ailleurs.
Bon de toute facon, les * ca fout la merde j'ai déjà eut des bugs avec
Et sinon utilise les propriétés standard notamment Fields
Marsh Posté le 20-04-2001 à 14:00:45
le probleme avec les fields(), c'est pour la maintenance, car si qqun rajoute un champs, ca peut foutre la merde... et sur ma table de 25+ champs, ca devient vite assez bordelique...
Marsh Posté le 20-04-2001 à 14:11:35
Deux possibilités avec la propriété Fields:
- Fields(index)
-> index: position du champ dans le recordset
- Fields(NomduChamp)
-> équivalent à ton ! et mettre le nom du champ entre "
Méthode 1 est plus rapide en terme d'éxécution (pas de recherche de nom de champ dans le recordset)
Méthode 2 plus lente
Et de plus, je te précise que si quelqu'un rajoute un champ dans les deux cas y'a pas de souci, sauf avec l'utilisation du *
T'as essayé en virant le * ?
Moi je bosse depuis peu, mais sur des grosses tables et déjà deux ou trois merdes avec le *
[edit]--Message édité par thegti--[/edit]
Marsh Posté le 20-04-2001 à 09:46:13
j'ai un recordset que j'appele record, que j'utilise de la maniere record!nom_du_champ, et j'aurais voulu savoir omment ca se fait que lorsque je n'exploite pas les records dans l'ordre de la table, j'ai des erreur aleatoires, parfois une, puis une autre...et ca se resout lorsque je les exploite dans l'ordre
PS: dans l'ordre, ca ne me convient pas au niveau du code.