Buenos dias.
Hoy me he planteado un ejercicio, crear un nuevo extrafield por ejemplo en facturas, que dé un valor conseguido con el campo combinado.
Por ejemplo..
Un dato que podria ser interesante es traerme la fecha del pago de la factura que no sale en el listado.
Los pasos a seguir, los tengo claros, pero no he jugado aún con el campo combinado. No logro entender parte de la formula. El '?' debe ser un IF, los ':' el ELSE. Mi dificultad reside en saber llamar al objeto del ejemplo que he puesto, que me valdria otro, para entenderlo.
1. Primero Modulo de facturas.
2. Crear nuevo Campo adicional. Para ello debo elegir un campo de texto, para que salga el campo combinado.
En la ayuda para calcular el campo combinado sale este texto:
Puede introducir aquí una fórmula utilizando otras propiedades de objeto o cualquier código PHP para obtener un valor calculado dinámico. Puede utilizar cualquier fórmula compatible con PHP, incluido el operador de condición "?" y los objetos globales siguientes: $db, $conf, $langs, $mysoc, $user, $object.
ATENCIÓN: Sólo algunas propiedades de $object pueden estar disponibles. Si necesita propiedades no cargadas, solo busque el objeto en su fórmula como en el segundo ejemplo.
Usando un campo computado significa que no puede ingresar ningún valor de la interfaz. Además, si hay un error de sintaxis, la fórmula puede devolver nada.
Ejemplo de fórmula:
$object->id < 10 ? round($object->id / 2, 2) : ($object->id + 2 * $user->id) * (int) substr($mysoc->zip, 1, 2)
Ejemlo de recarga de objeto
(($reloadedobj = new Societe($db)) && ($reloadedobj->fetch($obj->id ? $obj->id : ($obj->rowid ? $obj->rowid : $object->id)) > 0)) ? $reloadedobj->array_options['options_extrafieldkey'] * $reloadedobj->capital / 5 : '-1'
Otro ejemplo de fórmula para forzar la carga del objeto y su objeto principal:
(($reloadedobj = new Task($db)) && ($reloadedobj->fetch($object->id) > 0) && ($secondloadedobj = new Project($db)) && ($secondloadedobj->fetch($reloadedobj->fk_project) > 0)) ? $secondloadedobj->ref : 'Proyecto principal no encontrado'
Alguna ayuda?
Jesus
Crear un nuevo extrafield con campo combinado.
Buenos dias,
Voy avanzando y empiezo a entender algo más,
Concretando como ejercicio quiero listar el campo rowid de terceros, para ello he creado un campo extrafield con el siguiente codigo para el campo combinado:
Por si no me explicado bien, muestra correctamente los rowid en el listado de terceros, pero todos los terceros que son creados nuevos, no salen en el listado.
Si alguien ve el error, agradezco cualquier ayuda para comprender el por qué?
Gracias.
Jesus
Voy avanzando y empiezo a entender algo más,
Concretando como ejercicio quiero listar el campo rowid de terceros, para ello he creado un campo extrafield con el siguiente codigo para el campo combinado:
Funcionar funciona pero solo para los terceros creados anteriormente a la creación del extrafield. He intentado opciones al codigo sin lograr que salgan los que se crean a posteriori.(($reloadedobj = new Societe($db)) && ($reloadedobj->fetch($obj->rowid) > 0)) ? $reloadedobj->id: 0
Por si no me explicado bien, muestra correctamente los rowid en el listado de terceros, pero todos los terceros que son creados nuevos, no salen en el listado.
Si alguien ve el error, agradezco cualquier ayuda para comprender el por qué?
Gracias.
Jesus
Buenas,
Resulta que para sacar el rowid en los listados, existe esta variable de configuración:
MAIN_SHOW_TECHNICAL_ID ► Show also technical IDs on elements cards or some lists (not supported everywhere).
Con esto resuelvo el ejercicio. Me queda saber por qué falla el codigo para hacer lo mismo que resuelve esta configuración.y tambien retomaré el ejercicio inicial para comprender como funciona este campo combinado. Cualquier aportación seria bienvenida.
Seguimos.
Jesus.
Resulta que para sacar el rowid en los listados, existe esta variable de configuración:
MAIN_SHOW_TECHNICAL_ID ► Show also technical IDs on elements cards or some lists (not supported everywhere).
Con esto resuelvo el ejercicio. Me queda saber por qué falla el codigo para hacer lo mismo que resuelve esta configuración.y tambien retomaré el ejercicio inicial para comprender como funciona este campo combinado. Cualquier aportación seria bienvenida.

