Este ejemplo implementa un filtro de importación completo para un formato de archivo binario. El filtro de importación implementado admite casi todas las opciones disponibles para la realización de filtros de importación definidos por el usuario mediante automatización. Se ha diseñado deliberadamente para que pueda utilizarse como marco para un filtro de importación personalizado.
Por razones de claridad, no se ha realizado ningún tratamiento de errores.
El formato a importar
El formato que debe importarse es un formato de datos binario creado con fines de demostración, pero que responde a un patrón común. En la misma subcarpeta que la base de datos de muestra ImportFilter.fpd y el archivo de muestra se encuentra un programa que puede crear archivos en formato de muestra -y con el que también se creó el archivo de muestra Demofile.tst- como código fuente C++. El nombre de la ruta de acceso de la base de datos del proyecto es normalmente C:\Users\Public\Documents\Weisang\FlexPro\2025\Examples\VBA\Import Filter\ImportFilter.fpd o C:\Usuarios\Acceso público\Documentos públicos\Weisang\FlexPro\2025\Examples\VBA\Import Filter\ImportFilter.fpd.
También puede implementar una función FPScript definida por el usuario en FPScript. Consulte el tutorial Funciones FPScript personalizadas.
Los archivos binarios constan de tres partes:
•una estructura de información de archivo que incluye, entre otras cosas, el número de canales y la frecuencia de muestreo. He aquí la definición en Visual Basic:
Private Type FileHeader
strID As String * 8
nVersion As Integer
strOrigin As String * 32
nNumberOfChannels As Long
nNúmeroDeMuestras As Long
fSamplingRate As Double
nTrigger As Long
End Type
•un número de estructuras de cabecera de canal correspondiente al número de canales, que describen los canales contenidos:
Private Type ChannelHeader
strName As String * 8
strDescription As String * 64
strUnit As String * 8
End Type
•a continuación vienen los datos, primero todos los del primer canal, luego los del segundo y así sucesivamente.
Filtro de importación
Para realizar un filtro de importación, debe crearse un módulo de clase en una base de datos que implemente la interfaz IImportFilter (en el ejemplo: módulo de clase DemoImportFilter). Al entrar
Implements IImportFilter
en la ventana de código del módulo de clase, la entrada IImportFilter pasa a estar disponible en la ventana de objetos. Si se selecciona esta entrada, los dos procedimientos de la interfaz IImportFilter aparecen en la ventana Procedimiento. Una vez seleccionados los dos procedimientos de interfaz en la ventana Procedimiento, se insertan en la ventana Código los cuerpos de procedimiento correspondientes con los argumentos correctos.
Procedimiento ImportSpy
Después de que un usuario haya iniciado un proceso de importación llamando al cuadro de diálogo de importación y seleccionando un archivo, se llama al procedimiento ImportSpy de todos los filtros de importación FlexPro para determinar qué filtros de importación pueden importar el archivo.
En el ejemplo, IImportFilter_ImportSpy comprueba primero qué filtro se ha especificado. Esto se hace aquí únicamente por razones de exhaustividad. En este caso, no es obligatorio porque solo se ha registrado un formato para el filtro de importación.
...
If Filter = m_strFilter Then
...
A continuación, el sistema comprueba si la extensión del nombre del archivo coincide con aquella para la que se registró el filtro:
...
If Right(UCase(PathName), 4) = ".TST" Then
...
El archivo solo se abre y la cabecera del archivo se lee cuando este es el caso:
...
Open PathName For Binary Access Read As #1 Len = Len(TheFileHeader)
Get #1, , TheFileHeader
Close #1
TheFileHeader.strID = CutString(TheFileHeader.strID)
If TheFileHeader.strID = "DEMO " And TheFileHeader.nVersion = 1 Then
IImportFilter_ImportSpy = True
End If
...
El formato de archivo de muestra contiene un texto de identificación y un número de versión que pueden utilizarse para reconocer el formato. Si el texto de identificación es correcto y el formato de archivo tiene una versión compatible, la función devuelve True.
Si existen otros filtros de importación específicos que admitan el formato de archivo en cuestión, se mostrará un cuadro de diálogo de selección durante la importación en el que el usuario podrá seleccionar el filtro de importación que desea utilizar; de lo contrario, FlexPro llamará al procedimiento de importacióndel filtro de importación para importar el archivo.
Procedimiento de importación
Solo se llama al procedimiento Importsi se ha llamado con éxito al procedimiento ImportSpyde los filtros de importación.
Como en el procedimiento ImportSpy, primero se comprueba el filtro. A continuación, se lee la cabecera del archivo especificado y la información de cabecera de todos los elementos o canales:
...
Open PathName For Binary Access Read As #1
Get #1, , TheFileHeader
For i = 1 To TheFileHeader.nNumberOfChannels
Get #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
Next i
nDataStartPos = Seek(1) - 1
Close #1
...
Los elementos encontrados se almacenan en un objeto Colecciónjunto con todos los datos relevantes para su visualización en el diálogo o para su importación. Si el archivo no debe importarse de forma totalmente automática, aparece un cuadro de diálogo en el que el usuario puede seleccionar los elementos que desea importar.
...
If (Flags And fpImportOptionAutomatic) = 0 Then
Set oFrm = New ImportItemsSelectFrm
oFrm.InitAndShow oItemColl, Flags
bCancel = oFrm.m_bCancel
Unload oFrm
End If
...

