From 6ccbffdecf055870a8e92432b7dfc309e7e68126 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 31 May 2024 19:24:36 +0200 Subject: [PATCH] Aggiunta modello + vista e stored x calcolo statistiche chiamate --- LiMan.DB/DBModels/StatsCallModel.cs | 20 + LiMan.DB/LMDbContext.cs | 9 + LiMan.DB/LiMan.DB.csproj | 12 +- ...40531171929_AddViewAndStored01.Designer.cs | 401 ++++++++++++++++++ .../20240531171929_AddViewAndStored01.cs | 50 +++ .../Migrations/LMDbContextModelSnapshot.cs | 55 ++- .../SqlScripts/Stored/stp_StatsCall_filt.sql | 45 ++ LiMan.DB/SqlScripts/Views/v_StatsCall.sql | 21 + 8 files changed, 593 insertions(+), 20 deletions(-) create mode 100644 LiMan.DB/DBModels/StatsCallModel.cs create mode 100644 LiMan.DB/Migrations/20240531171929_AddViewAndStored01.Designer.cs create mode 100644 LiMan.DB/Migrations/20240531171929_AddViewAndStored01.cs create mode 100644 LiMan.DB/SqlScripts/Stored/stp_StatsCall_filt.sql create mode 100644 LiMan.DB/SqlScripts/Views/v_StatsCall.sql diff --git a/LiMan.DB/DBModels/StatsCallModel.cs b/LiMan.DB/DBModels/StatsCallModel.cs new file mode 100644 index 0000000..4b44492 --- /dev/null +++ b/LiMan.DB/DBModels/StatsCallModel.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LiMan.DB.DBModels +{ + public partial class StatsCallModel + { + #region Public Properties + + public int YearRef { get; set; } = 0; + public string CodInst { get; set; } = ""; + public string CodApp { get; set; } = ""; + public int TotCall { get; set; } = 0; + + #endregion Public Properties + } +} diff --git a/LiMan.DB/LMDbContext.cs b/LiMan.DB/LMDbContext.cs index 3b2ee9d..38a2cbe 100644 --- a/LiMan.DB/LMDbContext.cs +++ b/LiMan.DB/LMDbContext.cs @@ -56,6 +56,7 @@ namespace LiMan.DB public virtual DbSet DbSetLogLicenze { get; set; } public virtual DbSet DbSetSubLicenze { get; set; } public virtual DbSet DbSetTicket { get; set; } + public virtual DbSet DbSetStatCall { get; set; } #endregion Public Properties @@ -89,6 +90,14 @@ namespace LiMan.DB entity.HasKey(e => new { e.DataRif, e.CodInst, e.CodApp, e.TargetUrl }); }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.YearRef, e.CodInst, e.CodApp }); + + entity.ToView("v_StatsCall"); + }); + OnModelCreatingPartial(modelBuilder); } diff --git a/LiMan.DB/LiMan.DB.csproj b/LiMan.DB/LiMan.DB.csproj index f1fab4b..17f0fb7 100644 --- a/LiMan.DB/LiMan.DB.csproj +++ b/LiMan.DB/LiMan.DB.csproj @@ -7,16 +7,16 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/LiMan.DB/Migrations/20240531171929_AddViewAndStored01.Designer.cs b/LiMan.DB/Migrations/20240531171929_AddViewAndStored01.Designer.cs new file mode 100644 index 0000000..3307728 --- /dev/null +++ b/LiMan.DB/Migrations/20240531171929_AddViewAndStored01.Designer.cs @@ -0,0 +1,401 @@ +// +using System; +using LiMan.DB; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace LiMan.DB.Migrations +{ + [DbContext(typeof(LMDbContext))] + [Migration("20240531171929_AddViewAndStored01")] + partial class AddViewAndStored01 + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("SQL_Latin1_General_CP1_CI_AS") + .HasAnnotation("ProductVersion", "6.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1); + + modelBuilder.Entity("LiMan.DB.DBModels.ApplicativoModel", b => + { + b.Property("CodApp") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Descrizione") + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.HasKey("CodApp"); + + b.ToTable("Applicativi"); + }); + + modelBuilder.Entity("LiMan.DB.DBModels.FileAttachModel", b => + { + b.Property("IdxFileAttach") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("IdxFileAttach"), 1L, 1); + + b.Property("DtEvent") + .HasColumnType("datetime2"); + + b.Property("FullStoragePath") + .HasColumnType("nvarchar(max)"); + + b.Property("IdxTicket") + .HasColumnType("int"); + + b.Property("OriginalName") + .HasColumnType("nvarchar(max)"); + + b.Property("StorageName") + .HasColumnType("nvarchar(max)"); + + b.HasKey("IdxFileAttach"); + + b.HasIndex("IdxTicket"); + + b.ToTable("FileAttach"); + }); + + modelBuilder.Entity("LiMan.DB.DBModels.InstallazioneModel", b => + { + b.Property("CodInst") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Cliente") + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Contatto") + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Descrizione") + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.Property("Email") + .HasMaxLength(250) + .HasColumnType("nvarchar(250)"); + + b.HasKey("CodInst"); + + b.ToTable("Installazioni"); + }); + + modelBuilder.Entity("LiMan.DB.DBModels.LicenzaModel", b => + { + b.Property("IdxLic") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("IdxLic"), 1L, 1); + + b.Property("Chiave") + .HasColumnType("nvarchar(max)"); + + b.Property("CodApp") + .HasColumnType("nvarchar(50)"); + + b.Property("CodInst") + .HasColumnType("nvarchar(50)"); + + b.Property("DataEnigma") + .HasColumnType("datetime2"); + + b.Property("Descrizione") + .HasColumnType("nvarchar(max)"); + + b.Property("Enigma") + .HasColumnType("nvarchar(max)"); + + b.Property("Locked") + .HasColumnType("bit"); + + b.Property("NumLicenze") + .HasColumnType("int"); + + b.Property("Payload") + .HasColumnType("nvarchar(max)"); + + b.Property("Scadenza") + .HasColumnType("datetime2"); + + b.Property("Tipo") + .HasColumnType("int"); + + b.HasKey("IdxLic"); + + b.HasIndex("CodApp"); + + b.HasIndex("CodInst"); + + b.ToTable("Licenze"); + }); + + modelBuilder.Entity("LiMan.DB.DBModels.LogCallModel", b => + { + b.Property("DataRif") + .HasColumnType("datetime2"); + + b.Property("CodInst") + .HasColumnType("nvarchar(450)"); + + b.Property("CodApp") + .HasColumnType("nvarchar(450)"); + + b.Property("TargetUrl") + .HasColumnType("nvarchar(450)"); + + b.Property("NumCall") + .HasColumnType("int"); + + b.HasKey("DataRif", "CodInst", "CodApp", "TargetUrl"); + + b.ToTable("LogCall"); + }); + + modelBuilder.Entity("LiMan.DB.DBModels.LogLicenzaModel", b => + { + b.Property("IdxLogLic") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("IdxLogLic"), 1L, 1); + + b.Property("Chiave") + .HasColumnType("nvarchar(max)"); + + b.Property("CodApp") + .HasColumnType("nvarchar(50)"); + + b.Property("CodInst") + .HasColumnType("nvarchar(50)"); + + b.Property("Descrizione") + .HasColumnType("nvarchar(max)"); + + b.Property("IdxLic") + .HasColumnType("int"); + + b.Property("NumLicenze") + .HasColumnType("int"); + + b.Property("Scadenza") + .HasColumnType("datetime2"); + + b.Property("Tipo") + .HasColumnType("int"); + + b.HasKey("IdxLogLic"); + + b.HasIndex("CodApp"); + + b.HasIndex("CodInst"); + + b.HasIndex("IdxLic"); + + b.ToTable("LogLicenze"); + }); + + modelBuilder.Entity("LiMan.DB.DBModels.StatsCallModel", b => + { + b.Property("YearRef") + .HasColumnType("int"); + + b.Property("CodInst") + .HasColumnType("nvarchar(450)"); + + b.Property("CodApp") + .HasColumnType("nvarchar(450)"); + + b.Property("TotCall") + .HasColumnType("int"); + + b.HasKey("YearRef", "CodInst", "CodApp"); + + b.ToView("v_StatsCall"); + }); + + modelBuilder.Entity("LiMan.DB.DBModels.SubLicenzaModel", b => + { + b.Property("IdxSubLic") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("IdxSubLic"), 1L, 1); + + b.Property("Chiave") + .HasColumnType("nvarchar(max)"); + + b.Property("CodImpiego") + .HasColumnType("nvarchar(max)"); + + b.Property("IdxLic") + .HasColumnType("int"); + + b.Property("Tipo") + .HasColumnType("int"); + + b.Property("VetoUnlock") + .HasColumnType("datetime2"); + + b.HasKey("IdxSubLic"); + + b.HasIndex("IdxLic"); + + b.ToTable("SubLicenze"); + }); + + modelBuilder.Entity("LiMan.DB.DBModels.TicketModel", b => + { + b.Property("IdxTicket") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("IdxTicket"), 1L, 1); + + b.Property("CodImpiego") + .HasColumnType("nvarchar(max)"); + + b.Property("ContactEmail") + .HasColumnType("nvarchar(max)"); + + b.Property("ContactName") + .HasColumnType("nvarchar(max)"); + + b.Property("ContactPhone") + .HasColumnType("nvarchar(max)"); + + b.Property("DtReq") + .HasColumnType("datetime2"); + + b.Property("IdxLic") + .HasColumnType("int"); + + b.Property("IdxSubLic") + .HasColumnType("int"); + + b.Property("ReqBody") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("SupplAnsw") + .HasColumnType("nvarchar(max)"); + + b.Property("SupplEmail") + .HasColumnType("nvarchar(max)"); + + b.Property("SupplUserCode") + .HasColumnType("nvarchar(max)"); + + b.Property("TType") + .HasColumnType("int"); + + b.Property("Tipo") + .HasColumnType("int"); + + b.HasKey("IdxTicket"); + + b.HasIndex("IdxLic"); + + b.ToTable("TicketLog"); + }); + + modelBuilder.Entity("LiMan.DB.DBModels.FileAttachModel", b => + { + b.HasOne("LiMan.DB.DBModels.TicketModel", "TicketNav") + .WithMany() + .HasForeignKey("IdxTicket") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("TicketNav"); + }); + + modelBuilder.Entity("LiMan.DB.DBModels.LicenzaModel", b => + { + b.HasOne("LiMan.DB.DBModels.ApplicativoModel", "ApplicativoNav") + .WithMany() + .HasForeignKey("CodApp"); + + b.HasOne("LiMan.DB.DBModels.InstallazioneModel", "InstallazioneNav") + .WithMany() + .HasForeignKey("CodInst"); + + b.Navigation("ApplicativoNav"); + + b.Navigation("InstallazioneNav"); + }); + + modelBuilder.Entity("LiMan.DB.DBModels.LogLicenzaModel", b => + { + b.HasOne("LiMan.DB.DBModels.ApplicativoModel", "ApplicativoNav") + .WithMany() + .HasForeignKey("CodApp"); + + b.HasOne("LiMan.DB.DBModels.InstallazioneModel", "InstallazioneNav") + .WithMany() + .HasForeignKey("CodInst"); + + b.HasOne("LiMan.DB.DBModels.LicenzaModel", "LicenzaNav") + .WithMany() + .HasForeignKey("IdxLic") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ApplicativoNav"); + + b.Navigation("InstallazioneNav"); + + b.Navigation("LicenzaNav"); + }); + + modelBuilder.Entity("LiMan.DB.DBModels.SubLicenzaModel", b => + { + b.HasOne("LiMan.DB.DBModels.LicenzaModel", "LicenzaNav") + .WithMany("Attivazioni") + .HasForeignKey("IdxLic") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("LicenzaNav"); + }); + + modelBuilder.Entity("LiMan.DB.DBModels.TicketModel", b => + { + b.HasOne("LiMan.DB.DBModels.LicenzaModel", "LicenzaNav") + .WithMany("Tickets") + .HasForeignKey("IdxLic") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("LicenzaNav"); + }); + + modelBuilder.Entity("LiMan.DB.DBModels.LicenzaModel", b => + { + b.Navigation("Attivazioni"); + + b.Navigation("Tickets"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/LiMan.DB/Migrations/20240531171929_AddViewAndStored01.cs b/LiMan.DB/Migrations/20240531171929_AddViewAndStored01.cs new file mode 100644 index 0000000..809d29a --- /dev/null +++ b/LiMan.DB/Migrations/20240531171929_AddViewAndStored01.cs @@ -0,0 +1,50 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using System.IO; +using System.Reflection; + +#nullable disable + +namespace LiMan.DB.Migrations +{ + public partial class AddViewAndStored01 : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + // aggiunta views + addView(migrationBuilder, "v_StatsCall"); + // aggiunta stored + addStored(migrationBuilder, "stp_StatsCall_filt"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + // rimozione stored + remStored(migrationBuilder, "stp_StatsCall_filt"); + // rimozione views + remView(migrationBuilder, "v_StatsCall"); + } + + private void addView(MigrationBuilder migrationBuilder, string viewName) + { + string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "SqlScripts", "View", $"{viewName}.sql"); + string viewBody = File.ReadAllText(path); + migrationBuilder.Sql(viewBody); + } + private void addStored(MigrationBuilder migrationBuilder, string objName) + { + string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "SqlScripts", "Stored", $"{objName}.sql"); + string viewBody = File.ReadAllText(path); + migrationBuilder.Sql(viewBody); + } + + private void remView(MigrationBuilder migrationBuilder, string viewName) + { + migrationBuilder.Sql($"EXEC('DROP VIEW IF EXISTS dbo.{viewName}');"); + } + + private void remStored(MigrationBuilder migrationBuilder, string objName) + { + migrationBuilder.Sql($"EXEC('DROP PROCEDURE IF EXISTS dbo.{objName}');"); + } + } +} diff --git a/LiMan.DB/Migrations/LMDbContextModelSnapshot.cs b/LiMan.DB/Migrations/LMDbContextModelSnapshot.cs index 0d6859c..ea9c81b 100644 --- a/LiMan.DB/Migrations/LMDbContextModelSnapshot.cs +++ b/LiMan.DB/Migrations/LMDbContextModelSnapshot.cs @@ -6,6 +6,8 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +#nullable disable + namespace LiMan.DB.Migrations { [DbContext(typeof(LMDbContext))] @@ -15,10 +17,11 @@ namespace LiMan.DB.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("Relational:Collation", "SQL_Latin1_General_CP1_CI_AS") - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("ProductVersion", "5.0.10") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .UseCollation("SQL_Latin1_General_CP1_CI_AS") + .HasAnnotation("ProductVersion", "6.0.9") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1); modelBuilder.Entity("LiMan.DB.DBModels.ApplicativoModel", b => { @@ -39,8 +42,9 @@ namespace LiMan.DB.Migrations { b.Property("IdxFileAttach") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("IdxFileAttach"), 1L, 1); b.Property("DtEvent") .HasColumnType("datetime2"); @@ -95,8 +99,9 @@ namespace LiMan.DB.Migrations { b.Property("IdxLic") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("IdxLic"), 1L, 1); b.Property("Chiave") .HasColumnType("nvarchar(max)"); @@ -166,8 +171,9 @@ namespace LiMan.DB.Migrations { b.Property("IdxLogLic") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("IdxLogLic"), 1L, 1); b.Property("Chiave") .HasColumnType("nvarchar(max)"); @@ -204,12 +210,32 @@ namespace LiMan.DB.Migrations b.ToTable("LogLicenze"); }); + modelBuilder.Entity("LiMan.DB.DBModels.StatsCallModel", b => + { + b.Property("YearRef") + .HasColumnType("int"); + + b.Property("CodInst") + .HasColumnType("nvarchar(450)"); + + b.Property("CodApp") + .HasColumnType("nvarchar(450)"); + + b.Property("TotCall") + .HasColumnType("int"); + + b.HasKey("YearRef", "CodInst", "CodApp"); + + b.ToView("v_StatsCall"); + }); + modelBuilder.Entity("LiMan.DB.DBModels.SubLicenzaModel", b => { b.Property("IdxSubLic") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("IdxSubLic"), 1L, 1); b.Property("Chiave") .HasColumnType("nvarchar(max)"); @@ -237,8 +263,9 @@ namespace LiMan.DB.Migrations { b.Property("IdxTicket") .ValueGeneratedOnAdd() - .HasColumnType("int") - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("IdxTicket"), 1L, 1); b.Property("CodImpiego") .HasColumnType("nvarchar(max)"); diff --git a/LiMan.DB/SqlScripts/Stored/stp_StatsCall_filt.sql b/LiMan.DB/SqlScripts/Stored/stp_StatsCall_filt.sql new file mode 100644 index 0000000..f4a8041 --- /dev/null +++ b/LiMan.DB/SqlScripts/Stored/stp_StatsCall_filt.sql @@ -0,0 +1,45 @@ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + + +/*-- ============================================= +-- Author: S.E.L. +-- Description: Estrazione dati statistiche call filtrati + +EXEC dbo.stp_StatsCall_filt '2024-01-01', GETDATE(), '' + +-- Mod. date: 2024.05.31 +-- =============================================*/ +CREATE PROCEDURE [dbo].[stp_StatsCall_filt] +( + @DtFrom INT = 0 + ,@DtTo INT = 0 + ,@SearchVal NVARCHAR(250) +) +AS +BEGIN + + SET NOCOUNT ON; + SET XACT_ABORT ON; + +WITH cteDati AS +( + SELECT YEAR(DataRif) AS YearRef, CodInst, CodApp, SUM(NumCall) AS TotCall + FROM LogCall + WHERE DataRif BETWEEN @DtFrom and @DtTo + AND (@SearchVal = '' OR TargetUrl LIKE '%'+@SearchVal+'%') + GROUP BY YEAR(DataRif), CodInst, CodApp +) + +SELECT * +FROM cteDati +ORDER BY YearRef DESC, TotCall DESC + +END + + +GO diff --git a/LiMan.DB/SqlScripts/Views/v_StatsCall.sql b/LiMan.DB/SqlScripts/Views/v_StatsCall.sql new file mode 100644 index 0000000..7f2b10e --- /dev/null +++ b/LiMan.DB/SqlScripts/Views/v_StatsCall.sql @@ -0,0 +1,21 @@ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +CREATE VIEW [dbo].[v_StatsCall] +AS + +WITH cteDati AS +( + SELECT YEAR(DataRif) AS YearRef, CodInst, CodApp, SUM(NumCall) AS TotCall + FROM LogCall + GROUP BY YEAR(DataRif), CodInst, CodApp +) + +SELECT * +FROM cteDati +ORDER BY YearRef DESC, TotCall DESC + +GO \ No newline at end of file