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

Langage Delphi Discussion :

Temps pour parser un fichier de + de 3 millions de lignes


Sujet :

Langage Delphi

  1. #21
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    il ne veut pas entendre de dataset ou de table temporaire, tout doit ce faire par lecture de fichier et pointeurs
    Pourquoi ?



    Les objets sont autorisés au moins ?

  2. #22
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Citation Envoyé par chaplin Voir le message
    C'est minable comme comportement ! Il cherche à te faire craquer.
    Il te test pour voir ta patience et tes réactions. Je n'aime pas ces pratiques
    parce qu'elles te font perdre confiance. Va droit au but et demande lui ce
    qui l'attend réellement de toi. S'il sait, il n'a qu'à te montrer, il faut le prendre
    au mot.
    Pas nécessairement. Je connais beaucoup de gens chez qui c'est simplement leur façon d'être et de travailler.

    Sinon pour en revenir au sujet.

    s'est exactement ce que je veux faire mais mon boss veux tout en même temps
    Et du point de vu des performances, il a certainement raison ! L'initialisation de ton DataSet, ou ta table temporaire prendra a elle seule autant de temps que le traitement complet... (en tout cas, que ce qu'il est possible de faire).

    Désolé mais j'ai beau lire et relire la discussion, je ne comprend toujours pas ce que tu cherches à faire.

    Donc je résume ce que j'ai compris :
    - Tu as un fichier CSV, de 300 Mo.
    - Ce dernier se compose de lignes avec 9 champs.
    - Le fichier n'est pas trié et peut contenir des doublons (quels sont les champs qui forment la clé pour dire qu'il y a doublons ? (1 et 2 ?)).
    - Tu veux supprimer les doublons et insérer les nouvelles valeurs dans une base ? (c'est la que je ne comprends pas ce que tu cherches à faire...)

    Du peu que je comprends, le problème se décompose en trois étapes qui peuvent s'optimiser indépendemment les unes des autres :
    - Lecture du fichier CSV et analyse du contenu (découpage en lignes et en champs).
    - Test d'existance des valeurs (les recherches dans les TList ou TStringList).
    - Insertion des enregistrements en base.

    Il serait bon que tu commences par mesurer les temps de traitement de chaqu'une de ces étapes pour évaluer les gains possibles à chaque niveau.

  3. #23
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    il ne veut pas entendre de dataset ou de table temporaire, tout doit ce faire par lecture de fichier et pointeurs
    ... tu peux dire au boss que dans toutes les professions un bon ouvrier choisit toujours l'outil le mieux adapté au résultat visé et qui dit le mieux adapté suppose un examen d'adaptation, et dans le cas présent une étude préalable de faisabilté et de comparaison des avantages et des inconvénients de chaque outil.
    (Et même si les exigences du boss étaient celles du client rien n'interdirait de discuter)

    Si t'as 1GO de RAM tu dois pouvoir charger au moins deux fois ton fichier de 300 Mo entièrement dans la RAM ce qui permet :
    1 - de charger ce fichier dans un 1er MemoryStream (vitesse optimale garantie) à partir d'un TFileStream (comme tes lignes de données sont séparées par des ";" et comportent toujours neuf données : toto;20071001;20071006;93;9;00:00:00;23:59:59;0.16590000;AFGHANISTAN;tu connais donc toujours la position de chaque donnée dans le FileStream sans avoir à le découper puisqu'il l'est déjà. La fin de ligne est repérable avec nombre de ";" modulo 9 = 0),
    2 - de le classer en ordre vers un 2ième MemoryStream et de le librérer le 1er, (pour regrouper les doublons s'il faut les supprimer)
    3 - de supprimer les doublons dans ce 2ième MemoryStream non par supression mais en les ignorant lors d'une simple copie de ce 2ième MemoryStream dans un 3ème MemoryStream (le 1er ayant été libéré de la RAM)
    3 - et ensuite tu passes à ton truc d'occurences dont l'énoncé gagne à être clarifé : Si par exemple "toto" est présent dans une seule ligne tu sauvegardes quoi et tu ignores quoi ? Autement dit quels sont les critères du tri. Et si "toto" est présent dans plusieurs lignes (donc 2 ocurrences du même mot ou même data) t'en fais quoi ?

    A+

  4. #24
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    Je vous remercie tous pour vos message et vos conseils.

    En fait j'ai essayer de faire tout ce que vous avez dit sauf le memorystream, je le confesse je ne le connais pas, mais je vais essayé.

    je me donne a font dans tous ce que je fait, le problème c'est qu'il ne me laisse pas le temps de me poser et de voir toutes les solutions possible et d'en tirer alors les conséquences.

    1- j'ai essayé de chargé dans un Tfilestring pour recherche dans le trop long (traitement) et prend beaucoup de RAM et le boss ne veux pas

    2- J'ai essayé le Tlist avec Objet prend un peut de place et long (traitement) et le boss ne veut pas

    3- J'ai essayé le DataSet prend un peut de place et long (traitement) et le boss ne veut pas
    3-1-Charger tous le fichier dans un clientDataset et effectuer le travail dessus long (traitement) et le boss ne veut pas
    3-2- Charger dans plusieurs dataset et faire le travail long (traitement)et le boss ne veut pas
    4- j'ai essayer comme il veut long et il n'est jamais comptent

    Le gros problème c'est que je n'ai même pas le temps de me retourné pour voir si ce que je fait est viable, toutes les 5 minutes il vient me gonfler alors s'en ou, alors s'en est ou ....... moi je pète un câble.

    je vais le laissé lui et ses programmes et il aura bien du mal à trouvé quelqu'un

    je pense et pardonnez moi cette prétention , mais je suis sure que s'il m'avait donner deux mois libre et un cahier des charges clair et une petite formation sur les data de télécommunication, alors je lui aurais fait quelque chose de bien.


    Je pense aussi être trop en colère contre lui pour être objectif mais je sais une chose :

    Je ne veux plus bosser avec lui

    Qays

  5. #25
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Est ce que ce raisonnement est correct d'après ce que dit l'énnoncé:

    Pour chaque ligne

    Recherche si Occurence(1) existe, placer dans un TLIST1 sinon placer dans Data
    Recherche si Occurence(2) existe, placer dans un TLIST2 sinon placer dans Data
    Recherche si Occurence(3) existe, placer dans un TLIST3 sinon placer dans Data
    Recherche si Occurence(4) existe, placer dans un TLIST4 sinon placer dans Data
    Recherche si Occurence(5) existe, placer dans un TLIST5 sinon placer dans Data
    Recherche si Occurence(6) existe, placer dans un TLIST6 sinon placer dans Data
    Recherche si Occurence(7) existe, placer dans un TLIST7 sinon placer dans Data

    Fin pour

    In fine, je ne serais pas tenté d'utiliser le TClientDataset.

    S'il te donne des instructions, demande à avoir des explications.
    Il doit argumenter ses propros, à ton tour de le tester.

  6. #26
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    merci chaplin de me conforter dans mon choix, sa réponse

    s'est mieux et on doit faire au plus vite

  7. #27
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 187
    Points
    187
    Par défaut
    J'arrive un peu tard dans la discussion, mais c'est vrai que la demande de ton boss est assez bizzarre et speciale...

    M'enfin bon, j'ai deja eu a traiter ce genre de probleme, j'ai utilisé des TStringList par manque de connaissance à l'époque mais ça va, ça marché correctement. Un peu long...

    Et en faite, j'avais fais une espece de bidouille qui était bien utile.

    J'ai vu que tes champs sont séparé par ;

    Si ton occurence est un debut de ville par exemple, tu peux changer les colonnes de place en mettant la colonne (ville dans notre exemple) où tu souhaites chercher ton occurence en position 0 (maStringList.exchange(index1,index2)) puis faire un trie, puis rechercher ton occurence.

    Clairement, j'avais fais un truc genre :

    MaList.loadFromFile(monfichier);
    maList.sorted:=true;
    malist.exchange(index1,index2);
    rechercheOccurence(list,occ);
    remiseEnPlaceDesDonness(list);
    maListe.saveToFile(monFichier);

    L'avantage :
    - C'est que le trie des listes est ultra rapide
    - La recherche d'occurence se fait plus facilement vu que c'est trié (par dichotomie c'est le must dans ce cas la).

    L'inconvenient :
    - Aucun, c'est parfait! je plaisante... l'inconveniant, c'est que le traitement peut etre un peu long et que si pour X ou Y raison, ça plante. Faut tout recommencer.

  8. #28
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    tu as tout compris

  9. #29
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    J'ai vu que l'on a utilisé la TStringList (avec Sorted à False ? et à True ?), la TList, mais as-tu tenté la THashedStringList (IniFiles) ??? qui pour des chaines longues permet de réduire les temps de recherches en regroupant les chaines par une clé de hash ... elle est chiante a manipuler mais le principe peut-être réutilisé !

    Autre Question, est-ce un fichier CSV géré vraiement comme un CSV ou plutôt comme un fichier à position fixe :
    CSV :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    abc;adefded;bded;1;
    abcded;deded;beddb;47;
    fgfg;bede;abc;29;
    Fixe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       abc;adefded; bded;001;
    abcded;  deded;beddb;047;
      fgfg;   bede;  abc;029;
          ;       ;     ;   ;

  10. #30
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Cela revient à faire une analyse lexical, qu'est ce qu'on utilise pour ce genre de traitement en général ?

  11. #31
    Aos
    Aos est déconnecté
    Membre habitué

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 189
    Points : 187
    Points
    187
    Par défaut
    ava ? init ?
    Un dérivé de java mais avec du code deja tout pret.

  12. #32
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    salut, si au moins tu as pris le temps de répondre au question de Franck SORIANO et Gilbert Geyer, sera mieux, car là tu as besoin des programmeurs agées qui ont à l'époque travail bien avec les fichiers sans utilisé des objet (TList,...) (age>30 ans) pour t'aidé contre ton bos

  13. #33
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Sinon, rien que parcourir une TStringList de 3M de Lignes, cela prend plusieurs secondes*, la remplir 25 avec mon test, alors que lire le fichier n'en prend que 12 (avec création d'un autre fichier d'index OffSet-Length via TTextFileReader)

    *Donc, automatiquement à un moment donné, ça traine, j'ai fait le même principe que toi, le fichier faisait 100Mo, environ 10Mo était récupéré, chaque ligne était associé à une table de code (environ 100000 codes), je parsais le texte (libéllé, notes, ...), cela générait un glossaire (environ 12000 mots), et un Index de 850 000 lien mot-code, c'était généré en 1 minutes environ par ce que le glossaire finalement ne grossissait que très peu (les mots comme a donc si le ... était évidemment exclu, environ 400 mots blacklistés !), ensuite, la DB était tellement lente (la gestion des compteurs à la main sans trigger, insertion une par une, ...) ça prenait 1h, alors, je n'ai jamais cherché à améliorer la TStringList du Glossaire ... si j'avais eu 7 liste, cela aurait duré au moins 10 minutes ...

    Un autre Test, import d'un fichier CSV avec MySQL, il a avale les 300Mo en une bonne dizaines de minutes, puis pour créer un index sur chaque colonne, cela prend entre 5 et 10 minutes par index, on atteind rapidement 1 heure ! Je pense que les experts en indexation de MySQL sont bien meilleur que nous, disons que 2h pour tout traiter ça serait pas mal !

    Test sur un P4 3Ghz 4Go Ram

  14. #34
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    resalut voila les trois codes possible ::

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    procedure TFrame3.TraitementGeneralGrilleRecord(Sender: TObject);
    var
    i:integer;
    j:integer;
    K:Integer;
    TgidInterne:PClassGrille;
    destinationidInterne:PClassDest;
    opeidinterne:Integer;
    //******************************
    ClassDest:PClassDest;
    ClassGrille:PClassGrille;
    ClassPrefixe:PClassPrefixe;
    ClassFormule:PClassFormule;
    ClassOperateur:  PClassOperateur;
    //******************************
    QaysLogTrace:TQaysLogTrace;
     
    cur_ope:String;
    cur_date:String;
    cur_dest:String;
    cur_formule:String;
    tmp_formule:String;
     
    nb_dest  : integer;
    nb_pref  : integer;
    nb_fvente: integer;
     
    dispose_ok: boolean;
    begin
     
      cur_ope     := '';
      cur_date    := '';
      cur_dest    := '';
      cur_formule := '';
     
      nb_dest     := 0;
      nb_pref     := 0;
      nb_fvente   := 0;
     
      with MigrationFormule do
      begin
    //*************************************************
    //Lecture du max de chaque table pour le numéroteur
    //*************************************************
        FmaxDest:=lDestination.QaysUtilBdd.GetNextNumFromTable('destination','destination_id');
        FmaxFormule:=lTarifFormule.QaysUtilBdd.GetNextNumFromTable('tarif_formule','tf_id');
        FmaxGrille:=lTarifGrille.QaysUtilBdd.GetNextNumFromTable('tarif_grille','tg_id');
        FmaxOperateur:=lTarifFormule.QaysUtilBdd.GetNextNumFromTable('operateur','ope_id');
    //******************************************************************************
        if MigrationFormule.QLFICHIER.ReadFichier = 0 then
        begin
          //ProgressBar1.Min := 0;
          //ProgressBar1.Max := MigrationFormule.QLFICHIER.GetSize;
     
          GaugeCtrlFic.MinValue:= 0;
          GaugeCtrlFic.MaxValue:=  MigrationFormule.QLFICHIER.GetSize;
          i:= 0;
     
          Repeat
            Try
    //******************************************************************************
              i:= i+1;
              MigrationFormule.QLFICHIER.ReadLigne;
              GaugeCtrlFic.Progress := i;
     
              if (i mod 1000)= 0 then begin
                  //LabelTimeToExport.Caption := IntToStr(i);
                  Application.ProcessMessages;
              end;
     
              TempWork.LigneProgress:=MigrationFormule.QLFICHIER.Ligne;
              if (copy(TempWork.GiveOccurence(3), 1, 6) = '200808') or
                   (copy(TempWork.GiveOccurence(4), 1, 6) = '200808') or
                   (copy(TempWork.GiveOccurence(4), 1, 6) = '200809') or
                   (copy(TempWork.GiveOccurence(4), 1, 6) = '200809')
              then begin
                if TempWork.GiveOccurence(5) <> '' then
                begin
    //******************************************************************************
                if cur_ope <> TempWork.GiveOccurence(1) then begin
                  cur_ope := TempWork.GiveOccurence(1);
                  cur_date := '';
                  ClientDataSetOperateur.Filter := 'ope_nom_court='+''''+LowerCase(TempWork.GiveOccurence(1))+''''
                                            + ' or ope_nom_court='+''''+UpperCase(TempWork.GiveOccurence(1))+'''';
                  ClientDataSetOperateur.Filtered:= true;
                  ClientDataSetOperateur.Open;
                  if ClientDataSetOperateur.RecordCount = 0 then
                  begin
                      k:=MigrationFormule.SearchInOperateur([TempWork.GiveOccurence(1)]);
                      if  k = -1 then
                      begin
                          new(ClassOperateur);
                          FmaxOperateur:= FmaxOperateur+1;
                          ClassOperateur.ope_id := FmaxOperateur;
                          ClassOperateur.ope_nom_long     := TempWork.GiveOccurence(1);
                          ClassOperateur.ope_nom_court     := TempWork.GiveOccurence(1);
                          lOperateurInMem.Add(ClassOperateur);
                          k:= MigrationFormule.SearchInOperateur([ClassOperateur.ope_nom_court]);
                      end;
                      opeidinterne :=TClassOperateur(lOperateurInMem.Items[K]^).ope_id;
                  end
                  else
                      opeidinterne := ClientDataSetOperateur.FieldByName('ope_id').Value;
     
                  Labeloperateur.Caption := 'Nb  d''Operateurs. '+IntTostr(lOperateurInMem.Count-1);
                end;
    //******************************************************************************
                if cur_date <> TempWork.GiveOccurence(3)+' '+TempWork.GiveOccurence(4) then begin
                  k:=MigrationFormule.SearchInGrilleDate([TempWork.GiveOccurence(3),TempWork.GiveOccurence(4)]);
                  if  k = -1 then
                  begin
                      cur_date := TempWork.GiveOccurence(3)+' '+TempWork.GiveOccurence(4);
                      cur_dest := '';
                      new(ClassGrille);
                      FmaxGrille:= FmaxGrille+1;
                      ClassGrille.idgrille    := FmaxGrille;
                      ClassGrille.opeid       := opeidinterne;
                      ClassGrille.dateDeb     := TempWork.GiveOccurence(3);
                      ClassGrille.dateFin     := TempWork.GiveOccurence(4);
                      ClassGrille.destination := TList.Create;
                      lGrilleInMem.Add(ClassGrille);
                      k:=MigrationFormule.SearchInGrilleDate([ClassGrille.dateDeb,ClassGrille.datefin]);
                  end;
                  TgidInterne :=lGrilleInMem.Items[K];
                  LabelGrille.Caption := 'Nb  de Dates. '+IntTostr(lGrilleInMem.Count-1);
                end;
     
    //******************************************************************************
                k := MigrationFormule.SearchInGrilleDest(TClassGrille(TgidInterne^).destination, [TempWork.GiveOccurence(10)]);
                if k = -1 then
                  begin
                      FmaxDest := FmaxDest+1;
                      New(ClassDest);
                      ClassDest.Destination := TempWork.GiveOccurence(10);
                      ClassDest.iddes       := FmaxDest;
                      ClassDest.prefixe     := TList.create;
                      ClassDest.fvente      := TList.create;
                      TClassGrille(TgidInterne^).destination.Add(ClassDest);
                      k:= MigrationFormule.SearchInGrilleDest(TClassGrille(TgidInterne^).destination, [ClassDest.Destination]);
                      inc(nb_dest);
                  end;
                  destinationidInterne := TClassGrille(TgidInterne^).destination.Items[K];
                  LabelDest.Caption := 'Nb  de destinations. '+IntTostr(nb_dest);
     
    //******************************************************************************
                if MigrationFormule.SearchInGrillePref(TClassDest(destinationidInterne^).prefixe, [TempWork.GiveOccurence(5)]) = -1 then begin
                  New(ClassPrefixe);
                  ClassPrefixe.prefix     := TempWork.GiveOccurence(5);
                  TClassDest(destinationidInterne^).prefixe.add(ClassPrefixe);
                  inc(nb_pref);
                  LabelPrefix.Caption := 'Nb  de préfixes. '+IntTostr(nb_pref)+' -> '+ inttostr(TClassDest(destinationidInterne^).prefixe.count);
                end;
     
    //******************************************************************************
                dispose_ok:=true;
                New(ClassFormule);
                ClassFormule.idjour           := MY_LIB_DIVERS.StrToInt(TempWork.GiveOccurence(6));
                ClassFormule.TF_DATE_DEBUT    :=TempWork.GiveOccurence(3);
                ClassFormule.TF_DATE_FIN     := TempWork.GiveOccurence(4);
                ClassFormule.TF_HEURE_DEBUT   :=TempWork.GiveOccurence(7);
                ClassFormule.TF_HEURE_FIN     :=TempWork.GiveOccurence(8);
                ClassFormule.TF_CNX_DUREE     :='0';
                ClassFormule.TF_CNX_COUT      :='0';
                ClassFormule.TF_PRIX          :=TempWork.GiveOccurence(9);
                ClassFormule.TF_PAS           :='0';
     
                  if MigrationFormule.SearchInGrilleFormule(TClassDest(destinationidInterne^).fvente,
                                                            [ClassFormule.idjour,
                                                             ClassFormule.TF_DATE_DEBUT,
                                                             ClassFormule.TF_DATE_FIN,
                                                             ClassFormule.TF_HEURE_DEBUT,
                                                             ClassFormule.TF_HEURE_FIN,
                                                             ClassFormule.TF_PRIX]) = -1 then
                  begin
                    FmaxFormule:= FmaxFormule+1;
                    ClassFormule.idformule        := FmaxFormule;
                    TClassDest(destinationidInterne^).fvente.Add(ClassFormule);
                    dispose_ok:=false;
                    inc(nb_fvente);
                    LabelFormule.Caption := 'Nb de formules. '+inttostr(nb_fvente);
                  end;
                if dispose_ok then dispose(ClassFormule);
              end;
              end;
    //******************************************************************************
     
            Except
                on E: Exception do
                begin
                  QaysLogTrace:=TQaysLogTrace.Create;
                  QaysLogTrace.NomAppelant:='TraitementGeneralGrilleRecord';
                  QaysLogTrace.LogDateTime:=(now);
                  QaysLogTrace.Parametre.Add('Erreur :'+E.Message);
                  QaysLogTrace.Parametre.Add(TempWork.LigneProgress);
                  QaysLogTrace.WriteLogTrace;
                end;
            End;
          Until (MigrationFormule.QLFICHIER.FinFichier);
          MigrationFormule.QLFICHIER.CloseFichier;
        end;
      end;
      //*********************************************************
    end;
    1 code avec des records des pointeurs et des tlist

  15. #35
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    1 code avec un dataset qui charge tout le ficheir et ensuite je fait un traitement comme avec une table select, insert, delete etc....
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    //*****************************************************************************
    procedure TFrame3.CharegInDataSet(Sender: TObject);
    var
    QaysLogTrace:TQaysLogTrace;
    i:integer;
    begin
      ClientDataSetimport :=TClientDataSet.Create(nil);
      ClientDataSetimport.FieldDefs.Add('operateur',ftString,30,false);
      ClientDataSetimport.FieldDefs.Add('operateurcode',ftString,30,false);
      ClientDataSetimport.FieldDefs.Add('date-debut',ftString,30,false);
      ClientDataSetimport.FieldDefs.Add('date-fin',ftString,30,false);
      ClientDataSetimport.FieldDefs.Add('prefix',ftString,30,false);
      ClientDataSetimport.FieldDefs.Add('tarif-jour',ftString,30,false);
      ClientDataSetimport.FieldDefs.Add('heure-debut',ftString,30,false);
      ClientDataSetimport.FieldDefs.Add('heure-fin',ftString,30,false);
      ClientDataSetimport.FieldDefs.Add('prix',ftString,30,false);
      ClientDataSetimport.FieldDefs.Add('destination	fichiers',ftString,30,false);
      ClientDataSetimport.CreateDataSet;
      with MigrationFormule do
      begin
    //*************************************************
    //Lecture du max de chaque table pour le numéroteur
    //*************************************************
    //******************************************************************************
        if MigrationFormule.QLFICHIER.ReadFichier = 0 then
        begin
          ProgressBar1.Min := 0;
          ProgressBar1.Max := MigrationFormule.QLFICHIER.GetSize;
     
          GaugeCtrlFic.MinValue:= 0;
          GaugeCtrlFic.MaxValue:=  ProgressBar1.Max;
          i:= 0;
     
          Repeat
            Try
              i:= i+1;
              MigrationFormule.QLFICHIER.ReadLigne;
              GaugeCtrlFic.Progress := i;
              ProgressBar1.Position := i;
              if (i mod 1000)= 0 then begin
                  LabelTimeToExport.Caption := IntToStr(i);
                  Application.ProcessMessages;
              end;
              TempWork.LigneProgress:=MigrationFormule.QLFICHIER.Ligne;
              ClientDataSetimport.Append;
              ClientDataSetimport.FieldByName('operateur').value:=TempWork.GiveOccurence(1);
              ClientDataSetimport.FieldByName('operateurcode').value:=TempWork.GiveOccurence(2);
              ClientDataSetimport.FieldByName('date-debut').value:=TempWork.GiveOccurence(3);
              ClientDataSetimport.FieldByName('date-fin').value:=TempWork.GiveOccurence(4);
              ClientDataSetimport.FieldByName('prefix').value:=TempWork.GiveOccurence(5);
              ClientDataSetimport.FieldByName('tarif-jour').value:=TempWork.GiveOccurence(6);
              ClientDataSetimport.FieldByName('heure-debut').value:=TempWork.GiveOccurence(7);
              ClientDataSetimport.FieldByName('heure-fin').value:=TempWork.GiveOccurence(8);
              ClientDataSetimport.FieldByName('prix').value:=TempWork.GiveOccurence(9);
              ClientDataSetimport.FieldByName('destination	fichiers').value:=TempWork.GiveOccurence(10);
              ClientDataSetimport.Post;
            Except
                on E: Exception do
                begin
                  QaysLogTrace:=TQaysLogTrace.Create;
                  QaysLogTrace.NomAppelant:='TraitementGeneralGrilleRecord';
                  QaysLogTrace.LogDateTime:=(now);
                  QaysLogTrace.Parametre.Add('Erreur :'+E.Message);
                  QaysLogTrace.Parametre.Add(TempWork.LigneProgress);
                  QaysLogTrace.WriteLogTrace;
                end;
            End;
          Until (MigrationFormule.QLFICHIER.FinFichier);
          MigrationFormule.QLFICHIER.CloseFichier;
        end;
      end;
      //*********************************************************
    end;

  16. #36
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    et enfin un qui est l'équivalent du premier sauf que là les clientdataset remplace les pointeur et tlist
    //******************************************************************************
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
     
     
    procedure TFrame3.TraitementGeneralGrilleClientDataSet(Sender: TObject);
    var
    i:integer;
    j:integer;
    K:Integer;
    TgidInterne:Integer;
    destinationidInterne:Integer;
    opeidinterne:Integer;
    //******************************
    ClassDest:TClientDataSet;
    ClassGrille:TClientDataSet;
    ClassPrefixe:TClientDataSet;
    ClassFormule:TClientDataSet;
    ClassOperateur:  TClientDataSet;
    ClassImportFile:  TClientDataSet;
    //******************************
    cur_ope:String;
    cur_date:String;
    cur_dest:String;
    cur_formule:String;
    tmp_formule:String;
    datedebut:Tdate;
     
    begin
      datedebut:= now;
      cur_ope     := '';
      cur_date    := '';
      cur_dest    := '';
      cur_formule := '';
     
      ClassImportFile := TClientDataSet.Create(nil);
      ClassImportFile.FieldDefs.Add('operateur',ftString,30,false);
      ClassImportFile.FieldDefs.Add('date-debut',ftString,30,false);
      ClassImportFile.FieldDefs.Add('date-fin',ftString,30,false);
      ClassImportFile.FieldDefs.Add('prefix',ftString,30,false);
      ClassImportFile.FieldDefs.Add('tarif-jour',ftString,30,false);
      ClassImportFile.FieldDefs.Add('heure-debut',ftString,30,false);
      ClassImportFile.FieldDefs.Add('heure-fin',ftString,30,false);
      ClassImportFile.FieldDefs.Add('prix',ftString,30,false);
      ClassImportFile.FieldDefs.Add('destination	fichiers',ftString,30,false);
      ClassImportFile.CreateDataSet;
     
      ClassOperateur := TClientDataSet.Create(nil);
      ClassOperateur.FieldDefs.Add('ope_id',ftString,30,false);
      ClassOperateur.FieldDefs.Add('ope_nom_court',ftString,30,false);
      ClassOperateur.FieldDefs.Add('ope_nom_long',ftString,30,false);
      ClassOperateur.CreateDataSet;
     
      ClassGrille := TClientDataSet.Create(nil);
      ClassGrille.FieldDefs.Add('id_grille',ftString,30,false);
      ClassGrille.FieldDefs.Add('dateDeb',ftString,30,false);
      ClassGrille.FieldDefs.Add('datefin',ftString,30,false);
      ClassGrille.CreateDataSet;
     
      ClassDest := TClientDataSet.Create(nil);
      ClassDest.FieldDefs.Add('id_des',ftString,30,false);
      ClassDest.FieldDefs.Add('id_grille',ftString,30,false);
      ClassDest.FieldDefs.Add('destination',ftString,30,false);
      ClassDest.CreateDataSet;
     
      ClassPrefixe := TClientDataSet.Create(nil);
      ClassPrefixe.FieldDefs.Add('prefixe',ftString,30,false);
      ClassPrefixe.FieldDefs.Add('id_Grille',ftString,30,false);
      ClassPrefixe.FieldDefs.Add('id_des',ftString,30,false);
      ClassPrefixe.CreateDataSet;
     
      ClassFormule := TClientDataSet.Create(nil);
      ClassFormule.FieldDefs.Add('id_Grille',ftString,30,false);
      ClassFormule.FieldDefs.Add('id_des',ftString,30,false);
      ClassFormule.FieldDefs.Add('idjour',ftString,30,false);
      ClassFormule.FieldDefs.Add('TF_DATE_DEBUT',ftString,30,false);
      ClassFormule.FieldDefs.Add('TF_DATE_FIN',ftString,30,false);
      ClassFormule.FieldDefs.Add('TF_HEURE_DEBUT',ftString,30,false);
      ClassFormule.FieldDefs.Add('TF_HEURE_FIN',ftString,30,false);
      ClassFormule.FieldDefs.Add('TF_CNX_DUREE',ftString,30,false);
      ClassFormule.FieldDefs.Add('TF_CNX_COUT',ftString,30,false);
      ClassFormule.FieldDefs.Add('TF_PRIX',ftString,30,false);
      ClassFormule.FieldDefs.Add('TF_PAS',ftString,30,false);
      ClassFormule.FieldDefs.Add('id_formule',ftString,30,false);
      ClassFormule.CreateDataSet;
      //ClassFormule.LoadFromFile(MigrationFormule.QLFICHIER.NameFichier);
     
      with MigrationFormule do
      begin
        if MigrationFormule.QLFICHIER.ReadFichier = 0 then
        begin
          ProgressBar1.Min := 0;
          ProgressBar1.Max := MigrationFormule.QLFICHIER.GetSize;
     
          GaugeCtrlFic.MinValue:= 0;
          GaugeCtrlFic.MaxValue:=  ProgressBar1.Max;
          i:= 0;
     
        //*************************************************
        //Lecture du max de chaque table pour le numéroteur
        //*************************************************
        FmaxDest:=1;//lDestination.QaysUtilBdd.GetNextNumFromTable('destination','destination_id');
        FmaxFormule:=1;//lTarifFormule.QaysUtilBdd.GetNextNumFromTable('tarif_formule','tf_id');
        FmaxGrille:=1;//lTarifGrille.QaysUtilBdd.GetNextNumFromTable('tarif_grille','tg_id');
        FmaxOperateur:=1;//lTarifFormule.QaysUtilBdd.GetNextNumFromTable('operateur','ope_id');
     
        //*******************************************************
        ProgressBar1.Min := 0;
        ProgressBar1.Max := MigrationFormule.QLFICHIER.GetSize;
     
        GaugeCtrlFic.MinValue:= 0;
        GaugeCtrlFic.MaxValue:=  ProgressBar1.Max;
        i:= 0;
        if MigrationFormule.QLFICHIER.ReadFichier = 0 then
        begin
              Repeat
                i:= i+1;
                MigrationFormule.QLFICHIER.ReadLigne;
                //****************************************
                GaugeCtrlFic.Progress := i;
                ProgressBar1.Position := i;
                if (i mod 1000)= 0 then begin
                  LabelTimeToExport.Caption := IntToStr(i)+'/'+IntToStr(ProgressBar1.Max);
                  Application.ProcessMessages;
                end;
                TempWork.LigneProgress:=MigrationFormule.QLFICHIER.Ligne;
                //****************************************
                //if (copy(TempWork.GiveOccurence(3), 1, 6) = '200710') or
                //   (copy(TempWork.GiveOccurence(4), 1, 6) = '200710') then
                //begin
    //******************************************************************************
                    if cur_ope <> TempWork.GiveOccurence(1) then
                    begin
                        cur_ope := TempWork.GiveOccurence(1);
                        cur_date := '';
    			              ClassOperateur.Filter := 'ope_nom_court='+''''+TempWork.GiveOccurence(1)+'''';
                        ClassOperateur.Filtered:= true;
                        ClassOperateur.Open;
                        if ClassOperateur.RecordCount = 0 then
                        begin
                            ClassOperateur.Append;
                            ClassOperateur.FieldByName('ope_id').Value := FmaxOperateur;
                            ClassOperateur.FieldByName('ope_nom_court').Value := TempWork.GiveOccurence(1);
                            ClassOperateur.FieldByName('ope_nom_long').Value := TempWork.GiveOccurence(1);
                            ClassOperateur.Post;
                            opeidinterne := FmaxOperateur;
                        end
                        else
                            opeidinterne := ClassOperateur.FieldByName('ope_id').Value;
    			          end;
     
    //******************************************************************************
                    if cur_date <> TempWork.GiveOccurence(3)+' '+TempWork.GiveOccurence(4) then
                    begin
                        cur_date := TempWork.GiveOccurence(3)+' '+TempWork.GiveOccurence(4);
                        cur_dest := '';
                        ClassGrille.Filter := 'DateDeb='+''''+TempWork.GiveOccurence(3)+''''
                                     +' and DateFin='+''''+TempWork.GiveOccurence(4)+''''  ;
                        ClassGrille.Filtered:= true;
                        ClassGrille.Open;
                        if ClassGrille.RecordCount = 0 then
                        begin
                            ClassGrille.Append;
                            ClassGrille.FieldByName('id_grille').Value := FmaxGrille;
                            ClassGrille.FieldByName('DateDeb').Value := TempWork.GiveOccurence(3);
                            ClassGrille.FieldByName('DateFin').Value := TempWork.GiveOccurence(4);
                            ClassGrille.Post;
                            TgidInterne := FmaxGrille;
                        end
                        else
                            TgidInterne :=ClassGrille.FieldByName('id_grille').Value;
    			        end;
    //******************************************************************************
                  if cur_dest <> inttostr(TgidInterne)+TempWork.GiveOccurence(10) then
                  begin
                      cur_dest := inttostr(TgidInterne)+TempWork.GiveOccurence(10);
                      ClassDest.Filter := 'id_grille='+''''+IntTostr(TgidInterne)+''''
                                   +' and destination='+''''+TempWork.GiveOccurence(10)+''''  ;
                      ClassDest.Filtered:= true;
                      ClassDest.Open;
                      if ClassDest.RecordCount = 0 then
                      begin
                          ClassDest.Append;
                          ClassDest.FieldByName('id_grille').Value := TgidInterne;
                          ClassDest.FieldByName('id_des').Value := FmaxDest;
                          ClassDest.FieldByName('destination').Value := TempWork.GiveOccurence(10);
                          ClassDest.Post;
                          destinationidInterne:=FmaxDest;
                      end
                      else
                          destinationidInterne :=ClassDest.FieldByName('id_des').Value;
    			        end;
    //******************************************************************************
                  ClassPrefixe.Filter := 'id_grille='+''''+IntToStr(TgidInterne)+''''
                                      +'and prefixe='+''''+TempWork.GiveOccurence(10)+''''  ;
                  ClassPrefixe.Filtered:= true;
                  ClassPrefixe.Open;
                  if ClassPrefixe.RecordCount = 0 then
                  begin
                      ClassPrefixe.Append;
                      ClassPrefixe.FieldByName('id_grille').Value := TgidInterne;
                      ClassPrefixe.FieldByName('id_des').Value := FmaxDest;
                      ClassPrefixe.FieldByName('prefixe').Value := TempWork.GiveOccurence(5);
                      ClassPrefixe.Post;
                      destinationidInterne :=FmaxDest
                  end
                  else
                      destinationidInterne :=ClassDest.FieldByName('id_grille').Value;
    //******************************************************************************
    			        tmp_formule := inttostr(TgidInterne)+' '+inttostr(destinationidInterne)+' '+TempWork.GiveOccurence(6)+TempWork.GiveOccurence(7)+TempWork.GiveOccurence(8);
                  if cur_formule <> tmp_formule then
                  begin
                      cur_formule := tmp_formule;
                      ClassFormule.Filter := 'id_Grille='+''''+IntToStr(TgidInterne)+''''
                                      +' and iddes='+''''+IntToStr(destinationidInterne)+''''
                                      +' and idjour='+''''+(TempWork.GiveOccurence(6))+''''
     
                                      +' and TF_DATE_DEBUT='+''''+(TempWork.GiveOccurence(3))+''''
                                      +' and TF_DATE_FIN='+''''+(TempWork.GiveOccurence(4))+''''
                                      +' and TF_HEURE_DEBUT='+''''+(TempWork.GiveOccurence(7))+''''
                                      +' and TF_HEURE_FIN='+''''+(TempWork.GiveOccurence(8))+''''
                                      +' and TF_PRIX='+''''+(TempWork.GiveOccurence(9))+'''';
     
                      if ClassFormule.RecordCount = 0 then
                      begin
                          ClassFormule.Append;
                          ClassFormule.FieldByName('id_formule').Value:= FmaxFormule;
                          ClassFormule.FieldByName('id_Grille').Value:= TgidInterne;
                          ClassFormule.FieldByName('id_des').Value:= destinationidInterne;
                          ClassFormule.FieldByName('idjour').Value:= StrToInt(TempWork.GiveOccurence(6));
                          ClassFormule.FieldByName('TF_DATE_DEBUT').Value:= TempWork.GiveOccurence(3);
                          ClassFormule.FieldByName('TF_DATE_FIN').Value:= TempWork.GiveOccurence(4);
                          ClassFormule.FieldByName('TF_HEURE_DEBUT').Value:= TempWork.GiveOccurence(7);
                          ClassFormule.FieldByName('TF_HEURE_FIN').Value:= TempWork.GiveOccurence(8);
                          ClassFormule.FieldByName('TF_CNX_DUREE').Value:= '0';
                          ClassFormule.FieldByName('TF_CNX_COUT').Value:= '0';
                          ClassFormule.FieldByName('TF_PRIX').Value:= TempWork.GiveOccurence(9);
                          ClassFormule.FieldByName('TF_PAS').Value:= '0';
                          ClassFormule.Post;
                      end
    			       end;
    			    //end;
              Until MigrationFormule.QLFICHIER.FinFichier;
              MigrationFormule.QLFICHIER.CloseFichier;
        end;
        end;
      end;
      ShowMessage('Commencé à'+timeTostr(datedebut)+' et terminé à '+TimeToStr(now));
    end;

  17. #37
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    oioi, alors c'est trop pour moi
    ok, je vois que tu utilise delphi.net, moi je suis toujour au delphi 6, (vieux age>30 ans)
    mais si tu peut utlisé blockread et blockwrite, je peut taidé si, non j'ai rien à faire ici
    bon nuit

  18. #38
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    au il s'agit d'un fichier csv comme suit:
    abc;adefded;bded;1;
    abcded;deded;beddb;47;
    fgfg;bede;abc;29;
    avec un minimum de 1 500 000 lignes minimu a chaque fois, et chaque occurence doit être lut cat il n'y a aucun doublons dans ce fichier

    en fait je doit récupéer le nom de l'operateur le sauvegarder de façon unique
    recherche les grille de date et les sauvegarde de façon unique
    recherche le prefixe et les sauvegarde de façon unique
    recherche la formulz et les sauvegarde de façon unique
    ensuite cela donne un minime de 600000 à 800000 lignes qui ont été sauvegardé et qui devront être insérer en base de doonées

    de toutes les fçcon vous allez conprendre la "logique" en lisant les algos

  19. #39
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    edam non tu n'es pas vieux , mois aussi j'ai plus de 30 ans, c'es mon boss qui veux impréssioner ces chefs

  20. #40
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    ok, merci
    1- tu utilise le filtrage sur Ta Clientdataset, mieux utliser Locate
    2-tes id (idgrill, idmax, ..) tu les incrémante pas????????
    3- tu fait trop de coparésant en utlisant des strings surtout la convetion des nbr en string avant la comparésant
    bah il y a bcp d'ptimisation à faire vraiment bcp

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [JDOM] Problème pour parser un fichier XML [débutant]
    Par adn013 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 16/05/2007, 12h00
  2. fonction pour parser un fichier
    Par Dirty Harry dans le forum Langage
    Réponses: 7
    Dernier message: 30/01/2007, 05h13
  3. Réponses: 2
    Dernier message: 14/09/2006, 15h22
  4. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32
  5. [SAX] Probleme pour parser un fichier
    Par aymron dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 25/11/2005, 15h48

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