Seguimos.
Jesus.
Última edición por Apolo el Lun, 11/04/2022, 00:21, editado 1 vez en total.
Buenas,
Bien, pues vamos al lio. De momento voy a apuntarme por aqui, que tablas están implicadas para entender como guarda la Fecha de pago de una factura Dolibarr, que es el dato que quiero en el listado de facturas, con un extrafield y el campo combinado.
tabla de facturas-> llx_facture .> rowid
tabla de pagos de facturas-> llx_paiement -> rowid, datec
tabla de relacion de pagos de facturas-> llx_paiement_facture -> fk_paiment,fk_facture
El campo que me quiero traer esta en la tabla llx_paiment y se llama 'datec', que es la fecha del pago.
Si quisiera hacer una consulta SQL, la lógica seria esta mas o menos, se aceptan correcciones>
SELECT A.ref, B.datec
FROM llx_facture as A,llx_paiement as B, llx_paiement_facture as C
WHERE B.rowid=C.fk_paiement && A.rowid=C.fk_facture;
Con lo que si intento esta consulta; Me lanza un error de Bad string syntax to evaluate (dot char is forbidden), vamos que no puedo usar el punto en el codigo del campo combinado.
Qué sintaxi seria la correcta para inyectar ese SQL o su equivalencia en codigo?
Sequimos...
Jesus
Bien, pues vamos al lio. De momento voy a apuntarme por aqui, que tablas están implicadas para entender como guarda la Fecha de pago de una factura Dolibarr, que es el dato que quiero en el listado de facturas, con un extrafield y el campo combinado.
tabla de facturas-> llx_facture .> rowid
tabla de pagos de facturas-> llx_paiement -> rowid, datec
tabla de relacion de pagos de facturas-> llx_paiement_facture -> fk_paiment,fk_facture
El campo que me quiero traer esta en la tabla llx_paiment y se llama 'datec', que es la fecha del pago.
Si quisiera hacer una consulta SQL, la lógica seria esta mas o menos, se aceptan correcciones>
SELECT A.ref, B.datec
FROM llx_facture as A,llx_paiement as B, llx_paiement_facture as C
WHERE B.rowid=C.fk_paiement && A.rowid=C.fk_facture;
Con lo que si intento esta consulta; Me lanza un error de Bad string syntax to evaluate (dot char is forbidden), vamos que no puedo usar el punto en el codigo del campo combinado.
Qué sintaxi seria la correcta para inyectar ese SQL o su equivalencia en codigo?
Sequimos...
Jesus
Bueno pues entendiendo un poco el operador terniario de php, como forma sencilla del IF-THEN-ELSE
operando1 ? operando2 : operando3
Se mira si el operando1 es verdadero o falso, si es verdadero obtiene el valor del operando2 y si es falso obtiene el valor del operando3.
Seguimos.
operando1 ? operando2 : operando3
Se mira si el operando1 es verdadero o falso, si es verdadero obtiene el valor del operando2 y si es falso obtiene el valor del operando3.
Seguimos.
Para los dos ejercicios que habia propuesto existen opciones, la del rowid con la variable MAIN_SHOW_TECHNICAL_ID, aunque no se muestra en todos los listados.
El primer ejercicio de mostrar la fecha del pago, también esta disponible entendiendo que cuando se paga por completo una factura se cierra, por lo que la fecha de cierre que ya está en el listado podria valer aunque interpretando solo como el pago total, no serviria para pagos parciales.
De todas formas lo que busco es entender el funcionamiento del campo combinado.
Seguimos.
El primer ejercicio de mostrar la fecha del pago, también esta disponible entendiendo que cuando se paga por completo una factura se cierra, por lo que la fecha de cierre que ya está en el listado podria valer aunque interpretando solo como el pago total, no serviria para pagos parciales.
De todas formas lo que busco es entender el funcionamiento del campo combinado.
Seguimos.
Una vez entendido lo de los ternarios, lo siguiente es entender los objetos globales: $db, $conf, $langs, $mysoc, $user, $object, y para eso hay que ver mucho código. Además advierten que no están disponibles todas las propiedades de $object, pero proponen esta formula para obtener una propiedad no cargada:
(($reloadedobj = new Task($db)) && ($reloadedobj->fetch($object->id) > 0) && ($secondloadedobj = new Project($db)) && ($secondloadedobj->fetch($reloadedobj->fk_project) > 0))? $secondloadedobj->ref : 'Proyecto principal no encontrado'
Donde si lo desgranamos, el operando1 seria:
(($reloadedobj = new Task($db)) && ($reloadedobj->fetch($object->id) > 0) && ($secondloadedobj = new Project($db)) && ($secondloadedobj->fetch($reloadedobj->fk_project) > 0))
Analizando el operando1, tendriamos, dos partes claras, en esta primera, se selecciona la clase Task por el id si es mayor de cero,
(($reloadedobj = new Task($db)) && ($reloadedobj->fetch($object->id) > 0)
en la segunda parte se obtiene de la clase principal Project relacionandola con la clase Task por su clave foranea si es mayor de cero.
($secondloadedobj = new Project($db)) && ($secondloadedobj->fetch($reloadedobj->fk_project) > 0))
Si es verdadero obtendremos el operando2 , la referencia del Proyecto,
$secondloadedobj->ref
Si es falso el operando3, el texto,
'Proyecto principal no encontrado'
---------------
Seguimos
(($reloadedobj = new Task($db)) && ($reloadedobj->fetch($object->id) > 0) && ($secondloadedobj = new Project($db)) && ($secondloadedobj->fetch($reloadedobj->fk_project) > 0))? $secondloadedobj->ref : 'Proyecto principal no encontrado'
Donde si lo desgranamos, el operando1 seria:
(($reloadedobj = new Task($db)) && ($reloadedobj->fetch($object->id) > 0) && ($secondloadedobj = new Project($db)) && ($secondloadedobj->fetch($reloadedobj->fk_project) > 0))
Analizando el operando1, tendriamos, dos partes claras, en esta primera, se selecciona la clase Task por el id si es mayor de cero,
(($reloadedobj = new Task($db)) && ($reloadedobj->fetch($object->id) > 0)
en la segunda parte se obtiene de la clase principal Project relacionandola con la clase Task por su clave foranea si es mayor de cero.
($secondloadedobj = new Project($db)) && ($secondloadedobj->fetch($reloadedobj->fk_project) > 0))
Si es verdadero obtendremos el operando2 , la referencia del Proyecto,
$secondloadedobj->ref
Si es falso el operando3, el texto,
'Proyecto principal no encontrado'
---------------
Seguimos
Hola Apolo,
Conseguistes lo que te proponías?? Lo que estoy intentando yo es lo siguiente. Al generar un contrato, añado un campo extra de tipo objeto adjunto de esta manera:
hasta aquí bien, pero ahora lo que necesito es un campo adicional 'calculado' que me muestre la descripción del artículo... y aquí estoy atascado
Conseguistes lo que te proponías?? Lo que estoy intentando yo es lo siguiente. Al generar un contrato, añado un campo extra de tipo objeto adjunto de esta manera:
que es el número de serie de un artículo.Productlot:product/stock/class/productlot_class.php
hasta aquí bien, pero ahora lo que necesito es un campo adicional 'calculado' que me muestre la descripción del artículo... y aquí estoy atascado