PC SOFT

AYUDA EN LÍNEA
DE WINDEV, WEBDEV Y WINDEV MOBILE


Este contenido proviene de una traducción automática.. Haga clic aquí para ver la versión original en inglés.
  • Presentación
  • Crear un Procedure almacenado y una consulta almacenada
  • Los procedimientos almacenados se crean en el análisis.
  • Importar un set de procedimientos existente
  • Usando una consulta en un Procedure almacenado
  • Código WLanguage que se puede utilizar en los procedimientos almacenados
  • Procedimientos almacenados que pueden ser compilados en 64 bits
  • Ejecutando la prueba de un Procedure almacenado
  • Límite
  • Desplegando un Procedure almacenado y las consultas almacenadas de associated
  • Presentación
  • Despliegue para la prueba
  • Despliegue en modo real
  • Actualización en caliente de los procedimientos almacenados en el servidor HFSQL
  • Ejecutar un Procedure almacenado en sus programas
  • Ejecutando un Procedure almacenado desde una consulta SQL
  • Gestión de errores en los procedimientos almacenados
  • Mecanismo de suberrores
  • Pueden producirse los siguientes errores al ejecutar procedimientos almacenados
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaReportes y ConsultasCódigo de Usuario (UMC)
WEBDEV
WindowsLinuxPHPWEBDEV - Código Navegador
WINDEV Mobile
AndroidWidget Android iPhone/iPadApple WatchUniversal Windows 10 AppWindows Mobile
Otros
Procedimientos almacenados
Procedimientos y consultas almacenados (HFSQL Client/Server)
HFSQL Client/ServerDisponible solo con este tipo de conexión
Presentación
Los procedimientos almacenados se utilizan para simplificar el desarrollo y el mantenimiento de sus aplicaciones mediante la factorización del código.
En efecto, cuando el método utilizado para acceder a los datos evoluciona (cuando cambia la estructura de los archivos, por ejemplo), basta con modificar el Procedure almacenado en el servidor sin realizar ninguna modificación en las aplicaciones desplegadas que utilizan este Procedure.
Un procedimiento almacenado se usa para limitar el número de procesos de ida y vuelta entre el computador cliente y el servidor, y así aumentar la velocidad de los procesos.
Los procedimientos almacenados pueden utilizar consultas SQL o consultas creadas por el editor de consultas. TLos procedimientos almacenados y las consultas utilizadas por los procedimientos almacenados se crean en el editor de análisis.
Esta página de ayuda presenta:
Observación: A partir de la versión 19, HFSQL es el nuevo nombre de HyperFileSQL.
Crear un Procedure almacenado y una consulta almacenada

Los procedimientos almacenados se crean en el análisis.

Para crear un Procedure almacenado:
  1. Cree (si es necesario) el set de procedimientos almacenados en el análisis:
    • haga clic en entre los botones de acceso rápido.
      • Aparece la ventana de creación de elementos: Haga clic en "Datos" y luego en "Conjunto de procedimientos almacenados"..
      • Escriba el nombre de la set de procedimientos y valide.
    • a través del panel "Análisis: seleccionar la carpeta "Procedimientos almacenados. Seleccione "Nuevo set de procedimientos" de el menú contextual. El set de procedimientos almacenados se crea automáticamente. Este set de procedimientos se llama "set_<Nombre del análisis>" por Default.
    • en la cinta de la editor de análisis: en el panel "Análisis", en el grupo "Creación", ampliar "Nuevo" y seleccionar "Conjunto de procedimientos almacenados".. El set de procedimientos almacenados se crea automáticamente. Este set de procedimientos se llama "set_<Nombre del análisis>" por Default.
  2. Este set está físicamente guardado en el subdirectorio "Código" del directorio de análisis.
  3. Cree un Procedure en el conjunto de Procedure s. Este Procedure será un Procedure almacenado.

Importar un set de procedimientos existente

