21/01/2025 - By65Franco ha scritto:
non ho capito bene se devi lavorare o no con le linee guida
Ciao By65Franco, non ho nessuna linea guida. Tutta roba interna mia, per fortuna. Posso spaziare come meglio credo con la creatività.
21/01/2025 - Alka ha scritto:
stai gestendo un intero lungo, ma in fase di rappresentazione sottoforma di testo - quindi in visualizzazione - lo stai convertendo per rappresentarlo in una forma più corta.
Ciao Alka, esattamente. Purtroppo quando distribuivano la sintesi ero distratto. XD Le elucubrazioni nascono dalla ricerca del modo "giusto", ammesso ne esista in assoluto uno, di uniformare questa conversione da numero intero a testo e viceversa. L'istinto mi ha portato a scrivere una classe, per poi rendermi conto che probabilmente non era scelta più corretta visto che io voglio rappresentare un "dato semplice" e non un oggetto complesso. Ho virato quindi verso l'uso della struct e l'ho abbozzata così:
public struct Base36 : IEquatable<Base36>, IComparable<Base36>
{
private static readonly char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
private long _value;
public Base36(long value) { _value = value; }
public Base36(string value) { _value = ToLong(value); }
public static long ToLong(string base36Number)
{
bool isNegative = base36Number.ElementAt(0) == '-';
if (isNegative)
base36Number = base36Number.Substring(1);
long res = 0;
for (int i = base36Number.Length-1; i >= 0; i--)
{
res += Array.IndexOf(chars, base36Number.ElementAt(i)) * (long)Math.Pow(36, base36Number.Length - 1 - i);
}
if (isNegative)
res *= -1;
return res;
}
public static string ToBase36String(long value)
{
bool isNegative = false;
if (value < 0)
{
isNegative = true;
value = Math.Abs(value);
}
var res = new StringBuilder();
while (value != 0)
{
value = Math.DivRem(value, 36L, out long reminder);
res.Append(chars[reminder]);
}
if (isNegative)
res.Append('-');
var temp = res.ToString().ToCharArray();
Array.Reverse(temp);
return new string(temp);
}
public override string ToString()
{
return ToBase36String(_value);
}
bool IEquatable<Base36>.Equals(Base36 other)
{
return _value == other._value;
}
public override bool Equals(object obj)
{
return obj is Base36 b &&
_value == b._value;
}
public override int GetHashCode()
{
return -1939223833 + _value.GetHashCode();
}
int IComparable<Base36>.CompareTo(Base36 other)
{
return _value.CompareTo(other._value);
}
public static Base36 operator +(Base36 value1, Base36 value2)
{
return new Base36(value1._value + value2._value);
}
public static Base36 operator -(Base36 value1, Base36 value2)
{
return new Base36(value1._value - value2._value);
}
public static Base36 operator *(Base36 value1, Base36 value2)
{
return new Base36(value1._value * value2._value);
}
public static bool operator == (Base36 value1, Base36 value2)
{
return value1._value == value2._value;
}
public static bool operator !=(Base36 value1, Base36 value2)
{
return value1._value != value2._value;
}
public static bool operator >(Base36 value1, Base36 value2)
{
return value1._value > value2._value;
}
public static bool operator <(Base36 value1, Base36 value2)
{
return value1._value < value2._value;
}
public static bool operator >=(Base36 value1, Base36 value2)
{
return value1._value >= value2._value;
}
public static bool operator <=(Base36 value1, Base36 value2)
{
return value1._value <= value2._value;
}
}
Arrivato a questo punto, mi sono reso conto che ho sprecato caratteri: tutto quello sproloquio è un long a tutti gli effetti, solo che fa meno cose. E li m'è venuto il dubbio: ma mi serve davvero un struct/class che sia? Dopo che l'ho vista scritta, mi son detto di no. E allora ho pensato agli extension method. A me, al minimo, serve trovare il max in una lista che arriva da DB ed incrementarlo, quindi cose che con un long si fanno facilmente. Però ridurre tutto a
var lotto = (Base36)sqlDataReader.GetString(0);
lotto++;
//... bla ...
lotto.ToString();
mi affascina.
21/01/2025 - oregon ha scritto:
Tu devi memorizzare sul DB e nel codice un dato intero a 32 o 64 bit, quello che vuoi.
Ciao oregon, qui nasce la mia fregatura. La colonna del DB è un varchar(20). Il fatto che ad oggi io abbia usato un numero è fondamentalmente un caso. M'è venuto naturale, diciamo. Ho il vincolo di unicità sulla coppia di colonne [codice articolo] e [codice lotto] quindi non possono essere inseriti due codici articolo con lo stesso lotto, ma non ho limiti a quanti articoli hanno lo stesso lotto. Con la logica della progressione numerica tutti gli articoli avranno codice di lotto "1", "2", ..., "n" e questa cosa mi crea problemi in fase di scarico dei materiali perché i codici di lotto vengono scambiati tra gli articoli ed il gestionale non intercetta l'errore. Invece che complicare le procedure ai dipendenti, volevo escogitare un qualcosa che, a parità di flusso di lavoro, minimizzasse l'errore umano facendo in modo che ad ogni codice di lotto corrisponda un solo codice articolo. IN questo caso, qualora il codice di lotto non fosse presente, il gestionale blocca l'inserimento del dato ed io ho intercettato l'errore. Io nel DB salverò sempre una stringa, ma nel codice vorrei gestirlo come un numero. È questo fatto che mi crea confusione.
Spero di aver risposto alle vostre domande, ma come vedete l'inferno che ho in testa urla abbastanza.