# Análisis de Incompatibilidades - IDS 11.70

## Problemas Identificados

### 1. **CONCAT() - NO SOPORTADA EN IDS 11.70**
**Problema:** La función `CONCAT()` es una función moderna de SQL que no existe en IDS 11.70.

```sql
-- ❌ INCORRECTO (IDS 11.70 no lo entiende)
CONCAT(mov.movfue, ABS(mov.movdoc)) numero_completo_factura
CONCAT('NC', CONCAT(cnc.cncloc, cnc.cncnum))
```

**Solución:** Usar el operador `||` (concatenación de strings en Informix):

```sql
-- ✅ CORRECTO (Compatible con IDS 11.70)
mov.movfue || ABS(mov.movdoc) numero_completo_factura
'NC' || cnc.cncloc || cnc.cncnum
```

**Cambios realizados:** 15 instancias reemplazadas

---

### 2. **UNIQUE() COMO FUNCIÓN - NO SOPORTADA**
**Problema:** `UNIQUE()` no es una función válida en Informix. La sintaxis correcta es usar `DISTINCT`.

```sql
-- ❌ INCORRECTO
SELECT UNIQUE(devcau) causa FROM basdat:fadev
```

**Solución:** Usar `DISTINCT` en la cláusula SELECT:

```sql
-- ✅ CORRECTO
SELECT DISTINCT devcau causa FROM basdat:fadev
```

**Cambios realizados:** 2 instancias reemplazadas

---

### 3. **WITH (CTEs - Common Table Expressions) - LIMITADO EN IDS 11.70**
**Problema:** Las CTEs (WITH clauses) pueden no ser completamente soportadas o tener limitaciones en IDS 11.70.

```sql
-- ❌ PROBLEMÁTICO en IDS 11.70
WITH dev_col AS (
  SELECT UNIQUE(devcau) causa, devdev, devloc FROM basdat:fadev WHERE devanu = '0' OR devart = 'DEV-FAC'
),
dev_ec AS (
  ...
),
facturas AS (
  ...
)
```

**Solución:** Reescribir la consulta usando subconsultas inline en los LEFT JOINs:

```sql
-- ✅ CORRECTO
LEFT JOIN (SELECT DISTINCT devcau causa, devdev, devloc FROM basdat:fadev WHERE devanu = '0' OR devart = 'DEV-FAC') dv 
  ON dv.devdev = f.movdoc AND dv.devloc = f.movfue
```

---

## Comparativa de Versiones

| Característica | IDS 11.70 | Versión Original |
|---|---|---|
| `CONCAT()` | ❌ No | ✅ Sí |
| `||` concatenación | ✅ Sí | ✅ Sí |
| `DISTINCT` | ✅ Sí | Usa `UNIQUE()` |
| `WITH` (CTEs) | ⚠️ Limitado | ✅ Completo |
| `CASE WHEN` | ✅ Sí | ✅ Sí |
| `COALESCE()` | ✅ Sí | ✅ Sí |
| `UNION ALL` | ✅ Sí | ✅ Sí |

---

## Cambios Específicos Realizados

### Cambio 1: CONCAT → || (15 reemplazos)
```sql
-- Línea 68
CONCAT(mov.movfue, ABS(mov.movdoc))
→ mov.movfue || ABS(mov.movdoc)

-- Línea 129
CONCAT(f.movfue, ABS(f.movdoc))
→ f.movfue || ABS(f.movdoc)

-- Línea 162
CONCAT(cnc.cncloc, cnc.cncnum)
→ cnc.cncloc || cnc.cncnum

-- Línea 189 (múltiples)
CONCAT('NC', CONCAT(cnc.cncloc, cnc.cncnum))
→ 'NC' || cnc.cncloc || cnc.cncnum
```

### Cambio 2: UNIQUE() → DISTINCT (2 reemplazos)
```sql
-- Línea 42
SELECT UNIQUE(devcau) causa FROM basdat:fadev
→ SELECT DISTINCT devcau causa FROM basdat:fadev

-- Línea 45
SELECT UNIQUE(devcau) causa FROM dbecuador:fadev
→ SELECT DISTINCT devcau causa FROM dbecuador:fadev
```

### Cambio 3: CTEs reescritas
Las CTEs se han convertido en subconsultas inline en los LEFT JOINs. Ejemplo:

```sql
-- ANTES (Con CTE)
WITH dev_col AS (
  SELECT UNIQUE(devcau) causa, devdev, devloc FROM basdat:fadev WHERE devanu = '0' OR devart = 'DEV-FAC'
)
...
LEFT JOIN dev_col dv ON dv.devdev = f.movdoc AND dv.devloc = f.movfue

-- DESPUÉS (Subconsulta inline)
LEFT JOIN (SELECT DISTINCT devcau causa, devdev, devloc FROM basdat:fadev WHERE devanu = '0' OR devart = 'DEV-FAC') dv 
  ON dv.devdev = f.movdoc AND dv.devloc = f.movfue
```

---

## Notas Importantes

1. **Performance:** Las subconsultas inline pueden tener impacto en performance. Considera usar índices en las tablas `fadev`, `cncre`, `cndeb`.

2. **Testing:** Verifica que los resultados sean idénticos entre la versión original y la versión IDS 11.70.

3. **Conversion de tipos:** En IDS 11.70, a veces necesitas convertir tipos explícitamente con `CAST()` si hay problemas con concatenación de números. Ejemplo:
```sql
-- Si tienes errores de tipo
mov.movfue || CAST(ABS(mov.movdoc) AS VARCHAR(10))
```

4. **Índices recomendados:**
```sql
CREATE INDEX idx_fadev_dev_fue ON basdat:fadev(devdev, devloc);
CREATE INDEX idx_creci_ref_fue ON basdat:creci(crefac, crcfue);
CREATE INDEX idx_crcar_fac_cli ON basdat:crcar(crcfac, crccli, crcloc);
```

---

## Archivo Generado

Se ha creado `famovDAO_IDS1170_compatible.php` con todas las correcciones aplicadas.

Para usar la nueva versión:
1. Reemplaza la clase `FamovDAO` en tu código
2. O incluye el nuevo archivo donde necesites: `require_once 'lib/dao/famovDAO_IDS1170_compatible.php';`

