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

Bases de données Delphi Discussion :

problème de relation maitre detail


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut problème de relation maitre detail
    Bonjour,

    j'ai un problème qui me prend la tête depuis pas mal de temps.
    Voilà, j'ai deux tables, disons: tblContactsPro et tblEvenement


    je veux mettre ces tables en relations maitre détail avec:
    tblEvenement
    mastersource = DSContactsPro
    MasterField = id_Contact_Pro
    IndexFieldname = id_contact
    Le problème est que quand je veux ajouter ou modifier un enregistrement, avec tblEvenement.append ou tblEvenement.edit , j'ai le message d'errreur:

    tblEvenement: 'L'ensemble de données n'est pas en mode Edition ou Insertion'. processus stoppé.......

    Où peut bien être mon erreur ?

    D'avance merci

    Cordialement

  2. #2
    Membre Expert
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Par défaut
    Heu,

    je prèche peut être un convaincu, mais si tu veux insérer des données en mode table, tu dois avoir quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     with ADOTable1 do begin
            active:=true;
            append;
            FieldByName('MonChamp1').Value:=MaValeur;
            FieldByName('MonChamp2').Value:=MaValeur;
            ...
            post;
    end;

    Pour la mise à jour, il faut remplacer append par Edit.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Bonjour,

    oui je sais celà mais le problème vient quand je clique pour ajouter:

    tblEvenement.append
    ou pour modifier
    tblEvenement.Edit

    Cordialement

  4. #4
    Membre Expert
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Par défaut
    Je me disais, aussi...

    J'ai trouvé ceci dans l'aide de Delphi :

    Modification d'enregistrements

    Un ensemble de données doit être en mode dsEdit pour que l'application puisse modifier des enregistrements. Dans votre code, vous pouvez utiliser la méthode TDataSet.Edit pour mettre un ensemble de données en mode dsEdit si la propriété TDataSet.CanModify de l'ensemble de données, accessible seulement en lecture, est à True.

    Quand un ensemble de données passe en mode dsEdit, il reçoit d'abord un événement BeforeEdit. Une fois le passage en mode édition réussi, l'ensemble de données reçoit un événement AfterEdit. En général, ces événements sont utilisés pour mettre à jour l'interface utilisateur afin qu'elle indique l'état en cours de l'ensemble de données. Si l'ensemble de données ne peut passer en mode édition pour une raison ou pour une autre, un événement OnEditError survient, grâce auquel vous pouvez informer l'utilisateur du problème ou essayer de corriger la situation qui a empêché l'ensemble de données de passer en mode édition.

    Dans les fiches de votre application, certains contrôles orientés données pourront mettre automatiquement votre ensemble de données à l'état dsEdit si

    La propriété ReadOnly du contrôle vaut False (la valeur par défaut).
    La propriété AutoEdit de la source de données du contrôle vaut True.
    La propriété CanModify de l'ensemble de données vaut True.
    Remarque:
    Même si un ensemble de données est à l'état dsEdit, la modification d'enregistrements peut échouer pour les bases de données SQL si l'utilisateur de votre application ne dispose pas des droits d'accès SQL appropriés.


    Quand un ensemble de données se trouve en mode dsEdit, l'utilisateur peut modifier toutes les valeurs de champ de l'enregistrement qui apparaît dans les contrôles orientés données d'une fiche. Les contrôles orientés données, pour lesquels la modification est activée automatiquement, appellent Post quand l'utilisateur accomplit une action qui change la position du curseur (comme le déplacement vers un autre enregistrement dans une grille).

    Si vous avez mis un composant navigateur dans votre fiche, l'utilisateur peut annuler les modifications en cliquant sur le bouton Annuler du navigateur. L'annulation des modifications renvoie l'ensemble de données à l'état dsBrowse.

    Dans votre code, vous devez valider ou annuler les modifications en appelant les méthodes appropriées. Les modifications sont validées par l'appel de TDataSet.Post . Vous les annulez en appelant TDataSet.Cancel . Dans le code, les méthodes TDataSet.Edit et Post sont souvent utilisées conjointement. Par exemple,
    [Delphi]with CustTable do
    begin
    Edit;
    FieldValues['CustNo'] := 1234;
    Post;
    end;
    [C++]Table1->Edit();
    Table1->FieldValues["CustNo"] = 1234;
    Table1->Post();
    Dans l'exemple précédent, la première ligne du fragment de code place l'ensemble de données en mode dsEdit. La ligne suivante affecte la chaîne 1234 au champ CustNo de l'enregistrement en cours. Pour finir, la dernière ligne écrit (émet) l'enregistrement modifié. Si les mises à jour ne sont pas en mémoire cache, les modifications sont écrites en retour dans la base de données. Si les mises à jour sont en mémoire cache, les modifications sont écrites dans un tampon temporaire, où elles restent jusqu'à ce que la méthode ApplyUpdates de l'ensemble de données soit appelée.
    Ceci dit, j'exécute un append sur un ADOTable dans une de mes applications, et je n'ai pas ton souci.

    S'agit il d'une application multiutilisateur ou mono utilisateur ?
    Dans le premier cas, gères tu les verrous et comment ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Re,

    Le problème existe depuis que j'ai mis un mastersource:

    mastersource = DSContactsPro
    MasterField = id_Contact_Pro
    IndexFieldname = id_contact

    avec le code suivant je peux ajouter ou modifier normalement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DM.tblEvenement.Filtered:=false;
    DM.tblEvenement.Filter:='id_contact = '+ inttostr DM.tblContactproid_Contact_Pro.value);
    DM.tblEvenement.Filtered:=true;
    Je cherche depuis pas mal de temps mais je ne trouve pas la raison de cette erreur et je serais heureux de comprendre.

    Ceci dit, j'exécute un append sur un ADOTable dans une de mes applications, et je n'ai pas ton souci.
    Tu exécute cet append sur une table détail avec un mastersource ?

    Cordialement




    Dans

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Bonjour,

    je pense avoir trouvé l'origine de cette erreur.

    ma table tblEvenement comprend des champs persistant lookup pour afficher les noms et les fonctions en clair.

    Il semble donc qu'avec un champ persistant la table n'est plus en mode Append et edit ??? Curieux, non?

    Est ce qu'il existe une solution ?

    Cordialement

  7. #7
    Membre Expert
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Par défaut
    Ce lien peut peut être t'aider à gérer ta relation.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    re,

    merci pour ton aide.

    J'ai trouvé le pourquoi et j'ai résolu en enlevant le champ persistant et celà fonctionne maintenant.

    ceci dit je vais regarder de près le lien que tu as bien voulu me donner.

    Cordialement

  9. #9
    Membre Expert
    Avatar de Frank
    Homme Profil pro
    Chef de projet Informatique
    Inscrit en
    Avril 2002
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Chef de projet Informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 095
    Par défaut
    Penses à tagguer l'enfilade avec

  10. #10
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 50
    Par défaut champ persistant et lenteur
    bonjour,
    autre chose mais tj sur les champs persistant :

    j'ai créé un champ persistant de type champ de reference, afin de lire une liste de valeur dans un combo box.
    je trouve que mon appli est moins rapide avec ce champ persistant.
    il me semble qu'avec un lookup combo box sur lequel je declare ma table de données puis ma liste de valeur ca va plus vite.

    Je me trompe ou avez vous remarqué la meme chose ?
    merci

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Bonjour,

    personnellement je trouve les DBLookupcombobox mieux appropriés pour mettre à jour un DataField. Je ne sais pas si la liste de tonComboBox est importante, mais il faut déja le temps de la remplir. Je ne sais pas si c'est à cause de celà, essaie un Query avec un DBLookupcombobox.

    Cordialement

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

Discussions similaires

  1. [forms 10g] Relation maitre/détail facultatif
    Par lolafrite dans le forum Forms
    Réponses: 5
    Dernier message: 26/08/2015, 03h53
  2. [Forms 6i] Relation Maitre Detail réciproque ?
    Par lafouine dans le forum Oracle
    Réponses: 3
    Dernier message: 23/01/2006, 10h24
  3. [TTable] Pb avec une relation maitre-detail
    Par kase74 dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/10/2005, 10h34
  4. [Ferme] DBLookup fiche detail (relation maitre detail)
    Par boyerf dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/02/2004, 20h12

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