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 :

est il possible de sauver un tri physiquement sur une table sans passer par une autre table ?


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Points : 37
    Points
    37
    Par défaut est il possible de sauver un tri physiquement sur une table sans passer par une autre table ?
    Bonjour !
    je fait des trie sur un dbgrid a un moment donner je veut sauvegardée ce trie sur ma table je veut que la table soit trier physiquement de cette manier et il possible de le faire sans passer par une autre table
    je suis sur delphi 7 Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 551
    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 551
    Points : 25 122
    Points
    25 122
    Par défaut
    J'ignore comment tu fais tes tris mais si tu utilises IndexFieldName du DataSet sous-jacent, il suffit de le retirer pour que le DataSet retrouve son ordre naturel (celui au moment de l'ouverture pour Paradox, et dépend des implémentations selon ADO, IBX, CDS...)
    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

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    J'ignore comment tu fais tes tris mais si tu utilises IndexFieldName du DataSet sous-jacent, il suffit de le retirer pour que le DataSet retrouve son ordre naturel (celui au moment de l'ouverture pour Paradox, et dépend des implémentations selon ADO, IBX, CDS...)
    les tris que je fais sont simples voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.DBGrid1TitleClick(Column: TColumn);
    begin
    ZTable1.SortedFields:=Column.FieldName;
    ZTable1.First;
    end;
    mon problème ce n'est pas de trouver l'ordre naturel c'est l'inverse je veux que le tri choisi reste définitivement et réellement sur la table

    ma table et une sqlite3

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 095
    Points : 41 081
    Points
    41 081
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Je ne vois pas vraiment l'intérêt de garder un "tri physiquement" dans une table , peut être suis-je devenu trop SGBDR .

    En fait , suivant ton raisonnement il s'agit plus de détruire un Index Primaire , ou l'index mis à l'ouverture de la table, existant pour le remplacer par un autre . En SQL cela donnerai une séquence
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DROP INDEX nomindex;
    CREATE INDEX nomindex ON nomtable(nomcolumn)

    cependant , au vue de ton code , je pense que tu utilises les ZEOSDBO
    cependant Ztable ne propose pas la propriété IndexName comme l'aurait proposé un TTable BDE . J'ai même un doute sur le fait que ZEOSDBO utilise l'index primaire à l'ouverture d'une table (cela fait longtemps que je n'utilise plus de ZTable il faudra que je fasse un test )

    une 'mauvaise' solution consisterai donc a modifier directement l'index primaire avec les contraintes d'unicité qui s'impose (dans une dbGrid c'est franchement pas le top)

    la bonne solution à mon avis est d'écarter le composant ZTable et d'utiliser à la place le ZQuery+ZUpdateSQL (s'il y a des updates à faire) ou mieux le ZReadonlyQuery et de ne pas toucher à la structure de la Table , ainsi comme l'indiquait Retwas il suffit par la suite d'utiliser la clause ORDER BY du SELECT .
    Cela ne répond pas à la question : comment garder le tri à la prochaine ouverture ? mais la ma réponse serait de garder la clause ORDER par exemple dans un fichier ini , dans la base de registre ......

    P.S. s'il s'agit bien de ZTable , pour le tri par colonnes il vaut mieux utiliser la propriété SortedFields un peu de référence
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Points : 37
    Points
    37
    Par défaut
    @SergioMaster

    bonjour

    moi non plus je ne vois pas l'intérêt de garder le tri c'est juste pour facilité la tache au 2eme utilisateur un premier traitement s'effectue puis la base et envoyé a un autre utilisateur avec un autre programme et la base doit être envoyé trier
    dans le passé si je me souviens bien qu il y avait une méthode on utilisant une boucle avec le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while not DataSource1.DataSet.Eof do
    et une requête ORDER BY

    mais la je ne me souviens pas très bien

    oui je suis sur les zeolib et je utilise bien SortedFields

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Points : 37
    Points
    37
    Par défaut
    j'ai bidouiller la chose trier la grille exporter le trie vider la table importer les donné exporter

    la je ne trouve pas mieux

  7. #7
    Fxg
    Fxg est déconnecté
    Membre éclairé
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 510
    Points : 837
    Points
    837
    Par défaut
    Ne serait-il vraiment pas plus simple de lui envoyer les paramètres du tri à supposer qu'ils soient différents à chaque fois......et que l'intérêt de ce tri ne se limite pas à un simple confort

  8. #8
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Ne peux-tu pas créer une copie non indexée de ta table?
    Si l'ordre pose problème, tu ajoutes une colonne NO_ORDRE que tu affectes lors de la copie et tu indexes ce champ bien sûr.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  9. #9
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par e-ric Voir le message
    Ne peux-tu pas créer une copie non indexée de ta table?
    Si l'ordre pose problème, tu ajoutes une colonne NO_ORDRE que tu affectes lors de la copie et tu indexes ce champ bien sûr.
    non je ne peut pas ajouter de colonne,,, dans ce cas la table ne sera pas reconnu par le 2eme programme et il faut savoir que j'ai pas la source du 2eme programme

    par contre il y a une colonne créé et gérée directement par SQLite qui implémente systématiquement en interne un rowid transparent pour l'utilisateur, qui devient la clef INTEGER PRIMARY KEY (le numéro d’enregistrement)

  10. #10
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    non je ne peut pas ajouter de colonne,,, dans ce cas la table ne sera pas reconnu par le 2eme programme et il faut savoir que j'ai pas la source du 2eme programme
    Ce n'est pas aussi évident que cela : il faudrait savoir comment la requête est passée (avec un tri explicite, dasn ce cas, c'est mort) et comment les données sont affichées (champs persistants ou dynamiques).

    Quant au rowId, je ne suis pas sûr que SQLite en tienne compte pour le tri par défaut, c'est pas une obligation avec les SGBDR. A vérifier dans les docs de SQLite.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  11. #11
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Points : 37
    Points
    37
    Par défaut
    le tri est très simple en plus j'en ais besoin que d'un seul tri sur une seul colonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.DBGrid1TitleClick(Column: TColumn);
    begin
    ZTable1.SortedFields:=Column.FieldName;
    ZTable1.First;
    end;

  12. #12
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Points : 37
    Points
    37
    Par défaut
    j'ai encor cherché j'ai trouver dans un forum anglais une discussion sur le même problème et ils dises que c'est faisable avec un tire a bulles (Bubble Sort)

    quelqu’un a une idée a quoi consiste ce trie ?

  13. #13
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Si tu travailles avec une base de données, tu ne contrôles pas l'algorithme de tri mis en oeuvre, il est dépendant du SGBD.

    Si tu veux le faire, il faut travailler sur une structure de données que tu maîtrises tel un tableau, il te faut alors copier les données en mémoire puis procéder au tri. Mais :
    - Attention au volume de données à manipuler,
    - tu ne peux plus employer de DBGrid pour l'affichage.

    Je ne connais pas par coeur l'algo de tri, c'est pas le meilleur, il est convenable sur un nombre limité de données. Tu peux éventuellement enregistrer tes données dans une TList puis appeler la méthode TList.Sort, il faut définir la routine de comparaison, consulte l'aide en ligne de Delphi ou le code de la méthode dans l'unité Classes.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/04/2010, 13h48
  2. Réponses: 4
    Dernier message: 02/05/2008, 09h23
  3. Réponses: 3
    Dernier message: 13/12/2006, 16h01
  4. Réponses: 7
    Dernier message: 15/02/2006, 15h12
  5. Réponses: 7
    Dernier message: 08/03/2004, 15h30

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