Gestione legami di parentela o altri tipi di relazione tra persone

di il
0 risposte

Gestione legami di parentela o altri tipi di relazione tra persone

Buongiorno a tutti,

avrei bisogno di un aiuto; mi sono appena iscritto al forum e non sono tanto pratico di questo ambiente.

Ho progettato e realizzato un database in Sql Server per la catalogazione bibliografica e dei dati di autorità (persone, enti/aziende, luoghi, ecc.).

L'interrogazione e la manipolazione dei dati (quella che io chiamo catalogazione) avvengono utilizzando Access: ho ovviamente collegato access al db sql server e creato maschere, sottomaschere, ecc.

Funziona tutto.

L'unico problema è che ci sono delle cose che riesco a fare solo con Sql server e altre solo con access e quindi mi ritrovo una sorta di forma mista che non mi convince e che preferirei superare avendo tutto il db in access o tutto in sql server.

Mi spiego meglio con un esempio.

Il mio db gestisce anche i legami tra quelle che io chiamo entità catalografiche: ad esempio Sigmund Freud PADRE DI Anna Freud e conseguentemente Anna Freud FIGLIA DI Sigmund Freud; oppure John Lennon MEMBRO DI The Beatles e conseguentemente The Beatles COMPOSTO DA john Lennon, ecc.

Ho creato due tabelle: la tabella Relazioni è la tabella di convalida che contiene i diversi tipi di relazione possibili (ad esempio Padre/figlio, ecc.) con un campo numerico che io chiamo Reciproco per rappresentare la relazione reciproca rispetto a quella indicata ( rispetto al padre sarà figlio, rispetto al marito sarà moglie e così via - ovviamente si tratta di campi numerici). Di seguito lo script:

