Página 1 de 1

Array como parámetro de objeto

Publicado: 07 Feb 2012, 12:30
por jamaro
A ver si el título del hilo es claro y puedo explicarme.

Viendo en uso del Método OpenChema de ADO, hay una parte que no sé si puede realizarse en Autoit. Se trata de poner una array como parámetro en un objeto.


Sabiendo que el esquema es así:
QueryType Criteria
=============================
. adSchemaTables TABLE_CATALOG
........................ TABLE_SCHEMA
........................ TABLE_NAME
........................ TABLE_TYPE

Para mostrar las tablas de la base de datos el código en VB sería:

Set rs = cn.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "Table")
While Not rs.EOF
Debug.Print rs!TABLE_NAME
rs.MoveNext
Wend


Sabiendo que el valor de adSchemaTables es 20, En autoit he probado así:
$oRec = $oADO.OpenSchema(20) <<<<<<<<<<<<< Obtengo resultados, pero sin lo que quiero es filtrar, intento poner los demás parámetros:

$oRec = $oADO.OpenSchema(20,Array("Empty","Empty","Empty","TABLE")) <<<<<<<<< Obtengo: ERROR: Array(): undefined function.
así:
$oRec = $oADO.OpenSchema(20,("Empty","Empty","Empty","TABLE")) <<<<<<<<< Obtengo: ERROR: unbalanced paranthesis expression.
$oRec = $oADO.OpenSchema(20,("Empty",
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ ERROR: syntax error
$oRec = $oADO.OpenSchema(20,("Empty","Empty","Empty","TABLE"))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
y así:
Local $array[4]= ["Empty","Empty","Empty","TABLE"]
$oRec = $oADO.OpenSchema(20,$array)
<<<<<<<<<<<<<<<<<<<<<< Obtengo el error: The requested action with this object has failed.:

He buscado en el foro inglés y tampoco encuentro solución. No sé si es por el tipo de parámetro "array"o por "empty" (he probado también a poner "" o sólo , pero no funciona).

¿Sabéis si hay posibilidad de hacer esto en Autoit?

Re: Array como parámetro de objeto

Publicado: 07 Feb 2012, 13:20
por Ximorro
Tampoco encuentro nada... :smt010

He encontrado rutinas usando ADO.OpenSchema pero no veo que nadie use ese parámetro matriz.
Por cierto por si no la conoces igual esta UDF te interesa:
http://autoit.mvps.org/udf_code.aspx?udf=access

Desde luego de los intentos que has hecho el último era el único correcto para AutoIt, los primeros no te los puede aceptar AutoIT por no seguir la sintaxis del lenguaje.
En el último sí estás pasando un array AutoIT, pero claro, el problema es que el objeto no acepta arrays autoit, será más bien tipo C, o una estructura.
Desgraciadamente sería necesario ver la estructura interna de ese parámetro y montarlo, si es posible, con DllStruct, que puede hacer arrays de C. Luego habría que ver si hay que pasar el puntero o la matriz directamente, aunque eso es un problema menor dentro de todo esto.
Un problema que sí veo serio es que los valores de la matriz son string, y eso ya es más peliagudo, ¿qué tipo de string hay que crear? ¿array null-terminated de C? ¿codificación ANSI, Unicode?...

Mira a ver si puedes acceder al esquema sin usar ese parámetro, quizás con esa UDF.
Si no revísate las versiones beta de AutoIT en el foro oficial, están haciendo muchas modificaciones al soporte de objetos COM, quizás en algún momento han mejorado el paso de parámetros, o están en ello...

Re: Array como parámetro de objeto

Publicado: 07 Feb 2012, 14:31
por jamaro
Gracias Ximorro.

La UDF que comentas es la que utilicé y modifiqué para el programa MDB2SQLite que hice. Precisamente ahí utiliza el "schema" pero sin parámetros.

Era una duda que surgió, pero como $oRec = $oADO.OpenSchema(20) ya devuelve todo el contenido (sin filtrar), no es mucho problema hacer el filtrado de datos después con Autoit.

Re: Array como parámetro de objeto

Publicado: 07 Feb 2012, 19:41
por Chefito
Hombre jamaro, si nos das un código de ejemplo con lo que dices (aunque no funcione), junto a una bbdd te lo miramos mejor :smt002 .

Pensad que sql es muy poderoso. No hace falta tirar siempre de objetos.
En access podeis mirar la tabla del sistemas (contiene todos los objetos de la bbdd como tablas, formularios, consultas, etc) llamada MsysObjects. Podeis hacerle consultas y filtrar los datos hasta que deis con lo que quereis. Poned en google MsysObjects y tendreis mucha información...entre ésta, consultas ya hechas para sacar diversos objetos de la bbdd. Eso sí, no os fieis mucho de esto, porque seguramente cambiará algo las consultas de una versión a otra del access. Me ha pasado eso con el access 2007 que tengo. Por lo visto, las consultas que he visto son de access anteriores y no filtraban del todo bien. Que hacer? Coger el generador de consultas del access y a realizar tu consulta a medida :smt003 .

He hecho pruebas con una bbdd bastante grande y con cantidad de objetos, y al final me ha salido esta consulta para listar los nombres de las tablas creadas por el usuario (access 2007):
SELECT MsysObjects.Name
FROM MsysObjects
WHERE ((MsysObjects.Type=1) AND (MsysObjects.LvProp Is Not Null) AND (MsysObjects.Flags>=0))
ORDER BY MsysObjects.Name;
Saludos.