Comment faire un passthrough / passthru requête modifiable?
Dans le Microsoft Access 2007 avec un SQL Server back-end, nous avons l'habitude de prendre une table liée à partir du Serveur SQL de la Forme.RecordSource du formulaire éditable pour une seule table de modification de données. Un local de requête est utilisé pour les tables d'éditions qui combine des champs provenant de plusieurs tables liées. La requête locale doit être mise à jour dans le but de modifier des données dans le formulaire d'édition.
Maintenant, nous prévoyons de remplacer toutes les requêtes locales par Passthrough requêtes pour les utiliser en natif SQL Server tables directement.
J'ai essayé de créer un très simple passthru requête nommée qrySelProductsPassThroughEditable avec le SQL suivant dans la chaîne de
SELECT dbo.Products.ID, dbo.Products.Name FROM dbo.Products;
Le champ ID est le champ d'IDENTITÉ défini comme Clé Primaire dans le Serveur SQL server comme la définition:
CREATE TABLE [dbo].[Products](
[ID] [int] IDENTITY(1,1) NOT NULL,
....
)
Mais la feuille de données retourné par pass d'Accès de la requête n'est pas modifiable à tout. Il n'est donc pas utilisable en tant que .RecordSource d'un formulaire d'édition ni.
C'est au contraire avec le lien qui dit que si un genre de requête contient toutes les Clés Primaires de toutes les tables impliquées, la requête sera modifiable.
Conclusion Ajoutés a Posteriori
Par le biais des discussions ci-dessous, une requête directe dans Microsoft Access 2007 .accdb, .accde ou .accdr (Access runtime) est toujours en lecture seule, il n'est jamais modifiable. Vous devez l'utiliser comme une liste finale, ou en tant que .RecordSource d'un rapport, non pas pour une forme pour laquelle vous devez utiliser une table liée, ou une écriture Normale Requête impliquant des tables liées pour les données IO.
- Je ne suis pas au courant que se Passe-Par le biais de requêtes peut être mis à jour. J'étais sous l'impression de la produire en lecture seule des jeux d'enregistrements.
- Si c'est le cas, comment peut-on modifier directement des tables dans SQL Server à l'aide de formulaire d'Accès: il faut passer par des tables liées ?
Vous devez vous connecter pour publier un commentaire.
En ligne avec mon commentaire ci-dessus et la réponse par Yawar, je ne suis pas au courant qui Passe à Travers les Requêtes sont toujours modifiables/jour. Ils sont modifiables dans le sens que vous pouvez modifier un enregistrement de Passage Par la Requête de l'objet, mais je ne crois pas qu'il est possible pour un Passage Par la Requête pour produire un jeu d'enregistrements modifiable.
Il existe essentiellement deux méthodes pour se connecter à l'Accès à un non-Accès aux sources de données.
La première méthode, et la plus populaire, est d'utiliser une certaine forme de tables liées, en général ODBC tables liées. Il existe une variété de méthodes d'utilisation des tables ODBC liée avec MS Access, mais par ce que la plupart des développeurs préfèrent consiste à utiliser des connexions sans DSN que vous rafraîchir ou reconstruit (supprimé et rebranché) au moment de votre application démarre. Soyez conscient que lorsque vous utilisez ODBC, vous êtes également toujours à l'aide de DAO. DAO est l'accès aux données par défaut de l'objet construit dans MS Access et même lorsque vous n'avez pas spécifiquement écrire n'importe quel code DAO, MS Access est toujours à l'aide de DAO sous le capot pour lier vos formulaires, des rapports et des requêtes à votre source de données. Dans le cas d'ODBC, vous avez en fait avoir deux couches d'accès aux données au travail, DAO et ODBC. Mais vous pouvez utiliser ODBC/DAO avec de jolies performances décentes et sans écrire de code (autres que de maintenir les tables ODBC liée).
La deuxième méthode consiste à utiliser ADO. Contrairement à la croyance populaire, cela ne signifie pas que vous avez à utiliser des formulaires indépendants. Mais ça ne signifie pas que vous avez à écrire plus de code que l'utilisation de JET/DAO/MSAccess ou DAO/ODBC/SSQL Serveur. Vous devez écrire le code pour afficher dans les enregistrements de votre base de données dans et jeu d'enregistrements ADO et utiliser le code pour lier votre forme à un jeu d'enregistrements. Vous devez écrire plus de code pour garder enfant de formes en synchronisation avec les formulaires parent, d'insérer les clés étrangères dans les formulaires enfants lorsque de nouveaux dossiers sont créés, et pour une variété d'autres choses, comme le filtrage et le tri sélectif et la forme intégrée de filtrage et de tri des options habituellement ne fonctionnent pas avec les jeux d'enregistrements ADO. ADO est un excellent moyen de parler à SQL Server car il vous donne beaucoup de contrôle, mais parce que c'est le code intense, et parce que les Tables ODBC Liée fonctionne si bien, la plupart des développeurs ne recommandons pas l'utilisation d'ADO à moins qu'il n'y a pas d'autre moyen de faire ce que vous voulez faire. Un exemple de ceci est l'appel de Procédures Stockées. Je pense Passer à Travers les Requêtes peuvent être utilisés pour appeler des Procédures Stockées, mais je pense aussi qu'il y a certaines limites y (tels que l'utilisation de Paramètres). Je crois que dans la plupart des cas, les développeurs à utiliser ADO pour appeler des procédures stockées. J'utilise ADO beaucoup, mais je ne suis pas d'utiliser des Procédures Stockées beaucoup (pas encore) donc je n'ai pas beaucoup d'informations.
Une autre chose à mentionner est que les DAO avec ODBC utilise "lazy loading" mais ADO vous oblige à tirer toutes les données qui peuvent être très coûteuse en temps et de consommer beaucoup de mémoire si vous avez > des millions de lignes. Ou d'autre, vous aurez besoin de mettre en œuvre une sorte de pagination.
Ma propre fonction pour créer un seul DSN ODBC Liée tableau ci-dessous. Si vous êtes nouveau à l'Accès et à nouveau à VBA ce ne sera probablement pas faire beaucoup de sens pour vous. Le code supprime toute définition de la table qui existe déjà pour la table que vous essayez de lien, qui est un peu dangereux parce que je crois qu'il pourrait supprimer un local, non lié à la table dont vous ne voulez pas. La gestion d'erreur dans ici n'est pas vraiment à la vitesse, mais la plupart des en ligne exemple de code n'a pas une bonne gestion des erreurs en raison de complications que cela implique. La création de la Clé Primaire Index sur une table liée n'est pas toujours nécessaire. Je viens de l'avoir intégré dans ma fonction, parce que j'en ai eu besoin une seule fois pour un projet spécifique, donc maintenant je le laisser là et de l'utiliser, pour le meilleur ou pour le pire.
À faire bon usage de ce code, vous avez vraiment besoin d'avoir une liste de tous vos tables liées quelque part et parcourir cette liste et appeler cette fonction pour chaque table. Cette fonction permet de lier la table à l'aide d'un autre nom que son nom réel dans SQL Server. Vous avez également besoin d'avoir un moyen de la construction d'un valide chaîne de connexion ODBC qui doit être passé dans cette fonction trop.
Il y a quelques vraiment bonnes ressources, vous devriez vérifier concernant DAO, ADO, Passer Par le biais de Requêtes SQL Server, etc:
http://technet.microsoft.com/en-us/library/bb188204%28v=sql.90%29.aspx
http://www.utteraccess.com/wiki/Choosing_between_DAO_and_ADO
Voici un exemple de liaison d'un formulaire à un jeu d'enregistrements ADO. C'est un peu trompeur, car il est préférable d'avoir un objet de connexion global qui reste ouverte lors de l'exécution de l'application. Cela vous permet d'utiliser des jeux d'enregistrements ADO qui sont automatiquement mis à jour. À l'aide de cette pratique peut également rendre votre jeu d'enregistrements à un niveau de forme de l'objet.
http://msdn.microsoft.com/en-us/library/office/bb243828%28v=office.12%29.aspx
Il est plus facile non bien documenté d'ouvrir n'importe quel Serveur SQL Instruction Select (une table, une vue ou un sql-select avec de nombreuses tables jointes) dans un MsAccess fenêtre de requête et être modifiable/mis à jour:
Ouvrir une fenêtre de requête d'Accès et entrez votre Instruction SQL. Remplacer le nom de la table(s) avec la totalité de la chaîne ODBC de SQL Server à l'intérieur des crochets, à la suite d'un point et le schéma et le nom de la table comme dans l'exemple suivant:
Avant:
Après:
La Requête est maintenant mis à jour:
Remarques:
Passer les requêtes des ensembles de résultats ne sont pas modifiables, mais l'Accès des requêtes basées sur des tables liées sont certainement.
Oui c'est vrai avec "La seconde méthode consiste à utiliser ADO" que LinkMasterFields et LinkChildFields propriétés ne sont pas de travail dans un environnement multi-forme et jeu d'enregistrements ADO n'est pas de travail dans l'Accès rapport 2013, alors là, je suis à l'aide de requête sql directe. Je suis à l'aide d'ADP+ ADPX.accde pour simuler LinkMasterFields et LinkChildFields propriétés multi-forme et multi-rapport.