Cómo crear una base de Recordset jerárquico fabricado en un conjunto de registros existente

Seleccione idioma Seleccione idioma
Id. de artículo: 241202 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Resumen

Algunas directivas corporativas permiten sólo lectura-acceso a tablas de base de datos con todas las actualizaciones se realiza mediante procedimientos almacenados. Si desea enlazar un control de datos, como el control cuadrícula de flexible jerárquica o vista de lista a un conjunto de registros jerárquico, esto puede suponer un problema de mantener en sincronización con los datos el conjunto de registros si se permite agregar, eliminar y modificar registros, pero no puede editar directamente a través de recordset jerárquico.

Más información

Si desea mantener un conjunto de registros jerárquico sincronizada con el servidor, pero no puede agregar registros mediante el conjunto de registros jerárquico, existen de soluciones:
  1. Puede volver a consultar el conjunto de registros. Esto tiene la desventaja de un rendimiento deficiente.
  2. Puede desconectar el conjunto de registros y realizar adiciones y otras modificaciones en paralelo con procedimientos almacenados. El problema es que algunos campos son de sólo lectura, como la identidad y TimeStamp y no se puede establecer su valor. Esto resulta problemático si la columna de identidad en el registro principal se utiliza para vincular el recordset(s) secundarios o se suministra a los procedimientos almacenados para identificar el registro se actualice, o si la columna TimeStamp se pasa al procedimiento almacenado para determinar si alguien tiene editied el registro en el tiempo medio. Hay una serie de soluciones:
    1. Puede copiar los datos en una base de datos local, como por ejemplo una MDB de Jet y utilizar tipos de datos que no el campo de sólo lectura. Puede actualizar el conjunto de registros jerárquico en paralelo mediante procedimientos almacenados y mantener sincronizados los datos.
    2. Puede fabricar un conjunto de registros jerárquico basado en el original y copie los datos en él. Los campos todo será actualizables y puede actualizar el conjunto de registros en paralelo mediante procedimientos almacenados.
Este artículo proporciona código de ejemplo para la última solución. Es genérico para trabajar con cualquier conjunto de registros jerárquico, mientras no (a) está parametrizada y (b) no utiliza las palabras clave COMPUTE o BY . Si necesita cualquiera de estas características, debe copiar los datos en una base de datos local y manipular desde allí.

El artículo proporciona las siguientes funciones:

Contraer esta tablaAmpliar esta tabla
Nombre de funciónDescripción
GenerateShapeSQLGenera una instrucción SHAPE dada un conjunto de registros jerárquico abierto. La sintaxis genera es diferente de la sintaxis de forma habitual, que no obtiene los campo nombres y tipos de datos desde el proveedor de datos back-end. Para obtener más información sobre esta sintaxis, consulte el siguiente artículo de Knowledge Base:
196029 How To Create Hierarchical Recordsets Programmatically
GenerateRelateClauseGenera una cláusula RELATE basada en los números de campo especificados en la propiedad RELATIONCONDITIONS del campo de capítulo. Esta función se utiliza por GenerateShapeSQL.
TypeNameDevuelve la representación texto de tipo de datos de un campo con información de tamaño opcional entre paréntesis. La implementación proporcionada en el artículo no abarca todos los tipos de datos - principalmente Ausente son adNumeric y adDecimal. Esta función se utiliza por GenerateShapeSQL.
CopyDataÉsta es una función de copia recursiva que copia datos de un conjunto de registros a otro. Llama a sí mismo recursivamente para copiar datos de conjunto de registros secundarios.

La aplicación de ejemplo tiene los siguientes pasos:
  1. Se abre un conjunto de registros jerárquico.
  2. Llama a GenerateShapeSQL para proporcionar una instrucción SHAPE para abrir un recordset jerárquico estructurado de forma equivalente que no se basa en cualquier proveedor y, por lo tanto, no tiene campos de sólo lectura.
  3. Llama a CopyData para copiar los datos de conjunto de registros original en el conjunto de registros fabricado.
  4. Cierra el conjunto de registros original.
  5. Enlaza la cuadrícula flexible jerárquica al conjunto de registros fabricado.
Nota : el código no proporciona ejemplos de actualizar el servidor tabla y realizar los cambios equivalentes en el conjunto de registros fabricado. Se deja como ejercicio para el lector dado que el conjunto de registros fabricado ahora es un estado para que esto sea posible.

Aplicación de ejemplo

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía tanto expresa como implícita, incluyendo, pero sin limitarse a, las garantías implícitas de comerciabilidad e idoneidad para un propósito determinado. En este artículo se supone que está familiarizado con el lenguaje de programación que se muestra y las herramientas utilizadas para crear y depurar procedimientos. Los profesionales de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos a necesidades específicas.
Si tiene poca experiencia en programación, desea póngase en contacto con un Microsoft Certified Partner o servicios de consultoría de Microsoft. Para obtener más información, visite estos sitios Web de Microsoft:

Microsoft certificado Partners - https://partner.microsoft.com/global/30000104

Servicios de asesoramiento de Microsoft - http://support.microsoft.com/gp/advisoryservice

Para obtener más información acerca de las opciones de soporte técnico que están disponibles y cómo ponerse en contacto con Microsoft, visite el siguiente sitio Web de Microsoft: http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMS
  1. Abra un proyecto nuevo en Microsoft Visual Basic 6.
  2. Mediante los proyectos de | componentes de menú, seleccione el control de "Microsoft Hierarchical FlexGrid 6.0 (OLEDB)" y colocarlo en el formulario. Hacen bastante grande.
  3. Uso de los proyectos | referencias de menú, seleccione "Biblioteca de objetos de datos de Microsoft ActiveX".
  4. Agregue el código siguiente al módulo de formulario:
    Option Explicit
    
    Dim rsManufactured As ADODB.Recordset
    
    Private Sub Form_Load()
    Dim cn As ADODB.Connection, rsSource As ADODB.Recordset, SQL As String
    '
    ' Get original data
    '
      Set cn = New ADODB.Connection
      Set rsSource = New ADODB.Recordset
      cn.Open "Provider=MSDATASHAPE;Data Provider=SQLOLEDB;Data Source=MyServer;User ID=xxx;Password=yyy;Initial Catalog=Northwind;"
      rsSource.CursorLocation = adUseClient
      rsSource.Open "SHAPE {SELECT * FROM Customers} APPEND ({SELECT * FROM Orders} RELATE CustomerID TO CustomerID)", _
                    cn, adOpenStatic, adLockOptimistic, adCmdText
    '
    ' Generate SHAPE statement for manufactured recordset
    '
      SQL = GenerateShapeSQL(rsSource)
    '
    ' Build manufactured recordset
    '
      Set cn = New ADODB.Connection
      Set rsManufactured = New ADODB.Recordset
      cn.Open "Provider=MSDATASHAPE;Data Provider=none"
      rsManufactured.Open SQL, cn, adOpenStatic, adLockOptimistic
      CopyData rsSource, rsManufactured
      rsSource.Close
      Set rsSource = Nothing
      Set cn = Nothing
    '
    ' Bind manufactured recordset
    '
      Set MSHFlexGrid1.DataSource = rsManufactured
    End Sub
    
    Private Function GenerateShapeSQL(rs As ADODB.Recordset, Optional ByVal Level As Long = 0) As String
    Dim FieldList As String, SQL As String, I As Long, F As ADODB.Field
    '
    ' SQL Prefix
    '
      If Level = 0 Then
        SQL = "SHAPE APPEND "
      Else
        SQL = ", ((SHAPE APPEND "
      End If
    '
    ' Add fields
    '
      FieldList = ""
      For Each F In rs.Fields
        If F.Type = adChapter Then
          FieldList = FieldList & GenerateShapeSQL(F.Value, Level + 1) & ") AS [" & F.Name & "] " & _
                      GenerateRelateClause(F, rs) & ")"
        Else
          FieldList = FieldList & ", New " & TypeName(F) & " AS [" & F.Name & "]"
        End If
      Next F
    '
    ' SQL Suffix
    '
      GenerateShapeSQL = SQL & Mid$(FieldList, 3)
    End Function
    
    Private Function GenerateRelateClause(F As ADODB.Field, rsParent As ADODB.Recordset) As String
    Dim I As Long, FieldInfo() As Byte, FieldList As String, rsChild As ADODB.Recordset
      FieldInfo = F.Properties("RELATIONCONDITIONS").Value
      Set rsChild = F.Value
      For I = 0 To UBound(FieldInfo) - 11 Step 12
        FieldList = FieldList & ", [" & rsParent(FieldInfo(I) - 1).Name & "] To [" & rsChild(FieldInfo(I + 4) - 1).Name & "]"
      Next I
      GenerateRelateClause = "RELATE" & Mid$(FieldList, 2)
    End Function
    
    Private Function TypeName(ByVal F As ADODB.Field) As String
    '
    ' Returns the text name of the field type and optional size specification
    '
      Select Case F.Type
        Case adBinary
          TypeName = "adBinary(" & F.DefinedSize & ")"
        Case adBoolean
          TypeName = "adBoolean"
        Case adChar
          TypeName = "adChar(" & F.DefinedSize & ")"
        Case adCurrency
          TypeName = "adCurrency"
        Case adDBTimeStamp
          TypeName = "adDBTimeStamp"
        Case adDouble
          TypeName = "adDouble"
        Case adInteger
          TypeName = "adInteger"
        Case adLongVarBinary
          TypeName = "adLongVarBinary"
        Case adLongVarChar
          TypeName = "adLongVarChar"
        Case adLongVarWChar
          TypeName = "adLongVarWChar"
        Case adNumeric
          TypeName = "adNumeric"
        Case adSingle
          TypeName = "adSingle"
        Case adSmallInt
          TypeName = "adSmallInt"
        Case adTinyInt
          TypeName = "adTinyInt"
        Case adUnsignedTinyInt
          TypeName = "adUnsignedTinyInt"
        Case adVarBinary
          TypeName = "adVarBinary (" & F.DefinedSize & ")"
        Case adVarChar
          TypeName = "adVarChar (" & F.DefinedSize & ")"
        Case adVarWChar
          TypeName = "adVarWChar(" & F.DefinedSize & ")"
        Case adWChar
          TypeName = "adWChar(" & F.DefinedSize & ")"
        Case Else
          MsgBox "UnKnown Field Type: " & F.Name & ", " & F.Type
      End Select
    End Function
    
    Private Sub CopyData(rsSource As ADODB.Recordset, rsDest As ADODB.Recordset)
    '
    ' Copies all data from rsSource to rsDest
    '
    Dim I As Long
      Do While Not rsSource.EOF
        ' add record copy standard field values
        rsDest.AddNew
        For I = 0 To rsSource.Fields.Count - 1
          If rsSource(I).Type <> adChapter Then
            rsDest(I).Value = rsSource(I).Value
          End If
        Next I
        rsDest.Update
        ' call CopyData recursively for each child recordset
        For I = 0 To rsSource.Fields.Count - 1
          If rsSource(I).Type = adChapter Then CopyData rsSource(I).Value, rsDest(I).Value
        Next I
        rsSource.MoveNext
      Loop
    End Sub
    					
  5. Modifique la cadena de conexión en el procedimiento Form_Load y ejecute el proyecto. Los datos de los clientes se mostrará en la cuadrícula. Si se desplaza a la derecha, podrá ver los registros de pedido de cada cliente.
Nota : si coloca las funciones en un módulo .BAS, quite la palabra clave Private de la declaración de función.

Propiedades

Id. de artículo: 241202 - Última revisión: domingo, 23 de febrero de 2014 - Versión: 2.3
La información de este artículo se refiere a:
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.1 Service Pack 1
  • Microsoft ActiveX Data Objects 2.1 Service Pack 2
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft ActiveX Data Objects 2.6
  • Microsoft ActiveX Data Objects 2.7
Palabras clave: 
kbnosurvey kbarchive kbmt kbhowto KB241202 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 241202

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com