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

Python Discussion :

Forcer copytree à la mise jour


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Points : 49
    Points
    49
    Par défaut Forcer copytree à la mise jour
    Bonjour je suis en train d'essayer de faire un petit script pour mettre à jour tous les fichiers .ini d'un dossier dans un autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    from shutil import copytree, ignore_patterns
     
    SOURCE = ("C:/Users/mimour/Desktop/testpyt/repo1")
    BACKUP = ("C:/Users/mimour/Desktop/testpyt/repo2")
     
    copytree(SOURCE, BACKUP, ignore=ignore_patterns('*.txt', '*.html', '*.js', '*.css', '*.php', '*.xml', '*.yml' , '*.gitignore', '_tools*' ))
    Mon soucis c'est dans le cas d'un dossier ou fichier existant le script bloque ... => repo2 ne doit pas existé
    Comment faire pour qu'il puisse faire aussi les mise à jour ?
    Merci

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    S'il s'agit de recopier un répertoire et tout son contenu "*.ini" dans un autre répertoire existant, donc de faire plus une mise à jour qu'une création à chaque fois, on peut proposer autre chose.

    Ici, on utilise iglob du module glob pour trouver (un par un) tous les fichiers "*.ini" de l'arborescence source. Ce n'est pas la seule solution, mais c'est la plus facile, et j'en avais décrit les avantages ici: https://www.developpez.net/forums/d1...ive-glob-glob/.

    Dans le code qui suit, le répertoire destination peut ou pas exister déjà, mais en plus, la copie ne se fera que dans 2 cas:
    1- le fichier source n'existe pas déjà dans la destination
    2- ou le fichier source est plus récent que le fichier destination

    Voilà le code proposé:

    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # Python 3.7
     
    import os
    from glob import iglob
    from shutil import copy2
     
    ##############################################################################
    def sauveselect(repsrce, repdest, motifs=['*'], affiche=False):
        """Trouve (recherche récursive) les fichiers du répertoire source repsrce 
           satisfaisant l'un des motifs 'wildcard' de la liste motifs,
           et les recopie dans le répertoire destination 'repdest' seulement si:
           - le fichier source n'existe pas dans la destination,
           - ou le fichier source est plus récent que le fichier destination
           Si affiche=True: affiche les opérations faites en console
           Retourne le nombre de fichiers trouvés + copiés, ainsi que les erreurs
        """
        # normalisation des répertoires
        repsrce = os.path.abspath(os.path.expanduser(repsrce))
        lgrepsrce = len(repsrce) # longueur du chemin du répertoire source
        repdest = os.path.abspath(os.path.expanduser(repdest))
     
        # traitement des recopies
        erreurs = []
        nsrce, ndest = 0, 0
        for motif in motifs:
            for ficsrce in iglob(os.path.join(repsrce, "**", motif), recursive=True):
     
                if os.path.isfile(ficsrce): # on ne s'intéresse qu'aux fichiers
     
                    nsrce += 1 # nouveau fichier source trouvé
                    ficdest = repdest + ficsrce[lgrepsrce:] # => fichier destination
     
                    rep = os.path.dirname(ficdest) # répertoire du fichier destination
                    if not os.path.exists(rep):
                        # crée le ou les répertoire(s) manquant(s) de la destination
                        os.makedirs(rep)
     
                    if not os.path.exists(ficdest):
                        # fichier destination absent => recopie du fichier source
                        try:
                            copy2(ficsrce, ficdest)
                            ndest += 1
                            if affiche: print("Recopie fichier absent de la destination:", ficsrce)
                        except Exception as msgerr:
                            erreurs.append(str(msgerr))    
                    else:
                        # ici, on sait que le fichier destination existe déjà
                        if os.path.getmtime(ficsrce) > os.path.getmtime(ficdest):         
                            # fichier source plus récent => recopie
                            try:
                                copy2(ficsrce, ficdest)
                                ndest += 1
                                if affiche: print("Recopie fichier plus récent que la destination:", ficsrce)
                            except Exception as msgerr:
                                erreurs.append(str(msgerr))    
     
        return nsrce, ndest, erreurs
    Exemple d'utilisation (changer les chemins des répertoires!):

    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
    # répertoire source
    repsrce = r"E:\Programmes\Python37\Tools"
     
    # répertoire destination
    repdest = r"E:\Temp\Tests\Tools"
     
    # liste de motifs de type "wildcard"
    motifs = ["*.py", "*.pyw"]
     
    # appel de la sauvegarde sélective
    nsrce, ndest, erreurs = sauveselect(repsrce, repdest, motifs, affiche=True)    
     
    print("nombre de fichiers trouvés:", nsrce)
    print("nombre de fichiers mis à jour", ndest)
    if len(erreurs)==0:
        print("Aucune erreur")
    else:
        print("Erreurs:", len(erreurs))
        for erreur in erreurs:
            print(erreur)
    Dans ton cas, la liste des motifs sera: ["*.ini"]

    La 1ère fois, si le répertoire destination n'existe pas ou est vide, tous les fichiers de l'arborescence satisfaisant au motif de sélection "*.ini" seront recopiés. Mais les fois suivantes, seul les nouveaux fichiers et les fichiers plus récents seront recopiés, ce qui fera gagner du temps.

    Dans les cas comme le tien, cela devrait être suffisant. Dans des cas plus importants, on peut ajouter des fonctionnalités supplémentaires. Par exemple:
    - demander à ce que les fichiers destination qui sont absents de la source soient supprimés (option "miroir").
    - demander à ne pas traiter les fichiers situés dans un sous-répertoire donné
    - demander à supprimer les répertoires vides
    - paramétrer la "profondeur" de la recherche dans l'arborescence
    - etc...
    Mais ça complique pas mal le code...

    Ce code est assez rapide parce que iglob, dans les versions de Python récentes, est basé sur os.scandir. Pour prendre un exemple, j'ai un gros répertoire de développement Python et je veux sauvegarder environ 100.000 fichiers ["*.py", "*.pyw", "*.ui"]. Si je neutralise les opérations de copies (en relançant le programme une 2ème fois), le parcours total de l'arborescence par la fonction ci-dessus se fait en un peu plus d'une minute.

    J'insiste sur l'intérêt des sauvegardes: souvent, quand un amateur s'intéresse aux sauvegardes, c'est qu'il a déjà tout perdu...
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Points : 49
    Points
    49
    Par défaut
    cool je vais regarder sa ...
    juste pour savoir cela prend bien tout les fichiers contenu dans des sous dossiers ? => punaise c'est magnifique ca marche du tonner !!!
    derniere question, si je voulais modifié le nom de mes fichier (ils comportent tous en-GB.monfichier.ini) tu le verrai comment ?
    MErci en tout cas !

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par micker Voir le message
    juste pour savoir cela prend bien tout les fichiers contenu dans des sous dossiers ?
    Bien sûr! Pour avoir ça, il ne faut pas oublier l'option "recursive=True" de iglob et la recherche a bien lieu dans toute l'arborescence du répertoire.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Points : 49
    Points
    49
    Par défaut
    en fait j'ai édietr pendant que tu répondais ...
    => punaise c'est magnifique ca marche du tonner !!!
    derniere question, si je voulais modifié le nom de mes fichier (ils comportent tous en-GB.monfichier.ini) tu le verrai comment ?

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par micker Voir le message
    derniere question, si je voulais modifié le nom de mes fichier (ils comportent tous en-GB.monfichier.ini) tu le verrai comment ?
    Dans ma fonction, tu pourrais renommer le fichier destination au moment où il est calculé (ligne 33) avec en ligne 34 et suivantes: os.rename(ficdest, ficdest_renommé).
    Mais c'est dommage pour 2 raisons:
    1- ce ne serait plus une vraie sauvegarde (si tu as besoin de récupérer le fichier destination, tu seras obligé de le renommer dans l'autre sens!)
    2- ta fonction ne sera plus générale et tu ne pourras plus l'utiliser pour d'autres sauvegardes: elle sera spécifique à cette utilisation.

    Autre solution: créer une fonction de renommage que tu pourras utiliser après la sauvegarde. Par exemple:

    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # Python 3.7
     
    import os
    from glob import iglob
     
    def renomme(repertoire, motifs=['*.ini'], entete="en-GB.", affiche=False):
        """Trouve tous les fichiers du répertoire et de ses sous-répertoires
           satisfaisant aux motifs wildcard, et les renomme en leur retirant
           l'en-tête de leur nom 
        """
        # normalise le chemin
        repertoire = os.path.abspath(os.path.expanduser(repertoire))
        # renomme les fichiers
        nbfichiers = 0
        for motif in motifs:
            for fichier in iglob(os.path.join(repertoire, "**", motif), recursive=True):
                if os.path.isfile(fichier): # on ne s'intéresse qu'aux fichiers
                    # sépare le chemin et le nom de fichier
                    chemin, nom = os.path.split(fichier)
                    # calcule le nouveau nom
                    if nom.startswith(entete):
                        # ici, il faut renommer!
                        nom = nom[len(entete):] # supprime l'en-tête
                        # recalcule le nouveau nom du fichier avec son chemin    
                        fichier2 = os.path.join(chemin, nom)
                        # renomme
                        os.rename(fichier, fichier2) 
                        nbfichiers += 1 
                        if affiche: print("Fichier renommé:", fichier, "===>", fichier2)  
     
        return nbfichiers # nombre de fichiers renommés
    Exemple d'utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    repertoire = r"chemin\du\repertoire"
     
    nbfichiers = renomme(repertoire, motifs=['*.ini'], entete="en-GB.", affiche=True)
     
    Print("Nombre de fichiers renommés:", nbfichiers)
    Et si tu veux un jour renommer dans l'autre sens, tu pourras t'inspirer de ce code pour faire une nouvelle fonction qui ajoutera l'en-tête au lieu de la retirer!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Points : 49
    Points
    49
    Par défaut
    hello je suis partie sur la solution 2 un second script
    mais je suis resté bloqué sur un soucis le os.rename ne fonctionne pas si un fichier ayant le même nom existe déjà
    j'ai essayé ceci dans ton dernier script ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # renomme
                        try:
                            os.rename(fichier, fichier2) 
                            nbfichiers += 1
                        except WindowsError:
                            os.remove(fichier)
                            os.rename(fichier, fichier2) 
                        if affiche: print("Fichier renommé:", fichier, "===>", fichier2)
    et j'ai ce retour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Traceback (most recent call last):
      File "C:\Users\yannick\Documents\GitHub\flexicontent-translations\rename-file.py", line 28, in renomme
        os.rename(fichier, fichier2)
    FileExistsError: [WinError 183] Impossible de créer un fichier déjà existant: 'C:\\Users\\yannick\\Documents\\GitHub\\flexicontent-translations\\admin\\language\\en-GB\\en-GB.com_flexicontent.ini' -> 'C:\\Users\\yannick\\Documents\\GitHub\\flexicontent-translations\\admin\\language\\en-GB\\com_flexicontent.ini'
     
    During handling of the above exception, another exception occurred:
     
    Traceback (most recent call last):
      File "C:\Users\yannick\Documents\GitHub\flexicontent-translations\rename-file.py", line 38, in <module>
        nbfichiers = renomme(repertoire, motifs=['*.ini'], entete="en-GB.", affiche=True)
      File "C:\Users\yannick\Documents\GitHub\flexicontent-translations\rename-file.py", line 32, in renomme
        os.rename(fichier, fichier2)
    FileNotFoundError: [WinError 2] Le fichier spécifié est introuvable: 'C:\\Users\\yannick\\Documents\\GitHub\\flexicontent-translations\\admin\\language\\en-GB\\en-GB.com_flexicontent.ini' -> 'C:\\Users\\yannick\\Documents\\GitHub\\flexicontent-translations\\admin\\language\\en-GB\\com_flexicontent.ini'
    Merci d'avance

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'aurais dû réfléchir un peu plus: si on renomme les fichiers sauvegardés après la sauvegarde elle-même, la sauvegarde recopie toujours tous les fichiers satisfaisant les motifs, et cela fait échouer le os.rename au 2ème appel!

    Je te propose autre chose: on va modifier la fonction de sauvegarde "sauveselect" comme suit:

    - on ajoute un argument d'appel: modifie=None

    - lorsqu'on calcule le fichier destination (ligne: ficdest = repdest + ficsrce[lgrepsrce:]), on ajoute les 3 lignes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                    # modifie le nom de fichier destination si c'est demandé
                    if modifie is not None:
                        ficdest = modifie(ficdest)
    Donc, si à l'appel de sauveselect on donne "modifie=modifini", par exemple, le nom de fichier sera modifié comme si on appelait directement "ficdest = modifini(ficdest)".

    Et si on laisse l'argument modifie=None, la sauvegarde "sauveselect" restera une fonction générale sans aucune modification de nom de fichier.

    Il suffira de créer et d'adapter la fonction "modifini" en fonction de la modification que tu veux. Par exemple, pour retirer l'entete indiquée du nom de fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def modifini(fichier, entete="en-GB."):
        """modifie le nom du fichier en retirant l'en-tête indiqué
        """
        # sépare le chemin et le nom de fichier
        chemin, nom = os.path.split(fichier)
        # calcule le nouveau nom
        if nom.startswith(entete):
            # modifie le nom
            nom = nom[len(entete):] # supprime l'en-tête
            # recalcule le nouveau nom du fichier avec son chemin   
            fichier = os.path.join(chemin, nom)
        # et retourne le nom (modifié ou pas) du fichier avec son chemin
        return fichier
    Et voilà le nouveau code complet:

    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # Python 3.7
     
    import os
    from glob import iglob
    from shutil import copy2
     
    ##############################################################################
    def modifini(fichier, entete="en-GB."):
        """modifie le nom du fichier en retirant l'en-tête indiqué
        """
        # sépare le chemin et le nom de fichier
        chemin, nom = os.path.split(fichier)
        # calcule le nouveau nom
        if nom.startswith(entete):
            # modifie le nom
            nom = nom[len(entete):] # supprime l'en-tête
            # recalcule le nouveau nom du fichier avec son chemin   
            fichier = os.path.join(chemin, nom)
        # et retourne le nom (modifié ou pas) du fichier avec son chemin
        return fichier
     
    ##############################################################################
    def sauveselect(repsrce, repdest, motifs=['*'], modifie=None, affiche=False):
        """Trouve (recherche récursive) les fichiers du répertoire source repsrce 
           satisfaisant l'un des motifs 'wildcard' de la liste motifs,
           et les recopie dans le répertoire destination 'repdest' seulement si:
           - le fichier source n'existe pas dans la destination,
           - ou le fichier source est plus récent que le fichier destination
           Si modifie=unefonction, modifie le fichier en appelant unefonction(...)
           Si affiche=True: affiche les opérations faites en console
           Retourne le nombre de fichiers trouvés + copiés, ainsi que les erreurs
        """
        # normalisation des répertoires
        repsrce = os.path.abspath(os.path.expanduser(repsrce))
        lgrepsrce = len(repsrce) # longueur du chemin du répertoire source
        repdest = os.path.abspath(os.path.expanduser(repdest))
     
        # traitement des recopies
        erreurs = []
        nsrce, ndest = 0, 0
        for motif in motifs:
            for ficsrce in iglob(os.path.join(repsrce, "**", motif), recursive=True):
     
                if os.path.isfile(ficsrce): # on ne s'intéresse qu'aux fichiers
     
                    nsrce += 1 # nouveau fichier source trouvé
                    ficdest = repdest + ficsrce[lgrepsrce:] # => fichier destination
     
                    # modifie le nom de fichier destination si c'est demandé
                    if modifie is not None:
                        ficdest = modifie(ficdest)
     
                    rep = os.path.dirname(ficdest) # répertoire du fichier destination
                    if not os.path.exists(rep):
                        # crée le ou les répertoire(s) manquant(s) de la destination
                        os.makedirs(rep)
     
                    if not os.path.exists(ficdest):
                        # fichier destination absent => recopie du fichier source
                        try:
                            copy2(ficsrce, ficdest)
                            ndest += 1
                            if affiche: print("Recopie fichier absent de la destination:", ficsrce)
                        except Exception as msgerr:
                            erreurs.append(str(msgerr))    
                    else:
                        # ici, on sait que le fichier destination existe déjà
                        if os.path.getmtime(ficsrce) > os.path.getmtime(ficdest):         
                            # fichier source plus récent => recopie
                            try:
                                copy2(ficsrce, ficdest)
                                ndest += 1
                                if affiche: print("Recopie fichier plus récent que la destination:", ficsrce)
                            except Exception as msgerr:
                                erreurs.append(str(msgerr))    
     
        return nsrce, ndest, erreurs
    Et la nouvelle façon d'appeler la sauvegarde sélective:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # appel de la sauvegarde sélective
    nsrce, ndest, erreurs = sauveselect(repsrce, repdest, motifs, modifie=modifini, affiche=True)
    Tu noteras que dans "modifie=modifini", on ne met pas de parenthèses à modifini puisqu'on parle ici d'un nom de fonction, et non du résultat de son exécution!

    Ok?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Points : 49
    Points
    49
    Par défaut
    Donc en soit plus besoins de faire le rename ensuite ca fait tout d'un coup !
    MMMMMMIIIILLLLEEEEE MMMERRRRCI

Discussions similaires

  1. Forcer les mises à jour à l'extinction
    Par zbahoui dans le forum Windows XP
    Réponses: 2
    Dernier message: 11/05/2011, 20h42
  2. Forcer la mise à jour d'un progressbar
    Par colorid dans le forum Langage
    Réponses: 5
    Dernier message: 27/11/2010, 13h47
  3. Forcer la mise à jour de la version du xap
    Par Golzinne dans le forum Silverlight
    Réponses: 13
    Dernier message: 14/09/2010, 09h25
  4. Réponses: 4
    Dernier message: 08/10/2007, 14h44
  5. forcer mise à jour combo box
    Par Rcanada dans le forum Access
    Réponses: 3
    Dernier message: 07/04/2006, 10h54

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