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