Checkpoint del Módulo 4
Repaso del módulo, un caso real de escalado de casos escrito para aguantar 200 registros, y tu primer choque controlado con un governor limit en la Developer Org.
✓ En esta sub-lección
- 01Aplicar la receta completa de DML seguro: juntar, consultar una vez, decidir en memoria, guardar una vez y revisar resultados.
- 02Elegir entre todo o nada, resultados parciales y savepoints según el negocio.
- 03Provocar y leer un LimitException en una Developer Org.
La nutria: ¿Te acuerdas? · Repaso de la lección 5
Pones Savepoint sp = Database.setSavepoint(); DESPUÉS de insert acc;, un contacto falla y haces Database.rollback(sp). ¿Qué pasa con la cuenta?
Con los Módulos 3 y 4 tienes las dos mitades de casi cualquier automatización: leer y escribir. A partir del Módulo 6 las meterás dentro de triggers, donde el volumen no lo eliges tú. Este checkpoint es el ensayo general.
Lo que has aprendido, sub-lección a sub-lección
1 · DML. insert, update, delete, undelete y upsert son las operaciones de Data Loader. insert rellena el Id; update necesita el Id; upsert decide por un Id externo. Todo DML pasa por validaciones, flows y triggers.
2 · Resultados parciales. La instrucción es todo o nada; Database.insert(lista, false) guarda lo que puede y devuelve un SaveResult por registro, en el mismo orden: tu success.csv y error.csv. Parcial nunca significa ignorar los errores.
3 · Bulkificación. Los registros llegan de 200 en 200. Ninguna consulta ni DML dentro de un bucle: juntar en un Set, consultar una vez con IN, trabajar en memoria, guardar una vez. Map para no duplicar Ids.
4 · Governor limits. 100 consultas, 150 DML, 50.000 filas leídas, 10.000 filas escritas, 10 s de CPU, 6 MB de heap, por transacción y compartidos con los flows. LimitException no se captura. La clase Limits mide.
5 · Savepoints. Database.setSavepoint() marca y Database.rollback() vuelve: deshacer una parte y seguir. Cuestan DML, no devuelven límites y no borran los Ids de tus variables.
ORDENA LA RECETA: PULSA EL SIGUIENTE PASO
Paso 1 de 5: ¿qué va ahora?
La nutria: La lista de revisión que ya usas con Flow
La nutria: ¿Y por qué no un Flow? El escalado sí; el resumen, no
Ahora en tu Developer Org
- En Developer Console → Debug → Open Execute Anonymous Window, ejecuta tu solución del ejercicio de la lección 1. Busca Nimbus Logistics en la interfaz: ahí están la cuenta y sus dos contactos.
- Ejecuta delete [SELECT Id FROM Account WHERE Name = 'Nimbus Logistics']; y abre la Papelera: la cuenta está allí. Recupérala con undelete, usando ALL ROWS en la consulta.
- Provoca el límite a propósito: for (Integer i = 0; i < 151; i++) { insert new Task(Subject = 'Prueba ' + i); }. Lee el error: «System.LimitException: Too many DML statements: 151». Luego busca las tareas «Prueba»: no hay ninguna. La transacción se deshizo entera.
- Ahora la versión bulkificada: añade las 151 tareas a una lista dentro del bucle y haz un solo insert fuera. Funciona. En el log, con Debug Only desmarcado, busca LIMIT_USAGE_FOR_NS: «Number of DML statements: 1 out of 150». Borra después esas tareas.
- Guarda la clase LimitsReport de la lección 4 en Setup → Apex Classes → New, y llama a LimitsReport.log('fin') al final del ejercicio de este checkpoint.
El diccionario completo: de Data Loader y Flow a Apex
| Con clics | En Apex |
|---|---|
| Data Loader Insert / Create Records | insert |
| Data Loader Update / Update Records | update (con Id) |
| Data Loader Upsert con un External ID | upsert … Account.Fields.Campo__c |
| Data Loader Delete / Delete Records | delete (a la Papelera) |
| success.csv y error.csv | Database.insert(lista, false) y sus SaveResult |
| Batch size 200 | bulkificación: todo pensado para 200 |
| Fault path + Roll Back Records | Database.setSavepoint() y Database.rollback() |
| El correo «Too many SOQL queries: 101» | la clase Limits, antes de llegar ahí |
La nutria: Lo que no se traduce: tú eres el responsable