> ## Documentation Index
> Fetch the complete documentation index at: https://a3erpapi.appcloud.es/llms.txt
> Use this file to discover all available pages before exploring further.

# Vistas y procedimientos almacenados personalizados

> Configura y ejecuta vistas SQL personalizadas y procedimientos almacenados en la A3ERP API para acceder a datos específicos de tu empresa.

La A3ERP API permite extender su funcionalidad con dos mecanismos de personalización: **vistas SQL** registradas en el diccionario JNCAPI y **procedimientos almacenados** de SQL Server definidos en cualquier otro diccionario. Ambos te permiten acceder a datos o lógicas específicas de tu empresa sin modificar el núcleo de la API.

***

## 1. Vistas personalizadas

Las vistas personalizadas son consultas SQL que defines y registras en el **diccionario JNCAPI** mediante la herramienta **CfgVistas.exe**. Una vez registradas, puedes ejecutarlas a través de la API como si fueran un endpoint más.

### Crear y gestionar vistas

1. Abre **CfgVistas.exe** desde la carpeta de instalación de la API.
2. Verás la lista de vistas ya configuradas por defecto.
3. Para crear una nueva vista, pulsa el botón **Nueva** — se añadirá al final con orden `-1`.
4. Define la consulta SQL de la vista y guarda los cambios.

<Note>
  Las vistas se almacenan en la base de datos y se cargan en memoria **al iniciar el servicio**. Después de crear o modificar una vista, debes **reiniciar el servicio A3ERP API** para que los cambios estén disponibles.
</Note>

<Warning>
  **Solo se pueden ejecutar vistas que estén registradas en el diccionario JNCAPI.** Si intentas llamar a una vista que no existe en el diccionario, la API devolverá un error.
</Warning>

### Ejecutar una vista

Llama al endpoint `GET /api/vista/{nombre_vista}` con tu token JWT en la cabecera `Authorization`:

```http theme={null}
GET /api/vista/{nombre_vista} HTTP/1.1
Host: <domain>:<port>
Authorization: Bearer {JWT Token}
Accept: */*
```

**Ejemplo — ejecutar la vista `Api_Vinculos`:**

```bash theme={null}
curl -X GET https://miservidor:5555/api/vista/Api_Vinculos \
  -H "Authorization: Bearer {JWT Token}"
```

Las vistas admiten **filtrado y ordenación** igual que el resto de endpoints. Por ejemplo:

```bash theme={null}
# Filtrar por cliente
curl -X GET "https://miservidor:5555/api/vista/Api_Vinculos/filtro/codcli='000001'" \
  -H "Authorization: Bearer {JWT Token}"

# Ordenar por fecha descendente
curl -X GET "https://miservidor:5555/api/vista/Api_Vinculos/order/fecha desc" \
  -H "Authorization: Bearer {JWT Token}"
```

### Generar informes desde una vista

Si la vista tiene asociado un formato FastReport, puedes generar el informe en PDF o Excel:

```
GET /api/vista/{nombre_vista}/impresion/pdf
```

Los archivos generados se suben al servidor FTP configurado en el `Config.ini` y están disponibles para su descarga.

***

## 2. Procedimientos almacenados

Los procedimientos almacenados te permiten ejecutar lógica SQL personalizada en el servidor de base de datos directamente desde la API. A diferencia de las vistas, los procedimientos se ejecutan sin restricciones sobre el código que contienen.

<Warning>
  **Solo se pueden ejecutar procedimientos almacenados que estén definidos en diccionarios distintos al JNCAPI.** Los procedimientos del diccionario JNCAPI están reservados para uso interno de la API.
</Warning>

### Ejecutar un procedimiento almacenado

Usa `POST /api/procalm/{procedimiento}` enviando los parámetros en el cuerpo de la petición como JSON:

```http theme={null}
POST /api/procalm/{procedimiento} HTTP/1.1
Host: <domain>:<port>
Authorization: Bearer {JWT Token}
Content-Type: application/json
Accept: */*
```

**Cuerpo de la petición:**

```json theme={null}
{
  "parametros": [
    {
      "nombre": "nombre_del_parametro",
      "tipo": "string",
      "direccion": "entrada",
      "longitud": "8",
      "defecto": "",
      "valor": "valorejemplo"
    }
  ]
}
```

### Campos de cada parámetro

| Campo       | Descripción                                                                           |
| ----------- | ------------------------------------------------------------------------------------- |
| `nombre`    | Nombre del parámetro tal como está definido en el procedimiento SQL.                  |
| `tipo`      | Tipo de dato del parámetro (ver tabla de tipos más abajo).                            |
| `direccion` | Dirección del parámetro: si es de entrada, salida o ambas (ver tabla de direcciones). |
| `longitud`  | Longitud del parámetro en caracteres. Usa `"0"` para tipos numéricos.                 |
| `defecto`   | Valor por defecto si no se proporciona un valor.                                      |
| `valor`     | Valor concreto que se pasa al procedimiento.                                          |

### Tipos de datos válidos

| Tipo       | Descripción                       |
| ---------- | --------------------------------- |
| `string`   | Cadena de texto.                  |
| `integer`  | Número entero.                    |
| `boolean`  | Valor booleano (verdadero/falso). |
| `float`    | Número decimal de punto flotante. |
| `currency` | Valor monetario.                  |
| `word`     | Entero sin signo de 16 bits.      |
| `date`     | Fecha.                            |
| `time`     | Hora.                             |
| `text`     | Texto largo.                      |
| `binary`   | Datos binarios.                   |

### Direcciones válidas

| Dirección       | Descripción                                                              |
| --------------- | ------------------------------------------------------------------------ |
| `entrada`       | El parámetro solo se envía al procedimiento.                             |
| `salida`        | El procedimiento devuelve un valor en este parámetro.                    |
| `entradasalida` | El parámetro se envía y el procedimiento puede modificarlo y devolverlo. |
| `retorno`       | Valor de retorno del procedimiento.                                      |

### Ejemplo completo

Llamada al procedimiento `procedimientodeprueba` con un parámetro de entrada (`codigo`) y uno de salida (`riesgo`):

**URL:**

```
https://miservidor:5555/api/procalm/procedimientodeprueba
```

**Petición curl:**

```bash theme={null}
curl -X POST https://miservidor:5555/api/procalm/procedimientodeprueba \
  -H "Authorization: Bearer {JWT Token}" \
  -H "Content-Type: application/json" \
  -d '{
    "parametros": [
      {
        "nombre": "codigo",
        "tipo": "string",
        "direccion": "entrada",
        "longitud": "8",
        "defecto": "",
        "valor": " 1"
      },
      {
        "nombre": "riesgo",
        "tipo": "float",
        "direccion": "salida",
        "longitud": "0",
        "defecto": "0",
        "valor": "0"
      }
    ]
  }'
```

La respuesta incluirá los valores de los parámetros de salida junto con cualquier conjunto de resultados que devuelva el procedimiento.
