Saltar navegación

Documentación de FlexPro 2025

Un filtro de importación personalizado

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.