Hola;
Te copio mi rutina que uso para efectuar lo que solicitas. Espero te ayude. Un poco de paciencia, este objeto es bueno, lo malo es que es como una piedra. Si quieres convertilo en algo precioso debes pulirlo ya que nada trae de manera nativa.
Saluidos
***************************************************
**Genera un cursor a partir de los datos del cubo**
***************************************************
Local lcNameCursor,i,c,d,lnNroFilas,lnNroColRow,lnNroColHeader ,lnNroColData,lcCreateCursor,lcNameColumn
**************************************
**Genera un cursor del cubo TEMPORAL**
**************************************
lcNameCursor = "Cur_Export"
**Cierra por si esta abierto, para volver a generar
If Used(lcNameCursor) Then
Select (lcNameCursor)
Use
Endif
**Clona el cubo en otro objeto para que luego sea procesado
ThisForm.AddObject("TmpCubo","Cubo",.t.)
loTmpCubo = Thisform.TmpCubo
loTmpCubo.lTmpCubo = .t.
**Pasa el contenido del cubo al temporal
lcFileCubo = This.Cb_GenfileTMP() &&Archivo de cubo temporal
This.Save(lcFileCubo,3) &&Guarda el cubo en el archivo
loTmpCubo.Load(lcFileCubo) &&Carga el archivo en el cubo temporal
Erase (lcFileCubo) &&Elimina el archivo
loTmpCubo.Top = loTmpCubo.Height * -1 - 50
loTmpCubo.Visible = .t.
**Normaliza el cubo en solo 2 dimensiones row - data
lnNroColHeaderData = loTmpCubo.ColFields.Count
For i = 0 To lnNroColHeaderData - 1
loTmpCubo.ColFields(0).Orientation = 2 &&Siempre con el indice en CERO
Next
Pause(0.001) &&Una pausa para refrescar el cubo antes de cargar los datos
**Despliega todas las columnas y retira los totales
For i = 0 To loTmpCubo.RowFields.Count - 1
***Quita los totales
loTmpCubo.RowFields(i).GroupFooterType = 0
loTmpCubo.RowFields(i).ShowDetail(1) &&Despliega todas las filas
Next
**Visualiza todas las columnas DATAFIELS
For i = 0 To loTmpCubo.DataFields.Count - 1
***Quita los totales
loTmpCubo.DataFields(i).Visible = .t.
Next
Pause(0.2) &&Una pausa para refrescar el cubo antes de cargar los datos
**Genera cadena con la sintaxis para generar el cursor
lcCreateCursor = "CREATE CURSOR " + lcNameCursor + " ("
lnNroColRow = loTmpCubo.RowFields.Count - 1
lnNroColHeader = loTmpCubo.ColFields.Count - 1
**Dimensiones Row
For i = 0 To lnNroColRow
**Nombre de la columna
lcNameColumn = loTmpCubo.Cb_Getfieldname(i,2)
**Genera la cadena con la sintaxis para cerar el cubo
lcCreateCursor = lcCreateCursor + lcNameColumn + " C (150), "
Next i
**Medidas
**Numero de columnas numericas
lnNroColData = loTmpCubo.DataFields.Count - 1
For i = 0 To lnNroColData
lcNameColumn = loTmpCubo.Cb_GetFieldName(i,1)
**Si es un campo calculado, el nombre para el campo del cursor, es de su propiedad VARNAME, sin espacios
If loTmpCubo.DataFields(lcNameColumn).Calculated Then
***lcNameColumn = Left(EvalCaracter(loTmpCubo.DataFields(lcNameColumn).VarName),10)
Else
lcCreateCursor = lcCreateCursor + lcNameColumn + " N (12,2), "
Endif
Next
**Ejecuta el comando para crear el cursor
lcCreateCursor = Alltrim(lcCreateCursor)
lcCreateCursor = Left(lcCreateCursor,Len(lcCreateCursor)-1) + ")"
**Messagebox(lcCreateCursor)
&lcCreateCursor
If nResult = -1 Then
ThisForm.RemoveObject("TmpCubo")
Return ""
Endif
lnSeconds = Seconds()
**Carga el cursor los datos del cubo
lnNroFilas = loTmpCubo.RowCount - 1 &&- UNO, porqque comienza en CERO
For i = 0 To lnNroFilas
If Type("loTmpCubo.RowHeading(i,lnNroColRow+1).Name") <> "C" Then
Loop &&Fila no es validad, tiene menos columnas que la cantidad de columnas activa
Endif
Append Blank
**Recorre y carga la fila de DIMENSIONES
For c = 1 To lnNroColRow + 1
If Type("loTmpCubo.RowHeading(i,c).Name") = "U" Then
Messagebox("No se pudo leer la fila nº "+Str(i) + " columna: "+ Str(c)+Chr(13)+;
"Estado del objeto: "+ Type("loTmpCubo.RowHeading(i,c)"),+48,"Exportar a excel")
ThisForm.RemoveObject("TmpCubo")
Return ""
Else
lcValue = loTmpCubo.RowHeading(i,c).Name
Endif
**Recupera nombre del campo del cursor
lcFieldCursor = Field(c)
Replace &lcFieldCursor With lcValue
Next c
**Recorre y carga la fila de MEDIDAS
For d = 1 To lnNroColData + 1 && MAS 1 puesto que la variable tiene almacenado el total MENOS 1
lcNameDataField = loTmpCubo.Cb_GetFieldName(d-1,1)
If loTmpCubo.DataFields(lcNameDataField).Calculated Then
**Cmapos calculados no entran....
Else
lcValue = loTmpCubo.DataValue(i,d-1)
lcFieldCursor = Field((lnNroColRow+1) + (d) )
Replace &lcFieldCursor With lcValue
Endif
Next d
Next i
**Retira cubo temporal
ThisForm.RemoveObject("TmpCubo")
**Nombre del cursor a devolver
lcNameCursor = Iif(Used(lcNameCursor),lcNameCursor,"")
Select (lcNameCursor)
**Browse
*Messagebox("Segundos: " + Str(Seconds()-lnSeconds,7,3))
*cancel
Return lcNameCursor