Compartir a través de


Buscar un valor o una coincidencia más cercana en una tabla de Visual FoxPro de VB .NET mediante el proveedor OLE DB de VFP

En este artículo se describe cómo buscar un valor o una coincidencia más cercana en una tabla de Visual FoxPro de VB .NET mediante el proveedor OLE DB de VFP.

Versión original del producto: Visual FoxPro
Número de KB original: 956277

PUBLICACIÓN RÁPIDA

LOS ARTÍCULOS DE PUBLICACIÓN RÁPIDA PROPORCIONAN INFORMACIÓN DIRECTAMENTE DESDE LA ORGANIZACIÓN DE SOPORTE TÉCNICO DE MICROSOFT. LA INFORMACIÓN CONTENIDA EN EL PRESENTE DOCUMENTO SE CREA EN RESPUESTA A TEMAS EMERGENTES O ÚNICOS, O SE PRETENDE COMPLEMENTAR OTRA INFORMACIÓN DE LA BASE DE CONOCIMIENTO.

Acción

Tiene una tabla de Visual FoxPro (VFP) a la que accede desde Visual Basic .NET a través del proveedor OLE DB VFP. Desea buscar un valor determinado en una columna o la coincidencia más cercana.

Solución

El comando VFP SET NEAR controla lo que sucede con el puntero de registro en una tabla VFP después de una operación SEEK (o FIND) incorrecta (SEEK usa un índice en una columna VFP para buscar un valor). Cuando NEAR está activado, el puntero de registro en la tabla VFP se coloca en el registro coincidente más cercano después de una búsqueda sin éxito.

El siguiente código de VB .NET muestra cómo ubicar un registro o la coincidencia más cercana a este mediante el proveedor OLE DB de VFP. Para usar este código...

  1. Cree una tabla y un índice de VFP de ejemplo mediante el código VFP siguiente:

    CLOSE DATA ALL
    DELETE FILE C:\CUSTS.DBF RECYCLE
    DELETE FILE C:\CUSTS.CDX RECYCLE
    CREATE TABLE C:\CUSTS (NAMES VarChar(30))
    INDEX ON UPPER(NAMES) TAG NAMES
    INSERT INTO CUSTS VALUES('FRED')
    INSERT INTO CUSTS VALUES('JOHN')
    INSERT INTO CUSTS VALUES('MARY')
    CLOSE DATA ALL
    
  2. Cree una nueva aplicación de Windows .NET de Visual Studio VB. Coloque un cuadro de texto, una casilla y un botón en el formulario.

  3. Haga doble clic en la superficie del formulario para abrir el editor de código (form1.vb) y, a continuación, pegue el código siguiente en él y reemplace el contenido actual.

El código realiza lo siguiente:

  • Ajusta ON/OFF según el estado del CheckBox en el formulario VB (marcado = ON).
  • Abrir la tabla VFP (C:\CUSTS) y buscar el nombre del cliente.
  • En el proveedor OLE DB de VFP, se crea un cursor que será devuelto a la sesión de .NET.
  • Rellena el cursor devuelto con los valores de FOUND(), RECNO('CUSTS') y RECCOUNT('CUSTS').
  • Usa la función VFP SETRESULTSET() para devolver el cursor VFP a .NET.
  • VB .NET usa un OleDbDataReader objeto para leer el cursor devuelto y mostrar los resultados de SEEK en un MSGBOX.

Nota:

  • Cuando el VFP SEEK encuentra una coincidencia exacta, FOUND() (la primera columna del conjunto de resultados) es True. Se pueden omitir otras columnas.

  • Cuando VFP SEEK no encuentra una coincidencia exacta y NEAR está activado, FOUND() (la primera columna del conjunto de resultados) es False y RECNO() (2.ª columna en el conjunto de resultados) será un número válido o será RECCOUNT() (3.ª columna en el conjunto de resultados) +1 (lo que indica EOF en la tabla VFP).

  • Cuando VFP SEEK no encuentra una coincidencia exacta y NEAR está desactivado, FOUND() será .F., RECNO() será RECCOUNT() + 1.

  • La tercera columna del conjunto de resultados es constante: RECCOUNT('CUSTS'). Úselo para determinar si está en el registro más cercano cuando NEAR está activado (columna 2 no es columna 3 + 1).

