Calcoli numerici¶
Per fare calcoli (es. moltiplicare un prezzo per due) si legge il valore con ValueEx e lo si converte in double con CultureInfo.InvariantCulture, garantendo un parsing corretto indipendentemente dal locale dell'utente.
Esempio base¶
using System.Globalization;
// Leggo il valore come stringa invariante
string prezzoStr = oForm.DataSources.UserDataSources.Item("UnitPrice").ValueEx;
// Converto in double
double prezzo = double.Parse(prezzoStr, CultureInfo.InvariantCulture);
// Calcolo
double prezzoRaddoppiato = prezzo * 2;
// Riscrivo il risultato nel DataSource (di nuovo in formato invariante!)
oForm.DataSources.UserDataSources.Item("UnitPrice").ValueEx =
prezzoRaddoppiato.ToString(CultureInfo.InvariantCulture);
Attenzione al formato quando si riscrive¶
Se il numero ha molti decimali (es. 2.333333333), SAP potrebbe troncarlo o l'utente vedere qualcosa di strano. Conviene arrotondare secondo i decimali configurati per i prezzi:
double prezzoRaddoppiato = Math.Round(prezzo * 2, 2); // 2 decimali, adattare secondo necessità
oForm.DataSources.UserDataSources.Item("UnitPrice").ValueEx =
prezzoRaddoppiato.ToString(CultureInfo.InvariantCulture);
Se il DataSource è collegato a un controllo (es. EditText)¶
Dopo aver aggiornato il ValueEx del DataSource, se si vuole che il controllo a schermo si aggiorni visivamente, spesso basta il databinding automatico — ma in alcuni casi (soprattutto in Matrix) occorre forzare un refresh:
Perché senza CultureInfo si "perde la virgola"¶
Se si scrive:
.ToString() usa di default la cultura del thread corrente (CultureInfo.CurrentCulture), che sull'ambiente italiano è it-IT. In italiano il separatore decimale è la virgola, quindi si ottiene "1234,56".
Il problema: quel valore viene poi scritto in ValueEx, che si aspetta sempre il punto come separatore (formato invariante). SAP legge "1234,56" come se fosse un numero con la virgola come separatore delle migliaia (o lo interpreta male), e la parte decimale viene "persa" o spostata.
La regola¶
- Leggi da
ValueEx→ stringa con il punto → parsi conCultureInfo.InvariantCulture - Scrivi su
ValueEx→ devi produrre una stringa con il punto → quindi sempre passareCultureInfo.InvariantCultureanche inToString()
// SBAGLIATO — usa la cultura del thread (virgola in IT)
oForm.DataSources.UserDataSources.Item("UnitPrice").ValueEx = risultato.ToString();
// CORRETTO — forza il punto
oForm.DataSources.UserDataSources.Item("UnitPrice").ValueEx =
risultato.ToString(CultureInfo.InvariantCulture);
Regola d'oro
Ogni volta che si legge o scrive su ValueEx, mettere sempre esplicitamente CultureInfo.InvariantCulture sia in Parse/TryParse che in ToString(). Non fidarsi mai della cultura di default.