3.4 · Funciones de texto/fecha y lógica condicional (If/Select)

Nivel 3 · Avanzado: fórmulas y formato condicional

3.4Funciones de texto/fecha y lógica condicional (If/Select)

Objetivo: manejar texto y fechas en fórmula y escribir lógica condicional (If encadenados, Select…Case, IsNull).
Tiempo estimado: 11 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

Lo esencial en 30 segundos

  • Texto + fechas = 80 % de las necesidades: extraer y limpiar con UpperCase, Left, Trim, ToText; extraer periodos y plazos con Year, DateDiff, DateAdd, Today.
  • If para los umbrales, Select para los códigos: If…Then…Else encadenado para los tramos, Select…Case para traducir UN valor en etiquetas — más legible.
  • IsNull primero: un campo nulo no comprobado hace fallar la fórmula o devuelve vacío — comprobar IsNull antes de usar todo campo potencialmente vacío.

Minicaso hilo conductor — Farès clasifica a sus clientes y vigila los retrasos

Farès, controlador de gestión en Argel, clasifica a sus clientes a mano (VIP, Estándar, A seguir) y calcula los retrasos de pago con la calculadora. Escribe una fórmula por tramos — If {Clients.CA} >= 500000 Then "VIP" Else If {Clients.CA} >= 100000 Then "Estándar" Else "A seguir" — y un retraso en días con DateDiff("d", {Factures.Echeance}, CurrentDate), protegido por una comprobación IsNull sobre la fecha de pago. El informe clasifica y señala solo: la segmentación se hace con cada actualización, sin hoja de cálculo.

Este mismo caso vuelve en el curso, el esquema, el guion y el desafío 48h.

1. Funciones de texto y fecha: el día a día de las fórmulas

Crystal Reports ofrece CIENTOS de funciones; en el día a día, dos familias bastan. Funciones de TEXTO: UpperCase / LowerCase (mayúsculas), Left / Right / Mid (extraer una parte), Len (longitud), Trim (quitar los espacios), Replace (reemplazar), ToText (convertir número/fecha en texto). Limpian, extraen y componen: inicial de un nombre (Left({Client.Nom}, 1)), código de producto, etiqueta con formato. Funciones de FECHA: Year / Month / Day (extraer — esencial para agrupar por periodo), DateDiff (diferencia entre dos fechas: un plazo en días), DateAdd (añadir una duración: un vencimiento), Today / CurrentDate (fecha del día). Retraso = DateDiff("d", {Factures.Echeance}, CurrentDate).

Estas funciones cubren la manipulación de vencimientos, antigüedades y agrupaciones mensuales — el pan de cada día del reporting de gestión. Reflejo: convertir explícitamente (ToText para mostrar, CDate para convertir un texto en fecha) en lugar de mezclar los tipos.

2. Lógica condicional: If…Then…Else, Select…Case, IsNull

El corazón de las fórmulas inteligentes. If…Then…Else devuelve un valor según una condición: If {Montant} > 1000 Then "Grande" Else "Estándar" — encadenable para varios tramos (probar de lo más restrictivo a lo más general, la primera condición verdadera gana). Select…Case comprueba UN valor contra varios casos precisos, más legiblemente: Select {Clients.Statut} Case "A" : "Activo" Case "S" : "Suspendido" Default : "Desconocido". Regla de elección: UMBRALES y rangos → If encadenados; UN valor comparado con casos fijos (códigos, categorías) → Select…Case. Los operadores And, Or, Not combinan las condiciones.

El reflejo que evita los fallos: comprobar IsNull antes de usar un campo potencialmente nulo — una fecha nula en un DateDiff, un importe nulo en un cálculo, y la fórmula falla o devuelve vacío. Estas fórmulas alimentan luego la visualización, las agrupaciones (3-5), el formato condicional (3-2) y los filtros: es el vocabulario que hace los informes a medida.

