diff --git a/MP-TAB-SERV/Components/ControlsMan.razor b/MP-TAB-SERV/Components/ControlsMan.razor index 0243545f..87a6f55b 100644 --- a/MP-TAB-SERV/Components/ControlsMan.razor +++ b/MP-TAB-SERV/Components/ControlsMan.razor @@ -65,7 +65,7 @@ else - Elenco Controlli + Registro Controlli diff --git a/MP-TAB-SERV/Components/ScrapEditor.razor b/MP-TAB-SERV/Components/ScrapEditor.razor index b064ca35..12e7b232 100644 --- a/MP-TAB-SERV/Components/ScrapEditor.razor +++ b/MP-TAB-SERV/Components/ScrapEditor.razor @@ -12,28 +12,42 @@ @if (ShowDetail) { -
+
-
+
- Data Ora - + Num Pz + +
-
- +
+
+ Data Ora + + +
- - + +
- @if (CanSave) - { - - } +
+ @foreach (var item in ListComplete) + { +
+ + + + +
+ } +
diff --git a/MP-TAB-SERV/Components/ScrapEditor.razor.cs b/MP-TAB-SERV/Components/ScrapEditor.razor.cs index bf5f0bb8..87339eb4 100644 --- a/MP-TAB-SERV/Components/ScrapEditor.razor.cs +++ b/MP-TAB-SERV/Components/ScrapEditor.razor.cs @@ -1,25 +1,7 @@ -using global::System; -using global::System.Collections.Generic; -using global::System.Linq; -using global::System.Threading.Tasks; -using global::Microsoft.AspNetCore.Components; -using System.Net.Http; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Components.Authorization; -using Microsoft.AspNetCore.Components.Forms; -using Microsoft.AspNetCore.Components.Routing; -using Microsoft.AspNetCore.Components.Web; -using Microsoft.AspNetCore.Components.Web.Virtualization; -using Microsoft.JSInterop; -using MP_TAB_SERV; -using MP_TAB_SERV.Shared; -using MP_TAB_SERV.Components; +using global::Microsoft.AspNetCore.Components; using MP.Data; using MP.Data.DatabaseModels; -using MP.Data.DTO; using MP.Data.Services; -using Newtonsoft.Json; -using NLog; namespace MP_TAB_SERV.Components { @@ -27,41 +9,20 @@ namespace MP_TAB_SERV.Components { #region Public Properties - [Parameter] - public bool CanSave { get; set; } = false; - - [Parameter] - public EventCallback E_CommRec { get; set; } - - [Parameter] - public EventCallback E_DateSel { get; set; } - [Parameter] public EventCallback E_Updated { get; set; } [Parameter] public MappaStatoExpl? RecMSE { get; set; } = null; - protected string Title - { - get => ShowDetail? "Nascondi Registrazione Scarti": "Mostra Registrazione Scarti"; - } - [Parameter] - public EventListModel? CurrRecord - { - set - { - if (value != null) - { - DateSel = value.InizioStato ?? DateTime.Now; - UserComment = value.Value; - ShowDetail = false; - } - } - } - #endregion Public Properties + #region Protected Fields + + protected int dltMinRealtime = 1; + + #endregion Protected Fields + #region Protected Properties protected DateTime DateSel @@ -72,20 +33,38 @@ namespace MP_TAB_SERV.Components if (dateSel != value) { dateSel = value; - E_DateSel.InvokeAsync(value).ConfigureAwait(false); } } } + protected List ListComplete { get; set; } = new List(); + [Inject] protected MessageService MServ { get; set; } = null!; + protected int NumPz + { + get => numPz; + set + { + if (numPz != value) + { + numPz = value; + } + } + } + [Inject] protected SharedMemService SMServ { get; set; } = null!; [Inject] protected TabDataService TabServ { get; set; } = null!; + protected string Title + { + get => ShowDetail ? "Nascondi Registrazione Scarti" : "Mostra Registrazione Scarti"; + } + #endregion Protected Properties #region Protected Methods @@ -95,83 +74,46 @@ namespace MP_TAB_SERV.Components DoReset(); } - /// - /// Forza salvataggio impostando data-ora - /// - /// - /// - public async Task ForceSave(DateTime dtRif) + protected async Task doSave(vSelCauScartoModel currCau) { - DateSel = dtRif; - // ora salvo - await doSave(); - } - - protected async Task doSave() - { - // registro evento - EventListModel newRec = new EventListModel() + // registro scarto + RegistroScartiModel newRec = new RegistroScartiModel() { IdxMacchina = IdxMacc, - InizioStato = DateSel, - IdxTipo = idxTipoCommento, - CodArticolo = CodArt, - Value = UserComment, + DataOra = DateSel, + Causale = currCau.value, + Qta = NumPz, MatrOpr = MatrOpr, - pallet = "-" + Note=UserComment + }; - // elimino vecchio se c'è... - await TabServ.EvListDelete(IdxMacc, DateSel, idxTipoCommento); // inserisco - await TabServ.EvListInsert(newRec, MP.Data.Objects.Enums.tipoInputEvento.commento); + await TabServ.RegScartiInsert(newRec); + // reset DoReset(); //ToggleCtrl(); await E_Updated.InvokeAsync(true); } - protected override void OnInitialized() + protected override async Task OnInitializedAsync() { - idxTipoCommento = SMServ.GetConfInt("idxTipoCommento"); - dltMinRealtime = SMServ.GetConfInt("dltMinRealtime"); + await ReloadData(); } - protected override async Task OnAfterRenderAsync(bool firstRender) + protected async Task ReloadData() { - // verifico SE ci sia una data da usare... - bool hasDtRif = await MServ.SessHasVal(MessageService.KeyCommDtRif); - if (hasDtRif) - { - await Task.Delay(1); - ShowDetail = false; - UserComment = await MServ.CommentoValGet(true); - DateSel = await MServ.CommentoDtRifGet(true); - await InvokeAsync(StateHasChanged); - } + ListComplete = await TabServ.VSCS_getAll(); } - - protected int dltMinRealtime = 1; - /// - /// Determina se insert sia Realtime o batch con DataOra (in base a diff tra DataOra - /// selezionata e realtime, se superiore ad X minuti NON � realtime) - /// - protected bool insRealtime + protected void resetDate() { - get - { - bool answ = true; - try - { - if (Math.Abs(DateSel.Subtract(DateTime.Now).TotalMinutes) > dltMinRealtime) - { - answ = false; - } - } - catch - { } - return answ; - } + DateSel = DateTime.Now; + } + + protected void resetNumPz() + { + NumPz = 1; } protected void ToggleCtrl() @@ -185,12 +127,6 @@ namespace MP_TAB_SERV.Components #endregion Protected Methods - #region Private Fields - - private int idxTipoCommento = 0; - - #endregion Private Fields - #region Private Properties private string CodArt @@ -210,7 +146,10 @@ namespace MP_TAB_SERV.Components get => MServ.MatrOpr; } + private int numPz { get; set; } = 1; + private bool ShowDetail { get; set; } = true; + private string userComment { get; set; } = ""; private string UserComment @@ -221,7 +160,6 @@ namespace MP_TAB_SERV.Components if (userComment != value) { userComment = value; - E_CommRec.InvokeAsync(value).ConfigureAwait(false); } } } diff --git a/MP-TAB-SERV/Components/ScrapMan.razor b/MP-TAB-SERV/Components/ScrapMan.razor index 08297ecd..13a9346d 100644 --- a/MP-TAB-SERV/Components/ScrapMan.razor +++ b/MP-TAB-SERV/Components/ScrapMan.razor @@ -1,5 +1,4 @@  -
@@ -25,39 +24,7 @@ else
- - @if (showInsert) - { - @if (showNote) - { -
-
-
- @*
-
*@ - - -
-
-
- -
-
- } - else - { -
-
- -
-
- -
-
- } - } +
@@ -67,7 +34,7 @@ else - Elenco Controlli + Registro Scarti @@ -81,33 +48,27 @@ else
Art: @item.CodArticolo
-
- ODL: @($"ODL{item.IdxOdl:000000000}") +
+ @item.Descrizione
- @if (item.EsitoOk) - { - - } - else - { - - } + @item.Qta pz
- @($"{item.DataOra:ddd dd.MM.yy HH:mm:ss}") + @($"{item.DataOra:ddd dd.MM.yy HH:mm:ss}") +
@item.Operatore
-
+
@if (!string.IsNullOrEmpty(item.Note)) { -
@item.Note
+ Nota: @item.Note }
diff --git a/MP-TAB-SERV/Components/ScrapMan.razor.cs b/MP-TAB-SERV/Components/ScrapMan.razor.cs index 84c0e14c..a9c8c9f6 100644 --- a/MP-TAB-SERV/Components/ScrapMan.razor.cs +++ b/MP-TAB-SERV/Components/ScrapMan.razor.cs @@ -27,7 +27,7 @@ namespace MP_TAB_SERV.Components await Task.Delay(1); if (!string.IsNullOrEmpty(IdxMaccSel)) { - ListComplete = await TabDServ.RegControlliFilt(IdxMaccSel, IdxOdl, CurrPeriodo.Inizio, CurrPeriodo.Fine, false); + ListComplete = await TabDServ.RegScartiGetFilt(IdxMaccSel, IdxOdl, CurrPeriodo.Inizio, CurrPeriodo.Fine, false); TotalCount = ListComplete.Count; // esegue paginazione UpdateTable(); @@ -40,13 +40,10 @@ namespace MP_TAB_SERV.Components #region Protected Properties - protected string ConfTitle - { - get => showInsert ? "Nascondi Controllo" : "Registra Controllo"; - } + - protected List ListComplete { get; set; } = new List(); - protected List ListPaged { get; set; } = new List(); + protected List ListComplete { get; set; } = new List(); + protected List ListPaged { get; set; } = new List(); [Inject] protected MessageService MServ { get; set; } = null!; @@ -69,15 +66,7 @@ namespace MP_TAB_SERV.Components } } - protected async Task SaveKo() - { - isProcessing = true; - await TabDServ.RegControlliInsert(IdxMaccSel, MServ.MatrOpr, false, noteKo, DateTime.Now); - showInsert = false; - showNote = false; - await doUpdate(); - isProcessing = false; - } + protected void SaveNumRec(int newNum) { @@ -85,15 +74,7 @@ namespace MP_TAB_SERV.Components UpdateTable(); } - protected async Task SaveOk() - { - isProcessing = true; - await TabDServ.RegControlliInsert(IdxMaccSel, MServ.MatrOpr, true, noteKo, DateTime.Now); - showInsert = false; - showNote = false; - await doUpdate(); - isProcessing = false; - } + protected void SavePage(int newNum) { @@ -127,20 +108,7 @@ namespace MP_TAB_SERV.Components await doUpdate(); } - protected void ShowKo() - { - showNote = true; - } - - protected void ToggleBtn() - { - showInsert = !showInsert; - if (showInsert) - { - noteKo = ""; - showNote = false; - } - } + protected void UpdateTable() { @@ -161,11 +129,8 @@ namespace MP_TAB_SERV.Components private static Logger Log = LogManager.GetCurrentClassLogger(); private bool isProcessing = false; - private string noteKo = ""; private int NumRecPage = 10; private int PageNum = 1; - private bool showInsert = false; - private bool showNote = false; private int TotalCount = 0; private bool useOdl = false; diff --git a/MP-TAB-SERV/MP-TAB-SERV.csproj b/MP-TAB-SERV/MP-TAB-SERV.csproj index f1c4f6a3..b5d122d0 100644 --- a/MP-TAB-SERV/MP-TAB-SERV.csproj +++ b/MP-TAB-SERV/MP-TAB-SERV.csproj @@ -3,7 +3,7 @@ net6.0 enable - 6.16.2310.1614 + 6.16.2310.1616 enable MP_TAB_SERV diff --git a/MP-TAB-SERV/Resources/ChangeLog.html b/MP-TAB-SERV/Resources/ChangeLog.html index f6f6de29..8dbeecb3 100644 --- a/MP-TAB-SERV/Resources/ChangeLog.html +++ b/MP-TAB-SERV/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

Versione: 6.16.2310.1614

+

Versione: 6.16.2310.1616


Note di rilascio:
  • diff --git a/MP-TAB-SERV/Resources/VersNum.txt b/MP-TAB-SERV/Resources/VersNum.txt index 8bf83e7e..82d7e6ce 100644 --- a/MP-TAB-SERV/Resources/VersNum.txt +++ b/MP-TAB-SERV/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2310.1614 +6.16.2310.1616 diff --git a/MP-TAB-SERV/Resources/manifest.xml b/MP-TAB-SERV/Resources/manifest.xml index 8437644c..87dba021 100644 --- a/MP-TAB-SERV/Resources/manifest.xml +++ b/MP-TAB-SERV/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2310.1614 + 6.16.2310.1616 https://nexus.steamware.net/repository/SWS/MP-TAB-SERV/stable/LAST/MP-TAB-SERV.zip https://nexus.steamware.net/repository/SWS/MP-TAB-SERV/stable/LAST/ChangeLog.html false diff --git a/MP.Data/Controllers/MpTabController.cs b/MP.Data/Controllers/MpTabController.cs index 4a9ab556..c5ac908c 100644 --- a/MP.Data/Controllers/MpTabController.cs +++ b/MP.Data/Controllers/MpTabController.cs @@ -5,6 +5,7 @@ using MP.Data.DatabaseModels; using NLog; using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Threading.Tasks; using static MP.Data.Objects.Enums; @@ -754,6 +755,60 @@ namespace MP.Data.Controllers return fatto; } + /// + /// Aggiunta record RegistroScarti + /// + /// + /// + public async Task RegScartiInsert(RegistroScartiModel newRec) + { + bool fatto = false; + using (var dbCtx = new MoonProContext(_configuration)) + { + var IdxMacchina = new SqlParameter("@idxMacchina", newRec.IdxMacchina); + var DataOra = new SqlParameter("@DataOra", newRec.DataOra); + var Causale = new SqlParameter("@Causale", newRec.Causale); + var Qta = new SqlParameter("@Qta", newRec.Qta); + var Note = new SqlParameter("@Note", newRec.Note); + var MatrOpr = new SqlParameter("@MatrOpr", newRec.MatrOpr); + + var result = await dbCtx + .Database + .ExecuteSqlRawAsync("exec dbo.stp_RS_insert @idxMacchina, @DataOra, @Causale, @Qta, @Note, @MatrOpr", IdxMacchina, DataOra, Causale, Qta, Note, MatrOpr); + // indico eseguito! + fatto = result > 0; + } + return fatto; + } + /// + /// Aggiunta record RegistroScarti + /// + /// + /// + /// + /// + /// + /// + public List RegScartiGetFilt(string idxMacchina, int idxODL, DateTime dataFrom, DateTime dataTo, bool showMulti) + { + List dbResult = new List(); + using (var dbCtx = new MoonProContext(_configuration)) + { + var IdxMacc = new SqlParameter("@IdxMacchina", idxMacchina); + var IdxODL = new SqlParameter("@IdxODL", idxODL); + var DataFrom = new SqlParameter("@DataFrom", dataFrom); + var DataTo = new SqlParameter("@DataTo", dataTo); + var ShowMulti = new SqlParameter("@showMulti", showMulti); + + dbResult = dbCtx + .DbSetRegScarti + .FromSqlRaw("EXEC .stp_RS_getByFilt @IdxMacchina, @IdxODL, @DataFrom, @DataTo, @ShowMulti", IdxMacc, IdxODL, DataFrom, DataTo, ShowMulti) + .AsNoTracking() + .ToList(); + } + return dbResult; + } + /// /// Effettua ricalcolo MSE x macchina indicata /// @@ -1042,6 +1097,23 @@ namespace MP.Data.Controllers return answ; } + /// + /// Elenco causali scarto + /// + /// + public List VSCS_getAll() + { + List dbResult = new List(); + using (var dbCtx = new MoonProContext(_configuration)) + { + dbResult = dbCtx + .DbSetVSCS + .AsNoTracking() + .ToList(); + } + return dbResult; + } + /// /// Elenco ultimi ODL x macchina /// diff --git a/MP.Data/DatabaseModels/RegistroScartiModel.cs b/MP.Data/DatabaseModels/RegistroScartiModel.cs new file mode 100644 index 00000000..2082712d --- /dev/null +++ b/MP.Data/DatabaseModels/RegistroScartiModel.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; + + +#nullable disable +// +// This is here so CodeMaid doesn't reorganize this document +// +namespace MP.Data.DatabaseModels +{ + public partial class RegistroScartiModel + { + #region Public Properties + + public string IdxMacchina { get; set; } = ""; + public DateTime DataOra { get; set; } = DateTime.Now; + public string Causale { get; set; } = ""; + public string Operatore { get; set; } = ""; + + public int Qta { get; set; } = 0; + public string Note { get; set; } = ""; + public string CodArticolo { get; set; } = ""; + public int MatrOpr { get; set; } = 0; + public DateTime? DataOraProdRec { get; set; } = null; + public string Descrizione { get; set; } = ""; + public string cssClass { get; set; } = ""; + public string icona { get; set; } = ""; + + #endregion Public Properties + } +} \ No newline at end of file diff --git a/MP.Data/DatabaseModels/vSelCauScartoModel.cs b/MP.Data/DatabaseModels/vSelCauScartoModel.cs new file mode 100644 index 00000000..05b41c1a --- /dev/null +++ b/MP.Data/DatabaseModels/vSelCauScartoModel.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +#nullable disable +// +// This is here so CodeMaid doesn't reorganize this document +// +namespace MP.Data.DatabaseModels +{ + public partial class vSelCauScartoModel + { + [Key] + public string value { get; set; } = ""; + public string label { get; set; } = ""; + public string cssClass { get; set; } = ""; + public string icona { get; set; } = ""; + } +} diff --git a/MP.Data/MoonProContext.cs b/MP.Data/MoonProContext.cs index 4368603a..d3fccf85 100644 --- a/MP.Data/MoonProContext.cs +++ b/MP.Data/MoonProContext.cs @@ -37,7 +37,7 @@ namespace MP.Data #region Public Properties - + public virtual DbSet DbSetAlarmLog { get; set; } public virtual DbSet DbSetStatArticoli { get; set; } public virtual DbSet DbSetArticoli { get; set; } @@ -58,7 +58,7 @@ namespace MP.Data public virtual DbSet DbSetStatOdl { get; set; } public virtual DbSet DbSetPzProd { get; set; } public virtual DbSet DbSetEvList { get; set; } - public virtual DbSet DbSetDDB { get; set; } + public virtual DbSet DbSetDDB { get; set; } public virtual DbSet DbSetVocabolario { get; set; } public virtual DbSet DbOperatori { get; set; } public virtual DbSet DbSetGrp2Oper { get; set; } @@ -74,6 +74,7 @@ namespace MP.Data public virtual DbSet DbSetStatoProd { get; set; } public virtual DbSet DbSetTurniMacc { get; set; } public virtual DbSet DbSetRegControlli { get; set; } + public virtual DbSet DbSetRegScarti { get; set; } public virtual DbSet DbSetStAct { get; set; } @@ -90,6 +91,7 @@ namespace MP.Data public virtual DbSet DbSetVSEB { get; set; } public virtual DbSet DbSetVSODL { get; set; } + public virtual DbSet DbSetVSCS { get; set; } #endregion Public Properties @@ -541,6 +543,10 @@ namespace MP.Data { entity.HasKey(e => new { e.IdxMacchina, e.InizioStato }); }); + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.IdxMacchina, e.DataOra, e.Causale}); + }); modelBuilder.Entity(entity => { @@ -548,9 +554,12 @@ namespace MP.Data }); modelBuilder.Entity(entity => { - //entity.HasKey(e => e.value); entity.ToView("v_selODL"); }); + modelBuilder.Entity(entity => + { + entity.ToView("v_selCauScarto"); + }); OnModelCreatingPartial(modelBuilder); diff --git a/MP.Data/Services/TabDataService.cs b/MP.Data/Services/TabDataService.cs index 2949513d..556db2a9 100644 --- a/MP.Data/Services/TabDataService.cs +++ b/MP.Data/Services/TabDataService.cs @@ -486,7 +486,7 @@ namespace MP.Data.Services } catch (Exception exc) { - string logMsg = $"Eccezione in checkCambiaStatoBatch(6) | tipoInputEvento: {tipoEv} |macchina: {newRec.IdxMacchina} | IdxTipo: {newRec.IdxTipo} | CodArticolo: {newRec.CodArticolo} | Value {newRec.Value} | MatrOpr {newRec.MatrOpr} | Pallet {newRec.pallet}{Environment.NewLine}{exc}"; + string logMsg = $"Eccezione in checkCambiaStatoBatch(6) | tipoInputEvento: {tipoEv} |macchina: {newRec.IdxMacchina} | IdxTipo: {newRec.IdxTipo} | CodArticolo: {newRec.CodArticolo} | Value: {newRec.Value} | MatrOpr: {newRec.MatrOpr} | Pallet: {newRec.pallet}{Environment.NewLine}{exc}"; Log.Error(logMsg); } } @@ -670,6 +670,46 @@ namespace MP.Data.Services return result; } + /// + /// Restituisce elenco RS filtrato + /// + /// + /// + /// + /// + /// + /// + public async Task> RegScartiGetFilt(string idxMacchina, int idxODL, DateTime dataFrom, DateTime dataTo, bool showMulti) + { + // setup parametri costanti + string source = "DB"; + Stopwatch sw = new Stopwatch(); + sw.Start(); + List? result = new List(); + // cerco in redis... + string currKey = $"{redisBaseKey}:RegScarti:{idxMacchina}:{idxODL}:{dataFrom:yyyyyMMdd-HHmm}:{dataFrom:yyyyyMMdd-HHmm}:{showMulti}"; + RedisValue rawData = await redisDb.StringGetAsync(currKey); + if (rawData.HasValue) + { + result = JsonConvert.DeserializeObject>($"{rawData}"); + source = "REDIS"; + } + else + { + result = dbTabController.RegScartiGetFilt(idxMacchina, idxODL, dataFrom, dataTo, showMulti); + // serializzp e salvo... + rawData = JsonConvert.SerializeObject(result); + await redisDb.StringSetAsync(currKey, rawData, FastCache); + } + if (result == null) + { + result = new List(); + } + sw.Stop(); + Log.Debug($"RegScartiGetFilt | {source} | {sw.Elapsed.TotalMilliseconds}ms"); + return result; + } + /// /// Registra controllo /// @@ -686,6 +726,29 @@ namespace MP.Data.Services return answ; } + /// + /// Aggiunta record RegistroScarti + /// + /// + /// + public async Task RegScartiInsert(RegistroScartiModel newRec) + { + bool answ = false; + try + { + // inserisco evento + answ = await dbTabController.RegScartiInsert(newRec); + // reset cache eventi/commenti + await FlushCache("RegScarti"); + } + catch (Exception exc) + { + string logMsg = $"Eccezione in RegScartiInsert | macchina: {newRec.IdxMacchina} | DataOra: {newRec.DataOra} | Causale: {newRec.Causale} | MatrOpr: {newRec.MatrOpr} | Qta {newRec.Qta} | Note: {newRec.Note}{Environment.NewLine}{exc}"; + Log.Error(logMsg); + } + return answ; + } + /// /// Resetta (rileggendo) i dati della macchina /// @@ -1163,6 +1226,40 @@ namespace MP.Data.Services return result; } + /// + /// Elenco causali scarto + /// + /// + public async Task> VSCS_getAll() + { + string source = "DB"; + Stopwatch sw = new Stopwatch(); + sw.Start(); + List? result = new List(); + // cerco in redis... + string currKey = $"{redisBaseKey}:VSCS"; + RedisValue rawData = await redisDb.StringGetAsync(currKey); + if (rawData.HasValue) + { + result = JsonConvert.DeserializeObject>($"{rawData}"); + source = "REDIS"; + } + else + { + result = await Task.FromResult(dbTabController.VSCS_getAll()); + // serializzp e salvo... + rawData = JsonConvert.SerializeObject(result); + await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); + } + if (result == null) + { + result = new List(); + } + sw.Stop(); + Log.Debug($"VSCS_getAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); + return result; + } + /// /// Elenco ultimi ODL x macchina ///