Un set de procedimientos almacenados puede corresponder a un set de procedimientos existente (que se encuentra en el proyecto actual o en otro proyecto).
Para importar un set de procedimientos:
  1. Abrir la editor de análisis si es necesario.
  2. En el panel "Análisis", seleccione la carpeta "Procedimientos almacenados".
  3. Despliega el menú contextual y selecciona "Importar un set de procedimientos". En la ventana que se abre, seleccione el set de procedimientos para importar y validar.
  4. Se realizan las siguientes operaciones:
    • Idel set de procedimientos pertenece al proyecto actual: el set de los procedimientos encontrados en el proyecto se copia automáticamente en el directorio de análisis "Code".. El nombre lógico de este Procedure es automáticamente renombrado.
      Atención: Los dos conjuntos de procedimientos están disociados: una modificación realizada en el set de los procedimientos encontrados en el proyecto se aplicará automáticamente al set de los procedimientos encontrados en el análisis (y viceversa).
    • If el set de procedimientos no pertenece al proyecto actual: el conjunto de Procedure s se copia automáticamente en el directorio de análisis "Code" y se define como Procedure almacenado.

Usando una consulta en un Procedure almacenado

Una consulta creada por el editor de consultas puede ser usada en un Procedure almacenado. Para ello, la consulta debe haber sido creada en la editor de análisis.
Para crear una consulta en el editor de análisis:
  • Método 1:
    1. Haga clic en en los botones de acceso rápido.
      • Aparece la ventana de creación de elementos: haga clic en "Datos" y luego en "Consulta almacenada"..
      • El asistente para la creación de consultas se inicia automáticamente. La consulta se crea automáticamente. La consulta se guarda físicamente en el subdirectorio "Código" del directorio de análisis.
    2. La consulta se puede utilizar en uno de los procedimientos de análisis almacenados.
  • Método 2:
    1. Mostrar el editor de análisis.
    2. Despliegue el panel "Análisis" y seleccione "Nueva consulta" de el menú contextual. El asistente para la creación de consultas se inicia automáticamente. La consulta se crea automáticamente. La consulta se guarda físicamente en el subdirectorio "Código" del directorio de análisis.
    3. La consulta se puede utilizar en uno de los procedimientos de análisis almacenados.
Para importar una consulta:
  1. Abrir la editor de análisis si es necesario.
  2. En el panel "Análisis", seleccione la carpeta "Consultas";.
  3. Seleccione "Importar una consulta" de el menú contextual. En la ventana que se abre, seleccione la consulta que desea importar y validar.
  4. Se realizan las siguientes operaciones:
    • Si la consulta pertenece al proyecto actual: la consulta del proyecto se copia automáticamente en el directorio de análisis "Code" y se reubica: el proyecto y el análisis utilizan una sola consulta. Por lo tanto, una modificación realizada en la consulta del proyecto se aplicará automáticamente a la consulta de análisis (y viceversa).
    • Si la consulta no pertenece al proyecto actual: la consulta se copia automáticamente en el directorio "Code" de análisis y se define como consulta relacionado al análisis.

