• Este debate está vacío.
Viendo 6 entradas - de la 1 a la 6 (de un total de 6)
  • Autor
    Entradas
  • #31388

    Como podría ejecutar un proceso (callout) por cada registro de una tabla, para llenar otros campos.
    Estoy utilizando una vista de artículos, y hay 4 campos calculados de stock que necesito completar por cada registro. Como hago para que ejecute este proceso? Seteando el callout en cualquier columna de la tabla no se ejecuta.
    Alguna idea?

    Muchas Gracias
    Hermann D. Schimpf

    #34439
    Federico Cristina
    Superadministrador

    Hermann,

    Por lo que entiendo de tu consulta… ¿estás queriendo realizar procesamiento por lote de estos registros? Deberías en estos casos apoyarte sobre la lógica de un beforeSave() que, por ejemplo, se encargue de realizar estas tareas.

    Tené en cuenta que los callouts se utilizan en tiempo de edición del campo y se disparan desde la vista (ver MTab.processCallout(MField field) ). Un callout requiere que, en la definición de la columna, especifiques el callout a ejecutar: package.clase.metodo (sin especificar los parámetros que inyecta el framework). Luego simplemente implementás la clase y método correspondientes, contemplando obviamente los parámetros previamente mencionados.

    Saludos,
    Federico

    #34441

    La ventana es para consulta. Los campos deben llenarse al abrir esta ventana. Hay algún método que se ejecute al momento de la obtención del registro?

    Hermann D. Schimpf

    #34440
    Javier Ader
    Participante

    Buenas, me meto jaja. No se si termino yo también de entender, pero si los campos son para “consulta” (e.d, no los vas a editar) y se genera un grupo de estos campos por cada fila entonces me imagino que no tenes que usar callouts (esos metodos se usan solo para producir cambios o validaciones en tiempo de edición) si no columans virtuales.
    Ejecuta esta sentencia sql para ver ejemplos de tabla que tienen columanas virtuales y como se usan

    Code:
    select t.tablename,c.columnname, c.columnsql , c.* from
    ad_column c
    inner join ad_table t on (c.ad_table_id = t.ad_table_id)
    where
    c.columnsql is not null

    (fijate que lo que podes poner es casi cualquier sentencia sql que genere un solo valor; la complejidad es arbitraria siempre y cuando las referencias a las columnas de la “tabla madre” estén bien definidas; si no, te va a tirar un error semántico a nivel sql )
    Ahora, estos columnas virtuales a su vez van a tener un representación visual via un campo (igual que cualquier otra columna); no lo chequie, pero me da la sensación que estos campos a su vez pueder ser modificados via callouts seteados en otras columnas no virtuales.
    Por ej, digamos que Juguetes tiene dos columnas no virtuales Peso1 y Peso2; y queres un tercer valor solo visual que sea el PesoTotal = Peso1 + Peso2. Esto se hace a nivel de Tabla (en Libertya) agregando (a mano) una columna llamada PesoTotal y setenadole el valor en sql (Peso1 + Peso2) (si no eso no anduviese, probar con (Juguetes.Peso1 + Juguetes.Peso2) ). Esta columa la podes usar desde un pestaña que muestre los juguetes.
    Ahora, esto creo que tiene el problema de que si el usuario modifica Peso1 o Peso2, el PesoTotal en la ventana no se va a recalcular hasta que salve la fila (pero cuando carge los Juguetes van a mostrar el valor correcto)…. si uno quisiese hilar fino, se le podría setear un callout un Peso1 y otro en Peso2 (o el mismo en los dos…) que vaya moficando “en vivo” el valor del campo PesoTotal (pero ojo, esto ultimo nunca lo probe y no se si los camos asociados a columnas virtuales se pueden modificar via callouts, pero casi seguro que si… es mas casi seguro que se esta haciendo con alguna de las columans virtuales que existen en uso).

    PD : Ojo, no se si es muy recomendable usar este tipo de cosas muy a la ligera… el valor de las columans virtuales se va a calcular por cada una de las filas que traigas; si el sql usadas en esta es muy complejo o trae muchos datos puede potencialmente hacerte ralentar mucho la carga inicial de la tabla (si es muy compleja, el servidor va tardar mucho en calcular; si es muy “grande” a nivel de datos, va a tardar mucho en poder enviarlos)

    #34445

    Quizá otra opción sería un trigger ON INSERT FOR EACH ROW sobre la tabla en cuestión. De última, se hará un refresh por código para mostrar por pantalla los valores sin necesidad de refrescar manualmente la ventana… Digo, como otra opción.

    #34447

    Gracias por la ayuda. Solucione el tema modificando la clase InfoProduct.

    Saludos
    Hermann D. Schimpf

Viendo 6 entradas - de la 1 a la 6 (de un total de 6)
  • Debes estar registrado para responder a este debate.