[access]interdire doublons encodage formulair

alain105d -  
 Utilisateur anonyme -
Bonjour à tous,
Voila mon problème,j’ai un projet en cours sur une location d’appartements(en access 2000) ,j’ai un formulaire client qui a un sous formulaire location
Dans le SF location j’ai les champs [date d’entrée] [date de sortie] [nom chalet] …
Après une réservation les données sont ajoutées à une table archive(puis effacées dans le SF location).
Je voudrais interdire l’encodage d’une date d’entrée déjà existante (dans table archive) pour un même chalet mais autoriser la date si c’est pour un autre chalet.
J’ai réussi à interdire quand la date est dans la table archive mais pas en associant l'appartement.
Quelqu’un a une idée ?
Merci de votre aide

7 réponses

  1. zenon Messages postés 729 Statut Membre 180
     
    Tu peux faire la même chose en VB sans être limité par le nombre de caractères.

    La fct DCount est effectivement une bonne idée.
    Tant pis pour la structure...
    1
  2. zenon Messages postés 729 Statut Membre 180
     
    Pourrais-tu en dire plus quant à la structure de tes tables?

    Je ne trouve pas logique de déplacer les enregistrements d'une table à l'autre.

    Ne serait-il pas plus simple d'extraire les dates libres à l'aide d'une requête pour n'afficher que les chalets libres.

    Si tu fais de la location saisonnière comme la dénomination "chalet" me le fait penser (à moins que tu ne sois Suisse? (lol)) ne penses-tu pas illogique de faire d'un formulaire "client" le formulaire principal? ne serait-il pas plus simple de partir d'un tableau affichant tous les chalets libres par date puis, une fois le choix du chalet et de la date effectués d'encoder les données du client...

    Je ferais une table "chalets" reprenant la description des chalets,
    une table "location" reprenant les dates de location, une clé externe N°de client et une clé externe N°de chalet et une table "clients" reprenant les coordonnées des clients.

    A mon avis avec ça tu as tout;
    0
  3. alain105d
     
    Bonjour
    Merci d’avoir répondu
    Je suis d’accord ,les tables chalet client et location sont faites comme ca
    Je déplace les enregistrements de la table location pour les archivés dans une autre table.
    Le formulaire location reprend chaque client avec le chalet qu’il loue les dates entrée ,de sortie, les charges et le prix a payer
    Moi je voulais que la personne qui encode les dates de la location ne puisse pas encoder une date qui existe déjà pour un chalet ,normalement elle se base sur la table archive pour voir les date occupées mais si elle se trompe elle fera une deuxiéme reservation ?
    Je ne sais pas si j’ai bien explique mon probléme
    Merci
    0
    1. Utilisateur anonyme
       
      salut, comme l'a dit zenon, tu as 1 pb de structure...

      sinon, si tu es "obligé" de faire avec, regarde la fonctin dcount, elle te permettra de regarder si 1 date est déja saisie.
      0
  4. zenon Messages postés 729 Statut Membre 180
     
    Je pense avoir bien compris, mais si tu laissais tous les enregistrements dans la même table, ce serait plus facile de n'afficher dans le formulaire dans lequel tu encodes les nouvelles locations que les périodes libres.

    On pourrait par exemple créer un formulaire principal reprenant les chalets avec un sous-formulaire affichant les périodes disponibles et/ou un formulaire de recherche par dates affichant tous les chalets libres à la période voulue. On pourrait ajouter d'autres critères comme la capacité d'accueil...

    Si les locations sont encodées dans une table distincte, ce n'est plus possible. On peut tout au plus écrire une procédure VB pour vérifier si le chalet est libre et afficher un message d'erreur si ce n'est pas le cas.

    En fait, dès qu'une période est réservée, elle disparait des possibilités de location et si on veut afficher toutes les réservations, il suffit d'appliquer une requête sélection à la table pour n'afficher que les enregistrements où les dates ne sont pas Null. Comme la table contient une référence au N°de chalet et au N°Client toutes les données peuvent être retrouvées et on n'a pas besoins d'une table archives.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. alain105d
     
    Merci de vos réponse
    J'essaie de resoudre le prob sans changer ma structure ,pour moi toute les dates sont libres sauf celle dans ma table archive
    Je pensais faire une macro qui compare la date d'entrée et le chalet que l'on entre dans le formulaire et les comparer au enregistrement dans la table archive.
    J'ai utilisé la condition
    CpteDom("[Date d'entrée]";"Archive dates";"[Date d'entrée]=Forms![CLIENTS+ SFormulairelocation]![LOCATION Sous-formulaire1]![Date d'entrée]")>0
    action bte message
    dans la macro pour savoir si la date est déja prise cela fonctionne mais si j'essaie d'ajouter la condition pour le chalet je n'est pas assez de caractere (texte trop long)
    une idée?
    Merci
    0
  7. alain105d
     
    Bonjour,
    Je crois que le VB est la meilleur solution ,mais comme je n’y connais pas grand chose en prog j’ ai converti ma macro ,qui fonctionne seulement avec les dates ,en VB
    Mais je n’arrive pas a la transformer avec le deuxième critère le nomchalet
    Voila ma macro convertie sans modif
    Si quelqu’un a une idée
    Merci

    Option Compare Database

    '------------------------------------------------------------
    ' verification_doublon_date
    '
    '------------------------------------------------------------
    Function verification_doublon_date()
    On Error GoTo verification_doublon_date_Err

    If (DCount("[Date d'entrée]", "Archive dates", "[Date d'entrée]=[Formulaires]![CLIENTS+ SFormulaire]![LOCATION Sous-formulaire1]![Date d'entrée]") > 0) Then
    Beep
    MsgBox "attention doublon", vbOKOnly, ""
    End If

    verification_doublon_date_Exit:
    Exit Function

    verification_doublon_date_Err:
    MsgBox Error$
    Resume verification_doublon_date_Exit

    End Function
    0
    1. Utilisateur anonyme
       
      Bonjour,

      il te faut rajouter un AND dans ta condition.

      
      If (DCount("[Date d'entrée]", "Archive dates", "[Date d'entrée]=[Formulaires]![CLIENTS+ SFormulaire]![LOCATION Sous-formulaire1]![Date d'entrée] AND nomchalet=form!location!blabla") > 0) Then 
      
      0
  8. alain105d
     
    Merci beaucoups
    Ca marche
    J'avais essayé avec and mais pas avec cette syntaxe.
    Salut
    0
    1. Utilisateur anonyme
       
      Pas de mal, et bonne continuation !

      0