Page 1 sur 1

[Résolu][Base] Intercepter l'erreur "Violation d'intégrité"

MessagePublié: 02 Fév 2010 11:38
par jerome bourgeois
Bonjour,

Ce projet est en fait une maquette dans le cadre d'une migration OpenOffice pour remplacer des "usines à gaz" excel (d'après les utilisateurs)... qui géraient le suivi des heures avec des tableaux croisés dynamiques.

C'est vrai que le développement a été influencé par l'existant comme vous pourrez le voir.

J'ai réutilisé pour ce programme mes macros de la base Comptoir http://user.services.openoffice.org/fr/forum/viewtopic.php?f=26&t=18473.

Sinon, tout fonctionne pratiquement à base de requêtes dynamiques...
On aurait pu fonctionner différemment à base de sous-formulaires et dans les macros avec des resultsets notamment pour éviter les sous-requêtes... Mais bon...

Seul point noir... allez, gris...
Je n'ai pas réussi à intercepter le message d'erreur du datagrid en cas de violation de l'intégrité référentielle :
suiviHeures.png


J'aurais préféré le remplacer par une msgbox plus sympa style " Ce participant est déjà dans ce projet à la date choisie !" et pourquoi pas même terminer en donnant le focus à l'enregistrement en question... Je ne sais pas si c'est possible, je n'ai pas creusé la question mais sûrement...

Si quelqu'un a la solution? je suis preneur évidemment !

Cordialement,

Jérôme

P.S. Nécessite le sun report builder...

Re: [Base]Gestion suivi des Heures

MessagePublié: 02 Fév 2010 16:58
par DLE
Bonjour,

Au niveau du formulaire "Standard" j'ai associé la macro "ErreurSurvenue" à l'événement de même nom.

En espérant t'avoir aidé.

A+

Re: [Base]Gestion suivi des Heures

MessagePublié: 02 Fév 2010 18:25
par jerome bourgeois
Ben, j'suis content de t'avoir rencontré aujourd'hui !!!! ;-)

Incroyable, j'avais essayé d'intercepter l'erreur au niveau du datagrid, au niveau de la zone de liste de la colonne et pas pensé au formulaire !!!
Génial... Je me penche sur le focus... dès que j'ai un peu de temps !

A bientôt ;-) et encore meci !

Re: [Base]Gestion suivi des Heures

MessagePublié: 02 Fév 2010 22:24
par jerome bourgeois
@DLE : Pour ce qui est du message en double, ce qu' en dit en effet xray c'est que deux erreurs sont émises, une par le controller et une par le component... Enfin de ce que j'en ai compris ;-) Faut pas m'en demander plus !

Code : Tout sélectionner   AgrandirRéduire
Sub ErreurSurvenue(evt as Object)

   Dim Msg As String
   
   REM le message apparaît deux fois !?
'   xray evt.source.getSupportedServiceNames()
   REM On n'intercepte que celle émise par le component....
   if instr(1,evt.Source.Dbg_SupportedInterfaces,"com.sun.star.comp.forms.ODatabaseForm") Then
   REM On aurait pu faire l'inverse et n'intercepter que elle émise par le controller
'   if instr(1,evt.Source.Dbg_SupportedInterfaces,"com.sun.star.form.FmXFormController") Then
      if instr(1,evt.Reason.NextException.message,"Duplicate") then
         Msg = Msg & chr(13) & "l'enregistrement existe déjà!"
      else
         Msg = Msg & chr(13) & evt.Reason.NextException.message
      end if
      msgBox Msg
   end if

End Sub


@ceux que ça intéresse : Sinon, on peut se servir des variables static (révision)

Code : Tout sélectionner   AgrandirRéduire
Sub ErreurSurvenue(evt as Object)

   REM Emploi d'une variable statique pour empêcher l'erreur de s'afficher deux fois sans que l'on en comprenne la raison

   Dim Msg As String
   Static i As Integer

   if i=0 Then
      if instr(1,evt.Reason.NextException.message,"Duplicate") then
         Msg = Msg & chr(13) & "l'enregistrement existe déjà!"
      else
         Msg = Msg & chr(13) & evt.Reason.NextException.message
      end if
      msgBox Msg
      i = i + 1
   else
      i = i - 1
   end if

End Sub


C'est tout pour aujourd'hui !

La version sur le premier post de ce fil est à jour, mais la correction par DLE est tout aussi valable ! ;-)
Encore merci à lui...