Código WLanguage que se puede utilizar en los procedimientos almacenados

  • El código de los procedimientos almacenados está escrito en WLanguage. Se pueden utilizar varias funciones WLanguage.
  • Para saber si una función puede ser utilizada en un Procedure almacenado, ver la ayuda sobre esta función: si el Image se muestra en la barra de título de la función, la función puede ser usada en el código de procedimientos almacenados.
    Además, cuando se compila el código, los mensajes de error le informan de que se han utilizado funciones no autorizadas en el código de procedimientos almacenados..
    Por ejemplo, sólo los tipos simples pueden utilizarse en el código de procedimientos almacenados (cadenas, números enteros, etc.).. Un parámetro de Procedure almacenado debe ser un parámetro simple: no se puede pasar ningún objeto o array en el parámetro. Sin embargo, Serialize puede ser usado para pasar un array en parámetro a un Procedure almacenado.
  • Los siguientes elementos no pueden utilizarse en los procedimientos almacenados: clases, informes, ventanas, páginas, ...
  • Las ventanas y páginas de gestión automática de errores no están disponibles en los procedimientos almacenados. Sin embargo, HOnError puede ser usado para redirigir el error a un Procedure (este Procedure debe ser también un Procedure almacenado).
  • Varias variables de WLanguage permiten obtener información sobre la aplicación cliente que está usando un Procedure almacenado.
    Estas variables son las siguientes:
    Aplicación HRuntimeInfo.Aplicación cliente que inició el actual Procedure almacenado.
    HRuntimeInfo.DatabaseBase de datos utilizada por la aplicación cliente que inició el Procedure almacenado.
    HRuntimeInfo.LoginEl usuario de la aplicación cliente que inició el Procedure almacenado.
    HRuntimeInfo.ComputerOrdenador del usuario que inició el actual Procedure almacenado (IP Address o nombre del ordenador).
  • Tienes la capacidad de guardar valores en el servidor desde un Procedure almacenado. Este valor puede ser leído por otro Procedure almacenado o por un disparador por ejemplo. Las siguientes funciones se utilizan para gestionar los valores persistentes en el servidor:
    Versiones 14 y posteriores
    HDeleteParameter
    Nueva funcionalidad versión 14
    HDeleteParameter
    HDeleteParameter
    Borra un parámetro previamente guardado con HSaveParameter.
    Versiones 14 y posteriores
    HListParameter
    Nueva funcionalidad versión 14
    HListParameter
    HListParameter
    Devuelve la lista de parámetros guardados a partir de procedimientos almacenados en el servidor.
    Versiones 14 y posteriores
    HLoadParameter
    Nueva funcionalidad versión 14
    HLoadParameter
    HLoadParameter
    Lee un parámetro que fue guardado de un Procedure almacenado por HSaveParameter.
    Versiones 14 y posteriores
    HSaveParameter
    Nueva funcionalidad versión 14
    HSaveParameter
    HSaveParameter
    Guarda un valor persistente.
  • Tiene la posibilidad de guardar archivos temporales en un directorio del servidor y de borrar este directorio.. Se pueden utilizar las siguientes funciones:
    Versiones 14 y posteriores
    HClearWorkingDir
    Nueva funcionalidad versión 14
    HClearWorkingDir
    HClearWorkingDir
    Borra y destruye el directorio temporal que se creó durante la ejecución de HServerWorkingDir..
    Versiones 14 y posteriores
    HServerWorkingDir
    Nueva funcionalidad versión 14
    HServerWorkingDir
    HServerWorkingDir
    Devuelve el ruta de un directorio temporal en el servidor HFSQL.
  • Para manipular los archivos de datos, debes usar HDeclareExternal.
    Por ejemplo:
    PROCEDURE NameOfStoredProcedure()
     
    // Check the existence of the logical file
    IF NOT HFileExist(ZIPCODES) THEN
    // File not known, it must be declared
    // Caution: to declare a new file in a stored HFSQL procedure,
    // you must:
    // - use NO connection: The current database
    // on which the stored procedure is found will be used
    // - specify NO full path:
    // The file will be sought in the current database.
    // You have the ability to specify a sub-directory of the database.
    // - specify the full name of the file with its extension (.FIC)
    IF NOT HDeclareExternal("ZIPCODES.FIC", "ZIPCODES") THEN
    // Error while declaring the file
    RESULT HErrorInfo()
    END
    END
     
    // Use the data file
    // FOR EACH ZIPCODES
    // //Process...
    // END
     
    // Process OK, without error
    RESULT ""

Procedimientos almacenados que pueden ser compilados en 64 bits

Para utilizar un ejecutable de 32 bits con procedimientos almacenados ejecutados en un servidor de 64 bits:
  1. Mostrar la ventana de description del análisis.
    • Abrir la editor de análisis si es necesario.
    • Abra el menú contextual del análisis (clic derecho en el gráfico del análisis) y seleccione la opción "Descripción del análisis".
  2. Mostrar la pestaña "Compilación.
  3. Compruebe "Habilitar los errores de compilación para la compatibilidad de 64 bits".
  4. Valide.

Ejecutando la prueba de un Procedure almacenado

Para hacer la prueba de un Procedure almacenado:
  1. En el panel de análisis, seleccione el Procedure almacenado cuya prueba debe ejecutarse.
  2. Mostrar el el menú contextual del Procedure almacenado (clic con el botón derecho del ratón) y seleccionar "Ejecutar el test Procedure".
  3. Se muestra la ventana para ingresar los parámetros del Procedure. Esta ventana le permite:
    • Escriba los parámetros de Procedure.
    • Ejecutar la prueba del procedimiento.
      Observación: esta ventana permite reiniciar la ejecución varias veces modificando los parámetros.
  4. Cuando se hace el test de Procedure:
    • Se propone una actualización de Procedure almacenada en el servidor si es necesario.
    • El Procedure se inicia en el servidor.
    • El valor de retorno de Procedure se muestra si es necesario.
