IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modélisation Discussion :

Modifier un champ NumeroAuto avant insertion en fonction du Max [AC-2010]


Sujet :

Modélisation

  1. #1
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 114
    Par défaut Modifier un champ NumeroAuto avant insertion en fonction du Max
    Bonjour, je vous explique mon problème du début.

    En gros j'ai une BDD Access qui est sur un serveur A, et la même BDD sur un serveur B.
    Je suis en train de programmer sur le serveur A un bouton "Exporter" qui me permet de récupérer toutes les données qui ont changées depuis le dernier export, et à l'inverse un bouton Importer sur le serveur B pour récupérer les données du serveur A.

    J'ai aucun problème pour y arriver si il n'y a aucun ajout sur la BDD du serveur B, mais quand c'est le cas, comme toutes mes clés primaires de toutes mes tables sont de type "NumeroAuto", j'ai forcément des problèmes d'ID identiques à l'import.

    Je me heurte donc à un problème, qui en amène un deuxième:
    Quand j'insère de nouvelles données dans la BDD du serveur B, il faudrait que touts les IDs soient supérieures à un certains chiffre, pour éviter les duplications (disons 1 000 000).
    J'essaye de faire ça via une macro de données Avant Modification, mais ce n'est pas possible de récupérer le maximum dans cette macro de données.

    Après, je sais que si j'ajoute une donnée à la main avec un ID de 1 000 000, la prochaine sera directement à 1 000 001.
    Mais ça m'amène à mon deuxième problème: Comme je suis censé faire une migration des BDDs du serveur A au B, quand j'importerais les données à la BDD du serveur B, il ne faut pas que les IDs importés soient aussi à plus de 1 000 000!

    Petites précisions, le code est trop important pour que je modifie chaque INSERT, et les tables sont nombreuses aussi, avec pas mal de liaisons de clés étrangères, ce qui rendrait bien difficile de modifier l'ID juste après une insertion (et surtout pas très performant ^^)

    Je ne vois donc pas trop comment faire, si quelqu'un à une idée...

    Merci d'avance!

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 434
    Par défaut
    Bonjour.

    Tu es un peu mal pris et c'est un problème classique avec les BD distribuée.
    La solution la plus simple serait un accès distant à l'application et pas de synchronisation.

    Si tu ne peux pas, tu peux essayer en changeant la propriété "Nouvelle valeur" de ton champ AutoNum à "Aléatoire".
    Tu vas perdre la numérotation séquentielle de tes enregistrements mais le risque de collision de clef devint minime.

    L'autre possibilité est d'avoir ta propre clef et qui te sert pour tes relations.
    Un truc du genre :

    • CodeBDSource (Texte)
    • ClefAutoDuplique (entier long) (lors de la création des enregistrements tu recopies le autonum).
      Comme c'est une copie il est "gelé" et n'est plus influencé par les transferts dans la table fusionnée,


    Lors de la fusion comme tu as un identifiant de BD tu n'as plus de risque de collision MAIS il faut faire la modif dans toutes tes tables synchronisées et dans tes relations.
    Si tu en as beaucoup, cela peut être un sacré travail.

    Je le réitère : l'accès à distance est VRAIMENT plus simple.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 114
    Par défaut
    Merci pour la réponse, malheureusement l'accès à distance n'est pas possible, parce que les deux serveurs ne sont pas connectés entre eux.
    J'ai déjà demandé si on pouvait pas avoir un espace partagé pour les deux serveurs, mais ce n'est pas possible puisque ceux sur le serveur A n'ont pas accès au serveur B et vice versa (et en plus certaines données/fichiers ne sont pas censées être accessibles sur le serveur B, du coup je ne migre pas tout)

    La partie aléatoire est pas mal, mais il y'a quand même une infime chance que des doublons apparaissent. Après je peux faire du code où je traite le cas des doublons, mais de manière récursive sur toutes les tables ce n'est pas possible puisque certaines tables possèdent cet ID, et qu'il faudrait donc le modifier partout en faisant un cas particulier pour chaque table. Je peux faire un switch qui envoi à une fonction, le nom des tables liés, et le nom du champ correspondant, et qui traitera une par une les UPDATE d'ID. (ça me parait pas trop long à faire, j'attends ton avis sur ce sujet)

    Sinon je suis pas sûr d'avoir compris ta deuxième solution.
    En gros ce qu'il faudrait c'est un champ supplémentaire dans chaque table qui prends la valeur A ou B (pour les deux serveurs), et qui forme une clé primaire avec l'ID de la table?
    Et du coup si j'ai deux fois le même ID, c'est juste la version de serveur qui va différer?

    Si c'est bien ça, j'ai une bonne cinquantaine de table à modifier (et dans les deux serveurs) et la seule modification dans le code ça serait au moment où j'exporte/j'importe

    Merci déjà pour ta réponse, j'attends ton avis sur la première solution et ta confirmation sur la deuxième

    PS: Merci pour le déplacement du sujet, je pensais qu'on était plutôt dans de la programmation de macro que de la modélisation

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 434
    Par défaut
    Bonjour.

    Pour le déplacement ce n'est pas moi.

    L'idée c'est d'avoir :

    • Clef : AUtoNum
    • Tes autres champs
    • CodeServeur
    • CopieClef (Entier Long)


    Et d'utiliser CodeSeveur & CopieClef pour faire tes relations entre les tables.
    Clef ne devient plus qu'une astuce pratique pour obtenir un numéro unique.
    Mais cela peut avoir a pas mal d'impacts sur l'application et pas seulement sur les tables et relations.

    Pour l'accès à distance, je pensais plutôt à un truc du genre LogMeIn (ou Microsoft Remote Desktop) qui permet de se connecter sur une machine de n'importe où dans le monde comme si on était devant le PC.
    J'ai un amis qui faisait cela avec son téléphone portable.

    Pour le risque de collision sur l'aléatoire, il est vraiment vraiment minime. C'est cela que Microsoft utilisait lorsqu'il faisait de la réplication dans les versions antérieures.

    Sinon peux-tu envisager de passer simplement un journal de modif ?
    Un fichier texte où tu noterais les changements pour ensuit les réappliquer par code dans l'un et l'autre des serveurs.

    Il n'y a pas de solution "claquement de doigt" à ton problème, désolé.

    Autre possibilité migrer tes données en MS SQL Serveur dans Azaure le cloud de M$.
    Il y a des coûts et du travail :-( pour cela aussi.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 114
    Par défaut
    Merci encore pour ta réponse.

    Pour l'accès à distance, je pensais plutôt à un truc du genre LogMeIn (ou Microsoft Remote Desktop) qui permet de se connecter sur une machine de n'importe où dans le monde comme si on était devant le PC.
    Le problème de l'accès à distance de cette manière, c'est que je ne peux pas vraiment bloquer une partie des informations et ça empêche en plus que plusieurs personnes utilisent la BDD en même temps (ou alors il faut plusieurs PC mais bon)

    L'idée c'est d'avoir :

    Clef : AUtoNum
    Tes autres champs
    CodeServeur
    CopieClef (Entier Long)


    Et d'utiliser CodeSeveur & CopieClef pour faire tes relations entre les tables.
    Clef ne devient plus qu'une astuce pratique pour obtenir un numéro unique.
    Sinon du coup rajouter deux champs sur chaque table va me demander de modifier quasiment toutes mes requêtes, donc en solution de dernier recours pourquoi pas.

    Sinon peux-tu envisager de passer simplement un journal de modif ?
    Un fichier texte où tu noterais les changements pour ensuit les réappliquer par code dans l'un et l'autre des serveurs.
    Le journal de modif est une bonne idée, mais dans le cas où une ligne qui est présente dans les deux BDD est modifiée des deux côtés, il faut que je puisse demander à l'utilisateur quelle version il préfère garder (ça je l'ai déjà via une table supplémentaire qui note la dernière date de modification de chaque ligne, et j'ai juste à comparer. Jusqu'à maintenant ça fonctionne très bien, sauf dans le cas des doublons justement ).

    Pour le risque de collision sur l'aléatoire, il est vraiment vraiment minime. C'est cela que Microsoft utilisait lorsqu'il faisait de la réplication dans les versions antérieures.
    Du coup je vais me pencher sur cette idée là. Même s'il y a une infime (mal)chance, il ne faut ABSOLUMENT pas que je perde des données entre les deux BDD, donc j'ai créé une petite fonction e matin qui modifie l'ID du doublon et met à jour dans chaque tables liés.

    Je te remercie pour l'aide et je reviens vers toi si j'ai d'autres questions

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 434
    Par défaut
    Bonjour.

    Avec Remote Desktop, tu peux avoir plusieurs personnes sur une seule machine.
    Il faut acheter des licences en conséquence et avoir un machine puissante.

    Pour la restriction d'accès au données, si tu fais déjà un filtre lors de tes transferts, tu devrais pouvoir l'implanter dans tes formulaires et requêtes.

    Bon courage car aucune solution n'est simple.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 114
    Par défaut
    Pour tenir au courant:
    J'ai donc ajouté dans une table qui a une ligne liée à chaque ligne de chaque table de ma BDD, un champ qui me permettais de savoir si la variable venait de la BDD du serveur A ou de la BDD du serveur B. Et quand j'avais un conflit, je déplaçait juste la valeur dans le serveur B pour laisser la place à ma valeur du serveur A.

    Mais le problème arrive:
    Si j'ajoute dans une table à la main une ligne d'ID 7, la prochaine insertion aura pour ID 8, même si le 8 est déjà pris dans la table...

    Je me suis donc rabattu sur la génération d'ID aléatoire en vérifiant tout de même qu'il n'y avait pas de doublon (et cette fois ci je n'ai pas de problème)

    Merci encore pour l'aide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/02/2010, 10h39
  2. Réponses: 2
    Dernier message: 02/02/2009, 17h40
  3. Controles des champs avant insertion dans la base de donnees avec talend
    Par tchanga dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 16/06/2008, 17h56
  4. Modifier un champs texte avec une fonction PHP (calcul TVA)
    Par Stella2809 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/11/2005, 01h55
  5. Ajouter un signe avant résultat en fonction du champ
    Par davyd dans le forum Langage SQL
    Réponses: 10
    Dernier message: 10/03/2005, 12h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo