Jeudi 31 janvier 2008

Microsoft, par l'intermédiaire de son partenaire OpenGate Software, met à disposition gratuitement et en téléchargement un logiciel (add-in) nommé "PowerBrowser for Access" qui peut vous faciliter la vie pour la gestion de vos tables.

Ce complément vous permet notamment de:

- Masquer plusieurs tables à la fois 
- Copier plusieurs tables à la fois 
- Supprimer plusieurs tables à la fois
- Modifier immédiatement les descriptions des tables
- Voir la liste des champs des tables, sans les ouvrir 
- lancer une création de formulaire et d'état
- ouvrir plusieurs tables simultanément en mode feuille de données ou en modification de table

Quelques semaines d'essais sur Access 2007 permettent de dire que cet outil est performant et agréable d'utilisation.

Configuration minimum: Access 2002, 2003 et 2007 uniquement

Téléchargement de ce complément sur : http://office.microsoft.com/en-us/marketplace/EM102562871033.aspx?CategoryID=CE010737481033
sans oublier de cliquer sur "Add-In Install Instructions" qui vous indiquera la procédure d'installation selon votre version Access.

 

Par Raymond - Publié dans : Téléchargements
Ecrire un commentaire - Voir les commentaires - Recommander
Mardi 29 janvier 2008

Vous avez souvent besoin de créer un champ, quelquefois une table complète, à l’intérieur de votre code VBA. Pour l’ajout d’un champ simple tel un champ texte ça ne pose pas de problème mais lorsque vous touchez les index ou les listes de choix, la procédure se complique et vous tâtonnez dans les propriétés à insérer.

Nous allons prendre l’exemple d’une table Contacts existante.

Ajouter un index :

    Dim Db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim Fld As DAO.Field
    Dim idx As DAO.index
    Set Db = CurrentDb()
    Set tdf = Db.TableDefs("Contacts")
    Set idx = tdf.CreateIndex("Nomdelindex")
    Set Fld = idx.CreateField("Nomduchamp")
    idx.Fields.Append Fld
    tdf.Indexes.Append idx
    Set Fld = Nothing
    Set idx = Nothing
    Set tdf = Nothing
    Set Db = Nothing

On pourra concentrer les instructions vba mais le détail ci-dessus montre bien le traitement séparé du nom d'index et du nom du champ utilisé en index.



