2010-07-25 4 views
0

J'ai une table qui contient plusieurs centaines d'enregistrements mais j'ai une propriété spéciale. Je veux seulement que l'utilisateur puisse sélectionner cette propriété 50 fois cependant. Comment puis-je définir une limite et renvoyer une erreur lorsque la limite est atteinte?Définition d'une limite d'enregistrement maximale en accès

+0

Une table userID SpProperty est-elle une possibilité pour vous? – Fionnuala

Répondre

0

select top 50 * de ...

+0

Il obtient les éléments mais il ne s'arrête pas à 50 – muckdog12

0

Je crois que ce Renick voulait dire était avant votre opération de sauvegarde que vous pourriez faire quelque chose comme

SELECT Count(*) 
FROM tblFoo 
WHERE Bar=’Thing_you_only_want_50_of’ 

alors vous vérifier si ce chiffre est supérieur ou égal à 50, si c'est alors retourner une erreur et ne pas laisser l'utilisateur sauvegarder. Autant que je sache, il n'y a aucun moyen de restreindre cela au niveau de DB mais l'accès 2010 a plus de contrôles tels que les déclencheurs etc. Pas sûr quelle version vous utilisez mais si vous êtes sur 2010, il pourrait être utile de vérifier out

+1

"Autant que je sache, il n'y a aucun moyen de restreindre cela au niveau DB" - voir la réponse que je viens de poster sur les contraintes 'CHECK'. – onedaywhen

0

La question est très floue. Il n'est pas clair si «sélectionner» signifie «afficher limité à 50 éléments» ou «permettre à l'utilisateur de créer des enregistrements de données limités à 50 éléments». Je ne parlerai pas de la première interprétation, car cela ne me semble pas pertinent. En supposant que certaines autres choses, comme un backend Jet/ACE (la seule façon dont la question a du sens pour moi), comment vous accomplir cela dépend de votre version d'Access.

  1. jusqu'à et y compris Access 2007: vous devrez appliquer la limitation dans l'interface utilisateur de votre application. EDIT: Comme @onedayqui l'a souligné dans sa réponse, il est possible d'utiliser DDL en mode SQL 92 pour ajouter une CHECK CONSTRAINT qui fonctionne sur l'enregistrement en cours basé sur des groupes d'autres enregistrements. Je ne savais pas que c'était possible quand j'ai posté.

  2. Dans Access 2010, vous pouvez utiliser les nouvelles macros de données de niveau table (qui fonctionnent comme des déclencheurs) et limiter l'utilisateur aux 50 sélections.

Je ne fournis pas de détails pour l'un ou l'autre de ces éléments, car il n'y a tout simplement pas assez d'informations pour le faire.

+1

"jusqu'à et y compris Access 2007: vous devrez appliquer la limitation dans l'interface utilisateur de votre application" - incorrect. Le plus simple est d'utiliser une contrainte 'CHECK'; plus compliqué est d'ajouter une colonne de séquence, des règles de validation et des contraintes composées 'UNIQUE'. Voir ma réponse juste posté. – onedaywhen

2

Pour ajouter à @Kevin Ross, le mécanisme "au niveau DB" pour appliquer la règle est une contrainte CHECK.

ALTER TABLE tblFoo ADD 
    CONSTRAINT tblFoo_bar__50_limit 
     CHECK (NOT EXISTS (
         SELECT T1.Bar 
          FROM tblFoo AS T1 
          WHERE T1.Bar = 'Thing_you_only_want_50_of' 
          GROUP 
          BY T1.Bar 
         HAVING COUNT(*) > 50 
         )); 

CHECK contraintes existent dans Jet de la version 4.0 (vers Access 2000) et existe toujours dans ACE (par exemple Access 2010).

Vous devez créer la contrainte CHECK à l'aide de SQL DDL dans ANSI-92 Query Mode. Non, vous ne pouvez pas créer des contraintes CHECK en utilisant DAO ou l'interface d'accès mais cela ne signifie pas qu'elles n'existent pas;)

Si pour une raison quelconque vous avez une objection philosophique à SQL DDL, vous pourriez faire des choses similaires avec une colonne 'sequence' supplémentaire, des règles de validation au niveau des lignes et une contrainte composée UNIQUE, qui peuvent toutes être créées à l'aide de DAO ou de l'interface d'accès et sont disponibles dans Jet depuis plusieurs années.

Voici une esquisse de ce que cette approche alternative pourrait ressembler à:

ALTER TABLE tblFoo ADD 
    Bar__sequence INTEGER; 

ALTER TABLE tblFoo ADD 
    CONSTRAINT tblFoo_bar_sequence__values 
     CHECK (
      (
       Bar <> 'Thing_you_only_want_50_of' 
       AND Bar__sequence IS NULL 
      ) 
      OR (
       Bar = 'Thing_you_only_want_50_of' 
       AND Bar__sequence BETWEEN 1 AND 50 
       ) 
      ); 

ALTER TABLE tblFoo ADD 
    CONSTRAINT tblFoo_bar__50_limit 
     UNIQUE (Bar__sequence); 

Dans ce cas, les résultats des trois instructions SQL DDL ci-dessus peuvent être obtenus en utilisant le Concepteur de table dans l'interface utilisateur Accès-à-dire ajouter la colonne, modifiez la règle de validation de table et ajoutez un index unique.

+0

Eh bien, c'est nouveau pour moi. Je ne savais pas que Jet/ACE supportait ce genre de contrainte. C'est dommage que MS n'expose pas cela dans l'interface utilisateur Access, ni ne l'implémente dans DAO. Vous pouvez obtenir la valeur de toutes les contraintes via DAO en examinant la propriété CheckConstraints d'un TableDef. Cela impliquerait que vous pouvez créer une CheckConstraint en créant cette propriété et en lui affectant une instruction valide, mais cela ne semble pas fonctionner de cette façon, malheureusement (juste essayé). Apparemment, toutes les données pertinentes sur CheckConstraint ne sont pas stockées dans la propriété par ce nom. –

+0

tblFoo_bar__50_limit: 'CHECK ((SELECT Count (Barre) FROM tblFoo O WH Bar =" Thing_you_only_want_50_of ") <= 50)' – HansUp

+0

@HansUp: En effet, il y a plus d'une façon de skinner le chat;) – onedaywhen

Questions connexes