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

VBScript Discussion :

Windows vbs script fonctionne pas avec 55MB fichier texte


Sujet :

VBScript

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Windows vbs script fonctionne pas avec 55MB fichier texte
    Bonjour,

    J'ai un vbs script qui prend un fichier texte en entree pour faire des validations, ensuite creer deux fichiers textes en sortie.

    Si je passe un fichier de 20MB, cela marche correctement mais si je passe un fichier plus grand que 20MB, disons 55MG, le vbs ne genere pas mes fichiers en sortie ni j'ai un message d'erreur.

    Est-ce qu'il y a un probleme avec le volumetrie de donnee? Il y a t-il une solution?

    Merci

  2. #2
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    Après attente de quelques dizaines de secondes, voire quelques minutes, regarde dans la liste des processus actifs(Ctrl+Alt+Supp) si Wscript.exe ou Cscript.exe y est ou non.
    S'il y est, c'est que traitement n'est pas terminé, donc attendre la fin, car un fichier TEXTE de cette taille est difficile à décortiquer.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Malheureusement non, après que le traitement se termine, pas de Wscript.exe ni Cscript.exe. J'ai laissé pendant toute une journée mais pas de fichier en sortie et pas d’erreur non plus.

    Cela a-t-il rapport avec la capacité de mémoire du serveur pour traiter cette taille de fichier?

    Merci

  4. #4
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    .....pas de fichier en sortie et pas d’erreur non plus.
    Si dans le script(au début), il y a des On Error Resume Next, on n'espèrera pas avoir des messages d'erreur. Essaie de les mettre en commentaire pour voir.
    Cela a-t-il rapport avec la capacité de mémoire du serveur pour traiter cette taille de fichier?
    Avec les mémoires actuelles, je ne pense pas, c'est plutôt Wscript/Cscript qui, peut-être, ne sait pas gérer des fichiers de très grande taille.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  5. #5
    Expert éminent
    Avatar de hackoofr
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2009
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2009
    Messages : 3 839
    Points : 9 222
    Points
    9 222
    Par défaut
    Citation Envoyé par Yuggy15 Voir le message
    Est-ce qu'il y a un probleme avec le volumetrie de donnee? Il y a t-il une solution?

    ça dépend de la méthode que vous utilisez, Puisque vous nous n'avez pas fourni un code ou donné une indication quant à la méthode que vous utilisez

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Salut,

    J'ai vérifié le script et le code été déjà en commentaire.

    Ci-dessous le code complet de mon script:


    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
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    757
    758
    759
    760
    761
    762
    763
    764
    765
    766
    767
    768
    769
    770
    771
    772
    773
    774
    775
    776
    777
    778
    779
    780
    781
    782
    783
    784
    785
    786
    787
    788
    789
    790
    791
    792
    793
    794
    795
    796
    797
    798
    799
    800
    801
    802
    803
    804
    805
    806
    807
    808
    809
    810
    811
    812
    813
    814
    815
    816
    817
    818
    819
    820
    821
    822
    823
    824
    825
    826
    827
    828
    829
    830
    831
    832
    833
    834
    835
    836
    837
    838
    839
    840
    841
    842
    843
    844
    845
    846
    847
    848
    849
    850
    851
    852
    853
    854
    855
    856
    857
    858
    859
    860
    861
    862
    863
    864
    865
    866
    867
    868
    869
    870
    871
    872
    873
    874
    875
    876
    877
    878
    879
    880
    881
    882
    883
    884
    885
    886
    887
    888
    889
    890
    891
    892
    893
    894
    895
    896
    897
    898
    899
    900
    901
    902
    903
    904
    905
    906
    907
    908
    909
    910
    911
    912
    913
    914
    915
    916
    917
    918
    919
    920
    921
    922
    923
    924
    925
    926
    927
    928
    929
    930
    931
    932
    933
    934
    935
    936
    937
    938
    939
    940
    941
    942
    943
    944
    945
    946
    947
    948
    949
    950
    951
    952
    953
    954
    955
    956
    957
    958
    959
    960
    961
    962
    963
    964
    965
    966
    967
    968
    969
    970
    971
    972
    973
    974
    975
    976
    977
    978
    979
    980
    981
    982
    983
    984
    985
    986
    987
    988
    989
    990
    991
    992
    993
    994
    995
    996
    997
    998
    999
    1000
    1001
    1002
    1003
    1004
    1005
    1006
    1007
    1008
    1009
    1010
    1011
    1012
    1013
    1014
    1015
    1016
    1017
    1018
    1019
    1020
    1021
    1022
    1023
    1024
    1025
    1026
    1027
    1028
    1029
    1030
    1031
    1032
    1033
    1034
    1035
    1036
    1037
    1038
    1039
    1040
    1041
    1042
    1043
    1044
    1045
    1046
    1047
    1048
    1049
    1050
    1051
    1052
    1053
    1054
    1055
    1056
    1057
    1058
    1059
    1060
    1061
    1062
    1063
    1064
    1065
    1066
    1067
    1068
    1069
    1070
    1071
    1072
    1073
    1074
    1075
    1076
    1077
    1078
    1079
    1080
    1081
    1082
    1083
    1084
    1085
    1086
    1087
    1088
    1089
    1090
    1091
    1092
    1093
    1094
    1095
    1096
    1097
    1098
    1099
    1100
    1101
    1102
    1103
    1104
    1105
    1106
    1107
    1108
    1109
    1110
    1111
    1112
    1113
    1114
    1115
    1116
    1117
    1118
    1119
    1120
    1121
    1122
    1123
    1124
    1125
    1126
    1127
    1128
    1129
    1130
    1131
    1132
    1133
    1134
    1135
    1136
    1137
    1138
    1139
    1140
    1141
    1142
    1143
    1144
    1145
    1146
    1147
    1148
    1149
    1150
    1151
    1152
    1153
    1154
    1155
    1156
    1157
    1158
    1159
    1160
    1161
    1162
    1163
    1164
    1165
    1166
    1167
    1168
    1169
    1170
    1171
    1172
    1173
    1174
    1175
    1176
    1177
    1178
    1179
    1180
    1181
    1182
    1183
    1184
    1185
    1186
    1187
    1188
    1189
    1190
    1191
    1192
    1193
    1194
    1195
    1196
    1197
    1198
    1199
    1200
    1201
    1202
    1203
    1204
    1205
    1206
    1207
    1208
    1209
    1210
    1211
    1212
    1213
    1214
    1215
    1216
    1217
    1218
    1219
    1220
    1221
    1222
    1223
    1224
    1225
    1226
    1227
    1228
    1229
    1230
    1231
    1232
    1233
    1234
    1235
    1236
    1237
    1238
    1239
    1240
    1241
    1242
    1243
    1244
    1245
    1246
    1247
    1248
    1249
    1250
    1251
    1252
    1253
    1254
    1255
    1256
    1257
    1258
    1259
    1260
    1261
    1262
    1263
    1264
    1265
    1266
    1267
    1268
    1269
    1270
    1271
    1272
    1273
    1274
    1275
    1276
    1277
    1278
    1279
    1280
    1281
    1282
    1283
    1284
    1285
    Option Explicit
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Procédures génériques                                                  ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    '** Récupération du format paramétré pour un nombre décimal
    '******************************************************************************
    Public Sub RecupFormatParamNbDec(in_Format, out_Separateur, _
               out_NbCar, out_NbEnt, out_NbDec)
     
     Dim Position_Separateur
     
      Position_Separateur = InStr(in_Format, ",") + InStr(in_Format, ".")
     
      out_Separateur = Mid(in_Format, Position_Separateur, 1)
      out_NbCar = CInt(Split(in_Format, out_Separateur)(0)) ' Nb total de caractères
      out_NbDec = CInt(Split(in_Format, out_Separateur)(1)) ' Nb de décimales
      out_NbEnt = out_NbCar - out_NbDec - 1                 ' Nb d'entiers
     
    End Sub
     
     
    '******************************************************************************
    ' ** Décomposition d'un nombre en ses constituants
    '******************************************************************************
    Public Sub DecomposeNombre(in_ValeurChamp, in_TailleFormat, _
      out_Position_Separateur, out_Separateur, _
      out_Partie_Entiere, out_Partie_Decimale)
     
       ' Valeurs par défaut
       out_Separateur = ""
       out_Partie_Entiere = 0
       out_Partie_Decimale = 0
     
       out_Position_Separateur = InStr(in_ValeurChamp, ",") + InStr(in_ValeurChamp, ".")
     
       If out_Position_Separateur = 0 Then ' Nombre entier
         out_Partie_Entiere = in_ValeurChamp
       Else ' Nombre décimal
         out_Separateur = Mid(in_ValeurChamp, out_Position_Separateur, 1)
         out_Partie_Entiere = Trim(Split(in_ValeurChamp, out_Separateur)(0))
         ' Test nécessaire car on peut avoir une valeur du type "123,"
         If (Len(Trim(out_Partie_Entiere)) + 1) < Len(Trim(in_ValeurChamp)) Then
           out_Partie_Decimale = Trim(Split(CStr(in_ValeurChamp), out_Separateur)(1))
         End If
       End If
     
    End Sub
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Fin procédures génériques                                              ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Gestion de la base Oracle                                              ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '***********************************************************************************
    '** Cette fonction retourne un objet de type connexion à oracle
    '***********************************************************************************
    Public Function GetConnexion(ServeurNameString, UserNameString, PasswordString)
     
    Dim Conn
     
        Set Conn = CreateObject("ADODB.Connection")
        Call Conn.Open( _
            "Provider=MSDAORA;" & _
            "Data Source=" & ServeurNameString & ";" & _
            "User ID=" & UserNameString & ";" & _
            "Password=" & PasswordString)
     
       Set GetConnexion = Conn
     
    End Function
     
    '***********************************************************************************
    ''' Permet d'exécuter une requête et de récuperer directement la valeur en cas de retour unique
    '***********************************************************************************
    Public Function ExecuteRequeteUnResultat(in_Requete)
     Dim Resultat
     
      Set Resultat = Connexion_BDD.Execute(in_Requete)
      If Not (Resultat.EOF = True And Resultat.BOF = True) Then
          Call Resultat.MoveFirst
          ExecuteRequeteUnResultat = Resultat(0).Value
      End If
     
    End Function
     
    '***********************************************************************************
    ''' Procédure d'alimentation d'un template avec les données réelles
    ''' Exemple : Template = select [Champ_Date] from [Table_Date]
    '''           Data     = ( ( Champ_Date ; DATE_EXPLOITATION) ; ( Table_Date ; DATE_EXPLOIT ) )
    '''           Requête  = select DATE_EXPLOITATION from DATE_EXPLOIT
    '''
    ''' Si AffecteNull = True, on met NULL dans tous les champs non définis
    ''' sinon, on ne met rien
    '***********************************************************************************
    Public Function MergeRequete(ByRef Template, ByRef Data, in_AffecteNull)
      Dim Field
      Dim Requete
      Dim TestApostrophe
     
      Requete = Template
      For Each Field In Data
          Requete = Replace(Requete, "[" & Field & "]", Data(Field))
      Next
     
      If in_AffecteNull = True Then
        While InStr(Requete, "[") <> 0
     
          ' Récupération du caractère qui précède le [ pour repérer les champs alphanumériques
          TestApostrophe = Right(Mid(Requete, 1, InStr(Requete, "[") - 1), 1)
          If TestApostrophe = "'" Then
            ' -2 et +2 car il faut aussi supprimer les ' qui encadrent les crochets
            Requete = Mid(Requete, 1, InStr(Requete, "[") - 2) & _
                      "NULL" & _
                      Mid(Requete, InStr(Requete, "]") + 2)
          Else
            Requete = Mid(Requete, 1, InStr(Requete, "[") - 1) & _
                      "NULL" & _
                      Mid(Requete, InStr(Requete, "]") + 1)
          End If
     
        Wend
      Else
        While InStr(Requete, "[") <> 0
     
          ' Récupération du caractère qui précède le [ pour repérer les champs alphanumériques
          TestApostrophe = Right(Mid(Requete, 1, InStr(Requete, "[") - 1), 1)
          If TestApostrophe = "'" Then
            ' -2 et +2 car il faut aussi supprimer les ' qui encadrent les crochets
            Requete = Mid(Requete, 1, InStr(Requete, "[") - 2) & _
                      Mid(Requete, InStr(Requete, "]") + 2)
          Else
            Requete = Mid(Requete, 1, InStr(Requete, "[") - 1) & _
                      Mid(Requete, InStr(Requete, "]") + 1)
          End If
     
        Wend
      End If
     
      MergeRequete = Requete
     
    End Function
     
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Fin gestion de la base Oracle                                          ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Gestion des erreurs                                                    ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    ' Initialisation du rapport d'erreurs
    '******************************************************************************
    Private Sub InitFicLog()
      Set Dic_LignesFicLog = CreateObject("Scripting.Dictionary")
    End Sub
     
    '******************************************************************************
    ' Ajout d'une ligne dans le rapport d'erreurs
    '******************************************************************************
    Private Sub AjoutLigneFicLog(in_Ligne)
      Call Dic_LignesFicLog.Add(Dic_LignesFicLog.Count, in_Ligne)
    End Sub
     
    '******************************************************************************
    ' Création du fichier de rapport d'erreurs
    '******************************************************************************
    Private Sub CreeFicLog()
     Dim Cle
     Dim Fs
     Dim Fd
     
      If Str_CheminFicLog = "" Then Str_CheminFicLog = "D:\Exploit\Logs\INTF\"
     
      If Not Dic_Param_Globaux.Exists("NOM_FIC_ERREURS") = "" Then
        Str_NomFicLog = "ISM_Err_Chgt_Decamasterpos.log"
      Else
        Str_NomFicLog = Dic_Param_Globaux("NOM_FIC_ERREURS")
      End If
     
      Set Fs = CreateObject("Scripting.FileSystemObject")
      Set Fd = Fs.OpenTextFile(Str_CheminFicLog & Str_NomFicLog, 2, True)
     
      If Dic_LignesFicLog.Count > 0 Then
        For Each Cle In Dic_LignesFicLog
          Fd.Writeline (Dic_LignesFicLog(Cle))
        Next
      End If
     
      Fd.Close
     
    End Sub
     
    '******************************************************************************
    ' Fin du script en cas d'erreur bloquante
    '******************************************************************************
    Private Sub SortieEnErreur(in_MsgErr)
      Call AjoutLigneFicLog (in_MsgErr)
      Call CreeFicLog
      Call WScript.Echo ("Erreur bloquante ; voir le fichier de log")
      Call WScript.Quit(1)
    End Sub
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Fin gestion des erreurs                                                ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Gestion des paramètres en entrée                                       ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    ' Stockage des paramètres en entrée du script
    '******************************************************************************
    Private Sub RecupParamEntree()
     
      If WScript.Arguments.Count = 7 then
        Str_NomTNS       = WScript.Arguments(0)
        Str_Utilisateur  = WScript.Arguments(1)
        Str_MdP          = WScript.Arguments(2)
        Str_CheminRepIni = WScript.Arguments(3) & "\"
        Str_CheminFicLog = WScript.Arguments(4) & "\"
        Str_CheminFicInsert = WScript.Arguments(5) & "\"
        Str_CheminFicSource = WScript.Arguments(6) & "\"
      Else
        Call SortieEnErreur("Erreur sur les paramètres en entrée")
      End If
     
    End Sub
     
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Fin gestion des paramètres en entrée                                   ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Gestion des fichiers ini                                               ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    ' Chargement d'un fichier ini
    '******************************************************************************
    Private Sub ChargeFichierIni(in_Str_Chemin_Fichier, io_Dic_Param )
     
      Dim Fs
      Dim Fd
      Dim Ligne
      Dim Identificateur
      Dim Valeur
     
      Set Fs = CreateObject("Scripting.FileSystemObject")
     
      If Not Fs.FileExists(in_Str_Chemin_Fichier) Then
        Call SortieEnErreur("Fichier manquant : " & in_Str_Chemin_Fichier)
      Else
     
        Set Fd = Fs.OpenTextFile(in_Str_Chemin_Fichier)
     
        If Fd.AtEndOfStream Then
          Call SortieEnErreur("Fichier vide : " & in_Str_Chemin_Fichier)
        Else
     
          While Not Fd.AtEndOfStream
            Ligne = Trim(Fd.ReadLine())
            If Ligne <> "" And Left(Ligne, 1) <> ";" Then
              Identificateur = UCase(Trim(Split(Ligne, "=")(0)))
              Valeur = Trim(Split(Ligne, "=")(1))
              Call io_Dic_Param.Add(Identificateur, Valeur)
            End If
          Wend
     
        End If
     
      End If
     
    End Sub
     
     
    '******************************************************************************
    '** Chargement des données d'un fichier INI lié à un fichier source
    '** dans les variables correspondantes de la classe associée
    '******************************************************************************
    Public Sub LectureIniFichierSource(in_Dic_ParamFichier, io_Str_ChampsClePrimaire, io_Tab_ChampsClePrimaire, io_Dic_Structure)
     
     Dim Cle_INI
     Dim Num_Champ
     
       'if CountLines(Dic_Param_DMP) > 0
       If in_Dic_ParamFichier.Count > 0 Then
     
         For Each Cle_INI In in_Dic_ParamFichier
     
           Select Case Cle_INI
             Case "CLE_PRIMAIRE"
               io_Str_ChampsClePrimaire = in_Dic_ParamFichier(Cle_INI)
               io_Tab_ChampsClePrimaire = Split(Str_ChampsClePrimaire, ";")
             Case Else ' Description de la structure du fichier
               Call io_Dic_Structure.Add(Cle_INI, Split(in_Dic_ParamFichier(Cle_INI), ";"))
           End Select
     
         Next
     
       End If
     
    End Sub
     
     
    '******************************************************************************
    '** Chargement des fichiers ini pour ce traitement
    '******************************************************************************
    Private Sub LectureFichiersIni()
     
      Set Dic_Param_Globaux = CreateObject("Scripting.Dictionary")
      Set Dic_Param_DMP      = CreateObject("Scripting.Dictionary")
      Set Dic_Structure     = CreateObject("Scripting.Dictionary")
     
      Call ChargeFichierIni(Str_CheminRepIni & "Config_ISM_DMP.ini", Dic_Param_Globaux)
      Call ChargeFichierIni(Str_CheminRepIni & Dic_Param_Globaux("NOM_INI_DMP"), Dic_Param_DMP)
      Call LectureIniFichierSource(Dic_Param_DMP, Str_ChampsClePrimaire, Tab_ChampsClePrimaire, Dic_Structure)
     
    End Sub
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Fin gestion des fichiers ini                                           ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Récupération du fichier source                                         ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    '** Initialisation des variables liées au fichier source
    '******************************************************************************
    Private Sub InitFicSource()
     
     Str_ChampsClePrimaire = ""
     
     Set Dic_DonneesFichier = CreateObject("Scripting.Dictionary")
     Set Dic_LignesErronees = CreateObject("Scripting.Dictionary")
     
     ' On ajoute un ; supplémentaire à la fin de la ligne pour le traitement via CTL
     Tmpl_Lig_Insert_SC_Date = "[CODE_PORTEFEUILLE];[SOUS_COMPTE_ACTIF];[DATE_REF_POS];;;"& Mid(Cstr(Now), 6, 10) & ";;"
     
     ' On ajoute un ; supplémentaire à la fin de la ligne pour le traitement via CTL
     Tmpl_Lig_Insert_Details = "[SOUS_COMPTE_ACTIF];[CODE_ISIN];[LIBELLE_SUPPORT];" & _
                               "[DATE_REF_POS];[DATE_DERNIER_COURS];[NB_PARTS];" & _
                               "[COURS_APPLICABLE];[VALORISATION];[TOP_OBLIGATION];" & _
                               "[CODE_GP_INSTRU];[LIBELLE_GP_INSTRU];[TYPE_INSTRU];[LIBELLE_TYPE_INSTRU];" & _
                               "[ESPECES];"
     
     Lng_NbLignesErr = 0
     
     Str_NomFicSource = Dic_Param_Globaux("NOM_FIC_DMP")
     
    End Sub
     
     
    '******************************************************************************************
    '** Chargement du fichier source dans Dic_DonneesFichier
    '** Si on passe une clé primaire en paramètre, on ne prend que les lignes correspondantes
    '******************************************************************************************
    Private Sub LectureFichierSource(in_Cle_Primaire)
     Dim FSO
     Dim Fichier_A_Traiter
     Dim Ligne_En_Cours
     Dim Num_Ligne          ' Emplacement de la ligne dans le fichier
     Dim Nb_Lignes_OK       ' Nombre de lignes insérées dans le dictionnaire
     Dim Cle_Primaire_Ligne ' Clé primaire de la ligne en cours de traitement
     Dim Nb_Champs_Attendus
     Dim Nb_Champs_Ligne
     
      ' Ouverture du fichier
      Set FSO = CreateObject("Scripting.FileSystemObject")
     
      If Not FSO.FileExists(Str_CheminFicSource & Str_NomFicSource) Then
        Call SortieEnErreur("Fichier absent : " & Str_NomFicSource)
      Else
     
        Set Fichier_A_Traiter = FSO.OpenTextFile(Str_CheminFicSource & Str_NomFicSource)
     
        Num_Ligne = 0
        Nb_Lignes_OK = 0
        While Not Fichier_A_Traiter.AtEndOfStream
     
          Num_Ligne = Num_Ligne + 1
     
          ' On ajoute le n° de la ligne en tant que premier champ
          Ligne_En_Cours = CStr(Num_Ligne) & ";" & Fichier_A_Traiter.ReadLine()
     
          ' Test sur le format (nombre de champs) de la ligne
          Nb_Champs_Attendus = Dic_Structure.Count
          ' Dans le fichier Decamasterpos, la fin de la ligne est signalée par un ";"
          ' donc le n° du dernier champ du split est égal au nb de champs du fichier
          Nb_Champs_Ligne = UBound(Split(Ligne_En_Cours, ";"))
     
          If Nb_Champs_Ligne <> Nb_Champs_Attendus Then
     
            Call AjoutLigneFicLog("Ligne " & Num_Ligne & " : format de la ligne erroné")
     
          Else
     
            ' S'il y a des données après le ";" final
            If Trim(Split(Ligne_En_Cours, ";")(Nb_Champs_Ligne)) <> "" Then
     
              Call AjoutLigneFicLog("Ligne " & Num_Ligne & " : format de la ligne erroné")
     
            Else
     
              Cle_Primaire_Ligne = RecupCleLigne(Dic_Structure, Ligne_En_Cours, Tab_ChampsClePrimaire)
     
              If in_Cle_Primaire = "" Or Cle_Primaire_Ligne = in_Cle_Primaire Then
                Nb_Lignes_OK = Nb_Lignes_OK + 1
                Call CreeEnregDictDansDict(Dic_DonneesFichier, _
                                           Cle_Primaire_Ligne, _
                                           RecupDicLigne(Dic_Structure, Ligne_En_Cours), _
                                           "")
              End If
     
            End If
     
          End If
     
        Wend
     
        Fichier_A_Traiter.Close
     
      End If
     
      If Num_Ligne    = 0 Then Call SortieEnErreur("Fichier " & Str_NomFicSource & " vide")
      If Nb_Lignes_OK = 0 Then Call SortieEnErreur("Aucune ligne du fichier " & Str_NomFicSource & " ne correspond aux données à traiter")
     
    End Sub
     
     
    '******************************************************************************
    '** Récupération des valeurs de la clé pour la ligne en entrée
    '******************************************************************************
    Private Function RecupCleLigne(ByRef in_Dic_Structure , ByRef in_Ligne, _
                                   ByRef in_Tab_Champs_Cle)
     Dim Cle
     Dim Champ_Cle
     Dim Num_Champ
     Dim Valeur_Champ
     
     ' Pour chaque champ de la clé (Champ_Cle),
     ' on lit le dictionnaire Structure pour récupérer le n° du champ dont l'identifiant correspond à Champ_Cle
     ' et on va chercher la valeur du champ correspondant dans la ligne passée en entrée
     ' N.B. On fait aussi en sorte que toutes les dates soient au même format
     Cle = ""
     For Each Champ_Cle In in_Tab_Champs_Cle
         Num_Champ = CInt(in_Dic_Structure(Champ_Cle)(0))
         Valeur_Champ = Trim(Split(in_Ligne, ";")(Num_Champ))
         If IsNumeric(Valeur_Champ) Then
           Valeur_Champ = Cstr(Valeur_Champ)
         ElseIf IsDate(Valeur_Champ) Then
           Valeur_Champ = Cstr(Valeur_Champ)
         Else
           Valeur_Champ = Cstr(Valeur_Champ)
         End If
         Cle = Cle & ";" & Valeur_Champ
     Next
     
     Cle = Mid(Cle, 2) ' Pour supprimer le premier point-virgule
     
     RecupCleLigne = Cle
     
    End Function
     
     
    '******************************************************************************
    '** Récupération des données de la ligne en entrée sous forme d'un dictionnaire
    '******************************************************************************
    Private Function RecupDicLigne(ByRef in_Dic_Structure, ByRef in_Ligne)
     Dim Nom_Champ
     Dim Tmp_Dic
     Dim Num_Champ
     Dim Valeur_Champ
     
     Set Tmp_Dic = CreateObject("Scripting.Dictionary")
     
     ' Pour chaque champ, on crée une nouvelle donnée dans le dictionnaire.
     ' Cette donnée a pour clé le nom du champ et pour valeur le contenu du Nième champ de la ligne
     ' où N est l'emplacement du champ tel que défini dans le dictionnaire Structure.
     
    '------------------------------------------------------------------------------------
    ' Correctif 18/06/2009 : on ne doit pas faire CDate ici, sinon le format de la date
    ' risque de changer et cela fausse les tests de validité du champ
    ' ' On fait aussi en sorte que toutes les dates soient au même format
    ' For Each Nom_Champ In in_Dic_Structure
    '   Valeur_Champ = Trim(Split(Ligne, ";")(in_Dic_Structure(Nom_Champ)(0)))
    '   If IsNumeric(Valeur_Champ) Then'
    '     Valeur_Champ = Cstr(Valeur_Champ)
    '   ElseIf IsDate(Valeur_Champ) Then
    '     Valeur_Champ = CStr(CDate(Valeur_Champ))
    '   Else
    '     Valeur_Champ = Cstr(Valeur_Champ)
    '   End If
    '   Call Tmp_Dic.Add(Nom_Champ, Valeur_Champ)
    ' Next
     
     For Each Nom_Champ In in_Dic_Structure
       Num_Champ = CInt(in_Dic_Structure(Nom_Champ)(0))
       Valeur_Champ = Trim(Split(in_Ligne, ";")(Num_Champ))
       Call Tmp_Dic.Add(Nom_Champ, Valeur_Champ)
     Next
    '------------------------------------------------------------------------------------
     
     Set RecupDicLigne = Tmp_Dic
     
    End Function
     
    '******************************************************************************
    '** Ajout d'un enregistrement de type dictionnaire dans un dictionnaire
    '******************************************************************************
    Private Sub CreeEnregDictDansDict(ByRef io_Dict, ByVal in_Cle, _
                                      ByVal in_Enreg, ByRef in_NomEnreg)
     
      ' Création de la clé dans le dictionnaire si elle n'y existe pas déjà
      If Not io_Dict.Exists(in_Cle) Then
        Call io_Dict.Add(in_Cle, CreateObject("Scripting.Dictionary"))
      End If
     
      ' Création d'un nouvel enregistrement pour la clé
      ' Si on n'a pas passé d'identifiant pour l'enregistrement, la clé secondaire est un numéro séquentiel.
      ' Sinon, on utilise cet identifiant comme clé secondaire.
      If in_NomEnreg = "" Then
        Call io_Dict(in_Cle).Add(io_Dict(in_Cle).Count, in_Enreg)
      Else
        Call io_Dict(in_Cle).Add(in_NomEnreg, in_Enreg)
      End If
     
    End Sub
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Fin récupération du fichier source                                     ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Traitement du fichier source                                           ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    ' Procédure globale de traitement du fichier source
    '******************************************************************************
    Private Sub TraitementFichierSource
     Dim Cle_Primaire
     
     ' Boucle sur toutes les clés primaires
     For Each Cle_Primaire In Dic_DonneesFichier
       Call TraitementLignesClePrimaire(Cle_Primaire)
     Next
     
     If Lng_NbLigDetails = 0 Then
       Call AjoutLigneFicLog ("Aucune donnée valide dans le fichier source")
     End if
     
    End Sub
     
     
    '******************************************************************************
    '** Taitement de toutes les lignes liées à une clé primaire
    '******************************************************************************
    Public Sub TraitementLignesClePrimaire(ByVal in_Cle_Primaire)
     
     Dim Cle_Secondaire
     Dim Req_Existence_Cle_Primaire
     Dim LigneSCD ' Ligne à insérer dans la table sous-compte/date
     Dim Sous_Compte
     Dim Date_Arrete
     Dim Msg_Err
     Dim Num_Ligne
     Dim Nb_Lignes_Valides  ' Nombre de lignes valides pour cette clé primaire
     
     Sous_Compte = Split(in_Cle_Primaire, ";")(0)
     Date_Arrete = Split(in_Cle_Primaire, ";")(1)
    ' Num_Ligne = Dic_DonneesFichier(in_Cle_Primaire)(0)("NUM_LIGNE")
     
     ' Test de validité pour la clé primaire
     Msg_Err = TestTypeTailleUnChampAvecStructure(Dic_Structure, "SOUS_COMPTE_ACTIF", Sous_Compte) & " " & _
               TestTypeTailleUnChampAvecStructure(Dic_Structure, "DATE_REF_POS", Date_Arrete)
     
     If Msg_Err <> " " Then
       Call AjoutLigneFicLog("Clé primaire " & in_Cle_Primaire & " invalide : " & Msg_Err)
     
     Else
     
       ' Test de la validité "globale" des lignes correspondant à la clé primaire
       ' et suppression des lignes erronées
       Msg_Err = TestValiditeDicClePrim(in_Cle_Primaire)
     
       If Msg_Err <> "" Then
     
         Call AjoutLigneFicLog(Msg_Err)
     
       Else
     
         Nb_Lignes_Valides = 0
     
         ' Boucle sur tous les enregistrements correspondant à la clé primaire en cours
         For Each Cle_Secondaire In Dic_DonneesFichier(in_Cle_Primaire)
           Call TraitementLigneFichier(in_Cle_Primaire, Cle_Secondaire, Nb_Lignes_Valides)
         Next
     
         If Nb_Lignes_Valides = 0 Then
     
           Msg_Err = "Aucune ligne valide pour la clé " & in_Cle_Primaire
           Call AjoutLigneFicLog(Msg_Err)
     
         Else
           ' Si pas d'enreg dans la table, on en crée un
     
           Req_Existence_Cle_Primaire = "select count(*) from OSP_TAB_SS_COMPTES " & _
             "where SOUS_COMPTE_ACTIF = '" & Sous_Compte & "'" & _
             "  and DATE_REF_POS = '" & Date_Arrete & "'"
     
           If Clng(ExecuteRequeteUnResultat(Req_Existence_Cle_Primaire)) = 0 Then
             ' Création de la requête en remplaçant dans le template les noms des champs par leur valeur
             LigneSCD = MergeRequete(Tmpl_Lig_Insert_SC_Date, Dic_DonneesFichier(in_Cle_Primaire)(0), True)
             Call AjoutLigneFicSCD(LigneSCD)
           End If
     
         End If
     
       End If
     End If
    End Sub
     
    '******************************************************************************
    '** Traitement d'une ligne du fichier
    '******************************************************************************
    Public Function TraitementLigneFichier(in_Cle_Primaire, in_Cle_Secondaire, io_Nb_Lignes_Valides)
     
     Dim Msg_Err
     Dim Ligne_Details      ' Ligne à insérer dans la table détails
     Dim Dic_Cle_Secondaire ' Variable tampon obligatoire pour l'appel à TestValiditeLigne
     Dim Code_ISIN
     Dim Date_Cours
     Dim Flag_Especes
     
     Set Dic_Cle_Secondaire = CreateObject("Scripting.Dictionary")
     Set Dic_Cle_Secondaire = Dic_DonneesFichier(in_Cle_Primaire)(in_Cle_Secondaire)
     
     Msg_Err = TestValiditeLigne(in_Cle_Primaire, in_Cle_Secondaire)
     
     If Msg_Err <> "" Then
     
       Call AjoutLigneFicLog(Msg_Err)
     
     Else ' Si les données de la ligne sont valides
     
       ' Ajout du champ "Espèces"
       Code_ISIN = Dic_DonneesFichier(in_Cle_Primaire)(in_Cle_Secondaire)("CODE_ISIN")
       Date_Cours = Dic_DonneesFichier(in_Cle_Primaire)(in_Cle_Secondaire)("DATE_DERNIER_COURS")
       If (Code_ISIN = "" Or IsNull(Code_ISIN)) And (Date_Cours = "" Or IsNull(Date_Cours)) Then
         Flag_Especes = 1
       Else
         Flag_Especes = 0
       End If
     
       Call Dic_DonneesFichier(in_Cle_Primaire)(in_Cle_Secondaire).Add("ESPECES", Flag_Especes)
     
       ' Création de la requête en remplaçant les noms des champs par leur valeur dans le template
       Ligne_Details = MergeRequete(Tmpl_Lig_Insert_Details, _
                                    Dic_DonneesFichier(in_Cle_Primaire)(in_Cle_Secondaire), _
                                    True)
     
       Call AjoutLigneFicDetails(Ligne_Details)
     
       ' Gestion des erreurs
       io_Nb_Lignes_Valides = io_Nb_Lignes_Valides + 1
       Lng_NbLigDetails = Lng_NbLigDetails + 1
     
     End If
     
    End Function
     
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Fin traitement du fichier source                                       ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Tests de validité                                                      ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    '** Teste la validité "globale" du dictionnaire pour une clé primaire
    '** et supprime les lignes erronées
    '******************************************************************************
    Public Function TestValiditeDicClePrim(in_Cle_Primaire)
     Dim Dic_Code_ISIN ' Id = code ISIN ; valeur = nb d'enreg dans le dic d'import
     Dim Cle_Secondaire
     Dim Code_ISIN
     Dim Num_Ligne
     Dim Req_Existence_ISIN ' Requête pour vérifier si le code ISIN est déjà présent en table
     Dim Sous_Compte
     Dim Date_Arrete
     
     TestValiditeDicClePrim = ""
     Sous_Compte = Split(in_Cle_Primaire, ";")(0)
     Date_Arrete = Split(in_Cle_Primaire, ";")(1)
     
     ' Suppression des doublons sur le code ISIN
     '-------------------------------------------
     
     ' Alimentation du dictionnaire contenant la liste des codes ISIN présents
     Set Dic_Code_ISIN = CreateObject("Scripting.Dictionary")
     
     For Each Cle_Secondaire In Dic_DonneesFichier(in_Cle_Primaire)
     
       Code_ISIN = Dic_DonneesFichier(in_Cle_Primaire)(Cle_Secondaire)("CODE_ISIN")
     
       If Dic_Code_ISIN.Exists(Code_ISIN) Then
         Dic_Code_ISIN(Code_ISIN) = Dic_Code_ISIN(Code_ISIN) + 1
       Else
         Call Dic_Code_ISIN.Add(Code_ISIN, 1)
       End If
     
     Next
     
     ' Suppression des doublons et alimentation du rapport d'erreurs
     For Each Cle_Secondaire In Dic_DonneesFichier(in_Cle_Primaire)
       Code_ISIN = Dic_DonneesFichier(in_Cle_Primaire)(Cle_Secondaire)("CODE_ISIN")
       Num_Ligne = Dic_DonneesFichier(in_Cle_Primaire)(Cle_Secondaire)("NUM_LIGNE")
     
       Req_Existence_ISIN = "select count(*) from OSP_TAB_DETAILS_SS_COMPTES " & _
                            "where SOUS_COMPTE_ACTIF = '" & Sous_Compte & "' " & _
                            "  and DATE_REF_POS = '" & Date_Arrete & "' " & _
                            "  and CODE_ISIN = '" & Code_ISIN & "'"
     
       If Code_ISIN <> "" And _
          ( Dic_Code_ISIN(Code_ISIN) > 1 Or Clng(ExecuteRequeteUnResultat(Req_Existence_ISIN)) > 0 ) Then
         Call AjoutLigneFicLog("Ligne " & Num_Ligne & " : doublon sur le code ISIN " & Code_ISIN)
         Call Dic_DonneesFichier(in_Cle_Primaire).Remove(Cle_Secondaire)
       End If
     
     Next
     
     If Dic_DonneesFichier(in_Cle_Primaire).Count = 0 Then
        TestValiditeDicClePrim = "Aucune ligne valide pour la clé " & in_Cle_Primaire
     End If
     
    End Function
     
    '******************************************************************************
    '** Teste la validité d'une ligne du fichier source
    '******************************************************************************
    Public Function TestValiditeLigne(in_Cle_Primaire, in_Cle_Secondaire)
     Dim Dic_Cle_Secondaire ' Variable tampon obligatoire pour l'appel à TestTypeTailleUnEnreg
     Dim Valeur_ISIN
     Dim Valeur_Date_Cours
     Dim Msg_Err
     Dim Msg_Test
     Dim Num_Ligne
     
     Set Dic_Cle_Secondaire = CreateObject("Scripting.Dictionary")
     Set Dic_Cle_Secondaire = Dic_DonneesFichier(in_Cle_Primaire)(in_Cle_Secondaire)
     Msg_Err = ""
     Num_Ligne = Dic_DonneesFichier(in_Cle_Primaire)(in_Cle_Secondaire)("NUM_LIGNE")
     Valeur_ISIN = Trim(Dic_Cle_Secondaire("CODE_ISIN"))
     
     Msg_Test = TestTypeTailleUnEnreg(Dic_Structure, Dic_Cle_Secondaire)
     If Msg_Test <> "" Then
     
        Msg_Err = "Ligne " & Num_Ligne & " " & in_Cle_Primaire & ";" & Valeur_ISIN & " : " & Msg_Test
     
     Else
     
     
       Valeur_Date_Cours = Trim(Dic_Cle_Secondaire("DATE_DERNIER_COURS"))
     
       ' Si le code ISIN est renseigné, la date du cours doit l'être aussi
       If Valeur_ISIN <> "" And Valeur_Date_Cours = "" Then
          Msg_Err = "Ligne " & Num_Ligne & " " & in_Cle_Primaire & ";" & Valeur_ISIN & _
                    " : la date du cours est obligatoire quand le code ISIN est renseigné."
       End If
     
     End If
     
     TestValiditeLigne = Msg_Err
     
    End Function
     
     
     
    '********************************************************************************
    '** Validation du format des données : test sur le type et la taille pour 1 enreg
    '** Rappel : les lignes du dictionnaire "structure" comportent :
    '** 0 --> numéro du champ
    '** 1 --> nom du champ
    '** 2 --> type de donnée (CHAR, NUM, DATE)
    '** 3 --> format (pour les dates) ou taille maximale (pour les autres types)
    '** 4 --> O/F (Obligatoire / Facultatif)
    '********************************************************************************
    Public Function TestTypeTailleUnEnreg(in_Dic_Structure, in_Dic_Enreg)
     Dim Flag_Format_OK
     Dim Nom_Champ
     Dim Valeur_Champ
     Dim Type_Champ
     Dim Taille_Format ' Format pour les dates ; taille pour les autres types
     Dim Oblig_Fac
     Dim Msg_Test
     
     Flag_Format_OK = True
     Msg_Test = ""
     
     For Each Nom_Champ In in_Dic_Enreg
     
       Valeur_Champ = in_Dic_Enreg(Nom_Champ)
       Type_Champ = CStr(in_Dic_Structure(Nom_Champ)(2))
       Taille_Format = in_Dic_Structure(Nom_Champ)(3)
       Oblig_Fac = in_Dic_Structure(Nom_Champ)(4)
     
       Flag_Format_OK = TestTypeTailleUnChamp(Valeur_Champ, Type_Champ, Taille_Format, Oblig_Fac)
     
       If Flag_Format_OK = False Then
        Msg_Test = "erreur sur le champ " & Nom_Champ & " " & Valeur_Champ
        Exit For
       End If
     
     Next
     
     TestTypeTailleUnEnreg = Msg_Test
     
    End Function
     
     
    '********************************************************************************
    '** Validation du format des données : test sur le type et la taille pour un champ
    '** référencé dans un dictionnaire structure
    '** Rappel : les lignes du dictionnaire "structure" comportent :
    '** 0 --> numéro du champ
    '** 1 --> nom du champ
    '** 2 --> type de donnée (CHAR, NUM, DATE)
    '** 3 --> format (pour les dates) ou taille maximale (pour les autres types)
    '** 4 --> O/F (Obligatoire / Facultatif)
    '********************************************************************************
    Public Function TestTypeTailleUnChampAvecStructure(in_Dic_Structure, in_Nom_Champ, in_Valeur_Champ)
     Dim Flag_Format_OK
     Dim Type_Champ
     Dim Taille_Format ' Format pour les dates ; taille pour les autres types
     Dim Oblig_Fac
     
     Type_Champ = CStr(in_Dic_Structure(in_Nom_Champ)(2))
     Taille_Format = in_Dic_Structure(in_Nom_Champ)(3)
     Oblig_Fac = in_Dic_Structure(in_Nom_Champ)(4)
     
     If TestTypeTailleUnChamp(in_Valeur_Champ, Type_Champ, Taille_Format, Oblig_Fac) = False Then
       TestTypeTailleUnChampAvecStructure = "erreur sur le champ " & in_Nom_Champ & " " & in_Valeur_Champ
     Else
       TestTypeTailleUnChampAvecStructure = ""
     End If
     
    End Function
     
     
    '********************************************************************************
    '** Validation du format des données : test sur le type et la taille pour 1 champ
    '********************************************************************************
    Public Function TestTypeTailleUnChamp(in_ValeurChamp, in_TypeChamp, _
                                          in_TailleFormat, in_ObligFac)
     
     Dim Flag_Format_OK
     
     ' Valeurs paramétrées
     Dim Position_Separateur_Param
     Dim Separateur_Param
     Dim Nb_Caracteres_Param
     Dim Nb_Entiers_Param
     Dim Nb_Decimales_Param
     
     ' Composition du champ
     Dim Position_Separateur
     Dim Separateur
     Dim Partie_Entiere
     Dim Partie_Decimale
     
       Flag_Format_OK = True
     
       ' Si le champ n'est pas renseigné
       If (Trim(in_ValeurChamp) = "") Then
     
         ' Si champ obligatoire, KO ; sinon, OK
         If in_ObligFac = "O" Then Flag_Format_OK = False
     
       Else ' Si le champ est renseigné, on doit tester son format
     
         Select Case in_TypeChamp
     
           Case "CHAR"
             If (Len(in_ValeurChamp) > CInt(in_TailleFormat)) Then
               Flag_Format_OK = False
             End If
     
    '       Case "NUM"
    '         If (Not IsNumeric(in_ValeurChamp)) _
    '            Or (Len(in_ValeurChamp) > CInt(in_TailleFormat)) Then
    '             Flag_Format_OK = False
    '         Else
    '           Position_Separateur = InStr(in_TailleFormat, ",") + InStr(in_TailleFormat, ".")
    '           Partie_Decimale = 0
    '           If Position_Separateur = 0 Then
    '             Nb_Chiffres = CInt(in_TailleFormat)
    '             Partie_Entiere = Trim(in_ValeurChamp)
    '           Else
    '             Separateur = Mid(in_TailleFormat, Position_Separateur, 1)
    '             Nb_Chiffres = CInt(Split(in_TailleFormat, Separateur)(0))
    '             Partie_Entiere = Trim(Split(in_ValeurChamp, Separateur)(0))
    '             Nb_Decimales = CInt(Split(in_TailleFormat, Separateur)(1))
    '             If Partie_Entiere <> Trim(in_ValeurChamp) Then
    '               Partie_Decimale = Trim(Split(CStr(in_ValeurChamp), Separateur)(1))
    '             End If
    '           End If
    '           ' Si on a plus de caractères que le nb de chiffres + le séparateur
    '           ' ou qu'on a trop de chiffres sans séparateur
    '           ' ou qu'on a trop de décimales
    '           If Len(Partie_Entiere) > Nb_Chiffres + 1 _
    '           Or ((Separateur = "") And (Len(Partie_Entiere) > Nb_Chiffres + 1)) _
    '           Or Len(Partie_Decimale) > Nb_Decimales Then
    '             Flag_Format_OK = False
    '           End If
    '         End If
     
           Case "INT"
             If (Not IsNumeric(in_ValeurChamp)) _
             Or (Len(in_ValeurChamp) > CInt(in_TailleFormat)) Then
               Flag_Format_OK = False
             End If
     
           Case "DEC"
             If (Not IsNumeric(in_ValeurChamp)) Then
               Flag_Format_OK = False
             Else
     
               Call RecupFormatParamNbDec(in_TailleFormat, Separateur_Param, _
                    Nb_Caracteres_Param, Nb_Entiers_Param, Nb_Decimales_Param)
     
               Call DecomposeNombre(in_ValeurChamp, in_TailleFormat, _
                                    Position_Separateur, Separateur, _
                                    Partie_Entiere, Partie_Decimale)
     
               ' Si on a trop de caractères, trop d'entiers ou trop de décimales
               If (Len(in_ValeurChamp) > Nb_Caracteres_Param) _
               Or (Len(Partie_Entiere) > Nb_Entiers_Param) _
               Or (Len(Partie_Decimale) > Nb_Decimales_Param) Then
                 Flag_Format_OK = False
               End If
     
             End If
     
           Case "DATE"
             If Not IsDate(in_ValeurChamp) Then
               Flag_Format_OK = False
             Else
               If in_TailleFormat = "JJ/MM/AAAA" Then
                 If Not (Len(in_ValeurChamp) = 10 _
                         And Mid(in_ValeurChamp, 3, 1) = "/" _
                         And Mid(in_ValeurChamp, 6, 1) = "/" _
                         And IsNumeric(Mid(in_ValeurChamp, 1, 2)) _
                         And IsNumeric(Mid(in_ValeurChamp, 4, 2)) _
                         And IsNumeric(Mid(in_ValeurChamp, 7, 4)) _
                        ) Then
                   Flag_Format_OK = False
                 End If
               ElseIf in_TailleFormat = "AAAA/MM/JJ" Then
                 If Not (Len(in_ValeurChamp) = 10 _
                         And Mid(in_ValeurChamp, 5, 1) = "/" _
                         And Mid(in_ValeurChamp, 8, 1) = "/" _
                         And IsNumeric(Mid(in_ValeurChamp, 1, 4)) _
                         And IsNumeric(Mid(in_ValeurChamp, 6, 2)) _
                         And IsNumeric(Mid(in_ValeurChamp, 9, 2)) _
                         And Len(Split(in_ValeurChamp, "/")(0)) = 4 _
                         And Len(Split(in_ValeurChamp, "/")(1)) = 2 _
                        ) Then
                   Flag_Format_OK = False
                 End If
               Else
                 Flag_Format_OK = False
               End If
             End If
     
           Case Else
             Flag_Format_OK = False
     
         End Select
     
       End If
     
       TestTypeTailleUnChamp = Flag_Format_OK
     
    End Function
     
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Fin tests de validité                                                  ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Gestion du fichier d'insertion dans la table sous-compte / date        ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    ' Initialisation du fichier
    '******************************************************************************
    Private Sub InitFicSCD()
     
      Str_CheminFicSCD = Str_CheminFicInsert
     
      If Not (Dic_Param_Globaux.Exists("NOM_FIC_SCD")) Then
        Str_NomFicSCD = "ISM_Donnees_OSP_SCD.txt"
      Else
        Str_NomFicSCD = Dic_Param_Globaux("NOM_FIC_SCD")
      End If
     
      Set Dic_LignesFicSCD = CreateObject("Scripting.Dictionary")
     
    End Sub
     
    '******************************************************************************
    ' Ajout d'une ligne dans le fichier SCD
    '******************************************************************************
    Private Sub AjoutLigneFicSCD(in_Ligne)
      Call Dic_LignesFicSCD.Add(Dic_LignesFicSCD.Count, in_Ligne)
    End Sub
     
    '******************************************************************************
    ' Création du Script SCD
    '******************************************************************************
    Private Sub CreeFicSCD()
     Dim Cle
     Dim Fs
     Dim Fd
     
      Set Fs = CreateObject("Scripting.FileSystemObject")
      Set Fd = Fs.OpenTextFile(Str_CheminFicSCD & Str_NomFicSCD, 2, True)
     
      If Dic_LignesFicSCD.Count > 0 Then
        For Each Cle In Dic_LignesFicSCD
          Fd.Writeline(Dic_LignesFicSCD(Cle))
        Next
      End If
     
      Fd.Close
     
    End Sub
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Fin gestion du fichier d'insertion dans la table sous-compte / date    ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Gestion du fichier d'insertion dans la table détails                   ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    ' Initialisation du fichier
    '******************************************************************************
    Private Sub InitFicDetails()
     
      Str_CheminFicDetails = Str_CheminFicInsert
     
      If Not (Dic_Param_Globaux.Exists("NOM_FIC_DETAILS")) Then
        Str_NomFicDetails = "ISM_Donnees_OSP_Details.txt"
      Else
        Str_NomFicDetails = Dic_Param_Globaux("NOM_FIC_DETAILS")
      End If
     
      Set Dic_LignesFicDetails = CreateObject("Scripting.Dictionary")
     
    End Sub
     
    '******************************************************************************
    ' Ajout d'une ligne dans le fichier
    '******************************************************************************
    Private Sub AjoutLigneFicDetails(in_Ligne)
      Call Dic_LignesFicDetails.Add(Dic_LignesFicDetails.Count, in_Ligne)
    End Sub
     
    '******************************************************************************
    ' Création du fichier
    '******************************************************************************
    Private Sub CreeFicDetails()
     Dim Cle
     Dim Fs
     Dim Fd
     
      Set Fs = CreateObject("Scripting.FileSystemObject")
      Set Fd = Fs.OpenTextFile(Str_CheminFicDetails & Str_NomFicDetails, 2, True)
     
      If Dic_LignesFicDetails.Count > 0 Then
        For Each Cle In Dic_LignesFicDetails
          Fd.Writeline(Dic_LignesFicDetails(Cle))
        Next
      End If
     
      Fd.Close
     
    End Sub
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Fin gestion du fichier d'insertion dans la table détails               ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
     
     
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Traitement principal                                                   ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    ' Déclarations
    '==============
     
    ' Chemin du répertoire des fichiers ini
    Dim Str_CheminRepIni
     
    ' Chemin du répertoire des fichiers log
    Dim Str_CheminRepLog
     
    ' Fichiers ini
    Dim Dic_Param_Globaux
    Dim Dic_Param_DMP
    Dim Str_ChampsClePrimaire
    Dim Tab_ChampsClePrimaire
     
    ' Fichier source
    Dim Str_CheminFicSource
    Dim Str_NomFicSource
    Dim Dic_Structure
    Dim Dic_DonneesFichier
    Dim Dic_LignesErronees
    Dim Lng_NbLignesErr
    Dim Tmpl_Lig_Insert_SC_Date ' Template de la ligne d'insertion dans la table sous-comptes / dates
    Dim Tmpl_Lig_Insert_Details ' Template de la ligne d'insertion dans la table détails
     
    ' Connexion à la base Oracle
    Dim Str_NomTNS
    Dim Str_Utilisateur
    Dim Str_MdP
    Dim Connexion_BDD
     
    ' Rapport d'erreurs
    Dim Str_NomFicLog
    Dim Str_CheminFicLog
    Dim Dic_LignesFicLog
     
    ' Fichiers d'insertion dans les tables
    Dim Str_CheminFicInsert
     
    ' Fichier d'insertion dans la table sous-compte / date
    Dim Str_NomFicSCD
    Dim Str_CheminFicSCD
    Dim Dic_LignesFicSCD
     
    ' Fichier d'insertion dans la table détails
    Dim Str_NomFicDetails
    Dim Str_CheminFicDetails
    Dim Dic_LignesFicDetails
    Dim Lng_NbLigDetails
     
    ' Actions
    '=========
     
    'On Error Resume Next
    WScript.Echo "InitFicLog"
    Call InitFicLog
    WScript.Echo "RecupParamEntree"
    Call RecupParamEntree
    WScript.Echo "Connexion_BDD"
    Set Connexion_BDD = GetConnexion(Str_NomTNS, Str_Utilisateur, Str_MdP)
    WScript.Echo "LectureFichiersIni"
    Call LectureFichiersIni
    WScript.Echo "InitFicSource"
    Call InitFicSource
    WScript.Echo "Première ligne du log"
    Call AjoutLigneFicLog(Now & " Traitement du fichier " & Str_CheminFicSource & Str_NomFicSource)
    WScript.Echo "InitFicSCD"
    Call InitFicSCD
    WScript.Echo "InitFicDetails"
    Call InitFicDetails
    WScript.Echo "LectureFichierSource"
    Call LectureFichierSource("")
    WScript.Echo "TraitementFichierSource"
    Call TraitementFichierSource
    WScript.Echo "CreeFicSCD"
    Call CreeFicSCD
    WScript.Echo "CreeFicDetails"
    Call CreeFicDetails
    WScript.Echo "CreeFicLog"
    Call CreeFicLog
    WScript.Echo "Fin"
    C'est la procedure
    et
    qui ne fonctionnent pas et ne génèrent pas mes fichiers.

    Si pour le même fichier de 55MB en entrée, j'enlève des lignes pour diminuer la capacité à environ 20 MB, cela marche parfaitement.

    Pensez-vous qu'à un moment donné, je dois vider mes dictionnaires et avant de continuer d'écrire dans les fichiers en sortie?

    Je vous en remercie infiniment pour vos aides et vos réponses car je suis actuellement bloqué sur cette situation.

    De mon coté, je continue à penser à une solution.

    Merci

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Il n'y a personne qui peut m'aider svp? snif

  8. #8
    Nouveau membre du Club
    Profil pro
    Technicien Help Desk
    Inscrit en
    Décembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Décembre 2012
    Messages : 23
    Points : 29
    Points
    29
    Par défaut
    J'avouerais que la longueur de ce code me fait un-peu peur.
    J'en suis à la partie de la requête à la base Oracle, mais pour le moment, c'est, disons, imbuvable.
    En extraction les fonctions de lecture que j'ai comprises :
    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
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Récupération du fichier source                                         ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    '** Initialisation des variables liées au fichier source
    '******************************************************************************
    Private Sub InitFicSource()
     
     Str_ChampsClePrimaire = ""
     
     Set Dic_DonneesFichier = CreateObject("Scripting.Dictionary")
     Set Dic_LignesErronees = CreateObject("Scripting.Dictionary")
     
     ' On ajoute un ; supplémentaire à la fin de la ligne pour le traitement via CTL
     Tmpl_Lig_Insert_SC_Date = "[CODE_PORTEFEUILLE];[SOUS_COMPTE_ACTIF];[DATE_REF_POS];;;"& Mid(Cstr(Now), 6, 10) & ";;"
     
     ' On ajoute un ; supplémentaire à la fin de la ligne pour le traitement via CTL
     Tmpl_Lig_Insert_Details = "[SOUS_COMPTE_ACTIF];[CODE_ISIN];[LIBELLE_SUPPORT];" & _
                               "[DATE_REF_POS];[DATE_DERNIER_COURS];[NB_PARTS];" & _
                               "[COURS_APPLICABLE];[VALORISATION];[TOP_OBLIGATION];" & _
                               "[CODE_GP_INSTRU];[LIBELLE_GP_INSTRU];[TYPE_INSTRU];[LIBELLE_TYPE_INSTRU];" & _
                               "[ESPECES];"
     
     Lng_NbLignesErr = 0
     
     Str_NomFicSource = Dic_Param_Globaux("NOM_FIC_DMP")
     
    End Sub
     
     
    '******************************************************************************************
    '** Chargement du fichier source dans Dic_DonneesFichier
    '** Si on passe une clé primaire en paramètre, on ne prend que les lignes correspondantes
    '******************************************************************************************
    Private Sub LectureFichierSource(in_Cle_Primaire)
     Dim FSO
     Dim Fichier_A_Traiter
     Dim Ligne_En_Cours
     Dim Num_Ligne          ' Emplacement de la ligne dans le fichier
     Dim Nb_Lignes_OK       ' Nombre de lignes insérées dans le dictionnaire
     Dim Cle_Primaire_Ligne ' Clé primaire de la ligne en cours de traitement
     Dim Nb_Champs_Attendus
     Dim Nb_Champs_Ligne
     
      ' Ouverture du fichier
      Set FSO = CreateObject("Scripting.FileSystemObject")
     
      If Not FSO.FileExists(Str_CheminFicSource & Str_NomFicSource) Then
        Call SortieEnErreur("Fichier absent : " & Str_NomFicSource)
      Else
     
        Set Fichier_A_Traiter = FSO.OpenTextFile(Str_CheminFicSource & Str_NomFicSource)
     
        Num_Ligne = 0
        Nb_Lignes_OK = 0
        While Not Fichier_A_Traiter.AtEndOfStream
     
          Num_Ligne = Num_Ligne + 1
     
          ' On ajoute le n° de la ligne en tant que premier champ
          Ligne_En_Cours = CStr(Num_Ligne) & ";" & Fichier_A_Traiter.ReadLine()
     
          ' Test sur le format (nombre de champs) de la ligne
          Nb_Champs_Attendus = Dic_Structure.Count
          ' Dans le fichier Decamasterpos, la fin de la ligne est signalée par un ";"
          ' donc le n° du dernier champ du split est égal au nb de champs du fichier
          Nb_Champs_Ligne = UBound(Split(Ligne_En_Cours, ";"))
     
          If Nb_Champs_Ligne <> Nb_Champs_Attendus Then
     
            Call AjoutLigneFicLog("Ligne " & Num_Ligne & " : format de la ligne erroné")
     
          Else
     
            ' S'il y a des données après le ";" final
            If Trim(Split(Ligne_En_Cours, ";")(Nb_Champs_Ligne)) <> "" Then
     
              Call AjoutLigneFicLog("Ligne " & Num_Ligne & " : format de la ligne erroné")
     
            Else
     
              Cle_Primaire_Ligne = RecupCleLigne(Dic_Structure, Ligne_En_Cours, Tab_ChampsClePrimaire)
     
              If in_Cle_Primaire = "" Or Cle_Primaire_Ligne = in_Cle_Primaire Then
                Nb_Lignes_OK = Nb_Lignes_OK + 1
                Call CreeEnregDictDansDict(Dic_DonneesFichier, _
                                           Cle_Primaire_Ligne, _
                                           RecupDicLigne(Dic_Structure, Ligne_En_Cours), _
                                           "")
              End If
     
            End If
     
          End If
     
        Wend
     
        Fichier_A_Traiter.Close
     
      End If
     
      If Num_Ligne    = 0 Then Call SortieEnErreur("Fichier " & Str_NomFicSource & " vide")
      If Nb_Lignes_OK = 0 Then Call SortieEnErreur("Aucune ligne du fichier " & Str_NomFicSource & " ne correspond aux données à traiter")
     
    End Sub
     
     
    '******************************************************************************
    '** Récupération des valeurs de la clé pour la ligne en entrée
    '******************************************************************************
    Private Function RecupCleLigne(ByRef in_Dic_Structure , ByRef in_Ligne, _
                                   ByRef in_Tab_Champs_Cle)
     Dim Cle
     Dim Champ_Cle
     Dim Num_Champ
     Dim Valeur_Champ
     
     ' Pour chaque champ de la clé (Champ_Cle),
     ' on lit le dictionnaire Structure pour récupérer le n° du champ dont l'identifiant correspond à Champ_Cle
     ' et on va chercher la valeur du champ correspondant dans la ligne passée en entrée
     ' N.B. On fait aussi en sorte que toutes les dates soient au même format
     Cle = ""
     For Each Champ_Cle In in_Tab_Champs_Cle
         Num_Champ = CInt(in_Dic_Structure(Champ_Cle)(0))
         Valeur_Champ = Trim(Split(in_Ligne, ";")(Num_Champ))
         If IsNumeric(Valeur_Champ) Then
           Valeur_Champ = Cstr(Valeur_Champ)
         ElseIf IsDate(Valeur_Champ) Then
           Valeur_Champ = Cstr(Valeur_Champ)
         Else
           Valeur_Champ = Cstr(Valeur_Champ)
         End If
         Cle = Cle & ";" & Valeur_Champ
     Next
     
     Cle = Mid(Cle, 2) ' Pour supprimer le premier point-virgule
     
     RecupCleLigne = Cle
     
    End Function
     
     
    '******************************************************************************
    '** Récupération des données de la ligne en entrée sous forme d'un dictionnaire
    '******************************************************************************
    Private Function RecupDicLigne(ByRef in_Dic_Structure, ByRef in_Ligne)
     Dim Nom_Champ
     Dim Tmp_Dic
     Dim Num_Champ
     Dim Valeur_Champ
     
     Set Tmp_Dic = CreateObject("Scripting.Dictionary")
     
     ' Pour chaque champ, on crée une nouvelle donnée dans le dictionnaire.
     ' Cette donnée a pour clé le nom du champ et pour valeur le contenu du Nième champ de la ligne
     ' où N est l'emplacement du champ tel que défini dans le dictionnaire Structure.
     
    '------------------------------------------------------------------------------------
    ' Correctif 18/06/2009 : on ne doit pas faire CDate ici, sinon le format de la date
    ' risque de changer et cela fausse les tests de validité du champ
    ' ' On fait aussi en sorte que toutes les dates soient au même format
    ' For Each Nom_Champ In in_Dic_Structure
    '   Valeur_Champ = Trim(Split(Ligne, ";")(in_Dic_Structure(Nom_Champ)(0)))
    '   If IsNumeric(Valeur_Champ) Then'
    '     Valeur_Champ = Cstr(Valeur_Champ)
    '   ElseIf IsDate(Valeur_Champ) Then
    '     Valeur_Champ = CStr(CDate(Valeur_Champ))
    '   Else
    '     Valeur_Champ = Cstr(Valeur_Champ)
    '   End If
    '   Call Tmp_Dic.Add(Nom_Champ, Valeur_Champ)
    ' Next
     
     For Each Nom_Champ In in_Dic_Structure
       Num_Champ = CInt(in_Dic_Structure(Nom_Champ)(0))
       Valeur_Champ = Trim(Split(in_Ligne, ";")(Num_Champ))
       Call Tmp_Dic.Add(Nom_Champ, Valeur_Champ)
     Next
    '------------------------------------------------------------------------------------
     
     Set RecupDicLigne = Tmp_Dic
     
    End Function
     
    '******************************************************************************
    '** Ajout d'un enregistrement de type dictionnaire dans un dictionnaire
    '******************************************************************************
    Private Sub CreeEnregDictDansDict(ByRef io_Dict, ByVal in_Cle, _
                                      ByVal in_Enreg, ByRef in_NomEnreg)
     
      ' Création de la clé dans le dictionnaire si elle n'y existe pas déjà
      If Not io_Dict.Exists(in_Cle) Then
        Call io_Dict.Add(in_Cle, CreateObject("Scripting.Dictionary"))
      End If
     
      ' Création d'un nouvel enregistrement pour la clé
      ' Si on n'a pas passé d'identifiant pour l'enregistrement, la clé secondaire est un numéro séquentiel.
      ' Sinon, on utilise cet identifiant comme clé secondaire.
      If in_NomEnreg = "" Then
        Call io_Dict(in_Cle).Add(io_Dict(in_Cle).Count, in_Enreg)
      Else
        Call io_Dict(in_Cle).Add(in_NomEnreg, in_Enreg)
      End If
     
    End Sub
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Fin récupération du fichier source                                     ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Traitement du fichier source                                           ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
     
    '******************************************************************************
    ' Procédure globale de traitement du fichier source
    '******************************************************************************
    Private Sub TraitementFichierSource
     Dim Cle_Primaire
     
     ' Boucle sur toutes les clés primaires
     For Each Cle_Primaire In Dic_DonneesFichier
       Call TraitementLignesClePrimaire(Cle_Primaire)
     Next
     
     If Lng_NbLigDetails = 0 Then
       Call AjoutLigneFicLog ("Aucune donnée valide dans le fichier source")
     End if
     
    End Sub
     
     
    '******************************************************************************
    '** Taitement de toutes les lignes liées à une clé primaire
    '******************************************************************************
    Public Sub TraitementLignesClePrimaire(ByVal in_Cle_Primaire)
     
     Dim Cle_Secondaire
     Dim Req_Existence_Cle_Primaire
     Dim LigneSCD ' Ligne à insérer dans la table sous-compte/date
     Dim Sous_Compte
     Dim Date_Arrete
     Dim Msg_Err
     Dim Num_Ligne
     Dim Nb_Lignes_Valides  ' Nombre de lignes valides pour cette clé primaire
     
     Sous_Compte = Split(in_Cle_Primaire, ";")(0)
     Date_Arrete = Split(in_Cle_Primaire, ";")(1)
    ' Num_Ligne = Dic_DonneesFichier(in_Cle_Primaire)(0)("NUM_LIGNE")
     
     ' Test de validité pour la clé primaire
     Msg_Err = TestTypeTailleUnChampAvecStructure(Dic_Structure, "SOUS_COMPTE_ACTIF", Sous_Compte) & " " & _
               TestTypeTailleUnChampAvecStructure(Dic_Structure, "DATE_REF_POS", Date_Arrete)
     
     If Msg_Err <> " " Then
       Call AjoutLigneFicLog("Clé primaire " & in_Cle_Primaire & " invalide : " & Msg_Err)
     
     Else
     
       ' Test de la validité "globale" des lignes correspondant à la clé primaire
       ' et suppression des lignes erronées
       Msg_Err = TestValiditeDicClePrim(in_Cle_Primaire)
     
       If Msg_Err <> "" Then
     
         Call AjoutLigneFicLog(Msg_Err)
     
       Else
     
         Nb_Lignes_Valides = 0
     
         ' Boucle sur tous les enregistrements correspondant à la clé primaire en cours
         For Each Cle_Secondaire In Dic_DonneesFichier(in_Cle_Primaire)
           Call TraitementLigneFichier(in_Cle_Primaire, Cle_Secondaire, Nb_Lignes_Valides)
         Next
     
         If Nb_Lignes_Valides = 0 Then
     
           Msg_Err = "Aucune ligne valide pour la clé " & in_Cle_Primaire
           Call AjoutLigneFicLog(Msg_Err)
     
         Else
           ' Si pas d'enreg dans la table, on en crée un
     
           Req_Existence_Cle_Primaire = "select count(*) from OSP_TAB_SS_COMPTES " & _
             "where SOUS_COMPTE_ACTIF = '" & Sous_Compte & "'" & _
             "  and DATE_REF_POS = '" & Date_Arrete & "'"
     
           If Clng(ExecuteRequeteUnResultat(Req_Existence_Cle_Primaire)) = 0 Then
             ' Création de la requête en remplaçant dans le template les noms des champs par leur valeur
             LigneSCD = MergeRequete(Tmpl_Lig_Insert_SC_Date, Dic_DonneesFichier(in_Cle_Primaire)(0), True)
             Call AjoutLigneFicSCD(LigneSCD)
           End If
     
         End If
     
       End If
     End If
    End Sub
     
    '******************************************************************************
    '** Traitement d'une ligne du fichier
    '******************************************************************************
    Public Function TraitementLigneFichier(in_Cle_Primaire, in_Cle_Secondaire, io_Nb_Lignes_Valides)
     
     Dim Msg_Err
     Dim Ligne_Details      ' Ligne à insérer dans la table détails
     Dim Dic_Cle_Secondaire ' Variable tampon obligatoire pour l'appel à TestValiditeLigne
     Dim Code_ISIN
     Dim Date_Cours
     Dim Flag_Especes
     
     Set Dic_Cle_Secondaire = CreateObject("Scripting.Dictionary")
     Set Dic_Cle_Secondaire = Dic_DonneesFichier(in_Cle_Primaire)(in_Cle_Secondaire)
     
     Msg_Err = TestValiditeLigne(in_Cle_Primaire, in_Cle_Secondaire)
     
     If Msg_Err <> "" Then
     
       Call AjoutLigneFicLog(Msg_Err)
     
     Else ' Si les données de la ligne sont valides
     
       ' Ajout du champ "Espèces"
       Code_ISIN = Dic_DonneesFichier(in_Cle_Primaire)(in_Cle_Secondaire)("CODE_ISIN")
       Date_Cours = Dic_DonneesFichier(in_Cle_Primaire)(in_Cle_Secondaire)("DATE_DERNIER_COURS")
       If (Code_ISIN = "" Or IsNull(Code_ISIN)) And (Date_Cours = "" Or IsNull(Date_Cours)) Then
         Flag_Especes = 1
       Else
         Flag_Especes = 0
       End If
     
       Call Dic_DonneesFichier(in_Cle_Primaire)(in_Cle_Secondaire).Add("ESPECES", Flag_Especes)
     
       ' Création de la requête en remplaçant les noms des champs par leur valeur dans le template
       Ligne_Details = MergeRequete(Tmpl_Lig_Insert_Details, _
                                    Dic_DonneesFichier(in_Cle_Primaire)(in_Cle_Secondaire), _
                                    True)
     
       Call AjoutLigneFicDetails(Ligne_Details)
     
       ' Gestion des erreurs
       io_Nb_Lignes_Valides = io_Nb_Lignes_Valides + 1
       Lng_NbLigDetails = Lng_NbLigDetails + 1
     
     End If
     
    End Function
     
     
    '******************************************************************************
    '******************************************************************************
    '***                                                                        ***
    '*** Fin traitement du fichier source                                       ***
    '***                                                                        ***
    '******************************************************************************
    '******************************************************************************
    Serait-il possible d'indiquer ou extraire les parties qui sont seules réellement nécessaires et bloquantes, concernant le traitement des fichiers (source / dictionnaire) ?

  9. #9
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Je vous explique le script en bref et la partie qui me bloque.
    On a la fonction ‘LectureFichierSource’ qui va lire un fichier fichier_source.txt en entrée.

    Par exemple ce fichier peut contenir:

    A, Détails de A
    B, Détails de B
    C, Détails de C
    D, Détails de D


    Call InitFicSCD - Cette fonction, il va initialiser un dictionnaire Dic_LignesFicSCD dans lequel on va garder des données comme A,B,C et D seulement.

    Call InitFicDetails - Cette fonction, il va initialiser un autre dictionnaire Dic_LignesFicDetails dans lequel on va garder des données comme 'Détails de A','Détails de B' ainsi de suite.


    On a les fonctions AjoutLigneFicSCD et AjoutLigneFicDetails qui vont remplir ces dictionnaires respectivement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    '******************************************************************************
    ' Ajout d'une ligne dans le fichier SCD
    '******************************************************************************
    Private Sub AjoutLigneFicSCD(in_Ligne)
      Call Dic_LignesFicSCD.Add(Dic_LignesFicSCD.Count, in_Ligne)
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    '******************************************************************************
    ' Ajout d'une ligne dans le fichier
    '******************************************************************************
    Private Sub AjoutLigneFicDetails(in_Ligne)
      Call Dic_LignesFicDetails.Add(Dic_LignesFicDetails.Count, in_Ligne)
    End Sub

    CreeFicSCD - Cette fonction va créer physiquement un fichier SCD.txt en sorti avec les données A, B, C, D qui sont dans le dictionnaire Dic_LignesFicSCD.

    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
     
    '******************************************************************************
    ' Création du Script SCD
    '******************************************************************************
    Private Sub CreeFicSCD()
     Dim Cle
     Dim Fs
     Dim Fd
     
      Set Fs = CreateObject("Scripting.FileSystemObject")
      Set Fd = Fs.OpenTextFile(Str_CheminFicSCD & Str_NomFicSCD, 2, True)
     
      If Dic_LignesFicSCD.Count > 0 Then
        For Each Cle In Dic_LignesFicSCD
          Fd.Writeline(Dic_LignesFicSCD(Cle))
        Next
      End If
     
      Fd.Close
     
    End Sub
    A la fin, nous allons avoir in fichier comme suite :
    A
    B
    C
    D


    CreeFicDetails - Cette fonction va créer physiquement un autre fichier SCD_Detail.txt en sorti avec les données 'Détails de A','Détails de B' ,……(sur chaque ligne dans le fichier) avec les données qui sont dans le dictionnaire Dic_LignesFicDetails.

    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
    '******************************************************************************
    ' Initialisation du fichier
    '******************************************************************************
    Private Sub InitFicDetails()
     
      Str_CheminFicDetails = Str_CheminFicInsert
     
      If Not (Dic_Param_Globaux.Exists("NOM_FIC_DETAILS")) Then
        Str_NomFicDetails = "ISM_Donnees_OSP_Details.txt"
      Else
        Str_NomFicDetails = Dic_Param_Globaux("NOM_FIC_DETAILS")
      End If
     
      Set Dic_LignesFicDetails = CreateObject("Scripting.Dictionary")
     
    End Sub

    A la fin, nous allons avoir un fichier comme suite :
    Détails de A
    Détails de B
    Détails de C
    .
    .

    Mais actuellement, ces données sont tous stockées dans les dictionnaires avant de finalement être envoyer dans les fichiers en sortie (ceci a été fait pour cause de performance)

    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
    '******************************************************************************
    ' Création du Script SCD
    '******************************************************************************
    Private Sub CreeFicSCD()
     Dim Cle
     Dim Fs
     Dim Fd
     
      Set Fs = CreateObject("Scripting.FileSystemObject")
      Set Fd = Fs.OpenTextFile(Str_CheminFicSCD & Str_NomFicSCD, 2, True)
     
      If Dic_LignesFicSCD.Count > 0 Then
        For Each Cle In Dic_LignesFicSCD
          Fd.Writeline(Dic_LignesFicSCD(Cle))
        Next
      End If
     
      Fd.Close
     
    End Sub

    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
    '******************************************************************************
    ' Création du fichier
    '******************************************************************************
    Private Sub CreeFicDetails()
     Dim Cle
     Dim Fs
     Dim Fd
     
      Set Fs = CreateObject("Scripting.FileSystemObject")
      Set Fd = Fs.OpenTextFile(Str_CheminFicDetails & Str_NomFicDetails, 2, True)
     
      If Dic_LignesFicDetails.Count > 0 Then
        For Each Cle In Dic_LignesFicDetails
          Fd.Writeline(Dic_LignesFicDetails(Cle))
        Next
      End If
     
      Fd.Close
     
    End Sub

    Le problème à mon avis vient au niveau des dictionnaires Dic_LignesFicSCD et Dic_LignesFicDetails qui ne peuvent pas contenir des tonnes de données car j'ai aucun fichier générer en sorti si je mets un fichier de 50 MB en entrée du script mais par contre un fichier de taille 10 ou 20 MB marche parfaitement.

    Peut-être qu'on doit enlever les dictionnaires et écrire dans les fichiers directement?

    Merci infiniment pour votre aide.

  10. #10
    Nouveau membre du Club
    Profil pro
    Technicien Help Desk
    Inscrit en
    Décembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Décembre 2012
    Messages : 23
    Points : 29
    Points
    29
    Par défaut
    C'est la boîte de Pandore pour trouver sur Internet Google l'information que je cherche pour toi : la taille limite d'une chaîne de caractères ou d'un objet en VBScript.
    Puisque 20Mo semblent passer et que 50Mo non, as-tu la possibilité de découper ton objet en paquets de 32Mo max ?

Discussions similaires

  1. Réponses: 26
    Dernier message: 20/11/2012, 09h24
  2. Script fonctionne pas avec cron
    Par Nelmo dans le forum Administration système
    Réponses: 11
    Dernier message: 09/07/2012, 17h01
  3. [WD-2007] Publipostage qui ne fonctionne pas avec un fichier source lié
    Par paulinegue dans le forum VBA Word
    Réponses: 6
    Dernier message: 09/08/2011, 09h47
  4. Réponses: 2
    Dernier message: 01/07/2008, 21h56
  5. window.resizeTo ne fonctionne pas avec firefox?
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/06/2005, 15h07

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