Listview et Access, Chercher l'erreur !

Résolu
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 - 14 déc. 2008 à 03:26
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 - 25 déc. 2008 à 18:27
Bonjour a tous
J'ai besoins d'un coup de mains car je rame depuis un moment sur ce qui suis :
j'aimerais pouvoir modifier une base de données existante déjà lourde,
J'utilise trois base.mdb différentes mais un seul listview à la fois
Il faut que mon système d'enregistrement soit compatible entre les 3 .mdb qui n'ont pas les mêmes champs !

' -------------------------------------------------------------
' Set DB = OpenDatabase(StatusBar1.Panels(1).Text)
' Set MaBase = DB.OpenRecordset(ListTables)
' ChampsAModifier = la ligne qui a été modifier ou créer
' Tables_Champs = listview
' -------------------------------------------------------------
If ChampsAModifier = 0 Then Exit Sub ' Si on n'a rien changer, on annule
On Error GoTo Erreur
Dim B As Long, C As Long, I As Integer
Dim LesChamps(50) As String

For I = 1 To Tables_Champs.ColumnHeaders.count ' On charge les Champs
LesChamps(I) = Tables_Champs.ColumnHeaders(I).Text
Next

Set DB = OpenDatabase(StatusBar1.Panels(1).Text)
Set MaBase = DB.OpenRecordset(ListTables)

With MaBase
For B = 1 To Tables_Champs.ListItems.count ' Parcourir les items
.AddNew ' Nouveau ...
.LesChamps(B) = Tables_Champs.ListItems(B).Text' Écrire le contenu de l'item
For C = 1 To Tables_Champs.ColumnHeaders.count - 1 ' Parcourir les SubItems
.LesChamps(C) = Tables_Champs.ListItems(B).SubItems(C) ' Enregistrer leurs contenu
Next C
.Update
Next B
End With

La syntaxe ".LesChamps(C)" crée une erreur ! m'en voulez pas mais je suis débutant et à force de lire des tonnes de doc, je sais plus ou j'en suis !
D'avance, merci !

7 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 déc. 2008 à 18:38
salut,

tu devrais avoir le bon raisonnement ci-dessus = > ADO, listview, comptage des colonnes et lignes



<hr />
'    AJOUT HEADERS ET/OU ENREGISTREMENTS DANS UNE LISTVIEW VIA LECTURE
D'UNE TABLE/BDD
'    http://www.codyx.org/snippet_ajout-headers-ou-enregistrements-dans-listview-via-lecture_498.aspx#1576
'    Posté par [ Exploreur ] le 25/11/2007
<hr />




Public Function 
FillListViewFromAdoCnx(
ByRef

CnxAdo
As
ADODB.Connection, MyLv
As
ListView,
ByVal
sSql
As String
,
Optional ByVal
bHeader
As Boolean
=
True
,

Optional ByVal
lFirstRow

As Long
=
1
,
Optional
ByVal
lLastRow
As Long

=
0
)
As Boolean


'******************************************************************************


'*    Fonction remplissage de colonnes (headers / nom des
tables)  et des    *


'*          champs avec
"LIMIT"  définissable dans ListView à partir         *


'*                          d'une Connexion
ADO  active                      *


'*                                                                          
*


'*    -----------------------                            
                    *


'*  -Ajout Référence projet
: Microsoft ActiveX Data Objects 2.5  Library    *


'*  -Ajout composant        :  Microsoft Windows Common controls
6.0        *


'*    -----------------------                                      
          *


'*                                                                          
*


'*  ------------                                                            
*


'*  Utilisation
:                                                            *


'*  ------------                                                            
*


'* les 5
premiers  :                                                       
*


'*      FillListViewFromAdoCnx CnxAdo,
ListView1, Sql, , 1,  5               *


'                                                  
                          *


'* les 5
seconds  :                                                          *


'*      FillListViewFromAdoCnx CnxAdo, ListView1, Sql, ,
6,  10              *


'                                                       
                     *


'* du 11è à la
fin  :                                                        *


'*      FillListViewFromAdoCnx CnxAdo, ListView1, Sql, ,
11,  0              *


'                                                         
                   *


'* tous sans
Header  :                                                      *


'*      ListView1.ColumnHeaders.Add , ,
"champs  1"                          *


'*      ListView1.ColumnHeaders.Add , ,
"champs  2"                          *


'*      FillListViewFromAdoCnx  CnxAdo, ListView1, Sql,
False                *


'                                                                    
        *


'******************************************************************************


    ' init

    FillListViewFromAdoCnx = False
    
    ' cnx
inexistante?
    If CnxAdo Is Nothing Then
        Exit Function
    ElseIf Not (CnxAdo.State = adStateOpen)
Then
        Exit Function
    End If
    
    '
sql  vide?
    sSql = Trim$(sSql)
    If LenB(sSql) = 0 Then Exit Function
    
    '
logique  rows
    If lFirstRow < 0 Then
        Exit Function
    ElseIf lLastRow < 0 Then
        Exit Function
    ElseIf (lLastRow > 0) And (lLastRow < lFirstRow)
Then
        Exit Function
    End If
    '  variables
    Dim i       As Long
    Dim j       As Long
    Dim RstAdo  As New ADODB.RecordSet
    Dim Itmx    As ListItem
    
    ' init Listview
    If bHeader Then MyLv.ListItems.Clear:
MyLv.ColumnHeaders.Clear
    MyLv.Visible = False
    
    On Error GoTo Lbl_Err
    ' Paramètres  RecordSet et lancement de la
requête
    RstAdo.CursorLocation = adUseClient
    RstAdo.Open sSql, CnxAdo, adOpenDynamic,
adLockPessimistic
    ' Si il n'y a pas de  champs
on ne fait rien
    If RstAdo.Fields.Count > 0 Then
        '  header
        If bHeader Then
            ' on affiche
forcément toutes les colonnes puisque  c'est la requête qui prévoit le
retour
            For i = 0 To RstAdo.Fields.Count - 1
                 MyLv.ColumnHeaders.Add , ,
RstAdo.Fields(i).Name
            Next i
        End If
        
        '
champs.  attention!! si pas de header, il faut évidemment que la listview ait
été  préparée avant!
        If RstAdo.RecordCount > 0 Then
            ' 1er champ zéro
=  aucun champs
            If lFirstRow > 0 Then
                ' dernier
champ  zéro tous, trop grand> on réduit
au  dernier
                If (lLastRow = 0) Or (lLastRow > RstAdo.RecordCount) Then
lLastRow = RstAdo.RecordCount
                ' ajoute
                RstAdo.Move lFirstRow - 1
                For i = lFirstRow - 1 To lLastRow - 1
                    Set Itmx = MyLv.ListItems.Add(, ,
CStr(RstAdo.Fields(0).Value))
                    For j = 1 To RstAdo.Fields.Count - 1
                        Itmx.SubItems(j) = IIf(LenB(RstAdo.Fields(j).Value) > 0, RstAdo.Fields(j).Value,
vbNullString)
                    Next j
                    ' passe à
l'enregistrement  suivant
                    If Not RstAdo.EOF Then RstAdo.MoveNext
                Next i
                ' pas d'erreur
                FillListViewFromAdoCnx = True
            Else
                ' pas de
champs  mais pas d'erreur pour autant
                FillListViewFromAdoCnx = True
            End If
        Else
            ' pas d'erreur
            FillListViewFromAdoCnx = True
        End If
    End If
' gestion d'erreur  s'il y en a eu
Lbl_Err:
    If Not (Err.Number = 0) Then
        FillListViewFromAdoCnx = False
        Err.Clear
    End If
    
    MyLv.Visible = True
    
    '
destruction  objets
    RstAdo.Cancel
    If Not (RstAdo.State = adStateClosed)
Then RstAdo.Close
    Set RstAdo = Nothing
    Set Itmx = Nothing
End Function





'----------------------------------------------------------------



'Remarques :


'permet d'initialiser une listview d'après une requête et une
cnx/bdd active





++

<hr size ="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
25 déc. 2008 à 16:47
salut,

t'essayes de toute faire à la fois sans maitriser, pour déboguer çà risque de prendre des années ^^

