Problemas con datos relacion

Estimados.
Estoy haciendo una operacion con 2 CI anidados, que usa un Datos Relación compuesto por 3 Datos Tabla.
pedidos (1)→(m) pedidos_detalles (1)→(m) pedidos_desglose

Es donde pedidos es un padre que puede tener varios hijos (pedidos_detalles), pero a su vez pedidos_detalles es el padre de pedidos_desglose.
En el primer CI manejo un formulario (pedidos) y un formulario ml (pedidos_detalles).
Y en el 2do. CI manejo un ml para pedidos_desglose

Cargo los DT con los formularios correspondientes, pero al intentar sincronizar el DR, arroja un error de sincronización. Pero al guardar los datos me arroja un error de inconsistenacia, Se intenta crear o actualizar una fila y su fila padre aún no existe.

Desde toba están las relaciones indicadas (adjunto capturas).

Saludos


Captura de pantalla de 2018-04-24 20-15-37.png

Captura de pantalla de 2018-04-24 20-15-37.png

Captura de pantalla de 2018-04-24 20-15-49.png

Captura de pantalla de 2018-04-24 20-15-49.png

Captura de pantalla de 2018-04-24 20-15-53.png

Captura de pantalla de 2018-04-24 20-15-53.png

Hola Leo,

te hago una consulta, cuando cargas el desglose… como sabes sobre que detalle estas actuando?.. Lo seleccionas en la pantalla del segundo CI?.

El DR necesita que el DT del detalle tenga un cursor fijado al momento de cargar el desglose, es por eso que te esta tirando el error… no debe saber a que detalle pegarle los registros.

Saludos

Hola Richard, adjunto la imagen del arbol de la operacion.

en el 1er. CI cargo el DR. de la siguiente forma

function evt__cuadro__entregar($datos) {
        $this->dep('datos')->cargar($datos);
        toba::memoria()->set_dato('pedido',$datos);
        $this->set_pantalla('pant_entrega');   
    }

Luego en el Cuadro del 2do CI, tengo un evento con el id del detalle. el evento es el siguiente.

 function evt__cuadro_detalle__entregar($datos) {
        $this->s__id_articulo = $datos;
        $this->s__articulo = co_articulos::get_detalle_activos($datos['id_articulo']);
        
        /*$datos =$this->get_relacion()->tabla('farm_pedidos_detalle')->get_filas();
        $p = array('id_detalle'=>$datos['id_detalle']);
        $this->get_relacion()->tabla('farm_pedidos_detalle')->set_cursor($p);
        ei_arbol($datos);*/

        $this->set_pantalla('pant_detalle');    
    }

y al form_desglose_ml lo cargo a mano de la siguiente forma.

function conf__form_desglose_ml(ei_desglose_ml $form_ml)
    {
        $datos = $this->s__articulo;
        for ($i=0; $i < count($this->s__pedido); $i++) {
            if ($this->s__pedido[$i]['id_articulo']==$this->s__id_articulo['id_articulo']) {
                $id_detalle=$this->s__pedido[$i]['id_detalle'];
            }
        }
        $filas=array();
        
        foreach ($datos as $key) {
            $filas['id_detalle']=$id_detalle;
            $filas['id_art_detalle']=$key['id_art_detalle'];
            $filas['id_articulo']=$key['id_articulo'];
            $filas['denominacion']=$key['denominacion'];
            $filas['codigo']=$key['codigo'];
            $filas['f_vencimiento']=$key['f_vencimiento'];
            $filas['nro_lote']=$key['nro_lote'];
            $filas['stock_actual']=$key['stock_actual'];
            $filas['precio']=$key['precio'];
            $filas['id_laboratorio']=$key['id_laboratorio'];
            $filas['laboratorio']=$key['laboratorio'];
            $filas['denominacion_vto']=$key['denominacion_vto'];
            $filas['apex_ei_analisis_filas'] = 'A';
            //$filas['x_dbr_clave'] = $i;
            $form_ml->agregar_registro($filas);
        }

    }

