Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1
Bonjour,
Dans une DataWindow dont la clé est saisissable (CODE), je souhaiterai afficher à l'utilisateur la valeur de la clé qui est en double en cas de saisie de doublon.
Je m'explique, actuellement c'est à l'enregistrement de la DataWindow qu'on obtiens une Exception "Duplicate Key", mais malheureusement, cela n'indique pas quel est la valeur qui est en double.
Avez vous un moyen d'obtenir cette information ou de gérer les doublons d'une manière "plus propre".
Je ne peux pas ajouter un clé auto increment. C'est le but de ma base de données d'être unique sur ce code.
Merci de votre aide.
Dernière modification par eric69 (28-01-2013 10:41:20)
Hors ligne
Bonjour,
eric69 a écrit:
'on obtiens une Exception "Duplicate Key", mais malheureusement, cela n'indique pas quel est la valeur qui est en double.
tu as plusieurs clés dans ta table ?
Hors ligne
Peut importe je dirais mais oui cela m'arrive que ma clé primaire soit constitué de plusieurs code.
Hors ligne
Bonjour,
la valeur en double, c'est celle saisie par l'utilisateur (le CODE), non ?
Tu as beaucoup de solution pour gérer ce cas et ça dépend des technologies (tout en PB natif, emploi d'un framework,...) employées pour développer.
De manière simple, tu peux toujours effectuer une recherche (SELECT CODE FROM TaTable INTO :var WHERE CODE = :CodeSaisi USING :Transaction et ensuite tester le SQLCode de la Transaction) dans l'évènement qui précède l'UPDATE (UpdateStart() ou autre si tu as un framework) et si tu trouves le CodeSaisi, c'est qu'il existe déjà en DB et alors ne pas autoriser l'UPDATE.
Tu peux aussi exploiter l'évènement DBError().
Hors ligne
Salut,
tu peux par exemple à l'itemchanged du champ checker si il existe déjà dans la DB et / ou dans la DW et tu donnes une message si c'est le cas.
Hors ligne
A l'ItemChanged() c'est un peu dangereux car la clé n'existera peut être pas à ce moment mais entre l'ItemChanged() et l'Update() (le temps de terminer la saisie et de sauver), la clé pourrait avoir été créée par un autre utilisateur.
Hors ligne
En fait, je veux pas obligatoirement un truc super "sexy".
Si déjà à l'enregistrement au lieu de me dire juste qu'il y a une clé en double, il me disais qu'elle est la valeur en double ca serait bien.
Je n'ai pas de FrameWork et je suis avec une base SQL Serveur.
Sinon, oui, je pourrais parcourir dans l'update start, les lignes qui ont été modifié ou supprimé et vérifier en BDD et dans la datawindow si elle existe.
Mais j'ai un peu peur des temps de réponse.
Me contenter de dire à l'enregistrement quel est le problème (et surtout ne rien enregistrer même ce qui a marché avant) m'irait trés bien.
Hors ligne
eric69 a écrit:
En fait, je veux pas obligatoirement un truc super "sexy".
Si déjà à l'enregistrement au lieu de me dire juste qu'il y a une clé en double, il me disais qu'elle est la valeur en double ca serait bien.
Je n'ai pas de FrameWork et je suis avec une base SQL Serveur.
je te suggère de faire comme l'indiquait Geo, se surcharger l'event DBError ainsi tu as la main sur le message et tu laisses la base de données vérifier à ta place :-p.
Hors ligne
Tu as une idée de ce que je peux mettre dans DBError ? car pour l'instant la base de données (même dans l'éditeur SQL) me jette certe mais sans me dire la clé qui pose problème
J'essai avec un collègue de mettre un Trigger avant pour envoyer une erreur plus parlante mais je ne suis pas sur que cela soit la bonne solution
Hors ligne
l'event DBError (en pb 11.5 du moins) indique entre autre "row" à la quelle l'erreur est intervenue.
Il est donc possible de gérer un ROLLBACK sur l'ensemble de l'Update et de renvoyer un message d'erreur contenant les valeurs des champs qui font partie de la clée primaire à la ligne 'row'.
On fait çà chez nous pour les valeurs "out of range".
Hors ligne
Ok, je vais essayer, ca a l'air bien
Je me pose juste une question si la ligne est dans le tampon Filtre.
Exemple : Je saisis une ligne, je filtre ma datawindow, elle n'apparait plus à l'écran mais à l'enregistrement, elle est tout de même enregistré.
Hors ligne
J'avais pas vu qu'il y avait le Buffer en parametre.
Je crois que j'ai tout ce qu'il me faut.
Merci
Hors ligne
Oups, derniere petite question, avant de mettre à résolu.
Dans mon DBError de ma DW, j'affiche un message d'erreur mais il y a avant un message d'erreur qui est généré par l'Update.
J'ai essayé tous les codes retour dans le DBError mais rien ne change;
D'un coté, le message d'erreur automatique se produit avant de rentrer dans le DBError.
Vous savez comment le désactiver ? Je suis en PB 11.5
Hors ligne
En fait, le return me permet bien d'éviter un 3ème message d'erreur mais je ne sais pas comment éviter le premier qui est lancé au moment de l'Update.
Quelqu'un sais comment faire ?
Hors ligne
y viendrait pas d'autre par ton message d'erreur (genre itemError ptêtre) ?
Hors ligne
tu as décoché "extend ancestor script" sur DBError ?
Hors ligne
Bonjour,
Cela fonctionne, il fallait effectivement décoché "extend ancestor script".
Une fois de plus, vous avez eu réponse à tout.
Merci pour vos réponses
Hors ligne
Pages: 1