Problème sur Access 2003

Résolu
Bonjour,
Voilà une quinzaine de jours que je ne me sors pas de ce problème.

Je travaille sur Access 2003 avec une base d’une simplicité enfantine.
C’est une base d’une collection d’affiches scolaires
Les enregistrements comprennent des champs basiques et deux photos que j’ai allégées au maximun
40 ko par photos.
La base fait plus de 2 gigas avec 3250 enregistrements.

Aujourd’hui, elle est complètement bloquée
Impossible d’ajouter des enregistrements et surtout de copier coller des enregistrements.
J’ai en permanence le message « argument invalide ».
Je suis « quasiment » certain qu’il n’y a pas d’argument invalide dans ma table.
J’ai tout contrôlé.

Je crois que c’est un problème de taille et qu’il faudrait que je change un paramètre dans un fichier window.
En fait je n’en sais rien.
Je dois vous avouer que je suis une « buse » sur Access.

Pouvez-vous avoir la gentillesse de m’aider.
slowikdaniel@aol.com

Merci
Configuration: Windows XP
AOL 9.0

20 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour,
    Pour votre fichier essayé ceci:
    Soit par une ligne de commande
    Démarrer -> Tous les Programmes -> Accessoires -> invite de commande
    là vous tapez dan la fenêtre (où vous remplacez "C:\Mes Documents\bd1.mdb" par le chemin de votre base endommagée)
    "C:\Program Files\Microsoft Office\Office\MSACCESS.EXE" "C:\Mes Documents\bd1.mdb" /repair
    Soit:
    Créez une base de donnée vide.
    Dans celle-ci : Menu Fichier -> Données Externes -> importer
    Là vous sélectionné la base endomagée.
    Dans chaque onglet (Tables, Requêtes, ...) vous sélectionnez tout.
    A la fin vous faites OK, l'entiereté de base endommagée est recopié dans la nouvelle.

    En fait il ne faut jamais stocker des images dans une base de données Access, où elle prennent une place inconsidérée.
    Procédure à utiliser:
    Stocker toutes les photos dans un répertoire et si possible donner leurs un nom formalisé.
    Dans un formulaire, insérer une image (pas un cadre d'objet indépendant !) choisissez n'importe quelle image.
    Modifiez sa propriété "Mode d'affichage" en "Zoom"
    Sur l'évènement de formulaire "Sur activation" (qui s'exécute lors du passage d'un enregistrement à l'autre) vous modifiez la propriété "Picture" de l'objet Image; vous lui attribuez le chemin compllet de l'image à incorporer pour cet enregistrement. Ex : image0.picture = "C:\Photos\photo_001.jpg"

    @+
    1. Merci pour vos conseils que j’ai suivi.
      Tout s’est parfaitement déroulé et j’ai récupéré l’intégralité des 3250 enregistrements.
      Aucun message d’erreur.

      Malheureusement, le problème est toujours là.
      Toujours « argument invalide »
      Je n’y comprends rien

      Pour le deuxième conseil, je vais regarder comment je peux m’en sortir.
      J’ai la chance d’avoir gardé toutes les photos dans un répertoire.

      Encore merci
      Quelle galère !
      1. Dans votre table, vous remplacez les deux champs OLE par des champs Texte dans lesquelles vous mettez le nom des photos associées à cet enregistrement, appelons-les NomPhoto1 et NomPhoto2
        Vous placez ces champs sur votre formulaire, vous pouvez les rendre invisible.
        Dans le même formulaire vous ajoutez deux champs Image (Appelons-les image1 et image2)
        Sur l'évènement du formulaire "Sur activation" vous écrivez ce code :

        Dim Chemin as string
        Dm Nom1 as string
        Dm Nom2 as string

        Chemin = "C:\Mes images\Photos\" ' A remplacer par le chemin où se trouve vos photos
        Nom1= me!NomPhoto1
        Nom2= me!NomPhoto2
        me!image1.picture = Chemin & nom1
        me!image2.picture = Chemin & nom2

        @+
        1. Tout d’abord merci de passer du temps pour moi mais,
          je n’y arrive pas.
          Désolé !

          J’ai écrit cela

          Private Sub Form_Current()

          Dim Chemin As String
          Dm Nom1 As String
          Dm Nom2 As String

          Chemin = "C:\Photos\"
          Nom1 = Me!NomPhoto1
          Nom2 = Me!NomPhoto2
          Me!Image1.Picture = Chemin & Nom1
          Me!Image2.Picture = Chemin & Nom2

          End Sub

          Et j’obtiens
          Erreur de compil
          Erreur de syntaxe

          Et
          Dm Nom1 As String
          Est surligné

          Horreur
          1. Erreur de syntaxe = erreur d'orthographe (ce n'est pas bien grave:
            Private Sub Form_Current()

            Dim Chemin As String
            Dim Nom1 As String
            Dim Nom2 As String

            Chemin = "C:\Photos\"
            Nom1 = Me!NomPhoto1
            Nom2 = Me!NomPhoto2
            Me!Image1.Picture = Chemin & Nom1
            Me!Image2.Picture = Chemin & Nom2

            End Sub

            ATTENTION : Nom1 et Nom2 doivent contenir l'extension du fichier. Ex : Pol.jpg
            ou si toutes les photos ont la même extension : Me!Image1.Picture = Chemin & Nom1 & ".jpg"
            1. Vous pouvez ajouter une petite gestion des erreurs, celle-ci vous donnera une indication si une erreur survient lors de l'exécution du programme:

              Private Sub Form_Current()
              Dim Chemin As String
              Dim Nom1 As String
              Dim Nom2 As String
              On Error GoTo Err

              Chemin = "C:\Photos\" ' A remplacer par le chemin où se trouve vos photos
              Nom1 = Me!NomPhoto1
              Nom2 = Me!NomPhoto2
              Me!Image1.Picture = Chemin & Nom1 & ".jpg"
              Me!Image2.Picture = Chemin & Nom2 & ".jpg"

              Err_Exit:
              Exit Sub
              Err:
              MsgBox Error$
              Resume Err_Exit

              End Sub
              1. J’avance lentement mais j’avance
                Tenez bon !
                Je comprends quand même un peu ce que je fais.

                J’ai le message
                Propriété ou méthode non gérée par cet objet

                Je crois que je ne crée par correctement les deux zones image dans le formulaire
                Je les crée en objet dépendant
                Il les appelle
                « DépendantOLE13457: »

                je les renomme « Image1 » et « Image2 »
                c’est peut-être là l’erreur ?
                1. Non, c'est que tu n'a pas pris les bons objets.

                  Dans la barre d'outils (à gauche) tu as :
                  ...
                  Images
                  Cadre d'objet indépendant
                  Cadre d'objet dépendant
                  ...
                  tu dois placer 2 objets images sur le formulaire

                  PS: Je peux t'envoyer un exemple par E-mail, si tu veux.
                  1. Super.
                    Ca marche.
                    Mille merci, impossible d'y arriver seul.

                    Va t'il être compliqué de récupérer mes images dans mes états?
                    1. Non, tu commences par créer une Requête qui va filtrer les enregistrements que tu veux imprimer.
                      Ensuite tu crées un état basé sur cette Requête.

                      A demain ... peut-être ...
                      1. Merci, je vais essayer.

                        Il arrive parfois que certaines affiches soient monoface, donc pas de NomPhoto2.
                        J’ai tenté une condition mais cela ne marche pas ?

                        Private Sub Form_Current()
                        Dim Chemin As String
                        Dim Nom1 As String
                        Dim Nom2 As String
                        Dim Numser As String
                        On Error GoTo Err

                        Chemin = "C:\Photos\"
                        Nom1 = Me!NomPhoto1
                        Nom2 = Me!NomPhoto2
                        Numser = Me!Numserie
                        Me!Image1.Picture = Chemin & Numser & " (" & Nom1 & ")" & ".jpg"
                        Me!Image2.Picture = Chemin & Numser & " (" & Nom2 & ")" & ".jpg"
                        If Nom2 = "" Then Me!Image2.Picture = ""

                        Err_Exit:
                        Exit Sub
                        Err:
                        MsgBox Error$
                        Resume Err_Exit

                        End Sub
                        1. Dans ce cas, il faut absolument une "photo viege" (à créer avec, par exemple, Paint)

                          petite simplification :
                          Me!Image1.Picture = Chemin & Numser & " (" & Nom1 & ")" & ".jpg"
                          devient
                          Me!Image1.Picture = Chemin & Numser & " (" & Nom1 & ").jpg"

                          Private Sub Form_Current()
                          Dim Chemin As String
                          Dim Nom1 As String
                          Dim Nom2 As String
                          Dim Numser As String
                          On Error GoTo Err

                          Chemin = "C:\Photos\"
                          Nom1 = Me!NomPhoto1
                          Nom2 = Me!NomPhoto2
                          Numser = Me!Numserie
                          Me!Image1.Picture = Chemin & Numser & " (" & Nom1 & ").jpg"
                          if nom2 ="" then
                          me!image.picture = Chemin & "PhotoVierge.jpg"
                          else
                          Me!Image2.Picture = Chemin & Numser & " (" & Nom2 & ").jpg"
                          end if

                          Err_Exit:
                          Exit Sub
                          Err:
                          MsgBox Error$
                          Resume Err_Exit

                          End Sub
                          1. Super idée, j'ai mis en place cette photo vierge mais il doit y avoir une erreur quelque part

                            J'obtiens le message

                            Utilisation incorrecte de Null
                            1. Oui, car en informatique null est diférent de vide ("")
                              Le plus simple :
                              ...
                              Nom1 = Me!NomPhoto1
                              Nom2 = Me!NomPhoto2
                              if isnull(Nom1) then nom1="" ' On ne sait jamais, au cas où...
                              if isnull(Nom2) then nom2="" ' On remplace la valeur Null par Vide (ou rien) afin d'éviter les erreurs lors des tests
                              ...
                              1. J'ai toujours le meme message

                                Utilisation incorrecte de Null

                                j'ai essayé comme suit, mais, toujours le meme message

                                Private Sub Form_Current()
                                Dim Chemin As String
                                Dim Nom1 As String
                                Dim Nom2 As String
                                Dim Numser As String
                                On Error GoTo Err

                                Chemin = "C:\Photos\"
                                If IsNull(Nom1) Then
                                Nom1 = ""
                                Else
                                Nom1 = Me!NomPhoto1
                                End If

                                If IsNull(Nom2) Then
                                Nom2 = ""
                                Else
                                Nom2 = Me!NomPhoto2
                                End If

                                Numser = Me!Numserie
                                Me!Image1.Picture = Chemin & Numser & " (" & Nom1 & ").jpg"
                                If Nom2 = "" Then
                                Me!Image2.Picture = Chemin & "PhotoVierge.jpg"
                                Else
                                Me!Image2.Picture = Chemin & Numser & " (" & Nom2 & ").jpg"
                                End If

                                Err_Exit:
                                Exit Sub
                                Err:
                                MsgBox Error$
                                Resume Err_Exit

                                End Sub
                                1. Il faut d'abord déterminer d'où vient l'erreur.
                                  Pour celà:
                                  Dans le code vous mettez le ON ERROR en remarque en le faisant précéder d'une simple quote, comme ceci : 'On Error GoTo Err.
                                  Ceci va annuler l'interception des erreurs. Réexécutez l'application.
                                  Lorsque l'erreur surviendra, Access vous affichera une fenêtre, choisissez Déboguage.
                                  L'affichage basculera alors vers le VBA (Visual Basic for Application : le language que nous utilisons)
                                  Le programme sera arreté sur la lgne fautive.
                                  En déplaçant le curseur de la souris sur les différentes variables dans le code, vous verrez leur valeur. Ceci vous aidera à déterminer ce qui provoque cette erreur.
                                  L'appui sur la touche F8 exécute le code ligne par ligne.
                                  La touche F5 exécute le code jusqu'à la fin, sauf détection d'erreur.

                                  Comme les variables Nom1 et Nom2 ne peuvent plus être NULL, le problème provient probablement de Numser, et certainement quand le programme veut créer un nouvel enregistrement, pour éviter ce problème vous pouvez mettre la propriété du formulaire "Ajout autorisé" à Non.

                                  Attention que Numser est déclaré en "String" (Chaîne de caractères) alors qu'il s'agit probablement d'un Long (voir définition dans la table) il faudrait alors le déclarer comme suit Dim Numser as long; mais alors dans les concaténations (Me!Image1.Picture = Chemin & Numser & " (" & Nom1 & ").jpg") il faut transformer la variable Long en String. Ceci se fait par la fonction Cstr
                                  Me!Image1.Picture = Chemin & cstr(Numser) & " (" & Nom1 & ").jpg"

                                  Allez, courrage ...
                                  1. Voici une version "définitive" qui permet l'ajout d'enregistrements via le formulaire.
                                    Dans la table vous devriez declarer le champ Numserie avec le type de donnée NuméroAuto et en Clé Primaire.
                                    Regardez les modifications: les test ne se font plus sur les variables mais sur les valeurs contenues dans le formulaire.

                                    Private Sub Form_Current()
                                    Dim Chemin As String
                                    Dim Nom1 As String
                                    Dim Nom2 As String
                                    Dim Numser As Long
                                    'On Error GoTo Err
                                    Chemin = "C:\Photos\"
                                    If Not IsNull(Me!Numserie) Then
                                    If IsNull(Me!NomPhoto1) Then
                                    Nom1 = ""
                                    Else
                                    Nom1 = Me!NomPhoto1
                                    End If

                                    If IsNull(Me!NomPhoto2) Then
                                    Nom2 = ""
                                    Else
                                    Nom2 = Me!NomPhoto2
                                    End If

                                    Numser = Me!Numserie
                                    Me!Image1.Picture = Chemin & CStr(Numser) & " (" & Nom1 & ").jpg"
                                    If Nom2 = "" Then
                                    Me!Image2.Picture = Chemin & "PhotoVierge.jpg"
                                    Else
                                    Me!Image2.Picture = Chemin & CStr(Numser) & " (" & Nom2 & ").jpg"
                                    End If
                                    Else
                                    Me!Image1.Picture = Chemin & "PhotoVierge.jpg"
                                    Me!Image2.Picture = Chemin & "PhotoVierge.jpg"
                                    End If
                                    Err_Exit:
                                    Exit Sub
                                    Err:
                                    MsgBox Error$
                                    Resume Err_Exit
                                    End Sub
                                    1. Vous êtes vraiment sympa de passer tout ce temps pour moi, merci.

                                      J’ai trouvé ce qui clochait dans les codes précédents

                                      Il fallait
                                      If nomPhoto2= »» ….
                                      Au lieu de
                                      If nom2= »»…
                                      La condition n’était pas sur le bon champ

                                      Maintenant cela marche parfaitement.
                                      Deux années de travaille sauvées.

                                      Je vais regarder la dernière chose que vous m’avez envoyé.

                                      J’ai encore quelque chose à vous demander.
                                      Peut-on empêcher la boite de dialogue windows de s’ouvrir pendant qu’il charge les images.
                                      Cela dure quelques dixième de seconde mais cela gène pour détecter les différence entre les affiches.
                                      C’est un peu compliqué à expliquer, mais j’utilise cette base pour répertorier toutes les variantes même infimes des affiches.

                                      Je crains que cela ne soit pas possible.
                                      1. Non, je n'ai rien trouvé pour cette demande. Par contre vous pouvez noter ces différences dans un champ (un champ par photo = deux) de la table et l'afficher sous les photos. Je sais qu'il y a 3250 enregistrements, mais ces remarques ne concernent peut-être qu'une minorité d'entre-eux?
                                        Par contre voici plein d'info sur les images dans Access:
                                        http://office.microsoft.com/fr-be/access/HA011472041036.aspx?pid=CL100570041036
                                        @+

                                        PS: N'oublié pas de clôturer ce post lorsque vous l'estimerez terminé. Merci
                                        1. MERCI
                                          Je clôture ce post et vous remercie chaleureusement.
                                          Bravo à vous.