Ricerche formattate in SAP Business One (FMS): sintassi $[$38.1.0], 7 esempi pratici e aggiornamento automatico
By Zain Abbas, Kodenova · Updated
Che cos’è una ricerca formattata
Una ricerca formattata, di solito chiamata FMS, è una query salvata collegata a un campo di una maschera. Quando viene eseguita, SAP Business One scrive il risultato nel campo oppure mostra un elenco da cui l’utente sceglie.
Gli utenti le apprezzano perché eliminano la digitazione. Gli sviluppatori perché non serve alcun add-on. Può compilare un UDF di riga con il nome estero dell’articolo, mostrare la giacenza nel magazzino della riga o offrire un menu a tendina da una tabella definita dall’utente.
Se vuole evitare il lavoro sulla sintassi, il nostro creatore di ricerche formattate scrive la query per lei.
La sintassi
Ci sono due modi per leggere i valori dalla maschera aperta.
| Forma | Esempio | Quando usarla |
|---|---|---|
$[$Item.Column.Type] | $[$38.1.0] | Legge il campo in base alla sua posizione nella maschera. Funziona su documenti simili. |
$[TABLE.Field] | $[OINV.CardCode] | Legge per nome di tabella e campo. Funziona solo sulle maschere basate su quella tabella. |
Nella prima forma:
- Item è l’indice dell’item della maschera. Nei documenti di vendita e acquisto,
38è la matrice delle righe e4è il codice cliente o fornitore. - Column è la colonna della matrice. Usi
0per i campi di testata. - Type determina come viene restituito il valore:
0restituisce il valore così com’è. Lo usi per codici, testo e numeri di documento.NUMBERrestituisce un numero senza valuta o unità. Lo usi per i calcoli.CURRENCYrestituisce solo il simbolo della valuta o l’unità di misura.DATErestituisce una data a cui può aggiungere giorni.
La guida di SAP consiglia la forma con indice, perché $[$4.0.0] funziona su qualsiasi documento di marketing, mentre $[OINV.CardCode] funziona solo sulle fatture clienti.
I campi definiti dall’utente usano il proprio nome come colonna: $[$38.U_Discount.NUMBER].
Non vuole cercare a mano gli ID di item e colonna? Il creatore di ricerche formattate scrive la variabile per il campo che sceglie.
Riferimento rapido
| Variabile | Che cosa restituisce |
|---|---|
$[$38.1.0] | Codice articolo della riga corrente: l’item 38 è la matrice delle righe, la colonna 1 il numero articolo e 0 indica che il campo contiene un solo valore. |
$[$38.17.NUMBER] | Il numero di un campo prezzo o totale senza simbolo di valuta, pronto per i calcoli. |
$[$38.17.CURRENCY] | Solo il simbolo della valuta (o l’unità di misura) di quel campo. |
$[$10.0.DATE] | Una data di testata utilizzabile nei calcoli, ad esempio $[$10.0.DATE] + 20. I campi di testata usano la colonna 0. |
$[$4.0.0] | Il codice cliente o fornitore su qualsiasi documento di vendita o acquisto. |
$[ORDR.CardCode], $[RDR1.ItemCode] | Nome di tabella e campo. Funziona solo nella finestra basata su quella tabella (qui l’ordine cliente). |
$[$38.U_Discount.NUMBER] | Un campo di riga definito dall’utente: scriva sempre il prefisso U_, altrimenti SAP B1 restituisce l’errore -1003. |
I numeri di item e colonna possono variare tra versioni e maschere. Li verifichi con Visualizza → Informazioni di sistema prima di fare affidamento su un numero.
Come trovare gli ID di item e colonna
- In SAP Business One apra Visualizza > Informazioni di sistema.
- Apra la maschera e passi il mouse sul campo.
- Legga la barra di stato in basso. Mostra l’item, la colonna e, per i campi del database, il nome della tabella e del campo.
Verifichi ogni ID sulla sua versione e sulla sua maschera. I numeri di colonna possono variare tra tipi di documento e localizzazioni. Il nostro riferimento tabelle SAP B1 aiuta con i nomi di tabelle e campi.
Come assegnare una ricerca formattata
- Salvi la query nel Query Manager, idealmente in una categoria chiamata “FMS”.
- Apra la maschera di destinazione e faccia clic nel campo.
- Prema Alt+Shift+F2. Si apre la finestra della ricerca formattata.
- Scelga Search in Existing User-Defined Values according to Saved Query e selezioni la sua query.
- Decida quando eseguirla:
- Nessun aggiornamento automatico: l’utente preme Shift+F2 o fa clic sulla lente.
- Auto Refresh When Field Changes: scelga il campo di attivazione, ad esempio il codice articolo. La query viene eseguita quando l’utente esce da quel campo.
- Display Saved Values: mantiene il valore salvato sul documento invece di rieseguire la query ogni volta che il documento viene aperto.
- Faccia clic su Aggiorna e provi su un nuovo documento.
La guida di SAP elenca anche un’opzione “Refresh Regularly”. Avverte di usarla con parsimonia, perché può rallentare le maschere e modificare i documenti salvati quando vengono consultati.
7 esempi pratici
Tutti gli esempi usano la sintassi SQL Server. Le note per HANA seguono più avanti.
1. Campo articolo su una riga. Nome estero dell’articolo della riga in un UDF di riga (tabella OITM).
SELECT T0.FrgnName
FROM OITM T0
WHERE T0.ItemCode = $[$38.1.0]
2. Campo del partner commerciale in testata. Fido disponibile per il cliente selezionato (tabella OCRD).
SELECT T0.CreditLine - T0.Balance
FROM OCRD T0
WHERE T0.CardCode = $[$4.0.0]
3. Giacenza nel magazzino della riga. In molte maschere di documento la colonna 24 è il magazzino. Lo confermi con Informazioni di sistema. La giacenza per magazzino si trova in OITW.
SELECT T0.OnHand
FROM OITW T0
WHERE T0.ItemCode = $[$38.1.0]
AND T0.WhsCode = $[$38.24.0]
4. Ultimo prezzo di vendita a questo cliente. Utile come controllo accanto alla colonna del prezzo (fatture clienti in OINV).
SELECT TOP 1 T1.Price
FROM OINV T0
INNER JOIN INV1 T1 ON T0.DocEntry = T1.DocEntry
WHERE T0.CardCode = $[$4.0.0]
AND T1.ItemCode = $[$38.1.0]
AND T0.CANCELED = 'N'
ORDER BY T0.DocDate DESC, T0.DocEntry DESC
5. Peso della riga. Peso di vendita per unità moltiplicato per la quantità della riga (colonna 11).
SELECT T0.SWeight1 * $[$38.11.NUMBER]
FROM OITM T0
WHERE T0.ItemCode = $[$38.1.0]
6. Menu a tendina da una tabella definita dall’utente. Restituire due colonne offre all’utente un elenco da cui scegliere.
SELECT T0.Code, T0.Name
FROM [@REGIONS] T0
ORDER BY T0.Name
7. Data odierna. Compila un UDF data alla creazione del documento.
SELECT GETDATE()
Differenze in HANA
Su SAP Business One per HANA la logica resta la stessa, ma l’SQL cambia:
- Metta i nomi di tabelle e colonne tra virgolette doppie:
T0."ItemCode","@REGIONS". - Anche i nomi degli UDF nella variabile richiedono le virgolette:
$[$38."U_Discount".NUMBER]. - Una
SELECTsenza tabella richiedeFROM DUMMY. - Sostituisca le funzioni SQL Server:
GETDATE()diventaCURRENT_DATE,ISNULLdiventaIFNULL.
Esempio 7 su HANA:
SELECT CURRENT_DATE FROM DUMMY
Esempio 1 su HANA:
SELECT T0."FrgnName"
FROM OITM T0
WHERE T0."ItemCode" = $[$38.1.0]
Se deve migrare molte query, le incolli nel nostro convertitore da SQL a HANA e poi le provi una per una.
Errori comuni delle ricerche formattate e come correggerli
| Sintomo | Causa abituale | Soluzione |
|---|---|---|
| Internal error (-1003) occurred quando la ricerca viene eseguita | L’SQL è fallito quando SAP Business One lo ha eseguito: un errore di sintassi, una parentesi mancante o un riferimento a un campo che non si risolve | Esegua la query nel Query Manager, oppure l’SQL tradotto in SQL Server Management Studio, e corregga l’errore indicato. Poi verifichi ogni riferimento $[...] con Visualizza > Informazioni di sistema. |
| La query funziona su SQL Server ma fallisce su HANA | Nomi di colonna con maiuscole e minuscole senza virgolette, o una SELECT senza tabella | Metta i nomi di tabelle e colonne tra virgolette doppie e aggiunga FROM DUMMY. Veda Differenze in HANA. |
| Un campo definito dall’utente non viene trovato | Il campo è stato scritto senza il prefisso U_ | Scriva sempre il nome completo, ad esempio $[$38.U_Discount.NUMBER]. |
| Il valore non cambia quando cambia il campo di attivazione | Auto Refresh When Field Changes è disattivato o punta al campo sbagliato | Spunti Auto Refresh e scelga il campo che deve attivare la query. Senza, la query viene eseguita solo con Shift+F2. |
| Il valore viene ricalcolato quando riapre un vecchio documento, oppure non si aggiorna mai | È stata scelta l’opzione di aggiornamento sbagliata | Display Saved Values mostra ciò che è stato salvato con il documento. Refresh Regularly riesegue la query ogni volta che si consulta il documento, e SAP avverte che può rallentare i documenti e modificare valori che non intendeva cambiare. |
Inoltre Auto Refresh non ha effetto sui campi che non si possono più modificare, come il numero articolo su una consegna già esistente.
Consigli sulle prestazioni
- Le ricerche a livello di riga si moltiplicano. Una ricerca che si aggiorna automaticamente sul codice articolo viene eseguita una volta per riga. Su un ordine di 200 righe sono 200 query. Ne aggiunga tre di questo tipo e gli utenti lo noteranno.
- Filtri sulle chiavi. Interroghi per
ItemCode,CardCode,DocEntry. EvitiLIKE '%x%'e funzioni sulle colonne nella clausolaWHERE. - Eviti join pesanti sulle tabelle dei documenti. L’esempio 4 scorre lo storico delle fatture: va bene per qualche centinaio di migliaia di righe, è lento con milioni. Valuti un indice o una tabella di riepilogo.
- Preferisca l’esecuzione su richiesta per le esigenze rare. Se agli utenti un valore serve solo ogni tanto, lasci disattivato l’aggiornamento automatico e faccia premere Shift+F2.
- Usi Display Saved Values per tutto ciò che non deve cambiare dopo il salvataggio del documento.
Quando usare qualcos’altro
Una ricerca formattata compila campi, non impone regole. Un utente può sovrascrivere il valore, e le importazioni tramite DI API o Service Layer non la eseguono.
- Usi la stored procedure di transaction notification (
SBO_SP_TransactionNotification) quando una regola deve valere sempre, ad esempio “nessuna fattura senza centro di costo” o “il prezzo non può essere inferiore al costo”. Blocca il salvataggio, qualunque sia l’origine. - Usi un add-on quando servono nuove schermate, pulsanti, chiamate ad API esterne o logiche che dipendono da molti campi contemporaneamente.
- Mantenga le FMS per valori predefiniti, ricerche ed elenchi di selezione che aiutano l’utente a digitare meno.
Le ricerche formattate compilano i campi mentre si digita; per la reportistica sugli stessi dati, veda come costruire una dashboard SAP Business One senza Power BI.
Pronto a crearne una? Apra il creatore di ricerche formattate, scelga maschera e campo e copi la query. Se i suoi documenti sono lenti o le servono regole che le FMS non possono imporre, ci contatti e analizzeremo la sua configurazione.
Sources
- SAP: How to Define and Use Formatted Search (guida pratica di SAP Business One, PDF)
- SAP: How to Define and Use Formatted Searches (ospitato da Vision33)
- SAP Community: Formatted search to calculate discount on SAP B1 HANA (ricerca formattata per calcolare uno sconto in SAP B1 HANA)
- SAP Community: Internal error (-1003) occurred [Message 131-183] durante l'esecuzione di una ricerca formattata
- Packt: Working with User-Defined Values in SAP Business One (lavorare con i valori definiti dall'utente)
Related services
Frequently asked questions
Che cosa significa $[$38.1.0] in SAP Business One?
Legge un valore dalla maschera aperta. 38 è l'indice dell'item della matrice delle righe del documento, 1 è la colonna (N. articolo) e 0 è il tipo, che restituisce il valore così com'è. Quindi $[$38.1.0] è il codice articolo della riga corrente.
Che differenza c'è tra 0, NUMBER e DATE in una ricerca formattata?
0 restituisce il valore del campo così com'è, adatto a codici e testo. NUMBER restituisce un valore numerico senza valuta o unità, così può usarlo nei calcoli. DATE restituisce una data utilizzabile nei calcoli con le date.
Come si trovano il numero di item e di colonna di un campo?
Attivi Visualizza > Informazioni di sistema, poi passi il mouse sul campo. La barra di stato mostra il numero di item, la colonna e, per i campi del database, il nome della tabella e del campo.
Le ricerche formattate funzionano su SAP Business One per HANA?
Sì, ma l'SQL deve rispettare le regole di HANA. Metta i nomi di tabelle e colonne tra virgolette doppie, usi FROM DUMMY quando seleziona un valore senza tabella e sostituisca le funzioni SQL Server come GETDATE() con quelle HANA come CURRENT_DATE.
Perché la mia ricerca formattata dà Internal error (-1003)?
In pratica significa che l'SQL è fallito quando SAP Business One lo ha eseguito: un errore di sintassi, un riferimento a un campo errato o un campo definito dall'utente scritto senza U_. Esegua la stessa query nel Query Manager, oppure l'SQL tradotto in SQL Server Management Studio, legga l'errore reale e lo corregga lì. Poi verifichi ogni riferimento $[...] con Visualizza > Informazioni di sistema.
Perché i miei documenti sono lenti dopo aver aggiunto ricerche formattate?
Ogni ricerca formattata esegue una query. Una che si aggiorna automaticamente su ogni riga, o è impostata per aggiornarsi regolarmente, viene eseguita molte volte per documento. Mantenga poche ricerche a livello di riga, adatte agli indici e, dove possibile, su richiesta.
Iniziamo?
Ci descriva di cosa ha bisogno. Riceverà una risposta tecnica chiara, un perimetro definito e un prezzo, di norma entro 24 ore.
