Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

collegamento ODBC - vista di SQL server - problema

384 views
Skip to first unread message

pfmarro

unread,
Jan 7, 2014, 6:14:34 AM1/7/14
to
salve

ho collegato ad un .mdb 2 tabelle SQL server e 1 vista

non capisco come mai se si modifica la vista da sql server e poi da access Gestione tabelle collegate si ricollegano a volte la vista diventa di sola lettura.
solo se cancello il collegamanto alla vista e ricreo il collegamento nel .mdb torna ad essere lettura e scrittura.

Come fare a testare da codice se e' lettura e scrittura?

Grazie anticipatamente

Mancini

unread,
Jan 8, 2014, 2:12:08 AM1/8/14
to
> Come fare a testare da codice se e' lettura e scrittura?

Il problema nasce dal fatto che quello che colleghi da SQLServer ( che sia una tabella o Vista ) per essere editabile deve avere un indice NOTO ad Access.

Per le tabelle il problema generalmente non si pone in quanto Access prende di default la Key a lato SQLServer

Per le viste invece questo non succede, Infatti quando colleghi una Vista di SQLServer ad Access la procedura ti chiede di indicare il campo Chiave

Ora tu dici che le viste che modifichi in SQLServer "alle volte" diventano in sola lettura, Forse quelle volte sono quelle in cui la modifica della vista implica i suoi indici ......


Tieni presente che se vuoi via codice dire ad access quale sia l'indice della vista
ssql = "CREATE UNIQUE INDEX NomInd ON dbo_Vis1 (Id)"
CurrentDB.Execute ssql
dove
NomInd è il nome che dai dell'indice
dbo_Vis1 è il nome della tabella collegata
Id è il campo che indichi come indice


Invece per verificare se una tabella collegata è editabile
ricirdo che lo avevo gia fatto.
la strada era ( vado a memoria a annaspando )

Dim Tdf As ......
Set Tdf = "NomeTabella"
msgbox Tdf.Index.Count

Ti dovrebbe rispondere quanti indici ci sono nella tabella collegata,
per cui se non hai indici .....



Questa sera potro essere piu preciso se non hai ancora risolto ..........


leggi questo http://support.microsoft.com/kb/209123/en-us

.

Mancini

unread,
Jan 8, 2014, 10:11:49 PM1/8/14
to
> Questa sera potro essere piu preciso se non hai ancora risolto ..........

Dim Tdf As DAO.TableDef
Set Tdf = DBEngine(0)(0).TableDefs("NomeTabella")
MsgBox Tdf.Indexes.Count
MsgBox Tdf.Updatable
MsgBox Tdf...........

pfmarro

unread,
Jan 9, 2014, 3:21:48 AM1/9/14
to
grazie molte per i 2 messaggi

in effetti quando collego la vista via odbc ad MsAccess mi chide qual e' il campo chiave: lo seleziono e tutto procede regolarmente fin quando mi accorgo che i dati non vengono aggiornati. Allora cancello il collegamento e lo ricreo.

- la vista di SQL server puo' avere degli indici? come si creano? se e' off topics possiamo scambiarci delle mail direttamente?

- mi consigli una procedura per testare se il collegamento alla vista e' diventato di sola lettura? per aggiornare il recordset eseguo da VBA delle query di aggiornamento o accodamento

Grazie anticipatamente

Mancini

unread,
Jan 9, 2014, 6:49:26 AM1/9/14
to
[quote]
> - la vista di SQL server puo' avere degli indici? come si creano? se e' off topics possiamo scambiarci delle mail direttamente?
[/quote]
Ma non credo che sia troppo OffTopics, magari questa sera provo a postare uno scriptino ( che dovrei avere a casa ) per creare una View di SQLServer2008 indicizzata ( WITH SCHEMABINDING .... )

Non h mai provato a connettere una vista indicizzata di SQLServer ad Access


ma a parer mio la domanda da porsi è:
Perchi una tabella collegata a una vista a un certo punto perde il suo indice e non è piu editabile ??????
Se sono modifiche che fai te alla struttura della vista allora Ok
diversamente ......



[quote]
> - mi consigli una procedura per testare se il collegamento alla vista e' diventato di sola lettura? per aggiornare il recordset eseguo da VBA delle query di aggiornamento o accodamento
[/quote]
Premesso che a regime NON DEVE succedere che all'improvviso la tabella perde la sua editabilita
Io farei in contemporanea il test e mettere a posto se necessario,
prima di lanciare le tue query di accodamento/aggiornamento
[code]
' ........
Dim Tdf As DAO.TableDef
Set Tdf = DBEngine(0)(0).TableDefs("NomeTabella")
If (Tdf.Indexes.Count) = 0 Then
DBEngine(0)(0).Execute "CREATE UNIQUE INDEX NomInd ON NomeTabella (NomeCampoDaIndicizzare)"
EndIf
[/code]