A continuación, se importan los elementos seleccionados teniendo en cuenta el parámetro Flags. Si hay que crear una nueva subcarpeta para cada archivo que se va a importar, esto se hace primero:
...
If Flags And fpImportOptionSubfolder Then
Set oFile = oFS.GetFile(PathName)
Set oImportFolder = Folder.Add(Left(oFile.Name, InStrRev(oFile.Name, ".")_
- 1), fpObjectTypeFolder)
Else ' import into the given folder
Set oImportFolder = Folder
End If
...
Si los datos no se van a importar como señales, primero se crea un conjunto de datos X, al que todos los demás conjuntos de datos pueden hacer referencia como componente X. En el ejemplo, solo hay un intervalo de muestreo y un trigger, por lo que el componente X puede calcularse mediante una fórmula:
...
If (Flags And fpImportOptionSignal) = 0 Then
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
...
Por último, todos los componentes Y seleccionados se importan en el archivo. En el ejemplo, se pueden importar fácilmente utilizando las opciones de importación binaria de FlexPro. Se crea un objeto BinaryDataLinkpara cada canal que se va a importar y se parametriza de acuerdo con las especificaciones. Al final, se decide si el objeto creado se evalúa en un conjunto de datos (se ha activado el indicador fpImportOptionLink) o si el objeto BinaryDataLinkse conserva como vínculo.
...
For i = 1 To oItemColl.Count
If oItemColl(i).bSelected = True Then
Set oBinaryDataLink = oImportFolder.Add(oItemColl(i).strName_
, fpObjectTypeBinaryDataLink)
' general properties
oBinaryDataLink.CommentsY = oItemColl(i).strDescription
oBinaryDataLink.Origin = TheFileHeader.strOrigin
oBinaryDataLink.Author = Application.UserName
propiedades de importación
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)
' as signal ?
If Flags And fpImportOptionSignal Then
oBinaryDataLink.AsSignal = True
oBinaryDataLink.SamplingInterval = 1 / TheFileHeader.fSamplingRate
oBinaryDataLink.SamplingOrigin = -(TheFileHeader.nTrigger_
* oBinaryDataLink.SamplingInterval)
Else ' assign the X component created above to this item
oBinaryDataLink.Component = fpDataComponentY
oBinaryDataLink.AssignedX = oXItem.Name
End If
' if import action is copy than evaluate the binary data link
If (Flags And fpImportOptionLink) = 0 Then
oBinaryDataLink.Evaluate
End If
End If
Next i
...
Si la importación se ha realizado correctamente, el procedimiento devuelve True.
Registrar un filtro de importación
Para que un filtro de importación definido por el usuario esté disponible en el cuadro de diálogo Importarde FlexPro (el formato de archivo aparece en Tipo de archivo), primero debe activarse con
Dim oImportFilter As New DemoImportFilter
y luego registrarse con el objeto Application de FlexPro llamando a RegisterImport.
RegisterImport oImportFilter.m_strFilter, _
fpImportOptionSpecific Or _
fpImportOptionLink Or fpImportOptionNoLink Or _
fpImportOptionSubfolder Or fpImportOptionNoSubfolder Or _
fpImportOptionAutomatic Or fpImportOptionManual Or _
fpImportOptionSignal Or fpImportOptionNoSignal Or _
fpImportOptionNoCalendarTime, _
oImportFilter
Al registrarse, además de una referencia al filtro de importación en sí, también se especifica cuáles de las opciones disponibles en el cuadro de diálogo del filtro de importación son compatibles.
Si un filtro de importación no admite vínculos, por ejemplo, solo se especifica el indicador fpImportOptionNoLink en el primer argumento de RegisterImport. La opción Crear accesos directos aparece atenuada y no se activa cuando se selecciona este filtro de importación en el cuadro de diálogo Importar. Si solo se especifica fpImportOptionLink, la opción Crear vínculos también aparece atenuada pero activada. Si se admiten ambas opciones (fpImportOptionLink Or fpImportOptionNoLink), el usuario puede determinar libremente cómo debe realizarse la importación.
Este procedimiento se aplica de forma análoga a las opciones:
•Crea una nueva carpeta para cada archivo
•Importación con tiempo absoluto
•Importar como señales
Si un filtro de importación debe estar disponible en todas las bases de datos de un usuario o, en general, para todos los usuarios, es aconsejable implementarlo en la base de datos de plantillas personales y registrarlo en el procedimiento AutoExec que se ejecuta automáticamente cuando se carga la base de datos de plantillas. La baja se puede realizar entonces en el procedimiento AutoExit (véase también Auto macros).
Nota Tenga en cuenta lo siguiente cuando desarrolle un filtro de importación personalizado: Si se restablece un proyecto VBA, por ejemplo, cuando se realizan cambios en el código en el depurador, los filtros de importación previamente registrados para este proyecto ya no se llaman. El filtro de importación debe darse de baja y registrarse de nuevo.