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 :

Lier, modifier et cohérence des données issues de deux tables


Sujet :

Bases de données Delphi

  1. #21
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Au temps pour moi. AddFieldDefs est pour la création de table
    Donc on reprend ton code, :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    with TStringField.Create(DataModule1.TableFrais) do begin
        FieldName := 'MONLOOKUP';
        Size := 20; 
        FieldKind:= fkLookup;
        DataSet := DataModule1. TableFrais;
        Name := Dataset.Name + FieldName;
        KeyFields:= 'f_categorie';
        LookUpDataset:= DataModule1. TableTypes;
        LookUpKeyFields:= 'ft_id';
        LookUpResultField:= 'ft_type';
       { On supprime : 
       DataModule1. TableFrais.FieldDefs.Add(Name, ftString, 20, false);
       }
      end;
    et à la fin de la création de tes champs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataModule1. TableFrais.FieldDefs.Update;
    Yurck, j'avais mis "détail" en italique ! C'est sûr que c'est très important, mais à mon avis, c'était plus une erreur de frappe que de compréhension.

    Par contre, ton idée de faire d'abord une "simulation" à la conception et d'aller voir le dfm est excellente, pour être sûr de ne rien oublier, et aussi pour ne rien mettre de superflu
    Roland

  2. #22
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par rsc Voir le message
    Au temps pour moi. AddFieldDefs est pour la création de table
    Donc on reprend ton code, :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    with TStringField.Create(DataModule1.TableFrais) do begin
        FieldName := 'MONLOOKUP';
        Size := 20; 
        FieldKind:= fkLookup;
        DataSet := DataModule1. TableFrais;
        Name := Dataset.Name + FieldName;
        KeyFields:= 'f_categorie';
        LookUpDataset:= DataModule1. TableTypes;
        LookUpKeyFields:= 'ft_id';
        LookUpResultField:= 'ft_type';
       { On supprime : 
       DataModule1. TableFrais.FieldDefs.Add(Name, ftString, 20, false);
       }
      end;
    et à la fin de la création de tes champs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataModule1. TableFrais.FieldDefs.Update;
    Yurck, j'avais mis "détail" en italique ! C'est sûr que c'est très important, mais à mon avis, c'était plus une erreur de frappe que de compréhension.

    Par contre, ton idée de faire d'abord une "simulation" à la conception et d'aller voir le dfm est excellente, pour être sûr de ne rien oublier, et aussi pour ne rien mettre de superflu
    Merci, le code fonctionne, mais ne résoud pas mon problème
    Je suis dans la même situation qu'avec mon code... le DBNavigator me retourne la même exception (indice de liste hors limite (5) ) lors de l'ajout (la modif semble toutefois fonctionner).

    Je précise que j'ai une fonction qui crée tous les champs de ma table physique, y compris le lookup, ce qui en fait 6 en tout, 5 + 1 (le lookup). Je les vois bien tous dans ma DBGrid, que je peux cacher ou non suivant mes besoins. J'ai ajouté le UPDATE comme conseillé par RSC à la fin, avant de réactiver la table.

    Ca ne change rien

  3. #23
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Attention, concentrons-nous sur "indice de liste hors limite (5)" .
    Cela signifierait-il que sans le DBNavigator toout ce passe bien ?


    Le débogueur à l'aide de la pile d'appel doit nous indiquer d'où vient l'erreur.
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  4. #24
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Citation Envoyé par lawappe Voir le message
    Je suis dans la même situation qu'avec mon code... le DBNavigator me retourne la même exception (indice de liste hors limite (5) ) lors de l'ajout (la modif semble toutefois fonctionner).
    Attends, si c'est lors de l'ajout, c'est qu'il essaie de réagir à un moment où tout n'est pas encore calé.
    Essaie de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TableFrais.DisableControls;
    avant l'ajout, et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TableFrais.EnableControls;
    après
    Roland

  5. #25
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Yurck Voir le message
    Attention, concentrons-nous sur "indice de liste hors limite (5)" .

    Le débogueur à l'aide de la pile d'appel doit nous indiquer d'où vient l'erreur.
    Je ne sais pas utiliser le débogueur...

  6. #26
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par rsc Voir le message
    Attends, si c'est lors de l'ajout, c'est qu'il essaie de réagir à un moment où tout n'est pas encore calé.
    Essaie de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TableFrais.DisableControls;
    avant l'ajout, et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TableFrais.EnableControls;
    après
    Ca ne résoud pas l'exception

  7. #27
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Pour que l'on soit bien d'accord, si je fais un récapitulatif en prose:

    Mes composants:

    1 DataBase
    2 Table
    2 DataSource
    2 DBGrid
    2 Navigator
    + quelques champs de données pour les modifs

    Tous ce petit monde reliés les uns aux autres, et tout fonctionne nickel.

    Dans une grille je vois mes FRAIS, dans l'autre je vois ma liste de TYPE de frais, avec toutes les colonnes de chacune des tables.

    Je peux ajouter, supprimer, modifier sans aucun souci.

    Maintenant, je voudrais que dans ma grille qui liste les FRAIS, n'apparaissent plus certaines colonnes, notamment celle de l'entier qui est identique (reliée ?) à celle de l'index de ma table TYPE, mais son libellé.

    Si j'ai bien compris, je dois passer par un lookup.

    C'est pour cela que j'ai écris une fonction qui crée les champs, dont le lookup.

    Suis-je donc sur la bonne voie avec ce code ?
    Ou y en a t il une autre à suivre ?

    Merci.

  8. #28
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Cela me semble cohérent

    Alors Débogueur et pile d'appel :

    Nom : optionDebogeur.JPG
Affichages : 44
Taille : 39,9 Ko

    Nom : optionsDebogeur.JPG
Affichages : 43
Taille : 41,4 Ko


    Quel delphi utilises-tu (déjà) ?
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  9. #29
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Yurck Voir le message
    Cela me semble cohérent

    Alors Débogueur et pile d'appel :

    Nom : optionDebogeur.JPG
Affichages : 44
Taille : 39,9 Ko

    Nom : optionsDebogeur.JPG
Affichages : 43
Taille : 41,4 Ko


    Quel delphi utilises-tu (déjà) ?
    Merci pour les captures.
    J'ai un Delphi 2007 Enterprise, et toutes ces options de débogage sont activées.

    Ca me rend dingue en fait. Tu confirmes que c'est cohérent, ça me rassure du coup, mais ça déconne avec le DBNavigator. C'est incroyable...

    A moins que je me borne à chaque fois à insérer une coquille dans mon code qui pour moi est absolument nickel, et qui ne l'est peut être pas en fait...

    J'abuse peut-être, si c'est le cas, dis le moi: si je te communique une adresse e-mail par MP, t'as moyen de m'envoyer un projet ultra mini, juste avec les compos fonctionnels, et la génération du lookup, afin de comparer avec mon code ?

    J'ai ressorti mes vieux bouqins de plus de 1000 pages sur Delphi tellement ça me rend dingue !!

    En tout cas merci de m'accompagner, je me sens moins seul face à ce problème !

  10. #30
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Petite info de plus: j'ai donc 5 colonnes dans la table en dur. Si j'ai moins de 5, ou 5 colonnes dans la DBGrid (créées via le DataSet), l'exception ne se produit pas. En revanche, si j'en ai plus, donc 6 avec le lookup, ça génère l'exception.

    Mais pourtant j'ai besoin de toutes ces colonnes...

    Je deviens dingue !!

  11. #31
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Bon,

    j'ai tout refait en conception, avec les assistants Delphi, notamment pour le champ référence (Lookup). Je n'ai tapé aucune ligne de code !

    J'ai le même problème !

    Dès que j'affecte un DBNavigator à la Table qui contient le lookup, j'ai le message d'erreur lorsque je veux ajouter des données

    J'en peux plus là... si quelqu'un à une idée pour m'éclairer... merci !

  12. #32
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Utilise une troisième table différente pour le lookup.

    Ou mieux mets le tout dans un clientdataset et fais un clone cursor.

    Enfin utilses le projet de démos de Delphi qui fait exactement ce que tu cherches :

    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
     
        object OrdersOrderNo: TFloatField
          FieldName = 'OrderNo'
        end
        object OrdersCustNo: TFloatField
          FieldName = 'CustNo'
          Required = True
        end
        object OrdersCustName: TStringField
          DisplayWidth = 27
          FieldKind = fkLookup
          FieldName = 'CustName'
          LookupDataSet = Cust
          LookupKeyFields = 'CustNo'
          LookupResultField = 'Company'
          KeyFields = 'CustNo'
          Size = 30
          Lookup = True
        end

    ....\Demos\Db\Gdsdemo\Gdsdemo.dpr


    à suivre...
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  13. #33
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Yurck Voir le message
    Utilise une troisième table différente pour le lookup.

    Ou mieux mets le tout dans un clientdataset et fais un clone cursor.

    Enfin utilses le projet de démos de Delphi qui fait exactement ce que tu cherches :

    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
     
        object OrdersOrderNo: TFloatField
          FieldName = 'OrderNo'
        end
        object OrdersCustNo: TFloatField
          FieldName = 'CustNo'
          Required = True
        end
        object OrdersCustName: TStringField
          DisplayWidth = 27
          FieldKind = fkLookup
          FieldName = 'CustName'
          LookupDataSet = Cust
          LookupKeyFields = 'CustNo'
          LookupResultField = 'Company'
          KeyFields = 'CustNo'
          Size = 30
          Lookup = True
        end

    ....\Demos\Db\Gdsdemo\Gdsdemo.dpr


    à suivre...
    Merci pour les pistes. Mais j'ai deja testé avec une troisième table pour le lookup, même problème. J'ai tenté le DataSet, j'ai pas tout compris et ça m'a surtout gavé car ça doit fonctionner plus directement ! Donc j'ai cherché une autre piste... sans rien trouver de mieux...

    Alors du coup, je suis reparti d'un projet vierge, en ajoutant les compos au fur et à mesure, en utilisant les assistants de Delphi, sans code, et en compilant à chaque fois pour tester si tout était ok.

    Et là, miracle, il semblerait que ça fonctionne comme je le souhaite.

    Comme tu le disais hier, peut-être que j'ai du code indésirable ou superflu qui met la panique.

    Donc, si ça persiste à fonctionner comme je le souhaite, avec mes petites améliorations d'affichage et de gestion interne, je vais m'imprimer le source du DFM, comme tu me le conseillais plus haut, et affecter les valeurs telles qu'elles y sont indiquées par Delphi. Car j'ai vraiment besoin d'affecter tout ça à l'exécution et non à la conception.

    Merci pour l'accompagnement sur ce topic, j'ai grandement apprécié et ça m'aura été très utile !

    Je noterais le fil RESOLU dès que j'aurais tout fait fonctionner par code à l'exécution. J'espère ne pas avoir de nouvelles surprises !

  14. #34
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    J'ai donc tout retapé 'à la mano', en me basant sur le source du DFM.

    Tout fonctionne parfaitement bien !

    J'ai rencontré l'exception une paire de fois, lors de certaines exécutions intermédiaires, ce qui m'a obligé à réorganiser mon code.

    Je pense donc que le souci venait d'une mauvaise chronologie de création des objets, et de leurs affectation.

    Merci infiniment à Yurck et RSC pour leur aide et leur soutien !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [AC-2010] importer des données qui alimentent deux tables
    Par sardaucar dans le forum Modélisation
    Réponses: 2
    Dernier message: 20/10/2014, 14h34
  2. [MySQL] Intercallage et affichage avec des données issues de plusieurs tables SQL
    Par vinceom92 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 02/03/2014, 14h37
  3. DataForm éditer des données liées dans deux tables.
    Par slyderkiller dans le forum Silverlight
    Réponses: 0
    Dernier message: 18/02/2011, 13h02
  4. Réponses: 2
    Dernier message: 30/04/2009, 12h46
  5. Réponses: 2
    Dernier message: 18/12/2002, 10h30

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