Error frecuente de interpretación: « Select…Case e If encadenados es lo mismo — y los valores nulos, ya veremos si falla ». No, dos veces. Select…Case solo es legible para UN valor comprobado en igualdades; para umbrales y combinaciones, los If siguen siendo la herramienta — intercambiarlos vuelve las fórmulas ilegibles. Y un nulo no comprobado nunca « pasa »: hace fallar en silencio. IsNull primero, siempre.
Hacer inteligente una fórmula Manipular, decidir, proteger ManipularTexto (Left, Trim) y fechas (Year, DateDiff)+DecidirIf para umbrales, Select para códigos+ProtegerIsNull antes de todo campo dudoso Orden de los If: de lo más restrictivo a lo más general.
Manipular, decidir, proteger
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) Manipular: Farès extrae el año con Year y el retraso con DateDiff en lugar de calcular a mano. 2) Decidir: If encadenados para los tramos de facturación, Select…Case para traducir los códigos de estado. 3) Proteger: IsNull sobre la fecha de pago antes de todo cálculo — ningún nulo atraviesa la fórmula. Lección: manipular, decidir, proteger — en ese orden.

🔎 Ejemplo concreto — Segmentación de clientes y retraso de pago

Farès escribe sus dos fórmulas de pilotaje en sintaxis Crystal.

Segmento: If {Clients.CA} >= 500000 Then "VIP"
  Else If {Clients.CA} >= 100000 Then "Estándar" Else "A seguir"
Retraso: If IsNull({Factures.DatePaiement}) Then
  DateDiff("d", {Factures.Echeance}, CurrentDate) Else 0

Lectura: umbrales → If encadenados; posible nulo → comprobación IsNull primero.

Lección: estas categorías servirán luego para AGRUPAR (3-5).

Vocabulario de la sección

Funciones de texto (cadenas)
UpperCase/LowerCase, Left/Right/Mid (extraer), Len, Trim (limpiar), Replace, ToText — para limpiar, extraer, componer texto.

Ejemplo sencillo: La inicial Left({Client.Nom}, 1) de Farès.

Lo que no es: códigos reintroducidos a mano en una hoja de cálculo.

Reflejo: extraer y limpiar en fórmula, nunca a mano.

Funciones de fecha
Year/Month/Day (extraer un periodo), DateDiff (plazo entre dos fechas), DateAdd (añadir una duración), Today/CurrentDate.

Ejemplo sencillo: El retraso DateDiff("d", vencimiento, CurrentDate).

Lo que no es: plazos calculados con la calculadora.

Reflejo: Year para agrupar, DateDiff para los plazos.

If…Then…Else
Devuelve un valor según una condición; encadenable para varios tramos (primera condición verdadera = ganadora).

Ejemplo sencillo: La segmentación VIP / Estándar / A seguir.

Lo que no es: un Select…Case para umbrales de importes.

Reflejo: umbrales y rangos → If encadenados.

Select…Case
Distribución: comprueba UN valor contra varios casos precisos + un defecto; más legible que If para igualdades.

Ejemplo sencillo: El código de estado traducido en etiqueta (Activo, Suspendido…).

Lo que no es: If encadenados para traducir diez códigos fijos.

Reflejo: un valor, casos fijos → Select…Case.

Gestión de nulos (IsNull)
Comprobar IsNull antes de usar un campo potencialmente nulo: un nulo no gestionado hace fallar la fórmula o devuelve vacío.

Ejemplo sencillo: La comprobación sobre {Factures.DatePaiement} antes del DateDiff.

Lo que no es: un DateDiff directo sobre una fecha a veces vacía.

Reflejo: IsNull en primera línea de toda fórmula de riesgo.

En la práctica — Usar funciones y lógica condicional

  1. Pruebe funciones de TEXTO: UpperCase, Left (extraer), Trim (limpiar), y componga una etiqueta con ToText.
  2. Pruebe funciones de FECHA: Year({Date}) para extraer el año, DateDiff para un plazo en días.
  3. Escriba una fórmula If…Then…Else (clasificar un importe); encadene para varios casos o use Select…Case para códigos.
  4. Gestione los nulos con IsNull antes de usar un campo; verifique la sintaxis y pruebe en vista previa.
Maneja texto y fechas y escribe lógica condicional: construye casi cualquier valor calculado.

Guion listo para decir — explicar la segmentación automática (30 s)

« La segmentación ya no es manual: una fórmula clasifica a cada cliente — VIP, Estándar o A seguir — según su facturación, y el retraso se calcula solo a partir del vencimiento, ignorando las facturas ya pagadas. Con cada actualización, la clasificación está al día. »

Para decir en comité de dirección; mostrar los umbrales de la fórmula.

Plantilla copiar-pegar — If, Select, fechas (sintaxis Crystal)

