Datos Tabla
Un datos\_tablas
mantiene una estructura tabular (o también llamada
RecordSet) y brinda una interface para trabajar con ella. Sus
principales características son:
Utiliza un administrador de persistencia para cargar los datos desde un medio de persistencia.
Una vez en memoria existen Primitivas para trabajar sobre estos datos.
Los datos y sus modificaciones son mantenidos automáticamente en sesión entre los distintos pedidos de página. Esto quiere decir que cuando se pide modificar un dato esta modificación se retiene hasta el final de la transacción de negocios.
Una vez terminada la edición se hace la sincronización con el medio de persistencia a través del administrador de persistencia, marcando el final de la transacción de negocios.
Definición
- Tabla: Nombre físico de la tabla en la base de datos
- Tipo de persistencia: administrador de persistencia que se utilizará, optativamente se puede personalizar alguno a manera de subclase.
- Permitir modificar claves: Por defecto las claves definidas no son modificables.
Primitivas
La mejor forma de entender las primitivas es revisando la API, a continuación se dan ejemplos a manera de resumen de las primitivas más utilizadas:
Carga
Generalmente la carga y sincronización son dos procesos que la tabla no maneja en forma aislada sino que es sólo un participante más de la relación a la que pertenece. En caso de que la operación maneje una tabla aislada (como pueden ser los ABMs de tablas simples) la carga generalmente se hace restringiendo por valores específicos de campos:
$tabla->cargar(array('id' => 8));
Trabajo con un único registro
La operación puede trabajar con un conjunto masivo de filas o registros, o simplemente con un solo. Este último caso es el más sencillo, asumiendo que la carga anterior siempre asegura un único registro (con id 8), para consultar su contenido se ejecuta:
$datos = $tabla->get();
ei_arbol($datos);
Por ejemplo el usuario puede modificar el contenido de la fila y pedir posteriormente la modificación en la tabla:
$datos['nombre'] = "Nuevo nombre";
$tabla->set($datos);
Trabajo con varios registros
Las primitivas permiten:
- Consultar los datos de una fila
$tabla->get_fila($id_fila);
- Consultar los datos de varias filas
$tabla->get_filas($condiciones, true)
- Crear una nueva fila:
$tabla->nueva_fila($datos);
- Modificar una fila:
$tabla->modificar_fila($id_fila, $datos);
- Eliminar una fila:
$tabla->eliminar_fila($id_fila);
- Procesar cambios masivos sobre filas
$tabla->procesar_filas($cambios);
donde cambios es una matriz asociativa de filas la clave de cada fila es elid\_fila
y cada una tiene una columna especial referenciada por la constanteapex_ei_analisis_fila
que marca el proceso a aplicar a la fila por ejemplo:$cambios = array( 1001 => array(apex_ei_analisis_fila => 'M', 'nombre' => 'Es una modificación'), 1010 => array(apex_ei_analisis_fila => 'A', 'nombre' => 'Es una alta'), 1011 => array(apex_ei_analisis_fila => 'B') );
En todos los casos cuando se habla de $id_fila
es la identificación
propia de la fila no relacionada con la clave de la tabla física.
Sincronización
Al finalizar el trabajo en memoria se pide sincronizar con el medio de persistencia
$tabla->sincronizar();
La sincronización construye los comandos SQL necesarios (updates o inserts) dependiendo de siel registro es nuevo o es sólo una modificación de la carga y los ejecuta dentro de una transacción.
Eliminación
Para eliminar TODAS las filas cargadas de una tabla se pueden optar por dos caminos:
- Hacerlo a través del trabajo en memoria más
sincronización:
$tabla->eliminar_filas(); $tabla->sincronizar();
Esta opción es útil cuando las filas a eliminar se encuentran cargadas en memoria.
- Hacerlo a través de una primitiva de eliminación masiva, esta
primitiva elimina directamente desde el mecanismo de persistencia
$tabla->eliminar_todo()
Esta opción es útil cuando las filas no están cargadas, sino que se borra utilizando una opción externa, sin ver el contenido de las filas.
Nota: Recordar que este estos son los pasos para la carga y sincronización de una tabla aislada, el proceso cambia cuando la tabla está involucrada en un objeto relación.
Más información se encuentra en la API.
Columnas Externas
Dentro de la transacción es probable que los contenidos de la tabla quieran ser presentados de una forma amigable al usuario. Así por ejemplo las claves foráneas tienen que mostrar su descripción y no su valor, para esto hay dos opciones:
Agrego la columna
descripcion
a la tabla y marcarla como externa. De esta forma su valor estará disponible pero no participará de la sincronización.En el ci, relleno los datos haciendo la consulta manualmente cada vez que se pide esta información.
El caso recomendado es el primero en donde se agrega la columna en la
definición datos_tabla
y se lo marca como externa. Además se tiene que
brindar una forma de cargarla, ya sea a través de un SQL o a través de
la invocación de un método PHP. Para esto último existe una solapa en el
editor del datos_tabla
.
Por ejemplo en el proyecto Referencia, ítem
Operaciones Simples -> ABM de Personas
, en la pantalla de
deportes se quieren listar las descripciones del mismo. Entonces se
agregan los campos que describen el deporte y el día de semana:
Tanto si se utiliza como medio de carga la consulta SQL o el método PHP, en ambos casos el resultado a devolver debe ser un registro que contenga la/s columna/s correspondientes para la carga de los valores 'externos'. En el caso de la carga por método PHP que se base en la realización de una consulta SQL, puede ser necesaria una conversión del resultado del formato Recordset al formato registro, para evitar este paso y sabiendo a priori que la consulta retornará siempre un solo registro se puede utilizar también el metodo toba::db()->consultar_fila($SQL) al momento de realizar la query. Para una carga donde se arme el resultado a mano, el mismo deberá tener una estructura similar a la del siguiente ejemplo:
$ejemplo_resultado_dao = array(
'desc_deporte' => 'Motociclismo',
'nombre' => 'Siambretta 150',
'desc_dia_semana' => $datos[0]['dia_semana']
);
Más info
Ejemplo en el proyecto Referencia, ítems bajo la rama "Operaciones Simples"