Un filtre d’importation personnalisé
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.