Notas/limitaciones:
  • El puerto de depuración es el puerto 27281 de Default. Este puerto debe estar abierto en el firewall. Este puerto puede ser modificado en el Archivo HFConf.ini.
  • Para ejecutar la prueba de un Procedure almacenado, debe tener los derechos de depuración en la base de datos.
  • Las huellas utilizadas en los procedimientos almacenados se muestran en el panel de Traza del depurador.
  • El código de Procedure almacenado puede contener puntos de ruptura: se iniciará el depurador.
  • Los elementos desplegados en el servidor se utilizan durante la prueba.
  • InTestMode devuelve a True.

Límite

En esta versión, no puede importar un set de procedimientos almacenados encontrados en un servidor.
Desplegando un Procedure almacenado y las consultas almacenadas de associated

Presentación

Para ejecutar la prueba de un Procedure almacenado y/o para ejecutar un Procedure almacenado, debe ser desplegado en el servidor. Este implementación se puede realizar:
  • para la prueba: los procedimientos almacenados y/o las consultas se despliegan en el servidor seleccionado pero el análisis no se actualiza. Esta operación se recomienda para análisis de gran tamaño cuya generación puede llevar bastante tiempo..
    Atención: cualquier aplicación desplegada en el servidor ya no puede funcionar después de este implementación para la prueba. Esta opción debe utilizarse en un servidor de prueba.
  • en modo real: el análisis debe ser regenerado y la modificación de automatic de los archivos de datos debe realizarse al instalar la versión cliente.

Despliegue para la prueba

Para ejecutar la prueba de las modificaciones realizadas en un Procedure almacenado:
  1. En el editor de análisis, en el panel "Análisis", en el grupo "Análisis", amplíe "Sincronización" y seleccione "Actualizar los elementos almacenados (HFSQL Client/Server)".
  2. En la ventana que se visualiza, seleccione:
    • los conjuntos de procedimientos a actualizar.
    • las consultas a actualizar.
    • los desencadenantes de la actualización.
    • la conexión afectada por la actualización. También puede introducir directamente las características de la conexión.
  3. Validar la actualización.
Observación: Cuando se despliega para la prueba, también puede generar el análisis y aceptar la modificación de los datos de automatic.

Despliegue en modo real

Para actualizar una aplicación Cliente/Servidor que utiliza procedimientos almacenados, debe hacerlo:
  1. Generar el análisis que contiene los procedimientos almacenados ("Generar el análisis" de el menú contextual de análisis). Los archivos de datos pueden ser modificados durante este paso.
  2. Crear la versión del cliente y solicitar una modificación de los archivos de datos de automatic: en el panel "Proyecto", en el grupo "Generación", expanda "Configurar Procedure" y seleccione "Crear la configuración Procedure".
    Observación: la modificación de los archivos de datos de automatic se propone cuando se modifica el código de los procedimientos almacenados o las consultas de análisis.
  3. Instale la aplicación.
Observaciones:
  • HRefreshSet y HDeleteSet se utilizan para forzar la actualización y la eliminación de conjuntos de procedimientos almacenados en el servidor.
  • HRefreshQuery y HDeleteQuery se utilizan para forzar la actualización y la eliminación de las consultas almacenadas en el servidor.
  • HListStoredElement se utiliza para enumerar los conjuntos de procedimientos, las consultas y los procedimientos instalados en un servidor.
  • El Centro HFSQL Control se utiliza para gestionar los procedimientos almacenados y las consultas encontradas en el servidor.

Actualización en caliente de los procedimientos almacenados en el servidor HFSQL

La actualización en caliente de los procedimientos almacenados en el servidor HFSQL consiste en actualizar los conjuntos de procedimientos almacenados en el servidor mientras se utiliza la aplicación.. Esta operación se utiliza para realizar una actualización sin desconectar a todos los usuarios.
Esta actualización puede ser realizada por HRefreshSet. Las siguientes condiciones son necesarias para realizar esta actualización:
  • Si no se ejecutó ningún Procedure del conjunto, el conjunto de Procedure s puede ser actualizado en el servidor.
  • Si un Procedure del conjunto se ejecutó, el conjunto de Procedure s puede ser actualizado sólo si la modificación del conjunto de Procedure s no afecta a las variables globales. HRefreshSet devuelve False si las variables globales del set de los procedimientos han sido modificadas. En este caso, todos los usuarios deben estar desconectados antes de que se pueda realizar la actualización..
    Depósito de seguridad: En este último caso, si se realizó la actualización, los usuarios conectados antes de la actualización utilizarán durante la próxima ejecución de un Procedure almacenado:
    • el nuevo código de Procedure almacenado,
    • las variables globales con los valores definidos antes de la actualización.
