Ricerche formattate in SAP Business One (FMS): sintassi $[$38.1.0], 7 esempi pratici e aggiornamento automatico

By Zain Abbas, Kodenova · Updated

Short answerUna ricerca formattata (FMS) è una query salvata collegata a un campo di SAP Business One, che compila il campo o mostra un elenco di selezione. Nella query si leggono i valori della maschera aperta con $[$Item.Column.Type] (item, colonna, tipo), ad esempio $[$38.1.0] per il codice articolo su una riga del documento. Si assegna con Alt+Shift+F2 e lei sceglie se eseguirla su richiesta, quando cambia un altro campo o sempre.

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.

FormaEsempioQuando 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 e 4 è il codice cliente o fornitore.
  • Column è la colonna della matrice. Usi 0 per i campi di testata.
  • Type determina come viene restituito il valore:
    • 0 restituisce il valore così com’è. Lo usi per codici, testo e numeri di documento.
    • NUMBER restituisce un numero senza valuta o unità. Lo usi per i calcoli.
    • CURRENCY restituisce solo il simbolo della valuta o l’unità di misura.
    • DATE restituisce 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

VariabileChe 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

  1. In SAP Business One apra Visualizza > Informazioni di sistema.
  2. Apra la maschera e passi il mouse sul campo.
  3. 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

  1. Salvi la query nel Query Manager, idealmente in una categoria chiamata “FMS”.
  2. Apra la maschera di destinazione e faccia clic nel campo.
  3. Prema Alt+Shift+F2. Si apre la finestra della ricerca formattata.
  4. Scelga Search in Existing User-Defined Values according to Saved Query e selezioni la sua query.
  5. 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.
  6. 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 SELECT senza tabella richiede FROM DUMMY.
  • Sostituisca le funzioni SQL Server: GETDATE() diventa CURRENT_DATE, ISNULL diventa IFNULL.

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

SintomoCausa abitualeSoluzione
Internal error (-1003) occurred quando la ricerca viene eseguitaL’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 risolveEsegua 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 HANANomi di colonna con maiuscole e minuscole senza virgolette, o una SELECT senza tabellaMetta i nomi di tabelle e colonne tra virgolette doppie e aggiunga FROM DUMMY. Veda Differenze in HANA.
Un campo definito dall’utente non viene trovatoIl 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 attivazioneAuto Refresh When Field Changes è disattivato o punta al campo sbagliatoSpunti 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 sbagliataDisplay 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. Eviti LIKE '%x%' e funzioni sulle colonne nella clausola WHERE.
  • 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

Related services

FAQ

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.