CREATE TABLE [dbo].[Relazioni](
[ID_Relazione] [int] IDENTITY(1,1) NOT NULL,
[Contatore] [numeric](18, 0) NULL,
[Relazione] [nvarchar](25) NOT NULL,
[Scioglimento] [varchar](255) NULL,
[Nota_esplicativa] [varchar](255) NULL,
[Reciproco] [int] NULL,
[Tipo_record] [int] NULL,
[Codice_sistema] [uniqueidentifier] NULL,
[Row_version] [timestamp] NULL,
[Data_creazione] [datetime] NULL,
[Ultima_modifica] [datetime] NULL,
CONSTRAINT [PK_Relazioni] PRIMARY KEY CLUSTERED 
(
[ID_Relazione] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Relazioni] ADD  CONSTRAINT [DF_Relazioni_Codice_sistema]  DEFAULT (newid()) FOR [Codice_sistema]
GO

ALTER TABLE [dbo].[Relazioni]  WITH CHECK ADD  CONSTRAINT [FK_Relazioni_Tipi_record] FOREIGN KEY([Tipo_record])
REFERENCES [dbo].[Tipi_record] ([ID_Tipo_record])
GO

ALTER TABLE [dbo].[Relazioni] CHECK CONSTRAINT [FK_Relazioni_Tipi_record]

Ho poi una tabella (che io chiamo LEGAMI) di inserimento dati del tipo molti a molti così fatta: 

CREATE TABLE [dbo].[Legami](
[ID_Legame] [int] IDENTITY(1,1) NOT NULL,
[Contatore] [numeric](18, 0) NULL,
[Prima_Intestazione] [int] NULL,
[Relazione] [int] NULL,
[Seconda_Intestazione] [int] NULL,
[Datazione] [varchar](25) NULL,
[Nota_esplicativa] [varchar](255) NULL,
[Row_version] [timestamp] NULL,
[Data_creazione] [datetime] NULL,
[Ultima_modifica] [datetime] NULL,
CONSTRAINT [PK_Legami] PRIMARY KEY CLUSTERED 
(
[ID_Legame] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Legami]  WITH CHECK ADD  CONSTRAINT [FK_Legami_Prima_intestazione] FOREIGN KEY([Prima_Intestazione])
REFERENCES [dbo].[Intestazioni] ([ID_Intestazione])
GO

ALTER TABLE [dbo].[Legami] CHECK CONSTRAINT [FK_Legami_Prima_intestazione]
GO

ALTER TABLE [dbo].[Legami]  WITH CHECK ADD  CONSTRAINT [FK_Legami_Relazioni] FOREIGN KEY([Relazione])
REFERENCES [dbo].[Relazioni] ([ID_Relazione])
GO

ALTER TABLE [dbo].[Legami] CHECK CONSTRAINT [FK_Legami_Relazioni]
GO

ALTER TABLE [dbo].[Legami]  WITH CHECK ADD  CONSTRAINT [FK_Legami_Seconda_intestazione] FOREIGN KEY([Seconda_Intestazione])
REFERENCES [dbo].[Intestazioni] ([ID_Intestazione])

Utilizzando un trigegr in sql server sono in grado di inserire tramite una maschera in access un record nella tabella Legami e automaticamente Sql Server mi scrive una seconda riga nella stessa tabella dei Legami riportandomi la relazione reciproca rispetto a quella da me inserita. Ciò mi consente di inserire una sola riga e automaticamente avere compilata anche la seconda.

Ovviamente questa operazione riesco ad eseguirla anche direttamente in access con una query di accodamento.

Ma la cosa veramente importante che non riesco a replicare in access è l'aggiornamento: se per esempio ho sbagliato nell'inserire il primo legame, nel momento in cui vado a correggerlo, in access non sono in grado di fargli correggere il corrispondente legame reciproco.

Il trigger sql server è il seguente:

CREATE trigger [dbo].[Trigger_Legami]
ON [dbo].[Legami]

AFTER INSERT, UPDATE, delete
as
/*declare @OPERAZIONE varchar(20);
declare @ultima_modifica datetime*/

if exists(SELECT * from inserted where Relazione <> 1) and not exists (SELECT * from deleted)

begin
   /*SET @OPERAZIONE = 'CREATO';*/
   set nocount on

declare @id int, @id2 int, @id3 int, @id4 int, @Contatore NUMERIC
---, @SEQUENZA NUMERIC*/

  
 select @id = Relazione , @id4 = ID_Legame, @Contatore = Contatore from Inserted


 
insert into Legami (Prima_Intestazione, Relazione, Seconda_Intestazione, Datazione)
select Seconda_Intestazione, --case when id_legame = 8 then 2 else 
(select ID_Relazione from Relazioni
where Reciproco = @id ),

Prima_Intestazione, datazione
FROM inserted
WHERE ID_Legame = inserted.ID_Legame;


END

--Nel caso di modifica

if exists(SELECT * from inserted where Relazione <> 1 ) and exists (SELECT * from deleted) 
 begin
   
 
   select @id = Relazione,  @id4 = ID_Legame, @Contatore = Contatore from Inserted

 
update Legami set Prima_Intestazione = inserted.Seconda_Intestazione,
Relazione = (select ID_Relazione from Relazioni
where Reciproco = @id ),

Seconda_Intestazione = inserted.Prima_Intestazione, Datazione = inserted.Datazione

from inserted
where legami.Prima_Intestazione= inserted.Seconda_Intestazione
and legami.Seconda_Intestazione= inserted.Prima_Intestazione
and Legami.ID_Legame = Legami.ID_Legame


UPDATE Legami set Ultima_modifica = GETDATE() 
   FROM 
 Legami

 INNER JOIN inserted 
 AS I 
 ON Legami.ID_Legame = I.ID_Legame

 update Legami
set Contatore = (SELECT CASE WHEN MAX (@Contatore) IS NULL THEN 1
ELSE MAX (@Contatore) + 1
END
FROM Legami) 
where Legami.ID_Legame = Legami.ID_Legame----@id4

end

If exists(select * from deleted) and not exists(Select * from inserted)

begin
   
   select @id = Prima_Intestazione,  @id2 = Seconda_Intestazione,  @id3 = Relazione  from deleted

delete Legami 
where
Prima_Intestazione = @id2 and  Seconda_Intestazione = @id and Relazione = @id3 + 1   
end

If exists(select * from deleted) and not exists(Select * from inserted)

begin
   
   select @id = Prima_Intestazione,  @id2 = Seconda_Intestazione,  @id3 = Relazione from deleted

delete Legami 
where
Prima_Intestazione = @id2 and  Seconda_Intestazione = @id and Relazione = @id3 - 1 
end

Mi potete aiutare a capire come fare per replicarlo direttamente in access?

Grazie a tutti e scusate il post troppo lungo

Devi accedere o registrarti per scrivere nel forum
0 risposte