Observación: Si un Procedure del conjunto de Procedure s se ejecuta actualmente, la actualización se bloquea hasta su ejecución (HRefreshSet es una función de bloqueo). Todos los procedimientos almacenados que se ejecutan actualmente se terminan y todos los procedimientos almacenados llamados después de la ejecución de HRefreshSet se bloquean hasta que el set se actualiza en el servidor.
Ejecutar un Procedure almacenado en sus programas
Un Procedure almacenado puede ser iniciado desde una aplicación:

Ejecutando un Procedure almacenado desde una consulta SQL

Para ejecutar un Procedure almacenado a partir de una consulta SQL, especifique en la consulta el nombre del Procedure a ejecutar y los parámetros esperados.
También tiene la capacidad de ejecutar directamente un Procedure almacenado y recuperar su resultado en SQL. En este caso, la sintaxis para ejecutar el Procedure almacenado es:
SELECT NameOfStoredProcedure(NumericParameter,'StringParameter',....) [FROM DUAL]
Observaciones:
  • El procedimiento almacenado debe ser una función almacenada: siempre debe devolver un valor. En caso contrario, se generará un error de ejecución.
  • Si el nombre del procedimiento almacenado es idéntico al de una función o procedimiento del proyecto, debe ir precedido por el nombre del conjunto de procedimientos almacenados.
Ejemplo 1: La siguiente consulta se utiliza para devolver el volumen de negocios de todos los clientes que viven en París (75). El volumen de negocios se calcula por un Procedure almacenado llamado nReturnTO.
// Query run by the client computer
HExecuteSQLQuery("TOCustomer75", "SELECT CustomerName, ZipCode, " + ...
"nReturnTO(Customer.CustomerNumber,'20061201') " + ...
"as Total from Customer where zipcode like '34%')")
// Stored procedure run on the server
PROCÉDURE nReturnTO(nCustomerNum, Deadline)
nTotal is currency
// Filter on the limit date
// Retrieve the orders from Deadline
HFilter(Orders, CustomerNum, hMinVal, hMaxVal, "OrderDate >= " + Deadline + "")
// Retrieve all the customer orders and add their amount
HReadSeekFirst(Orders, CustomerNum, nCustomerNum)
WHILE HFound(Orders)
nTotal += Orders.TotalIOT
HReadNext(Orders, CustomerNum)
END
RESULT nTotal
Ejemplo 2: Corriendo y recuperando el resultado de un Procedure almacenado:
dsStoredProc is Data Source
IF NOT HExecuteSQLQuery(dsStoredProc, HFSQLCnt, hDefaultQuery,StringBuild([
SELECT Function_StoredProcedure(%1,'%2')
FROM DUAL
], 3, "string to pass in parameter")) THEN
Error("Failure calling the stored procedure ", HErrorInfo())
ELSE
IF HReadFirst(dsStoredProc) THEN
Info("Result of stored procedure: ", HRetrieveRecord(dsStoredProc))
END
END
Gestión de errores en los procedimientos almacenados

Mecanismo de suberrores

La gestión de errores en los procedimientos almacenados está utilizando el mecanismo de suberrores. Si se produce un error cuando se ejecuta un Procedure almacenado en el servidor, los diferentes sub-errores se rellenan con los detalles de los errores que se produjeron en cada nivel de ejecución. Los diferentes errores son devueltos por ExceptionInfo.
Algunos ejemplos:
1. Un Procedure se ejecuta en el cliente. Este Procedure llama a un Procedure almacenado en el servidor. Este Procedure almacenado genera un error.
Cliente de la aplicación:
PROCEDURE Client_Procedure()
// Procedure run on the client computer
...
// Line 10: Runs a procedure on the server
HExecuteProcedure(AConnection, AStoredProcedure)
Aplicación de servidor:
// Procedure stored on the server
PROCEDURE AStoredProcedure
...
// Line 5: The security mechanism of WLanguage
// detects an unknown identifier
RESULT UnknownElement
La excepción se muestra sólo en el equipo cliente. Contiene la siguiente información:
  • Error principal: información sobre el cliente: "Error encontrado por el servidor XXX", Cliente_Procedure Procedure, Line 10, ...
  • Suberror: información sobre el servidor: "Identificador de elementos desconocidos", AProcedure Procedure, Line 5, ...