Imports System.Data.OleDb
Imports System.Text

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TextBox1.Focus()
        TextBox1.Text = "JOHN"
        TextBox1.CharacterCasing = CharacterCasing.Upper
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        FindOperator(TextBox1.Text, CheckBox1.Checked)
        TextBox1.Focus()
    End Sub
    Function FindOperator(ByVal Name2Find As String, ByVal Near As Boolean) As VariantType
        Dim oConn As New OleDbConnection( _"Provider=VFPOLEDB;Data Source=C:\")
        Dim oCmd As New OleDbCommand("", oConn)
        Dim oStrBldr As New StringBuilder
        Dim oReader As OleDbDataReader
        Dim lcNear As String = IIf(Near, "ON", "OFF")

        With oStrBldr
        .Append("EXECS(").Append("[SET NEAR " & lcNear & "] + CHR(13) + ").Append("[USE CUSTS ORDER NAMES SHARED AGAIN IN 0] + CHR(13) + ").Append("[SEEK '" & Name2Find & "' IN CUSTS] + CHR(13) + ").Append("[SELECT 0] + CHR(13) + ").Append("[CREATE CURSOR SeekResults(lFound L, nRecno I, nReccount I)] + CHR(13) + ").Append("[INSERT INTO SeekResults VALUES ( FOUND('CUSTS'), RECNO('CUSTS'), RECCOUNT('CUSTS'))]+ CHR(13) + ").Append("[USE IN SELECT('CUSTS')] + CHR(13) + ").Append("[RETURN SETRESULTSET( 'SeekResults' )]").Append(")")
        oCmd.CommandText = .ToString
        End With

        oConn.Open()
        oReader = oCmd.ExecuteReader()
        While oReader.Read
        MsgBox("Found: " & oReader.GetBoolean(0).ToString & vbCrLf & _
        "RECNO(): " & oReader.GetInt32(1).ToString & vbCrLf & _
        "RECCOUNT(): " & oReader.GetInt32(2).ToString)
        End While

        oConn.Close()
        oConn.Dispose()
        oCmd.Dispose()
        oReader.Close()
    End Function
End Class

Más información

Para obtener más información sobre las funciones y comandos de VFP usados en este artículo (SEEK, SET NEAR, RECNO(), RECCOUNT(), SELECT(), SETRESULTSET(), consulte Microsoft Visual FoxPro 9.0 SP2.

El proveedor OLE DB VFP está disponible como descarga gratuita y es la manera preferida de acceder a los datos de VFP desde aplicaciones que no son VFP. Está disponible aquí: Proveedor OLE DB de Microsoft para Visual FoxPro 9.0.

RENUNCIA

MICROSOFT Y/O SUS PROVEEDORES NO REALIZAN NINGUNA REPRESENTACIÓN O GARANTÍA SOBRE LA IDONEIDAD, CONFIABILIDAD O PRECISIÓN DE LA INFORMACIÓN CONTENIDA EN LOS DOCUMENTOS Y GRÁFICOS RELACIONADOS PUBLICADOS EN ESTE SITIO WEB (LOS "MATERIALES") PARA CUALQUIER PROPÓSITO. LOS MATERIALES PUEDEN INCLUIR IMPRECISIONES TÉCNICAS O ERRORES TIPOGRÁFICOS Y PUEDEN REVISARSE EN CUALQUIER MOMENTO SIN PREVIO AVISO.

EN LA MEDIDA MÁXIMA PERMITIDA POR LA LEY APLICABLE, MICROSOFT Y/O SUS PROVEEDORES RENUNCIAN Y EXCLUYEN TODAS LAS REPRESENTACIONES, GARANTÍAS Y CONDICIONES, YA SEAN EXPRESAS, IMPLÍCITAS O LEGALES, INCLUIDAS, ENTRE OTRAS, LAS REPRESENTACIONES, GARANTÍAS O CONDICIONES DE TÍTULO, NO INFRACCIÓN, CONDICIÓN SATISFACTORIA O CALIDAD, COMERCIABILIDAD Y IDONEIDAD PARA UN PROPÓSITO DETERMINADO, CON RESPECTO A LOS MATERIALES.