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 :

Traitement table Paradox


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut Traitement table Paradox
    Salut,

    g un soucis avec une requête SQL pour traiter une table Paradox. Il s'agit de supprimer des doublons. Lors des tests avec une table de 20 enregistrements, cela fonctionne nickel. Dans le cas réél, avec une table de 170 000 enregistrements, la requete genère une erreur!

    Pouvez vous m'aider
    Merci

  2. #2
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    Je rappelle que les 2 tables (test et réél) sont identiques d'un point de vue champ, index...

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Tu pourrais préciser l'erreur, la version de delphi et les composants db que tu utilises.
    Car comme ça, sans plus d'information, ca va êter dur que t'aider ^^
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  4. #4
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    J'utilise un composant query avec les lignes de commandes Query.SQL.text pour définir les requetes et query.open et query.ExecSQL.

    Je pense que ca vient de la capacité de la table? Y a til une limite par rapport à la mémoire ou un truc comme ca lors du traitement ?

  5. #5
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    C Delphi 7

  6. #6
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    mon code est le suivant :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    chemin:=StatusBar1.Panels[0].Text+'\'+Label1.Caption+'\'+'sortick.db';
     
    query1.SQL.Text:=
     
    SELECT DISTINCT * FROM  "chemin" T1 
    WHERE EXISTS (SELECT * FROM "chemin" T2
    WHERE T1.Ninc <> T2.Ninc
    AND T1.NoTicket = T2.NoTicket
    AND T1.DatPai = T2.DatPai);
     
     
    Query2.SQL.Text:=
     
    DELETE FROM "chemin" T 
    WHERE T.Ninc < ANY (SELECT Ninc FROM "chemin" T2
    WHERE T.Ninc <> T2.Ninc
    AND T.NoTicket = T2.NoTicket
    AND T.DatPai = T2.DatPai);
     
        Form2.Caption:='Sélection des enregistrements défectueux...';
        query1.Open;
        query1.FlushBuffers;
        Form2.Caption:='Suppression des doublons...';
        showmessage('Sélection terminée !');
        Query2.ExecSQL;
        Query2.Close;
        Query1.Close;
        showmessage('Suppression terminée !');

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    J'utilise un composant query avec les lignes de commandes Query.SQL.text pour définir les requetes et query.open et query.ExecSQL.
    Bde ou Ado ou dbexpress ?
    Sinon tu dois utiliser Open pour des requetes de type Select ou ExecSQL pour des requetes de type Insert/update/Delete pas les deux en même temps (Activate := true correspond a un open).

    Je pense que ca vient de la capacité de la table? Y a til une limite par rapport à la mémoire ou un truc comme ca lors du traitement ?
    Ca peut venir que le traitement est trop long par rapport au timeout du query donc vu qu'il n'a pas la reponse de fin de traitement de la requete dans le temps imparti, il génère une erreur.

    Mais bon, difficile d'être précis vu que tu ne m'as toujours pas dit quel etait l'erreur qu'il t'affiche.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  8. #8
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    Pour l'erreur, je vais voir. il faut que je lance l'appli sous delphi et que je le laisse tourner toute une nuit. Je vous dirais ca demain....

    j'utilise le BDE

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    A mon avis tu devrais franctionner en plusieurs fois.

    Vu que la requete à l'air de faire appel a une date je pense que tu pourrais faire un truc du style

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    var
      dDebut,dFin : TDate;
     
    begin
      With Query1 do 
      begin
        Close;
        SQL.clear;
        SQL.Add('Select Min(DatPai) as DateDebut,Max(DatPai) as DateFin from TATable');
        Open;
        dDebut := FieldByName('DateDebut').AsDateTime;
        dFin := FieldByName('DateFin').asDateTime;
      end;
     
      While dDebut <= dFin do
        With Query2 do
        begin
           Close;
           SQL.Clear;
           SQL.Add('DELETE FROM "chemin" T');
           SQL.Add('WHERE T.Ninc < ANY (SELECT Ninc FROM "chemin" T2');
           SQL.Add('WHERE T.Ninc <> T2.Ninc');
           SQL.Add('AND T.NoTicket = T2.NoTicket');
           SQL.Add('AND T.DatPai = T2.DatPai');
           SQL.Add('and T2.DatPai = :PDate)');
           ParamCheck := True;
           Params.ParamByName('PDate').Value := dDebut;
           ExecSQL;
           dDebut := dDebut + 1; // + 1 jour
        end;
    end;
    A tester et a modifier en consequence.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    je récupère et test le champ de date car c un champ qui fait apparaitre des doublons. J'aurai pu en prendre un autre...

    Mais le problème n'est pas là, comme je l'ai dit au début, prog fonctionne avec une table de 20 à 500 record, je sais pas trop. Mais pour un nombre conséquent de record, ca plante. alors je ne pense pas que ca vienne du code. Il est correct. Mais plutot de la mémoire ou de la capacité du query.

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Avec ma méthode ca fait plusieurs petites requetes au lieu d'en faire une grosse qui autant n'arrivera pas au bout à cause d'un timeout.
    La requete fait une jointure sur elle meme, vaut mieux le faire sur une portion que la totalité de la table.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  12. #12
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    qu'est ce que tu as voulu mettre avec cette ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL.Add('and T2.DatPai = :PDate)');
    Il n'y a pas d'erreur ?

  13. #13
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    pourquoi une erreur ?

    cette partie de la requete doit faire partie du select, donc il y a peut être un soucis au niveau des ()
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  14. #14
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    A l'execution de ExecSQL un message d'erreur apparait :
    'difference de type dans une expression'

  15. #15
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    DatPai est bien un datetime ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  16. #16
    Membre confirmé Avatar de James64
    Profil pro
    Inscrit en
    Février 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 99
    Par défaut
    oui, l'erreur vient de la requete query2 et je pense que la ligne que je t'ai mis précedemment est fausse.... Je ne la comprend pas!?

  17. #17
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Le and T2.DatPai = Date sert a limite la requete select par rapport a une date.
    Date est un paramètre qui est remplie par params.parambyName('PDate').Value.
    Le problème peut venir au niveau du format de la date. Dans paradox, faut iil ecrire la date DD/MM/YYYY ou MM/DD/YYYY ?

    Pour tester remplace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Params.ParamByName('PDate').Value := FormatDateTime('DD/MM/YYYY',dDebut);
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Params.ParamByName('PDate').Value := FormatDateTime('MM/DD/YYYY',dDebut);
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Params.ParamByName('PDate').Value := dDebut;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

Discussions similaires

  1. (VC++6 /C) Pb de création de table Paradox
    Par Vow dans le forum Paradox
    Réponses: 4
    Dernier message: 28/09/2004, 13h15
  2. Migration d'une table PARADOX
    Par DanielW dans le forum Débuter
    Réponses: 6
    Dernier message: 06/05/2004, 21h52
  3. Outil de reparation de tables paradox
    Par freud dans le forum Outils
    Réponses: 4
    Dernier message: 14/12/2003, 19h40
  4. Création multiple table paradox dans le code
    Par scarabee dans le forum C++Builder
    Réponses: 8
    Dernier message: 30/10/2002, 10h17
  5. reindexation table paradox
    Par edorlan dans le forum Paradox
    Réponses: 4
    Dernier message: 11/10/2002, 12h37

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