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?
Array como parámetro de objeto
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: Array como parámetro de objeto
Tampoco encuentro nada...
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...
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...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Re: Array como parámetro de objeto
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.
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.
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: Array como parámetro de objeto
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 .
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 .
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):
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 .
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):
Saludos.SELECT MsysObjects.Name
FROM MsysObjects
WHERE ((MsysObjects.Type=1) AND (MsysObjects.LvProp Is Not Null) AND (MsysObjects.Flags>=0))
ORDER BY MsysObjects.Name;
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).