.



Mancini

unread,
Jan 9, 2014, 7:32:04 AM1/9/14
to
[quote]
> Ma non credo che sia troppo OffTopics, magari questa sera provo a postare uno scriptino ( che dovrei avere a casa ) per creare una View di SQLServer2008 indicizzata ( WITH SCHEMABINDING .... )
[/quote]

Caso strano lo avevo anche qui dove lavoro.
Lo ho testato e funziona, poi durante la connessione ODBC con Access NON ti chiede di indicare il CampoChiave .....

Ma ti ripeto il problema è scoprire perche perdi la Editabilita. ....

[code]



/*

Questo script di esempio ( SQL2008R2 ) genera:
___ un DB
___ 2 Tabelle con Key
___ 1 Relazione
___ 1 Vista con Schemabinding
___ 1 indice sulla vista


*/


-- Creo il DB
USE master;
GO

CREATE DATABASE VI01;
GO

-- Uso il DB appena creato

USE VI01;
GO


-- Creo una tabella Fo ( Fornitori )


CREATE TABLE [dbo].[Fo]
(
[FoId] [int] IDENTITY(1,1) NOT NULL,
[Fornit] [varchar](50) NULL,
[FoCitt] [varchar](50) NULL,
[FoTele] [nchar](10) NULL,
CONSTRAINT [KFo] PRIMARY KEY CLUSTERED

(
[FoId] 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



-- Creo una tabella OD ( Ordini )

CREATE TABLE [dbo].[Od]
(
[OdId] [int] IDENTITY(1,1) NOT NULL,
[OdNume] [varchar](50) NULL,
[OdFo] [int] NULL,
[OdMate] [varchar](50) NULL,
[OdImpo] [int] NULL,
CONSTRAINT [KOr] PRIMARY KEY CLUSTERED

(
[OdId] 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


-- Creo la relazione

ALTER TABLE [dbo].[Od] WITH CHECK ADD CONSTRAINT [ReFoOr] FOREIGN KEY([OdFo])
REFERENCES [dbo].[Fo] ([FoId])
GO

ALTER TABLE [dbo].[Od] CHECK CONSTRAINT [ReFoOr]
GO



-- Inserisco un po di Dati

SET IDENTITY_INSERT [dbo].[Fo] ON

INSERT [dbo].[Fo]
([FoId], [Fornit], [FoCitt], [FoTele])
VALUES

(1, N'Forn1', N'Milano', NULL),
(2, N'Forn2', N'Bologna', NULL),
(3, N'Forn3', N'Firenze', NULL),
(4, N'Forn4', N'Roma', NULL),
(5, N'Forn5', N'Napoli', NULL);

SET IDENTITY_INSERT [dbo].[Fo] OFF


-- _______________________________________________________________


SET IDENTITY_INSERT [dbo].[Od] ON

INSERT [dbo].[Od]
([OdId], [OdNume], [OdFo], [OdMate], [OdImpo])
VALUES

(1, N'20', 2, N'Mele', 500),
(3, N'20', 2, N'Pere', 14),
(4, N'30', 3, N'Ananas', 150),
(5, N'22', 2, N'Castagne', 120);

SET IDENTITY_INSERT [dbo].[Od] OFF

GO


-- Creo la vista indicizzata



CREATE VIEW
[dbo].[ViInd01]
WITH SCHEMABINDING
AS

SELECT
dbo.Od.OdId,
dbo.Od.OdNume,
dbo.Od.OdFo,
dbo.Od.OdMate,
dbo.Od.OdImpo,
dbo.Fo.Fornit
FROM
dbo.Fo
INNER JOIN
dbo.Od
ON
dbo.Fo.FoId = dbo.Od.OdFo

GO


-- Creo l'indice

CREATE UNIQUE CLUSTERED INDEX NomeIndice
ON dbo.ViInd01
(
[OdId] ASC
)

GO


/*

CREATE UNIQUE CLUSTERED INDEX idx_campo
ON dbo.VIEWxxx
(orderid)

*/

[/code]

.

pfmarro

unread,
Jan 9, 2014, 1:50:25 PM1/9/14
to
appena sono in ufficio la provo
SEI VERAMENTE GENTILE

GRAZIE
0 new messages