| |||||
| Dernière réponse | |
|---|---|
| Sujet : [VB] un recordset qui merde.... | |
| thegti | 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] |
| Aperçu |
|---|
| Vue Rapide de la discussion |
|---|
| thegti | 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] |
| trictrac | 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... |
| thegti | 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 |
| mid | 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? |
| trictrac | 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... |
| thegti | Pourquoi sous VB vous utiliser DAO ?
Ce vieux truc a été remplacé depuis longtemps par ADO |
| tom64 | 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 |
| trictrac |
|
| godbout | 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 |
| tom64 | 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 |
| thegti | 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 |
| trictrac | 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??) |
| godbout | 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:D:p Merci a Waybee en passant |
| trictrac | 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 :-( |
| trictrac | 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 |
| tom64 | 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 |
| thegti | Hummm
Je parirais pour un * dans la requête Non ? |
| tom64 | tu peux me montrer ton code source? |
| trictrac | 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 |
| tom64 | :??: 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 |
| trictrac | 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. |




