Berechnetes Feld

Hallo zusammen

Ich möchte, wenn bei einem Ergänzenden Attribut auf dem Produkt der Haken gesetzt ist, soll es den Selbstkostenpreis * 0.82 rechnen und das Ergebnis in dem Ergänzenden Attribut anzeigen.

Ich danke euch für eure Hilfe

Hallo,
nur mit einem „Ergänzende Attribute“ (EA) wird das nicht funktionieren.
Da braucht man imho 2 davon.
Das 1. „EA“ definierst Du als Typ „boolean“ und das 2. „EA“ als „berechnetes Feld“ mit der entsprechenden DB-Abfrage auf das 1. „EA“ und den Preis aus der DB (llx_product_pmp) mit anschließender Rechnung.

Hallo DG-rilling
Vielen Dank für deine Antwort.
Das ich 2 EAs benötige war mir schon klar, leider komme ich mit dem Syntax für die DB-Abfrage nicht zurecht.
Könntest du mir helfen?
Wie muss ich die Abfrage genau im berechneten Feld eingeben damit er mir die Rechnung erstellt?
Das Boolean Feld heisst „Punkte“
Die Funktion müsste wie folgt sein: Wenn Punkte gesetzt dann rechne und zeige an „Selbstkostenpreis * 0.82“.
Vielen Dank

Hallo,

ja die Syntax ist tricky.
Musste damals auch ne Weile probieren bis das Ergebnis (fast) passte.

Der Typ des Feldes ist sinnvollerweise „Preis (Feld mit angehängtem Währungszeichen)“.
Das berechnete Feld sieht so aus:

(($result = $db->query('select pe.internal as punkte, p.pmp as pmp from llx_product_extrafields pe 
LEFT JOIN llx_product p ON pe.fk_object = p.rowid WHERE pe.fk_object = '.$object->id.' AND pe.internal = 1')) && ($row = $db->fetch_object($result))) ? round($row->pmp*0.82,2) : ''

Ein Problem besteht allerdings noch (das konnte ich leider bisher nicht lösen :frowning: )
Der Wert für das berechnete Feld wird nach dem Ändern des Steuerfeldes „punkte“ nicht sofort aktualisiert, sondern erst beim erneuten Laden des Produktes.

Hallo DG-rilling

Wenn ich die Funktion hinzufüge und dann auf dem Produkt etwas anpasse kommt immer folgender Wert: Attribut Active Points hat einen falschen Wert.
Das Attribut mit dem Berechnungsfeld heisst „Active Points“

Schau mal den den Typ des Attributes in mySQL an, „llx_product_extrafields Column calc“ ist bei mir „double(24,8)“

Wie sieht das im Setup aus?
Hier sieht das so aus:


Wobei mein Attribut „calc“ heisst.

Achso, welche Dolibarr Version ist installiert?

Der Typ des Attributes „punkte“ im mySQL auf der Tabelle „doli_product_extrafields“ ist „double(4,2)“

Ich habe deinen Code mal versucht auf meine Umgebung anzupassen.
Kannst du mich korrigieren, wenn ich einen Denkfehler darin habe?

(($result = $db->query('select pe.punkte as punkte, p.cost_price as cost_price from doli_product_extrafields pe 
LEFT JOIN doli_product p ON pe.fk_object = p.rowid WHERE pe.fk_object = '.$object->id.' AND punkte = 1')) && ($row = $db->fetch_object($result))) ? round($row->cost_price*0.82,2) : ''

Ich habe Dolibarr 18.0.0 installiert.

Sieht eigentlich so aus wie bei mir.

Eine Abweichung ist „AND punkte =“ da schreibe ich immer noch den alias davor, also in diesem Fall: „AND pe.punkte =“ ansonsten bekommt man eine Fehlermeldung über nicht eindeutige Zuordnung, wenn es in den Tabellen mehrere Columns namens „punkte“ gibt.

Man kann die Query auch per phpmyadmin o.ä. in mySQL ausführen

select 
  pe.punkte as punkte, 
  p.cost_price as cost_price 
from doli_product_extrafields pe 
LEFT JOIN doli_product p ON pe.fk_object = p.rowid 
where pe.fk_object = '59199' AND pe.punkte = 1

Ersetze dabei „59199“ durch deine Produkt-ID.
Dann müsste z.B. sowas angezeigt werden:

image

Ich verwende Version 17.0.2

Wenn ich die Abfrage bei mir mache, bekomme ich auch die Werte die ich möchte.

Aber beim berechneten Feld kommt immer noch der Fehler.

Ok, habe das mal in Version 18.x versucht und ich bekomme dann den gleichen Fehler :frowning:
Debug-Output ist:

String(350) "Bad string syntax to evaluate (dot char is forbidden): (($result = $db->query('select pe.punkte as punkte, p.cost_price as cost_price from llx_product_extrafields pe LEFT JOIN llx_product p ON pe.fk_object = p.rowid WHERE pe.fk_object = '.$object->id.' AND punkte = 1')) && ($row = $db->fetch_object($result))) ? round($row->cost_price*0.82,2) : ''" 

Problem ist das die Syntaxüberprüfung in der Funktion dol_eval in der Datei htdocs/core/lib/functions.lib.php keine „.“ zwischen chars erlaubt.

if (preg_match('/[^0-9]+\.[^0-9]+/', $s)) {	// We refuse . if not between 2 numbers

Man könnte nun die Syntaxüberprüfung modifizieren, was aber evtl. sicherheitstechnisch nicht empfehlenswert ist.
Besser wäre imho den entsprechenden Aufruf bzw. dem 4. Paramter von dol_eval(…) zu modifizieren

$this->array_options['options_' . $key] = dol_eval($extrafields->attributes[$this->table_element]['computed'][$key], 1, 0, 3);

und dann in dol_eval() die obige Syntaxüberprüfung nur für diesen Aufruf zu deaktivieren

if (preg_match('/[(a-z]+\.[)a-z]+/', $s) && $onlysimplestring != '3') {	// We refuse . if not between 2 numbers

Aber ich denke das ganze ist ein Fall für einen Bug-Report…