Hola!
Estoy intentando cargar datos en un formulario multilínea desde una tabla. Según vi en el modelo de referencia, puse
return $this->dependencia(‘datos’)->tabla(‘cert_items’)->get_filas(null, true);
pero no trae ningún dato.
¿Cuál es la forma correcta?
Gracias
Saludos
Natalia
Hola Natalia,
la forma que estas utilizando es la manera en que se le brindaban datos a los componentes en las versiones de toba anteriores a la 1.0. La manera actual de hacerlo seria:
function conf__nombre_formulario_ml($form)
{
$datos = $this->dependencia('datos')->tabla('cert_items')->get_filas(null, true);
$form->set_datos($datos);
}
Podrias colocarlo todo en una sola linea, pero de esta forma podes agregar alguna llamada para debug entre medio y saber si te esta recuperando los datos correctamente sin tener que volver a realizar toda la llamada a get_filas.
Saludos
Hola Richard!
Cambié el código como indicaste pero el array queda vacio. No he extendido el ml ni he agregado comportamientos adicionales. Revisé las queries del datos tabla y todo ok. ¿Me falta algo por agregar?, ¿que debo revisar?
gracias
Natalia
Hola Natalia,
en la llamada a get_filas le estas indicando que utilice cursores, la pregunta seria entonces… para el cursor seteado en la tabla padre… existen registros en la tabla ‘cert_items’?.
Proba haciento una llamada a get_filas pero sin parametros, solamente para ver si el componente cargo algun registro o no.
Saludos
Hola Richard!
Existen registros en la tabla cert_items.
La llamada
get_filas();
si trajo los registros, pero
get_filas(null, true);
nada.
En esta llamada
get_filas($condiciones, true)
, ¿cual es la sintáxis para $condiciones?
Muchas gracias
Saludos
Perfecto, eso quiere decir que la limitante esta en que el datos_tabla esta tomando en cuenta los cursores para recuperarte las filas, para obtener todos los registros de la tabla sin tener en cuenta el padre que pueda estar seleccionado (aunque no se si tenes padre en la relacion para esta tabla), tendrias que modificar la llamada y convertirla a get_filas(null, true, false) de esa forma ignora los cursores y te devuelve todos los datos que se encuentren cargados en el componente.
En esta llamada ``` get_filas($condiciones, true) ``` , ¿cual es la sintáxis para $condiciones?
El formato para las condiciones seria un arreglo asociativo con el campo como clave y el valor a filtrar, por ej:
$datos = $this->dep('datos')->tabla('apex_proyectos')->get_filas(array('cod_proyecto' => 'toba_referencia'), false, false);
En el ejemplo le solicito al componente que me entregue todas las filas que tengan como coincidencia ‘toba_referencia’ en el campo cod_proyecto, que no me numere el resultado usando la clave interna para indexar el arreglo y que tampoco use cursores. En el arreglo podes incluir tantas condiciones como quieras… pero tene en cuenta que ningun valor del mismo puede llevar NULL.
Saludos
Este es el código:
$datos = $this->dep('datos')->tabla('cert_items')->get_filas();
var_dump($datos);
if ($this->dep('datos')->esta_cargada()) {
$form_ml->set_datos($datos);
}else echo('NO CARGA DATOS');
Y el resultado:
array(0) { } NO CARGA DATOS
Pero presenta una grilla con algunos datos de llaves foráneas (adjunto imagen) pero no trae los datos (me retracto).
no hay tabla padre. El datos relación tiene un datos tabla solamente
Saludos
Natalia,
reemplaza esta fila
$datos = $this->dep('datos')->tabla('cert_items')->get_filas();
por esta otra
$datos = $this->dep('datos')->tabla('cert_items')->get_filas(null, false, false);
La cambié y no hay cambios. La misma respuesta
Sigo sin resolverlo, ¿algo que más para probar?
Saludos
Hola Natalia,
podrias subir el codigo del Ci donde se te esta produciendo este problema?.. una consulta mas que te hago… esta situacion se te presenta en un alta de registros o en una modificacion de registros previamente cargados?.
Te consulto esto porque si se produce en el alta esa es probablemente la razon de que no te este mostrando ningun dato, esto es $this->dep(‘datos’)->esta_cargada() unicamente devolvera true cuando se haya ejecutado antes un $this->dep(‘datos’)->cargar($claves);… si es un alta por mas que hayas asignado valores a la tabla dicha linea no devolvera true.
Si este fuera el caso, te conviene cambiar la condicion para que tome en cuenta los datos devueltos por la tabla, en tu caso quedaria algo asi:
$datos = $this->dep('datos')->tabla('cert_items')->get_filas();
var_dump($datos);
if (! empty($datos)) {
$form_ml->set_datos($datos);
}else echo('NO CARGA DATOS');
Es una de las ideas que me viene a la cabeza sin tener el codigo a mano.
Saludos
Richard, estoy haciendo una consulta, ni alta ni modificación en este momento.
Este es el código:
function conf__certifica(toba_ei_formulario_ml $form_ml)
{
// $datos = $this->dep('datos')->tabla('cert_items')->get_filas(null, false, false);
$datos = $this->dep('datos')->tabla('cert_items')->get_listado_selecto();
ei_arbol($datos);
$form_ml->set_datos($datos);
}
Viendo que get_filas no funcionaba armé una query (get_listado_selecto) y si anduvo. No sé cual será el problema.
En este operación, hay un CI con 2 DR asociados, uno para cada DT, ¿eso puede traer algún problema?
Saludos y gracias!
En el caso de la modificacion, ¿debería recuperar los id de filas a guardar mediante:
$filas = $this->dep('datos')->tabla('cert_items')->get_id_fila_condicion(array('certificacion_id' => 5));
y luego modificar_fila?
¿o tendría q usar directamente
$this->dep('datos')->tabla('cert_items')->procesar_filas($datos);
?
Si se usan ambas, ¿cuál es la diferencia?
Saludos
Hola Natalia,
gracias por el codigo :), creo que el tema viene asi:
-
Tener dos datos relacion en el mismo Ci no tiene porque generarte problema, siempre y cuando ambas relaciones no tengan el mismo objeto tabla cargado.
-
Con respecto a la modificacion, en gral cuando se usan formularios ML se tiende a utilizar la api procesar_filas() que brinda mayor comodidad, sin embargo hay situaciones en las cuales esto no puede hacerse y es necesario recuperar los ids de la fila para poder modificar, todo depende de la situacion particular y de la relacion. En tu caso como la tabla es directa y unica podrias usar procesar_filas().
-
Con el tema de la tabla cert_items hay un par de cosas:
- En el evt__certificar puedes posponer la sincronizacion de la tabla hasta que hayas agregado todas las filas, no es necesario que sincronices una por una, eso te va a penalizar en cuanto a performance.
- Al final del ciclo tenes una llamada al metodo resetear(), ojo con esto… si no hubieras sincronizado las filas antes esa llamada hace que se pierda todo el contenido del datos_tabla y aun cuando sincronizaste esa llamada hace que todas las filas que pudieran estar cargadas… ya no esten, en consecuencia cuando pasas la pantalla la tabla esta vacia, por eso el get_filas() no te recupera nada, pero una consulta directa a la base si.
Veo que tenes un evt__cancelar asi que voy a asumir que tenes un evt__guardar tambien … o algo por el estilo. Lo que podrias hacer si tu intencion es tomar aquellos datos seleccionados del cuadro y cargarlos para que el ML pueda completarlos, es usar el hecho de que el datos_tabla mantiene los datos en sesion hasta tanto lo resetees o cambies de operacion, con eso podes agregarle las filas en el evt__certificar, luego pasar a la otra pantalla donde esta el ML… completar los datos que faltan … y directamente sincronizar el todo cuando se guarda.
Si necesitas guardar los registros apenas pasas del cuadro al ML… entonces podes sincronizar apenas terminas el ciclo… pero no resetees los datos_tabla… luego podes usar procesar filas para efectuar las modificaciones de datos.
Saludos