// Tramos (If encadenados)
If {Clients.CA} >= 500000 Then "VIP"
Else If {Clients.CA} >= 100000 Then "Estándar"
Else "A seguir"
// Códigos (Select…Case)
Select {Clients.Statut}
Case "A" : "Activo"
Case "S" : "Suspendido"
Default : "Desconocido"
// Retraso protegido de los nulos
If IsNull({Factures.DatePaiement}) Then
    DateDiff("d", {Factures.Echeance}, CurrentDate)
Else 0

Independiente

Dos fórmulas (una por tramos, una de fechas) y su informe razona solo.

PYME en Argel

Farès segmenta a sus clientes y sigue los retrasos sin calculadora.

Equipo de proyecto

Documentar los umbrales (VIP, alertas) junto a cada fórmula para encontrarlos.

Principiante

Esta semana: un If con dos salidas + un DateDiff protegido por IsNull.

✓ Buenas prácticas

  • Pruebe las condiciones de lo más restrictivo a lo más general (la primera verdadera gana).
  • Prefiera Select…Case en cuanto un solo valor se compare con casos fijos.
  • Coloque la comprobación IsNull en primera línea de toda fórmula que toque un campo dudoso.

✗ Errores frecuentes

  • Encadenar los If en el orden equivocado: una condición general se traga los casos particulares.
  • Usar Select…Case para umbrales (o If para diez códigos fijos): ilegible.
  • Olvidar IsNull: la fórmula falla en silencio sobre los registros con campo vacío.

Puntos clave

  • TEXTO: UpperCase/LowerCase, Left/Right/Mid, Len, Trim, Replace, ToText — extraer, limpiar, componer.
  • FECHAS: Year/Month (periodos), DateDiff (plazos), DateAdd (vencimientos), Today — plazos, antigüedad, agrupaciones.
  • CONDICIONES: IF…THEN…ELSE (umbrales, encadenable) y SELECT…CASE (un valor, casos fijos) + And/Or/Not.
  • Precaución TIPOS y NULOS: convertir explícitamente, comprobar ISNULL antes de usar.

Desafío 48h — aplíquelo mañana

Escriba 1 fórmula por tramos sobre sus datos reales + 1 cálculo de plazo protegido por IsNull, probados en vista previa.

Lista de salida de la sección
  • Manipulo texto y fechas en fórmula sin herramienta externa.
  • Elijo If o Select según el caso (umbrales frente a códigos).
  • Ningún campo dudoso entra en mis fórmulas sin comprobación IsNull.
Autoevaluación 1-5: ¿mis categorías están calculadas o reintroducidas?¿cuántas de mis fórmulas protegen sus campos de los nulos?

Preguntas frecuentes

If…Then…Else o Select…Case: ¿cómo elegir para clasificar?

Ambos devuelven un valor diferente según los datos, pero no para los mismos casos. IF…THEN…ELSE: dos salidas (« If {Montant} > 1000 Then « Grande » Else « Estándar » ») o TRAMOS encadenados (« >= 5000: Muy grande », « >= 1000: Grande », « >= 100: Mediano », si no « Pequeño ») — orden decreciente, primera condición verdadera ganadora. Ideal para UMBRALES, rangos y combinaciones. SELECT…CASE: UN valor contra casos PRECISOS (« Select {Statut} Case « A »: « Actif » Case « S »: « Suspendu » Default: « Inconnu » ») — ideal para traducir códigos y categorías fijas, más legible que If. Estas categorías calculadas sirven luego para AGRUPAR (3-5): agrupar por tramo, por estado traducido, por periodo.

¿Cómo manipular las fechas y gestionar los valores nulos?

FECHAS: extraer con Year/Month/Day ({Date}) — para AGRUPAR por periodo (estado anual, mensual); plazo con DateDiff (días entre pedido y entrega, retraso frente a vencimiento, antigüedad); añadir con DateAdd (vencimiento = fecha + 30 días); hoy con Today/CurrentDate (retraso « a hoy »); comparar directamente (Fecha > #2026-01-01#); convertir con ToText/CDate. NULOS: un campo puede ser NULO (vacío — diferente de cero); una expresión con un nulo puede fallar o devolver vacío. Reflejo: If IsNull({champ}) Then … primero — valor de reemplazo, o cálculo alternativo. A probar sistemáticamente en fechas de pago, importes opcionales y campos no obligatorios.

Comprueba tu comprensión

Para traducir UN código de estado en etiquetas (A → Activo, S → Suspendido…), lo más legible es…

Recursos adicionales (opcional, para ir más allá)

Examen del nivel 3Preguntas inéditas y más difíciles para validar tus conocimientos