Ajouter un champ texte avec liste de choix:

    Dim Db As DAO.Database
    Dim tdf As DAO.TableDef
    Set Db = CurrentDb()
    Set tdf = Db.TableDefs("Contacts")
    tdf.Fields.Append tdf.CreateField("BusinessAddressCountry", dbText, 50)
    tdf!BusinessAddressCountry.AllowZeroLength = True
    tdf!BusinessAddressCountry.Properties.Append _
           tdf.CreateProperty("Caption", dbText, "Pays")
    tdf!BusinessAddressCountry.Properties.Append _
           tdf.CreateProperty("Description", dbText, "Pays du bureau")
    tdf!BusinessAddressCountry.Properties.Append _
           tdf.CreateProperty("UnicodeCompression", dbBoolean, True)
    ' Liste de choix
    tdf!BusinessAddressCountry.Properties.Append _
           tdf.CreateProperty("DisplayControl", dbInteger, acComboBox)
    tdf!BusinessAddressCountry.Properties.Append _
           tdf.CreateProperty("RowSourceType", dbText, "Table/Query")
    tdf!BusinessAddressCountry.Properties.Append _
           tdf.CreateProperty("RowSource", dbText, _
           "SELECT Pays_Nom FROM Pays ORDER BY 
Pays_Nom;")
    tdf!BusinessAddressCountry.Properties.Append _
           tdf.CreateProperty("ListRows", dbInteger, 32)
    tdf!BusinessAddressCountry.Properties.Append _
           tdf.CreateProperty("LimitToList", dbBoolean, True)
    tdf!BusinessAddressCountry.Properties.Append _
           tdf.CreateProperty("AllowValueListEdits", dbBoolean, True)
    Set tdf = Nothing
    Set Db = Nothing

Il est à noter que la propriété DisplayControl doit être la première propriété à créer en ce qui concerne la liste de choix, sinon les autres propriétés sont ignorées. Vous remarquerez que nous retrouvons exactement les mêmes propriétés qu'en VBA avec les mêmes appellations.

 

Par Raymond - Publié dans : Astuces
Ecrire un commentaire - Voir les commentaires - Recommander
Mardi 29 janvier 2008
Access utilise le schéma de codage de caractères Unicode pour représenter les données dans un champ Texte, Mémo ou Lien hypertexte. Étant donné que Unicode code chaque caractère sur deux octets, les données d'un champ Texte, Mémo ou Lien hypertexte nécessitent plus d'espace de stockage que dans les versions 97 ou antérieures, où les caractères étaient représentés sur un octet.
Pour décaler l'effet de représentation Unicode des caractères et garantir une performance optimale, la valeur par défaut de la propriété Compression Unicode d'un champ Texte, Mémo ou Lien hypertexte est Oui, lors de la création du champ en mode création de table de l’interface utilisateur. Lorsque la propriété Compression Unicode d'un champ est définie à Oui, tout caractère dont le premier octet est 0 est compressé lorsqu'il est stocké et décompressé lorsqu'il est extrait. Étant donné que le premier octet d'un caractère latin — caractère d'une langue occidentale telle que l'anglais, le français, l'espagnol ou l'allemand — est 0, la représentation des caractères au format Unicode n'affecte pas la quantité d'espace de stockage nécessaire pour les données compressées qui se composent entièrement de caractères latins.
Dans un champ, vous pouvez stocker n'importe quelle combinaison de caractères pris en charge par Unicode. Toutefois, si le premier octet d'un caractère particulier n'est pas 0, ce caractère n'est pas compressé.
Dans un champ Mémo, les données ne sont pas compressées tant qu'elles ne dépassent pas 4 096 octets d'espace de stockage après compression. Par conséquent, le contenu d'un champ Mémo peut être compressé dans un enregistrement, mais peut ne pas l'être dans un autre.
Ce dernier alinéa apporte un bémol à l’efficacité d’une telle propriété sur un champ mémo. Cette limite de 4Ko minimum pour compresser les données du champ mémo veut dire que seules les données de taille supérieure à 8-10Ko seront traitées et que l’efficacité s’en trouve terriblement diminuée. Si toutes les données des champs mémo de la base ne dépassent pas 8Ko, aucune compression ne sera réalisée et dans ce cas aucun gain de taille ne sera observé.
Seule la compression unicode des champs texte reste efficace en matière de taille de base Access, mais est-elle efficace en matière de temps d’exécution ? La question reste posée.
NB : en création de champ par programmation VBA, la valeur par défaut de la propriété Compression unicode est à Non par défaut.
Par Raymond - Publié dans : Spécifications
Ecrire un commentaire - Voir les commentaires - Recommander
Dimanche 27 janvier 2008

Vous avez la possibilité de récupérer une table que vous avez supprimée par erreur, bien sûr, sous certaines conditions.

Si ces conditions sont respectées :
- La base de données n'a pas été fermée depuis que la table a été supprimée,
- La base de données n'a pas été compactée depuis que la table a été supprimée,
- Les tables ont été supprimés en utilisant l'interface utilisateur Access uniquement (hors VBA, requêtes, etc…),
- La table ne contient aucune pièce jointe ou champ multivaleurs,

Alors, votre table a des chances d’être restaurée dans un bon état, tout en sachant bien que cette restauration peut ne pas réussir.

Si l’option « compacter à la fermeture » est positionnée et si vous fermez la base, la table sera irrécupérable car le changement de l’option ne prend effet qu’à la prochaine ouverture de la base. Si cette option n'était pas positionnée, une fermeture ne devrait pas empêcher une bonne restauration.

La table restaurée sera nommée sous un nom unique déterminé par Access (du genre CLP309541) et vous devrez immédiatement la renommer pour éviter qu’une deuxième restauration ne vienne la détruire. Tant que la base ne sera pas compactée, la table supprimée peut rester présente et dans l’état où elle était lors de sa suppression.

La restauration des tables sera réalisée par une procédure VBA que vous trouverez ci-dessous. Cette restauration devant intervenir dès que vous vous apercevez de la suppression, les conditions d’utilisation de la base feront peut-être que vous ne pourrez pas envisager la restauration. Vous devrez déterminer si ce code spécial doit être inclus dans votre base.

Si la table possède des champs pièce Jointe et MultiValeurs, la procédure actuelle ne peut pas restaurer la table. Mais vous pouvez tenter une opération en modifiant la requête, en indiquant tous les champs et non un astérisque, et en n’indiquant pas les champs pièce Jointe et multivaleurs. Les champs indiqués devraient être restaurés normalement.
Vous devez également essayer, sur une copie de base, d’afficher les tables system et de renommer la table refusée dans la table MSysObjects pour qu’elle puisse s’afficher dans la fenêtre. Si vous pouvez récupérer cette table, un code VBA spécifique à écrire vous permettra de restaurer l’ensemble de votre table quels que soient les types de champs. Mais attention, cette opération ne peut être conduite que par un spécialiste Access et toute mauvaise manipulation peut détruire l'ensemble de la base.


Procédure de restauration.
Placez ce code dans un module standard, que vous pourrez exécuter à partir d'un formulaire ou dans la fenêtre exécution. 

Option Compare Database
Option Explicit

Public Sub RestaurerTablesSupprimées()
    On Error GoTo ErrTables
    DoCmd.SetWarnings False
    Dim Db As DAO.Database
    Dim Tbl As String
    Dim strSQL As String
    Dim I As Integer
    Dim TblRestaurées As Integer
    Set Db = CurrentDb()
    For I = 0 To Db.TableDefs.Count - 1
        Tbl = Db.TableDefs(I).Name
        If Left(Tbl, 4) = "~tmp" Then
            strSQL = "SELECT DISTINCTROW [" & Tbl & "].* INTO " & Mid(Tbl, 5) & " FROM [" & Tbl & "];"
            If MsgBox("Voulez-vous restaurer la table " & Mid(Tbl, 5) & " ?", vbYesNo, "Restauration") = vbYes Then
                DoCmd.RunSQL strSQL
                RefreshDatabaseWindow
                TblRestaurées = TblRestaurées + 1
                DoEvents
                MsgBox "Une table a été restaurée sous le nom '" & Mid(Tbl, 5) & "'", vbOKOnly, "Restauration"
            End If
        End If
    Next I
    MsgBox "Restauration terminée, " & TblRestaurées & IIf(TblRestaurées > 1, " Tables restaurées.", " Table restaurée."), vbOKOnly
ExitSub:
    DoCmd.SetWarnings True
    Set Db = Nothing
    Exit Sub
ErrTables:
    MsgBox Err.Description
    Resume ExitSub
End Sub

Par Raymond - Publié dans : Astuces
Ecrire un commentaire - Voir les commentaires - Recommander
Dimanche 27 janvier 2008
Sur un formulaire d’interrogation vous avez disposé sept contrôles, texte ou combo ou cases à cocher, pour sélectionner des enregistrements selon un filtre composé des sept éléments si ceux-ci contiennent une valeur. Si un contrôle est Null, il n’entre pas dans le filtre. Vous faîtes donc une fonction, appelée dans tous les événements AfterUpdate des sept contrôles, qui génère et applique le filtre.
La façon la plus simple est d’utiliser des instructions If qui testent la valeur Null de ces contrôle :
Private Function loadFilter()
    Dim myFilter as String
    myFilter = ""
    If Not IsNull(Me!f_num) Then
        myFilter = myFilter & "[cli_code]= '" & Me!f_num & "' and "
    End If
    If Not IsNull(Me!f_lib) Then
        myFilter = myFilter & "[cli_rais] like '" & Me!f_lib & "' and "
    End If
    If Not IsNull(Me!f_nom) Then
        myFilter = myFilter & "[cli_nom] like '" & Me!f_nom & "' and "
    End If
    If Not IsNull(Me!f_vil) Then
        myFilter = myFilter & "[cli_vil]= '" & Me!f_vil & "' and "
    End If
    If Not IsNull(Me!f_pays) Then
        myFilter = myFilter & "[cli_pays]= '" & Me!f_pays & "' and "
    End If
    If Not IsNull(Me!f_rep) Then
        myFilter = myFilter & "[cli_rep]= '" & Me!f_rep & "' and "
    End If
    If Not IsNull(Me!f_sect) Then
        myFilter = myFilter & "[cli_secteur]= " & Me!f_sect & " and "
    End If
    If myFilter <> "" Then
        Me.Filter = Left$(myFilter, Len(myFilter) - 4)
        Me.FilterOn = True
    Else
        Me.Filter = ""
        Me.FilterOn = False
    End If
End Function
 
Vous pouvez commencer par réduire le code de cette fonction ainsi :
Private Function loadFilter()
    Dim myFilter As String
    myFilter = ""
    If Not IsNull(Me!f_num) Then myFilter = myFilter & "[cli_code]= '" & Me!f_num & "' and "
    If Not IsNull(Me!f_lib) Then myFilter = myFilter & "[cli_rais] like '" & Me!f_lib & "' and "
    If Not IsNull(Me!f_nom) Then myFilter = myFilter & "[cli_nom] like '" & Me!f_nom & "' and "
    If Not IsNull(Me!f_vil) Then myFilter = myFilter & "[cli_vil]= '" & Me!f_vil & "' and "
    If Not IsNull(Me!f_pays) Then myFilter = myFilter & "[cli_pays]= '" & Me!f_pays & "' and "
    If Not IsNull(Me!f_rep) Then myFilter = myFilter & "[cli_rep]= '" & Me!f_rep & "' and "
    If Not IsNull(Me!f_sect) Then myFilter = myFilter & "[cli_secteur]= " & Me!f_sect & " and "
    If myFilter <> "" Then
        Me.Filter = Left$(myFilter, Len(myFilter) - 4)
        Me.FilterOn = True
    Else
        Me.Filter = ""
        Me.FilterOn = False
    End If
End Function
Ce qui n'apportera qu'un gain de place sur l'écran. 
Mais, surtout, vous pouvez modifier le code, non seulement en le réduisant mais en l’optimisant, en appliquant les expressions conditionnelles de la propagation Null :
Private Function loadFilter()
    Dim myFilter As String
    myFilter = ""
    myFilter = myFilter & ("[cli_code]= '" + Me!f_num + "' and ")
    myFilter = myFilter & ("[cli_rais] like '" + Me!f_lib + "' and ")
    myFilter = myFilter & ("[cli_nom] like '" + Me!f_nom + "' and ")
    myFilter = myFilter & ("[cli_vil]= '" + Me!f_vil + "' and ")
    myFilter = myFilter & ("[cli_pays]= '" + Me!f_pays + "' and ")
    myFilter = myFilter & ("[cli_rep]= '" + Me!f_rep + "' and ")
    myFilter = myFilter & ("[cli_secteur]= " + Me!f_sect + " and ")
    If myFilter <> "" Then
        Me.Filter = Left$(myFilter, Len(myFilter) - 4)
        Me.FilterOn = True
    Else
        Me.Filter = ""
        Me.FilterOn = False
    End If
End Function
L’opérateur + placé dans les expressions conditionnelles indique de retourner une valeur Null pour l’expression entière si un de ses membres est Null. Donc si le champ de sélection est Null, toute l’expression sera null et rien ne sera ajouté dans myFilter. Non seulement vous économisez du code mais vous gagnez beaucoup de temps d’exécution.
Explications sur la propagation Null : http://officesystem.access.over-blog.com/article-15664382.html
 
 
Par Raymond - Publié dans : Astuces
Ecrire un commentaire - Voir les 1 commentaires - Recommander

Syndication

  • Flux RSS des articles

Calendrier

Novembre 2009
L M M J V S D
            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            
<< < > >>

Rechercher

Créer un blog sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus