IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

POO + DAO : Mettre en oeuvre schéma > Formulaire - Collections - Classes - Base de données [AC-2016]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2016
    Messages : 12
    Par défaut POO + DAO : Mettre en oeuvre schéma > Formulaire - Collections - Classes - Base de données
    Bonjour à tous,

    J'aimerais, pour le compte d'une association, développer un petit applicatif autour d'Access et Excel.
    Je cherche à afficher dans un formulaire les données issues à partir d'une base de données ACCESS (2013 - 2016).
    Il est vrai que cela fait quelques années que je n'ai pas codé... et surtout les techniques ont changé et j'aimerais me mettre à niveau...

    Bref, pour afficher les données dans le formulaire, je souhaite faire de la programmation orientée objet (POO), utiliser les classes et les collections et les instructions DAO pour interroger la base.
    J'utilise une base de données Access :
    - Table 'Persons' avec quelques champs : IDPerson, Prenom, Nom... Actif, En mission...

    Dans mon code VBA, j'ai crée la classe Person et la collection Persons.
    Je me suis inspiré du tutoriel de Michel BLAVIEN (que je remercie au passage) : Access : Modules de classes
    Cela fonctionne très bien avec des données statiques saisies dans le code...

    Maintenant j'aimerais passé à la seconde étape : récupérer les données Access et implémenter mes objets Person et Persons.
    Pour cela j'ai trouvé un autre tuto : http://codevba.com/help/Generate_class_from_table.htm

    Avant d'aller plus loin, j'aimerais comprendre le schéma : Formulaire - Collections - Classes - Base de données
    Comment à partir du formulaire interroger la base de données et implémenter les différents objets ?
    J'ai cru comprendre que dans la philosophie POO il n'y a pas de requête au niveau de interface 'Formulaire' mais au niveau des classes et collections.

    Donc dans mon formulaire lors que j'implémente mon objet Persons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ' On crée la collection d'adherents
        Set colAdherents = New Persons
    Les requêtes de la base se font au niveau de la collection (ensemble des persons) ou au niveau de la class Person

    Merci de votre aide
    Marc

  2. #2
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2016
    Messages : 12
    Par défaut
    Je vais préciser d'avantage ma question.

    Dans mon formulaire j'ai le code suivant pour implémenter l'objet colAdherents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Option Explicit
     
    Dim WithEvents oAdherent As Person          ' Objet Person
    Dim colAdherents As Persons                 ' Collection de Persons
     
    Private Sub UserForm_Initialize()
    ...
        ' On crée la collection d'adhérents
        Set colAdherents = New Persons
    ...
    End Sub
    Private Sub UserForm_Terminate()
       ' Libère les instances de classe utilisées
       Set colAdherents = Nothing
    End Sub
    J'ai la collection 'Persons' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Option Explicit
    Private Rs As DAO.Recordset              'Requete à la base Access
    Private mcolPersons As Collection
     
    Private Sub class_Initialize()
        Debug.Print "Collection Persons - class_Initialize"
        Set mcolPersons = New Collection
    End Sub
     
    Private Sub class_Terminate()
        Debug.Print "Collection Persons - class_Terminate"
        If Not (mcolPersons Is Nothing) Then Set mcolPersons = Nothing
    End Sub
    et la classe objet 'Person'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    Option Explicit
    Private Rs As DAO.Recordset              'Requete à la base Access
     
    Private mintIdPerson As Integer          'Nom de la Personne
    Private mstrNom As String                'Nom de la Personne
    Private mstrPrenom As String             'Prénom de la Personne
     
    Private mblnLoaded As Boolean               'est vrai lorsque les données sont chargées
    ...
     
    Private Sub class_Initialize()
        Debug.Print "Objet Person - class_Initialize"
        ' On récupère les données de la base : Table Adhérents
     
        Dim strSQL As String
     
        strSQL = "Adherents"             ' Tous les adhérents
        Set Rs = oDb.OpenRecordset(strSQL, RecordsetTypeEnum.dbOpenDynaset)
        Debug.Print "scrAdherent - UserForm_Initialize : Nb d'adhérents : " & Rs.RecordCount
     
    End Sub
     
    Private Sub class_Terminate()
        Debug.Print "Objet Person - class_Terminate : " & Me.NomComplet
     
        ' On libère les variables
        Rs.Close: Set Rs = Nothing
    End Sub
     
    Private Sub Load()
        Debug.Print "Objet Person - load"
     
        With Rs
            Me.IdPerson = Nz(.Fields("IdPerson").Value)
            Me.Prenom = Nz(.Fields("Prenom").Value)
            Me.Nom = Nz(.Fields("Nom").Value)
        End With
        mblnLoaded = True
    End Sub
     
    Public Sub AddNew()
        Debug.Print "Objet Person - AddNew"
     
        mblnLoaded = False
    End Sub
     
    Public Sub Update()
        Debug.Print "Objet Person - Update"
     
        With Rs
            If (mblnLoaded) Then
                .Edit
            Else
                .AddNew
            End If
     
            '.Fields("IdPerson").Value = Me.IdPerson
            .Fields("Prenom").Value = NullIfEmptyString(Me.Prenom)
            .Fields("Nom").Value = NullIfEmptyString(Me.Nom)
     
            .Update
     
        End With
        mblnLoaded = True
    End Sub
    Ma question ou plutôt mes questions :
    - Dans la classe objet Person, j'interroge la base avec une requête qui me retourne l'ensemble des personnes. Ne devrais-je plutôt faire une requête avec l'identifiant de la personne à rechercher ?
    - Dans ma collection Persons, est-ce là que je dois faire une requête pour me retourner la liste des personnes ?

    - Que pensez vous de cette méthode (et du code) ?

  3. #3
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2016
    Messages : 12
    Par défaut
    Bonjour à tous,

    Je me suis avancé un peu à l'aveugle et teste différentes pistes.
    La dernière en date :
    Je me suis inspiré la discussion sur la programmation objet : [Objets] La programmation Objet et VBA

    Et j'obtiens une erreur système : Ressources insuffisantes

    Voici mon code :
    Dans la classe objet Person, j'ai intégré la requête à la base de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    Option Explicit
     
    Private rstPerson As DAO.Recordset              'Requete à la base Access
     
    Private mintIdPerson As Integer          'Nom de la Personne
    Private mstrNom As String                'Nom de la Personne
    Private mstrPrenom As String             'Prénom de la Personne
    ...
     
    Private Sub class_Initialize()
        Debug.Print "Objet Person - class_Initialize"
    End Sub
     
    Private Sub class_Terminate()
        Debug.Print "Objet Person - class_Terminate : " & Me.NomComplet
     
        ' On libère les variables
        rstPerson.Close: Set rstPerson = Nothing
    End Sub
     
    Public Sub Init(ByVal Key As Integer)
        Debug.Print "Objet Person - Init"
     
    On Error GoTo err:
     
        ' On récupère les données de la base : Table Adhérents
        Dim strSQL As String
     
        ' Charge l'adhérent
        strSQL = "SELECT * FROM Adherents WHERE IDAdherent = " & Key & " ORDER BY Adherents.Nom, Adherents.Prenom"
        Set rstPerson = oDb.OpenRecordset(strSQL, RecordsetTypeEnum.dbOpenDynaset)
        Debug.Print "scrAdherent - UserForm_Initialize : Nb d'adhérents : " & rstPerson.RecordCount
     
        With rstPerson
            Me.IdPerson = .Fields("IdAdherent").Value
            Me.Prenom = .Fields("Prenom").Value
            Me.Nom = .Fields("Nom").Value
        End With
        mblnLoaded = True
     
        Exit Sub
     
    err:
     
        Select Case err.Number
     
            Case Else: MsgBox "scrAdherent - UserForm_Initialize : Une erreur est subvenue " & vbCrLf & _
                "N° erreur : " & err.Number & vbCrLf & _
                "Description : " & err.Description
        End Select
     
    End Sub
    Dans ma collection Persons : Pareil j'ai intégré une requête à la base de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    Option Explicit
     
    Private rstPersons As DAO.Recordset         ' Requete à la base Access
    Private intIdAdherent As Integer            ' Id de l'Adhérent
    ...
     
    Private Sub class_Initialize()
        Debug.Print "Collection Persons - class_Initialize"
     
        Set mcolPersons = New Collection
    End Sub
     
    Private Sub class_Terminate()
        Debug.Print "Collection Persons - class_Terminate"
        ' On libère les variables
        rstPersons.Close: Set rstPersons = Nothing
        If Not (mcolPersons Is Nothing) Then Set mcolPersons = Nothing
    End Sub
     
    Public Sub Init()
        Debug.Print "Collection Persons - Init"
     
        Dim strSQL As String
        intIdAdherent = 0
     
        ' On récupère les données de la base : Table Adhérents
        strSQL = "SELECT * FROM Adherents"             ' Tous les adhérents
        Set rstPersons = oDb.OpenRecordset(strSQL, RecordsetTypeEnum.dbOpenDynaset)
        Debug.Print "scrAdherent - UserForm_Initialize : Nb d'adhérents : " & rstPersons.RecordCount
     
        ' On instancie les membres de la collection de personnes
        With mcolPersons
     
            'Tant que non fin du recordset
            While Not rstPersons.EOF
                Debug.Print "scrAdherent - UserForm_Initialize : Nom de l'adhérent : " & rstPersons.Fields("Nom")
                intIdAdherent = FMax(intIdAdherent, rstPersons.Fields("IdAdherent"))
     
                Me.Add Me.CreatePerson(rstPersons.Fields("IdAdherent")), intIdAdherent
     
                'Passer au suivant
                rstPersons.MoveNext
            Wend
     
        End With    
     
    End Sub
     
    Public Sub Add(ByRef oPerson As Person, _
                        Optional ByVal Key As String)
        Debug.Print "Collection Persons - Add"
     
        'Si aucune clé key n'est fournit on en génère une automatiquement
        If Key = 0 Then
            Key = intIdAdherent
        End If
     
        mcolPersons.Add oPerson, Key
     
        'l'objet est inséré dans la collection on renseigne automatiquement la propriété Parent
        Set oPerson.Parent = Me
        Set oPerson = Nothing
    End Sub
     
    Public Function CreatePerson(ByVal intId As Integer) As Person
                                 ', strNom As String _
                                 ', strPrenom As String _
     
        Debug.Print "Collection Persons - CreatePerson"
        Dim oPerson  As Person
     
        Set oPerson = New Person
        oPerson.Init (intId)
        'With oPerson
        '    .IdPerson = intId
        '    .Nom = strNom
        '    .Prenom = strPrenom
        'End With
     
        Set CreatePerson = oPerson
     
        If Not (oPerson Is Nothing) Then Set oPerson = Nothing
    End Function
    ...
    Et enfin dans mon form, j'implémente les objets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Option Explicit
     
    Dim WithEvents oAdherent As Person          ' Objet Person
    Dim colAdherents As Persons                 ' Collection de Persons
     
    Private Sub UserForm_Initialize()
        Debug.Print "scrAdherent - UserForm_Initialize : Chargement de la page"
     
    On Error GoTo err:
     
        ' On crée la collection d'adherents, puis on l'initialise
        Set colAdherents = New Persons
        colAdherents.Init
     
        ' On sélectionne le filtre sur les adhérents actifs
        'OptFiltre1.Value = True                        ' Filtre sélection des adhérents actifs
     
        Exit Sub
     
    err:
     
        Select Case err.Number
            Case Else: MsgBox "scrAdherent - UserForm_Initialize : Une erreur est subvenue " & vbCrLf & _
                "N° erreur : " & err.Number & vbCrLf & _
                "Description : " & err.Description
        End Select
     
    End Sub
    Et là j'obtiens le message d'erreur : 3035 : Ressources systèmes insuffisantes.
    Je précise que je lis la moitié de ma table soit environ 200 enregistrements sur 350.

    Pouvez-vous m'aider à résoudre ce point ?

    Avec mes remerciements
    Marc

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,

    J'ai copié et collé ton code dans un module de classe et j'ai des erreurs de compilation.
    Une erreur sur oDB: cette variable devrait être initialisée sur CurrentDb, je pense.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rstPerson = oDb.OpenRecordset(strSQL, RecordsetTypeEnum.dbOpenDynaset)
    Une erreur sur tous les Me.quelque chose, car das une module de classe, Me représente l'objet lui même, pas un formulaire!
    Comme par exemple ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print "Objet Person - class_Terminate : " & Me.NomComplet
    Cordialement,

  5. #5
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2016
    Messages : 12
    Par défaut
    Merci Philippe d'avoir regardé mon problème.

    1 - Concernant le premier point, la connexion à la base de données, je n'ai pas indiqué le code complétement.
    En effet la variable rstPerson doit être instancié au préalable.
    Dans mon cas, il ne s'agit pas de la base CurrentDb, puisque je me connecte sur une base distante.
    J'ai donc ce code à l'initialisation de l'application :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    Public oDBE As DAO.DBEngine
    Public oDb As DAO.Database
     
    Sub Auto_open()
        '  La sub auto_open possède la propriété d'être automatiquement
        '  exécutée à l'ouverture du projet
        '  à l'identique : auto_close est exécutée sur la fermeture
        Debug.Print "Main - Auto_open"
        openDB
     
    End Sub
     
    Sub openDB()
        Debug.Print "Main - openDB"
     
        strCnxDb = "C:\bdd\monprojet\mabase_bdd.accdb" ' En fait cette chaine est construite par l'appel d'un sous module
     
       If Len(Dir(strCnxDb)) > 0 Then
            ' ----------------------- METHODE DAO
            ' Déclaration de la variable de connexion
             Set oDBE = New DBEngine
            ' Connexion à la base
             Set oDb = oDBE.OpenDatabase(strCnxDb, False, False)
     
            If modeSetting = True Then
                MsgBox "La base " & _
                    strCnxDb & vbCrLf & _
                    "est connectée.", vbOKOnly
            End If
        Else
            MsgBox "La base de donnée n'est pas connectée " & vbCrLf & vbCrLf & _
                    "Le chemin " & strCnxDb & vbCrLf & "n'est pas valide." & vbCrLf & vbCrLf & _
                    "Merci de vérifier le paramétrage", vbCritical + vbOKOnly, "PROBLEME DE CONNEXION A LA BASE"
        End If
     
          Exit Sub
     
    err:
        '3059 : chemin non défini
        '3704 : base déjà ouverte
        Select Case err.Number
            Case 3059: MsgBox "La base de donnée n'est pas connectée " & vbCrLf & vbCrLf & _
                "Merci de vérifier le paramétrage", vbOKOnly, "PROBLEME DE CONNEXION A LA BASE"
            Case 3704: MsgBox "La base de donnée déjà ouverte" & vbCrLf & _
                "L'opération est annulée"
            Case Else: MsgBox "Une erreur inconnue est survenue"
        End Select
    End Sub
     
    Sub Auto_close()
        closeDB
    End Sub
     
    Sub closeDB()
        Debug.Print "Main - closeDB"
    On Error GoTo err:
     
        '----------------------- METHODE DAO
        oDb.Close
        Set oDb = Nothing
        Set oDBE = Nothing
        '----------------------
     
        If modeSetting = True Then
            MsgBox "La base " & _
                strCnxDb & vbCrLf & _
                "est fermée.", vbOKOnly
        End If
     
      Exit Sub
    err:
     
    End Sub
    La raison de l'existence des sub openDB et closeDB : Je les utilise en maintenance de la base de données. Par exemple, pour effectuer une sauvegarde ou un compactage...

    2 - Pour ta remarque très judicieuse, 'une erreur sur tous les Me.quelque chose', si j'enlève 'Me.', par quoi dois-je le remplacer ?
    En fait, j'ai testé et c'est bien l'objet qu'il me faut, puisque je veux instancier les propriétés de l'objet par le résultat de la requête.

    Pour information, j'ai lu dans un autre post qu'il est préférable d'utiliser la méthode ADO plutôt que DAO.
    Aussi je travaille sur la migration de la connexion à la base (pendant que le projet me le permet encore).

    Pour ma part, je repose mes questions :
    - Dans la classe objet Person, j'interroge la base avec une requête qui me retourne l'ensemble des personnes. Ne devrais-je plutôt faire une requête avec l'identifiant de la personne à rechercher ?
    - Dans ma collection Persons, est-ce là que je dois faire une requête pour me retourner la liste des personnes ?
    En d'autres termes, à chaque classe ou collection, doit-on réaliser les requêtes à la base de données propres à la classe ou la collection ?
    Qu'en pensez-vous ?

    Merci
    Marc

  6. #6
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,


    Pour le point 2
    ============
    Ok, si tu veux donner une valeur aux propriétés de l'objet(et non pas instancier!), alors c'est bien Me qu'il faut utiliser.
    Remarque: c'est la classe qui est instanciée, pour créer un objet sur cette classe, on est d'accord?

    DAO ou ADO?
    ===========
    DAO est optimisée pour travailler avec Access.
    ADO est plus générale.
    Sur une bdd Access, il vaut mieux utiliser DAO.
    Mais ADO marche aussi!(Je ne suis pas normand!)

    J'ai l'impression que tu mélanges un peu les concepts!
    Dans ce que je comprend de ton appli, tu dois gérer un groupe de personnes.

    Dons l'idée c'est:
    J'ai une classe clsPersonne qui représente une personne.
    Ensuite j'instancie cette classe autant de fois que nécessaire pour avoir autant d'objet oPersonne, chaque objet représentant une personne particulière.
    Pour valoriser les propriétés de chaque objet, tu peux faire une requête sql sur la bdd, lors de l'initialisation de l'objet, en passant l'identifiant de la personne pour laquelle tu veux créer l'objet.

    Si tu dois gérer plusieurs objets simultanément, c'est là que la collection intervient.
    Elle te permet de mettre dans une collection tous les objets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set colPersonne = New Collection
    Set oPersonne = New clsPersonne
    oPersonne.initPersonne(IDPersonne) <== cette méthode va exécuter une requête sur ta bdd
    colPersonne.Add oPersonne, IDPersonne
    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DBExpress] Formulaire d'insertion (Base de donnée)
    Par Nadd dans le forum C++Builder
    Réponses: 14
    Dernier message: 12/07/2007, 10h22
  2. ajout dans un formulaire et une base de donnée
    Par mademoizel dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 13/06/2006, 14h42
  3. java+mettre le contenu d'un TextField ds une base de données
    Par Fredo le Tsar dans le forum Access
    Réponses: 1
    Dernier message: 20/05/2006, 18h29
  4. [Conception] Consulter les données d'un formulaire via la base de données
    Par snakejl dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 16/05/2006, 19h51
  5. [MySQL] Génération automatique de formulaire sur une base de données
    Par Tr@nkill dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 04/04/2006, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo