Newsgroup: it.comp.appl.access
Titolo: collegamento ODBC - vista di SQL server - problema

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  

> 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
 
 
.

> 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...........
 


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

 - 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]
 
.
 
 
 

 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]
 
.


appena sono in ufficio la provo
SEI VERAMENTE GENTILE
 
GRAZIE