Lo que tengo entendido que una vez que cargo el DR (el que cargo en el 1er CI), y se cargan todas las tablas que componen el DR. Entonces en el evento evt__cuadro_detalle__entregar, estuve haciendo pruebas para cargar la tabla “farm_pedidos_detalle” pero sin resultados.

Como tendria que hacer para detectar el cursor en el que estoy trabajando?

Saludos


Captura de pantalla de 2018-05-02 12-58-32.png

Captura de pantalla de 2018-05-02 12-58-32.png

Hola Leo,

Luego en el Cuadro del 2do CI, tengo un evento con el id del detalle. el evento es el siguiente.
 function evt__cuadro_detalle__entregar($datos) {
        $this->s__id_articulo = $datos;
        $this->s__articulo = co_articulos::get_detalle_activos($datos['id_articulo']);
        
        /*$datos =$this->get_relacion()->tabla('farm_pedidos_detalle')->get_filas();
        $p = array('id_detalle'=>$datos['id_detalle']);
        $this->get_relacion()->tabla('farm_pedidos_detalle')->set_cursor($p);
        ei_arbol($datos);*/

        $this->set_pantalla('pant_detalle');    
    }
Bien, lo que te faltaria en este caso.. es indicar que detalle estas editando?.. la tabla tiene todos los registros pero no sabe cual estas usando puntualmente. Otro tema es como lo seteas, si haces un get_filas() te va a traer todos los detalles que tiene ese pedido.. no podes agarrar el primero y fijarlo, tenes que hacer que coincidan.
y al form_desglose_ml lo cargo a mano de la siguiente forma.
function conf__form_desglose_ml(ei_desglose_ml $form_ml)
    {
        $datos = $this->s__articulo;
        for ($i=0; $i < count($this->s__pedido); $i++) {
            if ($this->s__pedido[$i]['id_articulo']==$this->s__id_articulo['id_articulo']) {
                $id_detalle=$this->s__pedido[$i]['id_detalle'];
            }
        }
        $filas=array();
        
        foreach ($datos as $key) {
            $filas['id_detalle']=$id_detalle;
            $filas['id_art_detalle']=$key['id_art_detalle'];
            $filas['id_articulo']=$key['id_articulo'];
            $filas['denominacion']=$key['denominacion'];
            $filas['codigo']=$key['codigo'];
            $filas['f_vencimiento']=$key['f_vencimiento'];
            $filas['nro_lote']=$key['nro_lote'];
            $filas['stock_actual']=$key['stock_actual'];
            $filas['precio']=$key['precio'];
            $filas['id_laboratorio']=$key['id_laboratorio'];
            $filas['laboratorio']=$key['laboratorio'];
            $filas['denominacion_vto']=$key['denominacion_vto'];
            $filas['apex_ei_analisis_filas'] = 'A';
            //$filas['x_dbr_clave'] = $i;
            $form_ml->agregar_registro($filas);
        }

    }

Bien.. pero tene en cuenta lo siguiente (esto es de la documentacion del metodo):
Agrega un registro nuevo a la matriz de datos
    La diferencia entre este método y agregar una fila vacía en el set_datos es que en este último
 los registros en el próximo pedido de página serán analizados como 'modificados' ya que no sabe diferenciarlos
 de los datos que ya existen en el medio de almacenamiento.
 
 Para cumplir con su objetivo este metodo tiene que se invocado en la etapa de configuración [b]cuando
 ya se ha cargado al componente con datos, de lo contrario se perdera su efecto.[/b]</blockquote>

Vos unicamente estas agregando los registros nuevos, despues no hay nada mas.

Lo que tengo entendido que una vez que cargo el DR (el que cargo en el 1er CI), y se cargan todas las tablas que componen el DR. Entonces en el evento evt__cuadro_detalle__entregar, estuve haciendo pruebas para cargar la tabla "farm_pedidos_detalle" pero sin resultados.

Como tendria que hacer para detectar el cursor en el que estoy trabajando?

No tenes que volver a cargar la tabla “farm_pedidos_detalle”, simplemente le tenes que decir que registro estas usando.
Eso lo podes hacer recuperando el id interno via este metodo y luego fijando el cursor con " $this->get_relacion()->tabla(‘farm_pedidos_detalle’)->set_cursor($p);".

Saludos