Un filtre d’importation personnalisé

23.04.2021

Cet exemple met en œuvre un filtre d'importation complet pour un format de fichier binaire. Le filtre d'importation qui en résulte prend en charge pratiquement toutes les options disponibles pour réaliser des filtres d'importation personnalisés via l'automatisation. Il a été spécifiquement conçu pour pouvoir servir de cadre à vos propres filtres d'importation.

Pour rester simple, l'exemple n'inclut pas la gestion des erreurs.

Le format à importer

Le format à importer est un format binaire qui a été généré à des fins d'illustration mais qui présente un modèle commun. Un programme qui peut produire des fichiers au format d'exemple, et qui a été utilisé pour créer le fichier d'exemple Demofile.tst, se trouve sous forme de code source C++ dans le même sous-dossier que la base de données et le fichier d'exemple ImportFilter.fpd. Le chemin d'accès à la base de données du projet est généralement C:\Utilisateurs\Public\Documents\Weisang\FlexPro\2021\Examples\VBA\ImportFilter\ImportFilter.fpd or C:\Users\Public\Public Documents\Weisang\FlexPro\2021\Examples\VBA\ImportFilter\ImportFilter.fpd.
 
Vous pouvez également implémenter une fonction FPScript personnalisée dans FPScript. Voir Tutoriel sur les fonctions FPScript personnalisées.

Les fichiers binaires se composent de trois parties :

Une structure d'information sur les fichiers qui comprend le nombre de canaux et la fréquence d'échantillonnage. Voici comment il est défini en Visual Basic :

Type privé FileHeader

    strID comme chaîne de caractères * 8

    nVersion As Integer

    strOrigin As String * 32

    nNumberOfChannels Comme Long

    nNumberOfSamples Comme Long

    fSamplingRate Comme Double

    nTrigger Comme Long

Type d'extrémité

Un nombre de structures d'en-tête de canal correspondant au nombre de canaux qui décrivent les canaux inclus :

Type privé ChannelHeader

    strName As String * 8

    strDescription comme chaîne de caractères * 64

    strUnit Comme Chaîne * 8

Type d'extrémité

La troisième partie contient les données, en commençant par les données du premier canal, suivies de celles du deuxième, etc.

Filtre d'importation

Pour réaliser un filtre d'importation, un module de classe doit être créé dans une base de données ; le module implémente l'interface IImportFilter (dans l'exemple : module de classe DemoImportFilter). En entrant

Implémente IImportFilter

dans la fenêtre de code du module de classe, l'entrée IImportFilter devient disponible dans la fenêtre d'objet. Si cette entrée est sélectionnée, les deux procédures de l'interface IImportFilter sont listées dans la fenêtre Procédure. Une fois que les deux procédures d'interface ont été sélectionnées dans la fenêtre Procédure, les racines de procédure correspondantes sont ajoutées à la fenêtre Code, y compris les arguments corrects.

Procédure ImportSpy

Une fois qu'un utilisateur a lancé une procédure d'importation en appelant la boîte de dialogue d'importation et en sélectionnant un fichier, la procédure ImportSpy de tous les filtres d'importation enregistrés dans FlexPro est lancée afin de déterminer quels filtres d'importation peuvent importer le fichier.

Dans l'exemple, IImportFilter_ImportSpy vérifie d'abord quel filtre a été spécifié. Cette étape n'a lieu que dans un souci de rigueur. Dans ce cas, ce n'est pas impératif car un seul format a été enregistré pour le filtre d'importation.

...

Si Filter = m_strFilter alors

...

Le filtre vérifie si l'extension du nom du fichier correspond à celle utilisée pour l'enregistrement du filtre :

...

Si Right(UCase(PathName), 4) = ".TST" Alors

...

Le fichier n'est pas ouvert et l'en-tête du fichier n'est pas lu tant que la vérification n'a pas donné un résultat positif :

...

Ouvrir le nom du chemin pour l'accès binaire Read As #1 Len = Len(TheFileHeader)

Obtenir #1, , TheFileHeader

Fermer #1

TheFileHeader.strID = CutString(TheFileHeader.strID)

Si TheFileHeader.strID = "DEMO " et TheFileHeader.nVersion = 1 alors

    IImportFilter_ImportSpy = True

End If

...

L'exemple de format de fichier contient un texte d'identification et un numéro de version qui permettent d'identifier le format. Si le texte d'identification est correct et que le format de fichier comporte une version prise en charge, la fonction renvoie True.

S'il existe d'autres filtres d'importation spécifiques qui prennent en charge ce format de fichier, une boîte de dialogue de sélection apparaît pendant l'importation, dans laquelle l'utilisateur peut sélectionner le filtre d'importation à utiliser. FlexPro appelle ensuite la procédure d' importation du filtre d'importation afin d'importer le fichier.

Procédure d'importation

La procédure d' importation n'est appelée que si la procédure ImportSpy du filtre d'importation a été appelée avec succès.

Comme pour la procédure ImportSpy, la première étape est une vérification du filtre. Ensuite, l'en-tête du fichier spécifié ainsi que les informations d'en-tête de tous les éléments ou canaux sont lus :

...

Ouvrir le nom du chemin pour l'accès binaire en lecture comme #1

Obtenir #1, , TheFileHeader

For i = 1 To TheFileHeader.nNumberOfChannels

    Obtenir #1, , TheChannelHeader

    Set oImportItem = New ImportItem

    oImportItem.strName = CutString(TheChannelHeader.strName)

    oImportItem.strDescription = _

             CutString(TheChannelHeader.strDescription)

    oImportItem.strUnit = CutString(TheChannelHeader.strUnit)

    oImportItem.nSamples = TheFileHeader.nNumberOfSamples

    oItemColl.Add oImportItem

Suivant i

nDataStartPos = Seek(1) - 1

Fermer #1

...

Les éléments trouvés sont stockés dans un objet Collection avec toutes les données pertinentes pour la présentation dans la boîte de dialogue ou pour l'importation. Si le fichier est automatiquement importé dans son intégralité, une boîte de dialogue apparaît où l'utilisateur peut choisir les éléments à importer.

...

Si (Flags et fpImportOptionAutomatic) = 0 alors

    Set oFrm = New ImportItemsSelectFrm

    oFrm.InitAndShow oItemColl, Flags

    bCancel = oFrm.m_bCancel

    Déchargez l'oFrm

End If

...

Enfin, les éléments sélectionnés sont ensuite importés, en tenant compte du paramètre Flags. Si un nouveau sous-dossier doit être créé pour chaque fichier à importer, ces sous-dossiers sont créés en premier :

...

Si Flags et fpImportOptionSubfolder alors

    Set oFile = oFS.GetFile(PathName)

    Set oImportFolder = Folder.Add(Left(oFile.Name, InStrRev(oFile.Name, ".")_

                        - 1), fpObjectTypeFolder)

Else ' importer dans le dossier donné

    Set oImportFolder = Dossier

End If

...

Si les données ne doivent pas être importées en tant que signaux, un ensemble de données X est créé en premier lieu ; il peut être référencé par tous les autres ensembles de données en tant que composant X. Dans l'exemple, il n'y a qu'un seul intervalle d'échantillonnage et un seul déclencheur, de sorte que la composante X peut être calculée à l'aide d'une formule :

...

Si (Flags et fpImportOptionSignal) = 0 alors

    Set oXItem = oImportFolder.Add("XItem", fpObjectTypeFormula)

    oXItem.Origin = TheFileHeader.strOrigin

    oXItem.Component = fpDataComponentX

    oXItem.Formula = "(" & CStr(TheFileHeader.nNumberOfSamples) & ", " & _

        CStr(-(TheFileHeader.nTrigger * oBinaryDataLink.SamplingInterval)) _

         & ", " & CStr(1 / TheFileHeader.fSamplingRate) & ")"

End If

...

Enfin, tous les composants Y sélectionnés dans le fichier sont importés. Dans l'exemple, cela peut être fait en tirant parti des capacités offertes par l'importation binaire de FlexPro. Pour chaque canal à importer, un objet BinaryDataLink est créé et paramétré selon les spécifications. Enfin, la procédure décide si l'objet créé est évalué dans un ensemble de données (le drapeau fpImportOptionLink a été activé) ou si l'objet BinaryDataLink est conservé en tant que lien.

...

For i = 1 To oItemColl.Count

    Si oItemColl(i).bSelected = True Alors

        Set oBinaryDataLink = oImportFolder.Add(oItemColl(i).strName_

             , fpObjectTypeBinaryDataLink)

        ' propriétés générales

        oBinaryDataLink.CommentsY = oItemColl(i).strDescription

        oBinaryDataLink.Origin = TheFileHeader.strOrigin

        oBinaryDataLink.Author = Application.UserName

        ' Importation de propriétés

        oBinaryDataLink.FilePath = PathName

        oBinaryDataLink.NumberOfBlocks = 1

        oBinaryDataLink.BlockSize = 200

        oBinaryDataLink.ByteDistance = 0

        oBinaryDataLink.ResultDataType = fpBinaryDataLinkResultDataTypeFloatingPoint64

        oBinaryDataLink.DataType = fpBinaryDataLinkDataTypeFloatingPoint64

        oBinaryDataLink.ByteOffset = nDataStartPos + ((i - 1)_

                                     * TheFileHeader.nNumberOfSamples * 8)

        ' comme signal

        Si Flags et fpImportOptionSignal alors

            oBinaryDataLink.AsSignal = True

            oBinaryDataLink.SamplingInterval = 1 / TheFileHeader.fSamplingRate

            oBinaryDataLink.SamplingOrigin = -(TheFileHeader.nTrigger_

                                             * oBinaryDataLink.SamplingInterval)

        Else ' affecte le composant X créé ci-dessus à cet élément

            oBinaryDataLink.Component = fpDataComponentY

            oBinaryDataLink.AssignedX = oXItem.Name

        End If

        ' Si l'action d'importation est une copie, évaluez le lien vers données binaires

        Si (Flags et fpImportOptionLink) = 0 alors

            oBinaryDataLink.Evaluate

        End If

    End If

Suivant i

...

Si l'importation a été effectuée avec succès, la procédure renvoie True.

Enregistrement d'un filtre d'importation

Pour qu'un filtre d'importation personnalisé soit disponible dans la boîte de dialogue Importation de FlexPro (le format de fichier est répertorié sous Type de fichier) , il doit être généré à l'aide de la fonction

Dim oImportFilter As New DemoImportFilter

et ensuite être enregistré avec l'objet FlexPro Application en appelant RegisterImport.

RegisterImport oImportFilter.m_strFilter, _

        fpImportOptionSpecific Or _

        fpImportOptionLink ou fpImportOptionNoLink ou ________

        fpImportOptionSubfolder ou fpImportOptionNoSubfolder ou ________

        fpImportOptionAutomatic ou fpImportOptionManual ou ________________

        fpImportOptionSignal ou fpImportOptionNoSignal ou ________________

        fpImportOptionNoCalendarTime, _

        oImportFilter

Lors de l'enregistrement, le filtre d'importation lui-même est référencé et spécifie quelles options disponibles dans la boîte de dialogue Filtre d'importation sont prises en charge.

Si, par exemple, un filtre d'importation ne prend pas en charge les liens, seul l'indicateur fpImportOptionNoLink est spécifié dans le premier argument de RegisterImport. L'option Créer des liens sera grisée et ne sera pas définie si ce filtre d'importation est sélectionné dans la boîte de dialogue d' importation. Si seule fpImportOptionLink est spécifiée, l'option Créer des liens est également grise, mais activée. Si les deux options sont prises en charge(fpImportOptionLink ou fpImportOptionNoLink), l'utilisateur peut choisir librement la manière dont l'importation aura lieu.

Cette procédure s'applique également aux options suivantes :

Créer un nouveau dossier pour chaque fichier

Importer avec temps absolu

Importer sous forme de signaux

Si un filtre d'importation doit être disponible dans toutes les bases de données d'un utilisateur ou pour tous les utilisateurs en général, il est recommandé de l'implémenter dans la base de données modèle personnelle et de l'enregistrer dans la procédure AutoExec, qui est exécutée automatiquement lorsque la base de données modèle est chargée. Le désenregistrement peut alors être traité par la procédure AutoExit (voir aussi Auto Macros).

Remarque :   Lors de l'élaboration d'un filtre d'importation personnalisé, veuillez tenir compte des points suivants : Lorsqu'un projet VBA est réinitialisé, par exemple en raison de modifications du code dans le débogueur, les filtres d'importation précédemment enregistrés de ce projet ne seront plus appelés. Le filtre d'importation doit être désenregistré et réenregistré à nouveau.

Partager l’article ou envoyer par mail :

Vous serez probablement intéressé par les articles suivants :