Scrivo solo ora, perché non ho avuto il tempo di organizzare bene le cose. Ho risolto il mio problema con le query personalizzate, era dovuto in particolare al fatto che non avevo ben compreso la logica di programmazione di quelle porzioni di codice. Riporto qui un paio di esempi per quanti avessero necessità simili e quindi volessero trovare spunto:
il |select| è una "variabile" che usa openstamanager per dire "infilaci i campi che vengono scelti nell'interfaccia.
Quando si setta una query personalizzata, bisogna tenere cont che i campi vanno inseriti dall'interfaccia, e pertanto va lasciata tale "variabile"
Nei campi aggiuntivi ho messo i due che mi interessavano, ossia:
(IF (`ordrighe`.`prezzoacq` > 0, FORMAT(`ordrighe`.`prezzoacq`,2,'it_IT'), FORMAT(`mga`.`prezzo_acquisto`,2,'it_IT')))
impostandolo con nome PrzAcq , e poi
(IF ((`mga`.`prezzo_vendita` 0) AND (`mga`.`prezzo_vendita` >= (`ordrighe`.`prezzoacq`*1.17)),FORMAT(`mga`.`prezzo_vendita`,2,'it_IT'),(IF (`ordrighe`.`prezzoacq` > 0, FORMAT(`ordrighe`.`prezzoacq`*1.17,2,'it_IT'), FORMAT(`mga`.`prezzo_acquisto`*1.17,2,'it_IT')))))
impostandolo come 'PrzVnd17'
(IF ((`mga`.`prezzo_vendita` 0) AND (`mga`.`prezzo_vendita`*1.22 >= (`ordrighe`.`prezzoacq`*1.43)),FORMAT(`mga`.`prezzo_vendita`*1.22,2,'it_IT'),(IF (`ordrighe`.`prezzoacq` > 0, FORMAT(`ordrighe`.`prezzoacq`*1.43,2,'it_IT'), FORMAT(`mga`.`prezzo_acquisto`*1.43,2,'it_IT')))))
impostandolo come 'PrzFin22'
in tal modo OpenStaManager infila tali campi nella query, assieme agli altri, al posto della variabile |select|
Nel campo per la query personalizzata della vista modulo Articoli, ho settato questa query
SELECT
|select|
FROM `mg_articoli` AS mga
LEFT JOIN (
SELECT
`id` as `id1`,
`idarticolo`,
(`subtotale`/`qta`)-`sconto_unitario` AS `prezzoacq`
FROM `or_righe_ordini` AS `subq`
WHERE `id` = (
SELECT `tabRigheOrdini`.`id` FROM `or_righe_ordini` AS `tabRigheOrdini` LEFT JOIN `or_ordini` AS `tabOrdini` ON `tabOrdini`.`id` = `tabRigheOrdini`.`idordine` WHERE (`idarticolo` = `subq`.`idarticolo`) AND (`subtotale` 0) AND (`idtipoordine` = '1') ORDER BY `tabRigheOrdini`.`id` DESC LIMIT 1
)
ORDER BY `id`
) AS ordrighe
ON mga.id = ordrighe.idarticolo
WHERE 1=1 HAVING 2=2
ORDER BY `descrizione` ASC
Spiego celermente cosa fa il codice in questione, così da rendere l'idea: il Prezzo di Acquisto di un articolo viene estrapolato ricercando il prezzo più recente pagato in un ordine di acquisto per l'articolo dato
Per la parte dei prezzi di vendita, PrzVnd17 e PrzFin22 sono molto simili, il primo dei due include solo il ricarico standard (nel mio caso il 17%) e l'altro anche l'IVA 22 (appicata sul prezzo ricaricato).
Per comodità spiego il PrzVnd17
Le query confrontano due valori, e ne prelevano il maggiore:
1) prezzo di acquisto più recente di un articolo, moltiplicato per il ricarico standard
2) prezzo di vendita inserito in scheda articolo manualmente
In questo modo, posso sempre andare ad impostare un prezzo di vendita manuale, che verrà considerato al posto di quello effettivo. Ad esempio, alcuni articoli hanno tasse particolari, che non inserisco direttamente nel prezzo d'acquisto dell'articolo (ad esempio l'orribile balzello SIAE sui supporti di memoria), per questo potrebbe essere utile inserire manualmente un prezzo di vendita diverso.
Inoltre, la query preleva soltanto il valore più alto tra i due, in questo modo se io ho settato ad esempio 10€ per un prodotto, ma nel frattempo ne ordino ancora ai miei fornitori, ed il prezzo di acquisto è incrementato, mi segnala comunque un prezzo ricavato dall'ultimo di acquisto.
Mi auguro di essere stato chiaro e, magari, anche utile a qualcuno
Nel caso sentitevi liberi di interpellarmi