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

WinDev Discussion :

Erreur de contrainte d'intégrité référentielle [WD15]


Sujet :

WinDev

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    914
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 914
    Points : 1 496
    Points
    1 496
    Par défaut Erreur de contrainte d'intégrité référentielle
    Bonsoir
    Quand je copie un enregistrement entre 2 bases Client/Serveur situées sur le même serveur, je n'ai pas de problêmes.
    Mais quand les bases sont sur des serveurs différents, j'obtiens cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Erreur à la ligne 49 du traitement Procédure globale CopiarRegistro.
    Vous avez appelé la fonction HCréationSiInexistant.
    La contrainte d'intégrité référentielle <HHAHHA_1> lie deux fichiers
    situés sur des serveurs HyperFileSQL différents.
    Cela n'est pas autorisé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    PROCEDURE CopiarRegistro(CnxDestino est une Connexion, FicheroDestino, CnxOrigen est une Connexion, FicheroOrigen, sClavePrincipal, ValorID, bEliminar est un booléen)
     
     
    sFicheroINI est une chaîne = ".\CONFIG.INI"
    sSeccion est une chaîne = "VARIABLES"
    //sProviderOrigen est une chaîne
    //sProviderDestino est une chaîne
    //sDatosOrigen est une chaîne
    //sDatosDestino est une chaîne
    sRegistros est une chaîne
     
     
    // Désactiver les règles d'intégrité sur tous les fichiers de l'application
    HGèreIntégrité("*", "*", hCardinalité + hEnModification + hEnSuppression, Faux)
     
     
    // Déclaration de l'alias
    sdFicheroDestino est une Source de Données
     
     
    // Création de l'alias
    SI HAlias(FicheroOrigen, sdFicheroDestino)= Vrai ALORS
     // Si le fichier sFicheroCopia.FIC est dans un autre répertoire, il faut ajouter :
     // Connexion à la base HyperFileSQL Client/Serveur.. connexion définie dans l'analyse
     // Si la base HyperFileSQL Client/Serveur est accessible, on travaille avec les données en mode Client/Serveur
     SI HOuvreConnexion(CnxDestino) = Vrai ALORS
      SI HChangeConnexion(sdFicheroDestino, CnxDestino) ALORS
       // CONEXION CORRECTA
       SI PAS HChangeNom(sdFicheroDestino, FicheroDestino) ALORS
        Erreur("Error de conexión a "+FicheroDestino)
       FIN
       SI PAS HCréationSiInexistant(sdFicheroDestino) ALORS
        Erreur("Error al crear el fichero: "+FicheroDestino)
       SINON
        //info(FicheroDestino+" Fichero creado.")
       FIN
      SINON
       HErreurInfo()
      FIN
     SINON
      Erreur("¡Servidor de Datos alternativo "+CnxDestino..Serveur+" no disponible!")
      sRegistros=fChargeTexte("REMOTE.TXT")
      sRegistros=sRegistros+FicheroOrigen+TAB+sClavePrincipal+TAB+ValorID+RC
      fSauveTexte("REMOTE.TXT", sRegistros)
      // Annulation de l'alias
      HAnnuleAlias(sdFicheroDestino)
      //HFermeConnexion(CnxDestino)
      // Activer les règles d'intégrité sur tous les fichiers de l'application
      HGèreIntégrité("*", "*", hCardinalité + hEnModification + hEnSuppression, Vrai)
      RETOUR
      //Erreur(HErreur(hErrMessage))
     FIN
     HFerme(sdFicheroDestino)
     HChangeNom(sdFicheroDestino,FicheroOrigen)
     // Pour filtrer les enregistrements copiés, ajoutez une fonction HFiltre ici
     //hfiltre(FicheroOrigen,sClavePrincipal,ValorID,ValorID)...
     HLitRecherchePremier(FicheroOrigen, sClavePrincipal, ValorID)
     //SI val(ValorID)=0 ALORS
     // Erreur("Clave vacía: no se puede hacer la copia en el Servidor alternativo.")
     //SINON
      HLitRecherchePremier(sdFicheroDestino, sClavePrincipal, ValorID)
      SI HTrouve(sdFicheroDestino) ALORS
       SI bEliminar=Vrai ALORS
        //MaTrace(ValorID+" Eliminado en "+CnxDestino..BaseDeDonnées+" de "+CnxDestino..Serveur)
        SI PAS HSupprime(sdFicheroDestino) ALORS
         Erreur(ValorID+" no se ha suprimido.")
        FIN
       SINON
        SI HCopieEnreg(sdFicheroDestino, FicheroOrigen, hCopieIdAuto + hValDéfaut) ALORS
         //MaTrace(ValorID+" Modificado en "+CnxDestino..BaseDeDonnées+" de "+CnxDestino..Serveur)
         SI PAS HModifie(sdFicheroDestino) ALORS
          Erreur(ValorID+" no se ha modificado.")
         FIN
        SINON
         // Erreur sur la fonction HCopieEnreg // Affichage d'un message d'erreur
         Erreur(ValorID+" Imposible modificar el Registro.")
        FIN
       FIN
      SINON
       SI bEliminar=Vrai ALORS
        // NO PROCEDE
       SINON
        SI HCopieEnreg(sdFicheroDestino, FicheroOrigen, hCopieIdAuto + hValDéfaut) ALORS
         //MaTrace(ValorID+" Añadido en "+CnxDestino..BaseDeDonnées+" de "+CnxDestino..Serveur)
         SI PAS HAjoute(sdFicheroDestino,hFixeIdAuto) ALORS
          Erreur(ValorID+" no se ha añadido.")
         FIN
        SINON
         Erreur(ValorID+" Imposible añadir el Registro.")
        FIN
       FIN
      FIN
     //FIN
    SINON
     // Erreur sur la fonction HAlias
     // Affichage d'un message sur l'erreur
     Erreur("Detalle del Problema " + HErreurInfo())
    FIN
    // Annulation de l'alias
    HAnnuleAlias(sdFicheroDestino)
    //HFermeConnexion(CnxDestino)
    // Activer les règles d'intégrité sur tous les fichiers de l'application
    HGèreIntégrité("*", "*", hCardinalité + hEnModification + hEnSuppression, Vrai)
    Je vous remercie d'avance si vous avez une idée pour résoudre la difficulté.

  2. #2
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 327
    Points : 3 840
    Points
    3 840
    Par défaut
    Bonjour,

    Je n'ai pas pratiqué ce que tu fais mais j'ai 2 remarques

    1) Le message d'erreur intervient dans le SINON indiquant que la connexion au serveur ne s'est pas faite

    2) Tu fais un HGèreIntégrité(..) en l. 14 avant de savoir si la connexion au serveur va se faire, et si la connexion ne se fait pas, tu remets les contraintes.
    Est-ce que ça ne serai pas mieux d'annuler les contraintes que si la connexion est ok ?

  3. #3
    R&B
    R&B est déconnecté
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2005
    Messages : 571
    Points : 1 263
    Points
    1 263
    Par défaut
    Bonjour

    Prenons le problème autrement.
    Vous effectuez des écritures en base avec le contrôle d'intégrité activé.
    Ces écritures sont soumises à intégrité et le contrôle est donc déclenché.
    la question est simple : qui fait le contrôle ?
    L'OS ? non
    Votre applicatif ? non, vous utiliser une connexion à un serveur HFSQL client/serveur.
    Le fichier ? non

    Le contrôle est effectué par le serveur HFSQL pour votre connexion.
    Quand vous travaillez au sein d'un serveur sur une ou plusieurs bases, le serveur sait résoudre les chemins et donc l'intégrité en fonction de ce que votre connexion peut voir.
    Vous avez réussi parce que vous êtes dans un cas particulier : le même utilisateur peut accéder aux deux bases.

    Maintenant, pour une base sur un serveur différent la résolution ne peut se faire car le premier serveur ne sais résoudre l'accès aux fichiers de l'autre serveur et ne peut effectuer le contrôle.

    Je vous invite donc à éviter à tout prix toute forme d'intégrité entre des fichiers de bases différentes. La frontière existe et se justifie par votre exemple.
    Une solution consiste alors à débrancher ce contrôle et effectuer les contrôles par programmation (respect des cardinalités pour chaque enregistrement modifié dans le fichier lié)

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    914
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 914
    Points : 1 496
    Points
    1 496
    Par défaut
    Merci tous deux pour vos conseils.
    En effet Windev ne permet pas la gestion d'intégrité entre 2 serveurs.
    L'erreur, je pense, viens du fait que j'avais auparavant ouvert les 2 conexions et déjà créer les fichiers.
    Donc j'ai supprimés les lignes 32 a 34 et celles qui contienent HGèreIntégrité
    Et là ça marche.

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

Discussions similaires

  1. Contraintes d'intégrité référentielle
    Par Jenesépa dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/02/2011, 16h39
  2. [8i] Contraintes d'intégrité référentielles
    Par apersonnat dans le forum Administration
    Réponses: 4
    Dernier message: 03/09/2010, 07h48
  3. Phpmyadmin et contraintes d'intégrité référentielle ?
    Par Jiraiya42 dans le forum Requêtes
    Réponses: 28
    Dernier message: 22/02/2008, 10h31
  4. Réponses: 10
    Dernier message: 24/09/2006, 14h08
  5. Réponses: 5
    Dernier message: 26/10/2005, 14h43

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