2009-11-10 6 views
4

Revenons à Access après avoir longtemps fait d'autres choses, il y a une chose qui me dérange vraiment, c'est que si vous ouvrez involontairement une requête dans Design mode, où le concepteur ne peut pas représenter le sql (même si c'est valide), le concepteur va «corriger» votre requête pour vous, et il n'y a pas d'annulation ...Empêcher l'accès de vider les requêtes qu'il ne comprend pas lors du passage en mode design

Y at-il une solution de contournement pour cela - ou un option où je peux au moins l'obtenir pour me poser la question d'abord?

(Access 2007)

+0

Voulez-vous dire que le formatage est perdu? Ou voulez-vous dire que la "correction" change réellement la substance de la requête? Je n'ai pas vu ce dernier. – hawbsl

+1

Je veux dire le dernier. Je l'ai vu. – Benjol

Répondre

-1

Si vous ne l'aimez pas ce que l'interface d'accès fait à votre code SQL, pourquoi voudriez-vous même essayer de voir votre SQL en elle? Il efface tout joli format ou espace qui peut avoir été ajouté pour aider le lecteur humain. Il peut même re-facteur SQL: littéraux de date au format américain, parens aux supports pour une sous-requête, la syntaxe des paramètres dans une PROCEDURE, la perte de noms de corrélation de colonne dans une VIEW, etc.

Sonne comme une meilleure approche pour vous est de créer des objets de base de données en utilisant un script SQL Data Definition Language (DDL SQL) puis référez-vous à votre script pour la maintenance future.

Par exemple, voici un script DDL moteur de base de données Access SQL pour créer des objets de base de données:

CREATE TABLE Constants 
(
lock CHAR(1) WITH COMPRESSION 
    DEFAULT 'x' 
    NOT NULL, 
    CONSTRAINT Constants__max_one_row 
     CHECK (lock = 'x'), 
pi DECIMAL(3, 2) NOT NULL 
) 
; 
INSERT INTO Constants (pi) VALUES (3.14) 
; 
CREATE TABLE Things 
(
thing_ID CHAR(10) WITH COMPRESSION NOT NULL 
    CONSTRAINT uq__Things UNIQUE, 
    CONSTRAINT thing_ID__numeric_chars_only 
     CHECK (thing_ID NOT ALIKE '%[!0-9]%'), 
thing_name VARCHAR(20) DEFAULT '{{NONE}}' NOT NULL, 
    CONSTRAINT thing_name__whitespace 
     CHECK (
       thing_name NOT ALIKE ' %' 
       AND thing_name NOT ALIKE '% ' 
       AND thing_name NOT ALIKE '% %' 
       AND LEN(thing_name) > 0 
      ) 
) 
; 
CREATE PROCEDURE AddThing 
(
arg_thing_ID CHAR(10), 
arg_thing_name VARCHAR(20) = '{{NONE}}' 
) 
AS 
INSERT INTO Things (thing_ID, thing_name) 
SELECT thing_ID, thing_name 
    FROM (
     SELECT RIGHT('0000000000' + arg_thing_ID, 10) AS thing_ID, 
       IIF(LEN(arg_thing_name) = 0, '{{NONE}}', arg_thing_name) 
       AS thing_name  
      FROM Constants 
     ) AS DT1 
WHERE thing_ID NOT ALIKE '%[!0-9]%' 
     AND thing_name NOT ALIKE ' %' 
     AND thing_name NOT ALIKE '% ' 
     AND thing_name NOT ALIKE '% %' 
; 
CREATE VIEW Stuff 
(
stuff_ID, stuff_name 
) 
AS 
SELECT T1.thing_ID, T1.thing_name 
    FROM Things AS T1 
WHERE ' ' & T1.thing_name & ' ' ALIKE '% stuff %' 
; 

Maintenant, je sais par expérience l'interface utilisateur Access est incapable d'exposer une partie de la caractéristique du moteur de base de données d'accès (CHECK contraintes, CHAR() type de données, WITH COMPRESSION propriété, etc) et peut essayer de changer la syntaxe dans une vue SQL de l'objet Query: parens dans la sous-requête, paramètres pour le PROCEDURE - qu'il insistera pour appeler une requête -, corrélation de colonne nommer la liste pour le VIEW - qu'il insistera pour appeler aussi une requête, etc.). Mais qui s'en soucie? Si je dois modifier le schéma, je le ferai en fonction du script SQL DDL et non de ce que l'interface utilisateur d'Access pense que mon script a dit.

Cela me laisse libre d'utiliser l'éditeur SQL de mon choix, par exemple. celui qui colore les mots-clés séparément des éléments de données, a auto-complétion, indente les éléments de requête à mon choix, etc.

+0

Eh, pouvez-vous développer cela s'il vous plaît? Je veux afficher le sql car il y a des requêtes que vous ne pouvez pas écrire en mode Design. Quel est votre cycle de travail lorsque vous utilisez SQL DDL (quel qu'il soit)? – Benjol

+0

@onedayone: vous n'aimez pas Access et vous êtes hostile à ses outils intégrés. Pourquoi continuez-vous à donner des conseils sur son utilisation? –

+0

@David W. David: "vous n'aimez pas l'accès": LOL! c'est comme dire qu'un critique de théâtre n'aime pas les jeux :) Je vais commencer à aimer le moteur de base de données Access quand quelqu'un améliore ses interfaces SQL. "vous êtes hostile à ses outils intégrés" Je ne suis pas "hostile" à la vue SQL d'Access, ça ne marche pas pour moi donc je ne l'utilise pas (ce n'est pas obligatoire!) Ça me semble être le OP pourrait adopter la même approche."Pourquoi continuez-vous à donner des conseils sur l'utilisation?": Je ne suis pas sûr que je le fais. L'interface utilisateur Access semble bien jouer avec SQL Server, qui a des capacités SQL supérieures, donc je recommande SQL Server à la place – onedaywhen

1

Je suis enclin ces jours-ci à stocker des requêtes dans des tableaux. Un formulaire peut être utilisé pour afficher les requêtes et un peu de code suffit pour construire une requête pour les tests, par exemple:

CurrentDb.CreateQueryDef "TempQueryName", Me.SQL 

Il serait, bien sûr, être sage de tester d'abord si la requête existe.

Vous pouvez également DLookUp une telle table pour SQL à utiliser dans le code et pour RecordSource et Control Source.

+1

Haha, comment utiliser Access sans réellement utiliser Access :) – Benjol

Questions connexes