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

Access Discussion :

Mises à jour difficiles sous ACCESS/SQL


Sujet :

Access

  1. #1
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Mises à jour difficiles sous ACCESS/SQL
    Demoiselle en détresse à cause d'ACCESS...

    Quand je démarre ma query de mise à jour, il me met toujours qu'il ne peut pas ajouter les champs demandés à cause d'une "key violation"
    Quand je démarre une autre requête de mise à jour il me met carrément "numeric field overflow" alors que la première fois il m'avait bien mis une erreur type "key violation" également.
    Le but est de rajouter dans une table (confimation) le résultat de requêtes select :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Confirmation ( Type, Chargement, [Code Pays], [Code Postal], Ville, Cochargement, Tranporteur, Prix ) SELECT [prix Query].[Bulk or Pack], [prix Query].Shipment, [prix Query].[Code Pays], [prix Query].[Postal code], [prix Query].Ville, [prix Query].Cochargement, [prix Query].Transporteur, [prix Query].Prix FROM [prix Query];
    Requête : Prix Query :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT Shipments.Shipment, Shipments.[Postal code], Shipments.Ville, Shipments.Cochargement, Shipments.Transporteur, Prix.Prix, Shipments.[Bulk or Pack], Shipments.[Code Pays] FROM Prix RIGHT JOIN Shipments ON (Prix.Transporteur =
    Shipments.Transporteur) AND (Prix.[Postal Code] = Shipments.[Postal code]) AND (Prix.[Code Pays] = Shipments.[Code Pays]) AND (Prix.Ville =
    Shipments.Ville) AND (Prix.Type = Shipments.[Bulk or Pack]);
    => En tout cela est censé rajouter à la table confirmation les chargements (sans les doublons) avec les prix, attribués au moyen d'une jointure avec le cide postal, le code pays, le transporteur et la ville (parce que des fois il n'y a pas tout) remarque : j'ai mis 0 en valeur par défaut mais il ne l'affiche pas. A priori il existe une fonction nulltozero ou nz qui permettrait de faire ça.
    aucune de mes tables a de null interdit ni de validation rule. Une idée?


    INSERT : MAJ poids
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Confirmation ( [Poids Net] ) SELECT [Poids Query2].[SumOfAvgOfDelivery realized net weight] FROM [Poids Query2];
    Requête : Poids Query2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [poids Query1].Shipment, Sum([poids Query1].[AvgOfDelivery realized net weight]) AS [SumOfAvgOfDelivery realized net weight] FROM [poids Query1] GROUP BY [poids Query1].Shipment;
    Requête : Poids Query1 (pas réussi à les fusionner)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Shipments.Shipment, Shipments.[Delivery number], Avg(Shipments.[Delivery realized net weight]) AS [AvgOfDelivery realized net weight] FROM Shipments GROUP BY Shipments.Shipment, Shipments.[Delivery number];
    => Le résultat de cette requête est:
    query1 : sélectionner tous les shipments qui contiennent des DN (= environ des produits) différentes sans les doublons, car les poids sont donnés par DN et non pas par chargement et on veut le poids par chargement ;
    query2 : ensuite, faire la somme de ces poids pour faire un poids total par shipment; MAJ POIDS: insérer dans la table confirmation, colonne poids, ce poids avec le shipment correspondant.

    Il l'affiche très bien, le problème est comme à chaque fois à l'insertion dans la table ...

    Une idée ?

    Merci d'avance pour votre aide,
    Cream

  2. #2
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Je rectifie, pour MAJ Confimation, il me met key violation, pour l'autre il me met validation rule violation, et non plus numeric overflow depuis que j'ai retiré 0 comme valeur par défaut pour le champs poids net.

  3. #3
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Salut,

    Citation Envoyé par L'aide Access
    J'obtiens un message de violation de clé
    Une violation de clé se produit si :

    · vous tentez d'exécuter une requête qui ajoute, supprime ou met à jour des enregistrements en utilisant une procédure qui viole les règles d'intégrité référentielle des tables associées
    · votre requête essaie d'ajouter ou de mettre à jour des enregistrements contenant des valeurs de clé primaire qui existent déjà dans la table destination.

    Si vous exécutez une telle requête, les enregistrements qui provoquent la violation de clé ne seront pas modifiés.

    Pour modifier les enregistrements qui violent l'intégrité référentielle, vous pouvez supprimer la relation entre les tables concernées ou désactiver l'intégrité référentielle, puis modifier les tables concernées une par une. Cependant, les données résultantes dans les deux tables peuvent alors entrer en conflit. Pour de plus amples informations sur l'intégrité référentielle, cliquez sur .

    Pour de plus amples informations sur la définition et la modification des clés primaires, cliquez sur .
    Citation Envoyé par L'aide Access
    J'obtiens un message de violation des règles de validation
    Une violation de règle de validation se produit si vous essayez de mettre à jour ou d'ajouter des enregistrements qui violent les règles de validation d'un champ ou d'un enregistrement.
    Pour de plus amples informations sur la validation des données, cliquez sur .
    Pour ton problème de violation de clé, vois ce qui est dit dans l'aide sur les clés et les intégrités (si ce n'est déjà fait).

    Pour ce qui est de ta Requete1 et Requete2 (si je n'ai pas fait d'erreurs... ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT Shipments.Shipment, Sum(Shipments.[AvgOfDelivery realized net weight]) AS [SumOfAvgOfDelivery realized net weight]
    FROM Shipments
    WHERE Shipments.[AvgOfDelivery realized net weight]) AS [SumOfAvgOfDelivery realized net weight] = 
    (SELECT Shipments.Shipment, Shipments.[Delivery number], Avg(Shipments.[Delivery realized net weight]) AS [AvgOfDelivery realized net weight]
    FROM Shipments
    GROUP BY Shipments.Shipment, Shipments.[Delivery number];)
    J'ai quand même un doute sur l'alias dans la clause where...

  4. #4
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Salut Kikof,

    Pour le problème de clé il me met dans l'aide : soit c'est un problème d'intégrité référentielle soit un problème de clé primaire.
    L'intégrité référentielle n'est pas activable (en fait j'ai des right ou left join, pour afficher tous les enregistrements de ma table de départ
    (SHIPMENTS) dans les requêtes même s'il manque des renseignements sur l'autre table de la requête, justement pour voir ce qui manque et pouvoir l'ajouter (on fait dans le transit alors les clients, les prix ou les adresses changent très souvent, plus vers l'augmentation que vers la
    diminution))
    Ou les enregistrements à rajouter contiennent des valeurs de clé primaires qui seraient déjà dans la table. Pour ma première table, il me met 1480 (= la totalité de ceux qu'il veut rajouter) en key violation alors que dans ma table de départ je n'en ai que 1421 (sachant que les SELECT DISTINCT ont normalement enlevé les doublons au niveau du Shipment (ou Chargement) qui est clé primaire).
    Cela me parait donc très étrange.

    C'est encore plus vague pour la validation rules violation puisque je n'ai pas de validation rules appliquées (et j'ai regardé dix fois l'aide sans grand succès) Aucune règle de validation et j'ai bien vérifié que les formats des données de départ étaient les mêmes que ceux d'arrivée.
    Sinon, il me fait de temps en temps numeric field overflow : "The data in a Btrieve field is too large to represent in your application." (alors que la fois d'avant il le faisait bien).
    => ... sans que j'ai rien changé dans ma requête. Là j'avoue que je ne comprends pas quelqu'un peut m'éclairer sur la signification de ce message?
    Est-ce que ça pourrait être dû à un problème de mémoire ? parce que je ne vois que ça pour que ça change (l'appli est destinée à être utilisable par tous les utilisateurs et se situe pour ça sur un disque de partage). Un index pourrait-il résoudre le problème (je n'ai jamais vraiment bien compris comment ça marchait) Oui parce qu'en plus je travaille sur un logiciel en version anglaise alors déjà que c'est pas forcément clair en français .... o_O et je n'ai pas internet au travail pour aller voir ce que ça veut dire ce qui complique encore plus ma tâche (je dois passer mes messages par mail à quelqu'un qui a internet pour qu'il les poste sur le forum ) Est-ce que vous pensez que ça peut être du à des valeurs vides de champs ou à des relations bizarres? S'il y a besoin de plus de précisions, je suis prête à en donner

    Pour ta requête, j'avais essayé un truc dans le genre, mais je pense avoir oublié de préciser le champ au début ... avec ta syntaxe (copier coller de ma deuxième requête entre parenthèses + rajout de la ligne WHERE Shipments.[AvgOfDelivery realized net weight]) AS [SumOfAvgOfDelivery realized net weight] = et il me marque qu'il y a une parenthèse (à priori fermante) de trop dans l'expression.
    Voilà ce que j'essaie de lui faire digérer ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT Shipments.Shipment, Sum(Shipments.[AvgOfDelivery realized net weight]) AS [SumOfAvgOfDelivery realized net weight] FROM Shipments WHERE Shipments.[AvgOfDelivery realized net weight]) AS [Delivery net weight] = (SELECT Shipments.Shipment, Shipments.[Delivery number], Avg(Shipments.[Delivery realized net weight]) AS [AvgOfDelivery realized net weight] FROM Shipments) GROUP BY Shipments.Shipment, Shipments.[Delivery number];
    M'enfin, pour les requêtes ce n'est pas trop trop grave puisque séparément elles fonctionnent bien. Ce qui est génant c'est que l'on ne puisse pas enregistrer l'information, alors qu'il l'affiche sans problème.

    Surtout n'hésitez pas à me demander si quelque chose n'est pas clair, je sais que ça fait beaucoup d'un coup.
    Merci!

  5. #5
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Presque résolu.
    Re,

    Le problème était du à un prix déterminé par un trop grand nombre de variables. cela faisait trois relations à mettre pour avoir un prix, j'ai du donc changer un peu la base en mettant un champ ID qui faisait référence à chaque prix.
    Un autre problème m'arrive : Je n'arrive plus à ce qu'il enregistre dans ma table le champ prix total comme la somme de [Prix] et de [various costs]. Les trois appartiennent à la même table, et sont des réels doubles en monétaire.
    c'est tout bête, mais j'arrive bien à l'afficher sur un formulaire en mettant la formule [prix]+[various costs] mais pas dans une requête.
    C'est assez ennuyeux qu'il ne retienne pas les bons résultats alors qu'il peut les montrer

  6. #6
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Salut Cr€@m
    Je n'arrive plus à ce qu'il enregistre dans ma table le champ prix total
    C'est effectivement assez ennuyeux. Mais as tu réellement besoin de conserver cette donnée ? Parce que par convention, on ne garde jamais des calculs dans une table. Vu qu'une requête peut les calculer et un formulaire/état les afficher.
    (bon j'avoue quand même que ça m'est arrivé une fois de devoir enregistrer un résultat dans une table. Je n'avais pas le choix. (trop de calcul, trop de données calculées de manipulé.. bref la galère...)

Discussions similaires

  1. Mise à jour automatique sous Access 2003.
    Par RicoNico dans le forum Access
    Réponses: 1
    Dernier message: 28/12/2011, 14h55
  2. [AC-2007] mise à jour d'une table SQL server depuis MS Access
    Par avalenza dans le forum Projets ADP
    Réponses: 1
    Dernier message: 10/02/2010, 20h04
  3. pb de mise à jour différée avec ACCESS, ADO et DELPHI 7
    Par QAYS dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/01/2006, 08h15
  4. Formulaire et mise à jour du sous-formulaire
    Par ana2sb dans le forum Access
    Réponses: 1
    Dernier message: 23/09/2005, 11h39
  5. Automatiser la mise à jour de la bD SQL SERVER from Access
    Par Nadaa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/11/2003, 15h23

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