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

 Delphi Discussion :

Ttable : Append versus Setrange


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2015
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 63
    Points : 39
    Points
    39
    Par défaut Ttable : Append versus Setrange
    Bonjour,

    Je viens de migrer un programme de Delphi 7 vers Delphi XE2.

    Dans le processus, le programme vérifie dans une table (avec le composant ttable) si des enregistrements existent via la propriété SetRange.
    Ensuite, il essaie d'ajouter un nouveau record avec Append.

    Si j'ai la propriété FetchWholeRows qui est à True, le setRange me renvoie une erreur. Si elle est a False, c'est l'Append qui me renvoie qu'il ne peut pas insérer une nouvelle ligne.

    J'ai contourné le problème en désactivant la propriété au moment du setRange et en la réactivant ensuite.

    Le but de mon post est d'essayer de comprendre pourquoi cela agit ainsi et de voir si je peux améliorer cela.

    Merci d'avance si vous pouvez m'aider et m'éclairer dans mon apprentissage Delphi.

    Bonne fin de journée,

    Lave

  2. #2
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Bonjour
    Le SetRange permet de créer un intervalle dans le jeu de données déjà récupéré sur le DataSet: c'est normal donc que tu ne peux pas mettre à jour correctement le DataSet d'où le Insert ou tout autre opération de mise à jour sur le DataSet échoue.
    Pour le faire, il faut avoir le FetchWholeRows à True mais dans ce cas tu ne peux plus créer un intervalle avec le SetRange.
    Pour créer une nouvelle ligne dans ton cas, il y a un contrôle d'unicité qui se fait d'après ce que j'ai vu ( ou tout autre contrôle de non redondance avant de lancer l'ajout du nouvel enregistrement ) : il faut soit :
    - Passer par un Locate sur le DataSet avec un VarArrayOf: s'il renvoie False, c'est que ton enregistrement n'est pas trouvé et que tu peux faire un Append.
    - Créer carrément un Query qui cherche si cette ligne existe avec l'ensemble de paramètres que tu passes : après un Open du DataSet, s'il est empty (tu peux tester aussi le EOF à true), tu insère ton enregistrement.
    Bon courage.
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2015
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Merci pour ta réponse Moez.B.

    J'ai oublié de préciser que nous faisons un CancelRange lorsque nous avons fini l'opération avec le setRange.
    Est-ce que cela change quelque chose à tes propos ?
    Si après le setRange et le CancelRange, nous faisons un Refresh sur la table, est-ce que cela pourrait également améliorer la situation ?

    Sinon, nous comptons migrer les ttable en Query mais il y a beaucoup de travail a effectué pour cela

    Merci d'avance pour votre aide.

    Bonne journée,

    Lave

    Ps : au besoin, la db est en Firebird

  4. #4
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Bonjour
    Le CancelRange ne fait que supprimer l'intervalle ce qui permet de récupérer toutes les données sur le DataSet et rendre accessible l'opération d'ajout.
    Dans un intervalle on ne peut que consulter/modifier les données sur le DataSet mais on ne peut insérer car il nous faut la totalité des données sur le DataSet.
    Utiliser un TTable sans filtre est dangereux si on fait face à de gros volumes de données et c'est pour cela qu'il faut filtrer le jeu de données sur lequel on va travailler.
    Il existe des composants (FireDac, DevArt..) qui présentent un TQuery qui permettent de fetcher les données sans interdire les opérations de mise à jour (insert/append/edit/delete) en gérant le corps des requêtes SQL d'une façon personnalisée (on peut ajouter autant de paramètre(s) qu'on veut, modifier la requête Update..).
    Bonne journée.
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Est-ce vraiment un TTable du BDE et non un TIBOQuery de IBObjects pour InterBase/FireBird ?
    Par ce que FetchWholeRows ça n'est existe pas dans le TTable !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Est-ce vraiment un TTable du BDE et non un TIBOQuery de IBObjects pour InterBase/FireBird ?
    Par ce que FetchWholeRows ça n'est existe pas dans le TTable !
    Évidement que c'est les composants de IbObjects :
    http://www.ibobjects.com/Ibo/IDH_TIB...hWholeRows.htm

    D'après leur explication, cette propriété sert à gérer d'une façon plus performante un DataSet disposant d'un nombre important de colonnes et lignes.
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2015
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Oui c'est bien un tibotable. Désolé pour ce manque de précision

    Merci pour vos réactions.
    Au final, si je comprends bien, si nous voulons faire un append, je suis obligé d'avoir la propriété FetchWholeRows à True sinon le dataset n'est pas "correct".

    Une dernière réflexion : vu que nous faisons un append qui met le nouveau record à la fin du Dataset (et voilà pourquoi il faudrait l'ensemble des données), est-ce qu'un insert ne pourrait pas fonctionner sans la propriété FetchWholeRows à true ?

    Merci d'avance et bonne journée,

    Lave

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par Moez.B Voir le message
    Évidement que c'est les composants de IbObjects :
    http://www.ibobjects.com/Ibo/IDH_TIB...hWholeRows.htm
    Non ! cela n'avait rien d'évident, tout le sujet évoque le TTable !
    Tu connaissais la propriété, donc tu le savais. Je l'ai déterminé par Google
    Mais il existe IBX, FIBPlus, Zeos, ou même le BDE ...
    toujours mentionner la lib et le nom exacte des classes utilisées pour que ceux qui savent puisse répondre
    et que les autres ne perdent pas de temps à poser la question
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Non ! cela n'avait rien d'évident, tout le sujet évoque le TTable !
    Tu connaissais la propriété, donc tu le savais. Je l'ai déterminé par Google
    Mais il existe IBX, FIBPlus, Zeos, ou même le BDE ... j'aurais su, dès le début, que c'était du IbObjects, je n'aurais pas perdu de temps à donner une réponse liée au TTable du BDE !
    C'était une fausse piste du demandeur
    Je ne connais les propriétés de TTable par cœur mais je n'ai pas rencontré non plus cette propriété ( qui , dans l'aide en ligne de ibobjects, est suggérée être à True si on va récupérer plus que le 1/3 d'une table volumineuse )
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  10. #10
    Membre averti Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Points : 370
    Points
    370
    Par défaut
    Citation Envoyé par lave_01 Voir le message
    Bonjour,

    Oui c'est bien un tibotable. Désolé pour ce manque de précision

    Merci pour vos réactions.
    Au final, si je comprends bien, si nous voulons faire un append, je suis obligé d'avoir la propriété FetchWholeRows à True sinon le dataset n'est pas "correct".

    Une dernière réflexion : vu que nous faisons un append qui met le nouveau record à la fin du Dataset (et voilà pourquoi il faudrait l'ensemble des données), est-ce qu'un insert ne pourrait pas fonctionner sans la propriété FetchWholeRows à true ?

    Merci d'avance et bonne journée,

    Lave
    Un Append permet d'ouvrir un nouvel enregistrement vide à la fin d'un DataSet.
    Un Insert permet d'ouvrir un nouvel enregistrement dans un DataSet à une position donnée (suite à un Locate par exemple et un déplacement du curseur du DataSet jusqu'à le bon enregistrement)
    Dans les 2 cas, le TIbTable doit comporter la totalité des lignes récupérées pour gérer correctement les données à l'intérieur (Déplacement, Suppression, Modification ..)
    Si on fait un Range, l'Insert va se faire à l'intérieur de l'intervalle ce qui n'est pas permis aussi.
    "L'homme supérieur est celui qui a une bienveillance égale pour tous, et qui est sans égoïsme et sans partialité." [Confucius]
    "Celui qui n'évolue pas disparaît." [Charles Darwin]
    “Without requirements or design, programming is the art of adding bugs to an empty text file.” [Louis Srygley]

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2015
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Encore désolé pour le manque de précision et la perte de temps que cela a pu provoqué . C'est noté pour mes futures posts

    Merci aussi pour les différentes précisions.

    Cela résout mon problème

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

Discussions similaires

  1. [Débat] MERISE versus UML ? Avenir de MERISE ?
    Par Matthieu Brucher dans le forum Méthodes
    Réponses: 51
    Dernier message: 15/02/2022, 17h32
  2. C# versus Java
    Par laffreuxthomas dans le forum C#
    Réponses: 368
    Dernier message: 30/03/2019, 22h59
  3. Que choisir : PHP versus Java ?
    Par Sniper37 dans le forum Général Conception Web
    Réponses: 164
    Dernier message: 28/04/2009, 16h50
  4. Temps de réponse : objet TTable (BDE)
    Par lirva dans le forum Bases de données
    Réponses: 5
    Dernier message: 12/12/2003, 00h50

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