tu testes, si nom différent tu quittes.
ok mais tu ne quittes pas ta sub pour autant, la suite va s'exécuter.
ceci se teste en PAS à PAS (F8)

petite modif donc :


# If ModifMDB.Caption = " Nouvelle Fiche ...." Then

# '
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

# 'ajout des données dans la table

# '
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

#   MaBase.AddNew

#   For I = 1 To X

#      MaBase.fields(LblEtiquet(I).caption).value = IIf(IsNull(TxtDonnées(I).Text), "", (TxtDonnées(I).Text))

#    Next I

#  MaBase.Update

#  End If

# Unload Me ' retour à la feuille principale (listView et Menu)

'et on suppose qu'il n'y a plus de code après

mais tu devrais consulter les tutos ou prendre un bon bouquin pour noël
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 déc. 2008 à 08:36
salut,

commence par regarder du côté de ADO (et non DAO)

un exemple ici :
http://www.codyx.org/snippet_connexion-base-donnees-access_107.aspx#1907

ps : regarde aussi l'instruction REDIM pour le tableau. là tu bloques à 50 sans savoir si tu auras plus ou moins de 51 champs...

++

<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 déc. 2008 à 08:39
oups ah et j'avais pas vu .... :


Dim LesChamps(50) As String

(...)
With MaBase

(...)
        .LesChamps(B) = (...)




forcément tu as une erreur, tu utilises ton tableau comme s'il était MEMBRE de ton recordset...

<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 1
14 déc. 2008 à 15:32
Bonjour,

Merci d'avoir répondu...

Trops débutant en la matière, je ne sais pas comment faire même avec une seule table !
Et là je suis bloqué ! Zut alors !
0
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 1
25 déc. 2008 à 12:37
bonjour,
Après des déboires avec internet, je remercie PCPT Mais hélàs, je n'ai toujours pas réussi à comprendre comment faire !
Remplir les colonnes du listview, sa j'y arrive très bien! y ajouter des données aussi !
mais enregistrer les dites données dans ma base sa c'est un bloquage parfait !
je sais que je n'aurais au max qu'une dizaine de champs sur 2 ou 3000 lignes
mais comme mes trois bases n'ont pas les même champs comment enregistrer les dit champs de la base ouverte ! (une seule ouverte a la fois)
J'ai essayé sa aussi:

# If ModifMDB.Caption <> " Nouvelle Fiche ...." Then
# Unload Me ' retour à la feuille principale
# End If
# ' >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# 'ajout des données dans la table
# ' >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# MaBase.AddNew
# For I = 1 To X
# MaBase![LblEtiquet(I).caption] = IIf(IsNull(TxtDonnées(I).Text), "", (TxtDonnées(I).Text))
# Next I
# MaBase.Update

# Unload Me ' retour à la feuille principale (listView et Menu)

LblEtiquet(I).caption contient le nom du champs dans sa colonne
TxtDonnées(I).Text contient lui les données !
C'est plus un coups de pouce, mais une vrai leçon qu'il me faudrait !
0
Galactus13 Messages postés 335 Date d'inscription lundi 29 septembre 2008 Statut Membre Dernière intervention 16 août 2023 1
25 déc. 2008 à 18:27
Lol! Pour le bouquin Ado et Access, j'y suis depuis le début du mois !
Rien que pour sa et le fonctionnement de la listview !
# MaBase.addNew
# For I=1 to X
# MaBase.fields(LblEtiquet(I).caption).value = IIf(IsNull(TxtDonnées(I).Text), "", (TxtDonnées(I).Text))

- J'avais testé sa aussi, mais sa ne marchait qu'en boitant car cela modifiait le dernier enregistrement et n'ajoutait pas mon enregistrement!!!
Et je viens de me rendre compte de l'erreur !
<< For I 1 >> alors que j'aurais du faire << For I 0 >> !
(Le premier Champs passait à la trappe!) Sa crevait mes yeux !

Grand merci, sa m'enlève déjà une grosse épine !
J'espère que la modification d'une fiche sera plus facile car je n'oublierais pas ce fichu Zéro ! c'est dur d'apprendre à mon age !
0
Rejoignez-nous