2. Un Procedure se ejecuta en el cliente. Este Procedure llama a un Procedure almacenado en el servidor. Este Procedure almacenado llama a un segundo Procedure que genera un error.
Cliente de la aplicación:
PROCEDURE Client_Procedure()
// Procedure run on the client computer
...
// Line 10: Runs a procedure on the server
HExecuteProcedure(AConnection, AStoredProcedure)
Aplicación de servidor:
// Procedure stored on the server
PROCEDURE AStoredProcedure
...
// Line 3: running a query
HExecuteSQLQuery(AQuery, "SELECT ProcedureCalculation(Fic.Itm) FROM Fic")
// Line 5: Browsing the query
FOR EACH AQuery
...
END
// Calculation procedure called from the query
PROCEDURE CalculationProcedure(param)
...
// Line 4: The security mechanism of WLanguage
// detects an unknown identifier
RESULT UnknownElement
La excepción se muestra sólo en el equipo cliente. Contiene la siguiente información:
  • Error principal: información sobre el cliente: "Error encontrado por el servidor XXX", Cliente_Procedure Procedure, Line 10, ...
  • Suberror 1: información del servidor sobre el AStoredProcedure Procedure: "Error al ejecutar la consulta", AStoredProcedure Procedure, Line 5, ...
  • Suberror 2: información del servidor con respecto al CalcProcedure Procedure: "Identificador de elementos desconocidos", CalcProcedure Procedure, Line 4, ...
Observación: Para get directamente el último sub-error (que es el primer error que ocurrió en el servidor HFSQL), use la siguiente sintaxis:
// First error on the server
ExceptionInfo(errMessage, errOrigin)

Pueden producirse los siguientes errores al ejecutar procedimientos almacenados

Los siguientes errores pueden ocurrir cuando se ejecutan procedimientos almacenados:
75000: El servidor no puede definir si el XXX Procedure debe ser ejecutado
Este error puede ocurrir en los siguientes casos:
  • Un Procedure almacenado con el mismo nombre es utilizado por varias bases de datos y por varias conexiones. El servidor no puede definir si el XXX Procedure debe ser ejecutado con la conexión YYY en la base de datos ZZZ o con la conexión YYY1 en la base de datos ZZZ1.
    Solución: Especifique la conexión y la base de datos que desea utilizar.
  • Dos conexiones a la base de datos están disponibles. El servidor no puede definir si el XXX Procedure en la base de datos ZZZ debe ser ejecutado con la conexión YYY o con la conexión YYY1.
    Solución: Especifique la conexión que desea utilizar
  • El Procedure se utiliza en varios conjuntos de Procedure s.
75001: No se ha especificado la base de datos
Este error puede ocurrir si existen varias bases de datos para una misma conexión. Para ejecutar el Procedure (XXX) almacenado, especifique una base de datos en la conexión utilizada.
75002: Almacenado Procedure no se encuentra
Este error se produce cuando el Procedure llamado no se encuentra en los conjuntos de Procedure s instalados en el servidor.
75003: Se produjo un error de WLanguage mientras se ejecutaba el Procedure almacenado
Este error ocurre cuando el Procedure almacenado contiene errores de WLanguage.
75004: El elemento XXX no existe
El Procedure almacenado o la consulta almacenada no existe.
75005: El elemento XXX no puede actualizarse.
El Procedure almacenado o la consulta almacenada se utiliza actualmente. Para actualizar este elemento, desconecte a los usuarios.
75006: Conjunto de procedimientos no compatibles con los servidores de 64 bits
El set de procedimientos se utiliza en un servidor de 64 bits.
Para que este conjunto de procedimientos funcione, debe seleccionar "Habilitar errores de compilación para la compatibilidad con 64 bits" ("Analysis description" en el menú emergente de análisis, pestaña "Compilación").
Versión mínima requerida
  • Versión 11
Esta página también está disponible para…
Comentarios
Haga clic en [Agregar] para publicar un comentario