[VB] un recordset qui merde....

un recordset qui merde.... [VB] - Programmation

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.

Reply

Marsh Posté le 20-04-2001 à 09:46:13   

Reply

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

Reply

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

Reply

Marsh Posté le 20-04-2001 à 10:11:30    

tu peux me montrer ton code source?

Reply

Marsh Posté le 20-04-2001 à 10:12:17    

Hummm
Je parirais pour un * dans la requête
Non ?

Reply

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

Reply

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

Reply

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 :-(

Reply

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:D:p
 
Merci a Waybee en passant

Reply

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??)

Reply

Marsh Posté le 20-04-2001 à 11:11:48   

Reply

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

Reply

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

Reply

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

Reply

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

Reply

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

Reply

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

Reply

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

Reply

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?

Reply

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

Reply

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

Reply

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]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed