2010-06-30 6 views
2

en ce qui est que je sais le tri dans un ClientDataSet fonctionne sur les IndexDefs. Je peux ajouter un indexDef, définir les champs que je veux trier, et sur la propriété ixDescending je peux définir la direction à trier.Delphi TClientDataSet tri émission (insert)

I ont une ClientDataSet reliée à une source de données qui est la source pour un DBGrid. Lorsque j'insère maintenant un nouvel enregistrement dans ClientDataSet, il est inséré en haut de la table (ixDescending = false) ou en bas de la table (ixDescending = true).

Mais je veux un ordre décroissant et de nouveaux records devraient être en haut à la table - pas au fond. J'ai essayé de changer l'indexDefs à l'exécution pour y parvenir - mais sans succès. Quelqu'un a une idée de comment faire cela?

Répondre

0

Lorsque vous avez inséré un dossier à moins que vous définissez des valeurs pour les champs indexés sont NULL ils et triés en conséquence.

+0

Je ne comprends pas - lorsque je ne définis pas de valeur pour les champs indexés, l'ordre est croissant. J'ai déjà besoin d'un ordre décroissant avant qu'un nouvel enregistrement ne soit inséré. – ben

+0

Le problème pourrait être comment un ClientDataset gérer les valeurs NULL dans les index. Ils peuvent être considérés comme plus ou moins que toute autre valeur. Si un CDS utilise cette dernière convention, et que vous utilisez un ordre décroissant, un enregistrement avec des valeurs NULL dans les champs indexés sera placé en bas. –

+0

Vous avez raison bien sûr. J'ai choisi un autre champ d'index qui est rempli avant de poster le nouvel enregistrement, et maintenant il est là où il devrait être - Merci;) – ben

0

Je ne sais pas d'une solution élégante (même si je suis un novice dans ce domaine.)

Peut-être il y a un moyen pour vous de créer un champ booléen temporaire dans votre ClientDataSet ... (Peut-être un champ calculé?) Supposons que vous nommiez le nouveau champ "NewRecord" et l'incluiez dans votre IndexDef afin qu'il soit le critère de tri le plus important.

Dans un événement .OnCreate, vous définissez-il vrai (ce qui serait 1 en interne?). Dans un événement .OnPost, vous définissez false.

Si vous ne voulez pas dépendre de la représentation interne des booléens, vous pouvez ensuite créer un champ de chaîne et de mettre « ZZZZZZZ » en elle. Ou un champ entier et mettez MaxInt dedans.

Questions connexes