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

SQL Oracle Discussion :

Problème avec un trigger et la valeur ":NEW."


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Par défaut Problème avec un trigger et la valeur ":NEW."
    Bonjour, j'ai essayé les différentes méthodes trouvées sur le forum sans succès.

    La base est Oracle 10gR2. Avec une base 9i, je n'avais pas de problème.

    Soit le code
    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
     
    Select VALIDE_AU, ID Into periode_fin, exercice_id
                from CO_EXERCICE
               Where VALIDE_DU <= :new.DATE_VALEUR
                 and VALIDE_AU >= :new.DATE_VALEUR
                 and DB_ELEMENT_ID = :new.DB_ELEMENT_ID;
     
    ou
     
    Select VALIDE_AU, ID Into periode_fin, exercice_id
                from CO_EXERCICE
               Where TO_CHAR(VALIDE_DU,'DD-MON-YY') <= :new.DATE_VALEUR
                 and TO_CHAR(VALIDE_AU,'DD-MON-YY') >= :new.DATE_VALEUR
                 and DB_ELEMENT_ID = :new.DB_ELEMENT_ID;
     
    ou 
     
    Select VALIDE_AU, ID Into periode_fin, exercice_id
                from CO_EXERCICE
               Where TO_DATE(TO_CHAR(VALIDE_DU,'DD-MON-YY'),'DD-MON-YY') <= :new.DATE_VALEUR
                 and TO_CHAR(VALIDE_AU,'DD-MON-YY'),'DD-MON-YY') >= :new.DATE_VALEUR
                 and DB_ELEMENT_ID = :new.DB_ELEMENT_ID;
    Et j'ai également essayé les conversions sur le champ ":new.DATE_VALEUR" sans succès.

    Dans une fenêtre SQL j'obtiens le résultat suivant (avec ou sans les conversions explicites) :
    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
     
    SQL> select id, valide_du, valide_au
      2    from co_exercice
      3    where valide_du <= '01-JAN-2009' and
      4             valide_au >= '01-JAN-2009' and
      5            db_element_id = 5;
     
               ID VALIDE_DU VALIDE_AU
    ---------- --------- ---------
            56 01-JAN-09 31-DEC-09
     
    SQL> select id, valide_du, valide_au
      2    from co_exercice
      3    where valide_du <= '01-JAN-09' and
      4             valide_au >= '01-JAN-09' and
      5             db_element_id = 5;
     
            ID VALIDE_DU VALIDE_AU
    ---------- --------- ---------
            56 01-JAN-09 31-DEC-09
     
    SQL> select id, valide_du, valide_au
      2    from co_exercice
      3    where valide_du <= to_date('01-JAN-09','DD-MON-YY') and
      4            valide_au >=  to_date('01-JAN-09','DD-MON-YY') and
      5            db_element_id = 5;
     
            ID VALIDE_DU VALIDE_AU
    ---------- --------- ---------
            56 01-JAN-09 31-DEC-09
    J'ai également vérifié les NLS_*PARAMETERS, soit :
    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
     
    SQL> SELECT * FROM NLS_SESSION_PARAMETERS;
     
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_LANGUAGE                   AMERICAN
    NLS_TERRITORY                  AMERICA
    NLS_CURRENCY                   $
    NLS_ISO_CURRENCY               AMERICA
    NLS_NUMERIC_CHARACTERS         .,
    NLS_CALENDAR                   GREGORIAN
    NLS_DATE_FORMAT                DD-MON-RR
    NLS_DATE_LANGUAGE              AMERICAN
    NLS_SORT                       BINARY
    NLS_TIME_FORMAT                HH.MI.SSXFF AM
    NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
     
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
    NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
    NLS_DUAL_CURRENCY              $
    NLS_COMP                       BINARY
    NLS_LENGTH_SEMANTICS           BYTE
    NLS_NCHAR_CONV_EXCP            FALSE
     
    17 rows selected.
     
    SQL> SELECT * FROM NLS_INSTANCE_PARAMETERS;
     
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_LANGUAGE                   AMERICAN
    NLS_TERRITORY                  AMERICA
    NLS_SORT
    NLS_DATE_LANGUAGE
    NLS_DATE_FORMAT
    NLS_CURRENCY
    NLS_NUMERIC_CHARACTERS
    NLS_ISO_CURRENCY
    NLS_CALENDAR
    NLS_TIME_FORMAT
    NLS_TIMESTAMP_FORMAT
     
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_TIME_TZ_FORMAT
    NLS_TIMESTAMP_TZ_FORMAT
    NLS_DUAL_CURRENCY
    NLS_COMP
    NLS_LENGTH_SEMANTICS           BYTE
    NLS_NCHAR_CONV_EXCP            FALSE
     
    17 rows selected.
     
    SQL> SELECT * FROM NLS_DATABASE_PARAMETERS;
     
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_LANGUAGE                   AMERICAN
    NLS_TERRITORY                  AMERICA
    NLS_CURRENCY                   $
    NLS_ISO_CURRENCY               AMERICA
    NLS_NUMERIC_CHARACTERS         .,
    NLS_CHARACTERSET               WE8ISO8859P15
    NLS_CALENDAR                   GREGORIAN
    NLS_DATE_FORMAT                DD-MON-RR
    NLS_DATE_LANGUAGE              AMERICAN
    NLS_SORT                       BINARY
    NLS_TIME_FORMAT                HH.MI.SSXFF AM
     
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
    NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
    NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
    NLS_DUAL_CURRENCY              $
    NLS_COMP                       BINARY
    NLS_LENGTH_SEMANTICS           BYTE
    NLS_NCHAR_CONV_EXCP            FALSE
    NLS_NCHAR_CHARACTERSET         AL16UTF16
    NLS_RDBMS_VERSION              10.2.0.1.0
     
    20 rows selected.
    Et là, honnêtement, je sèche. Est-ce que qqn aurait une idée?

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Pour votre problématique, il nous faut connaitre la structure de la table CO_EXERCICE, et ce qui envoie le paramètre DATE_VALEUR (requête, trigger, procédure stockée, et cetera).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Par défaut
    Alors la description de la table CO_EXERCICE

    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
     
    SQL> desc co_exercice
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     DATE_CREATION                             NOT NULL DATE
     USER_CREATION                             NOT NULL VARCHAR2(40)
     ELEMENT_CREATION                          NOT NULL NUMBER(16)
     DATE_MUTATION                                      DATE
     USER_MUTATION                                      VARCHAR2(40)
     STATUS                                    NOT NULL NUMBER(4)
     DB_ELEMENT_ID                             NOT NULL NUMBER(16)
     NO_CLASS                                           NUMBER(16)
     LEVEL_CLASS                                        NUMBER(16)
     ID                                        NOT NULL NUMBER(16)
     DB_ELECPTA_ID                             NOT NULL NUMBER(16)
     CO_PERIODE_DEFAUT_ID                               NUMBER(16)
     CO_PLAN_COMPTABLE_ID                               NUMBER(16)
     INT_FORME_STE_CI                                   VARCHAR2(20)
     CO_CODE_ANALYT_CI                                  VARCHAR2(20)
     CO_CODE_CONSOLID_CI                                VARCHAR2(20)
     CO_CODREL_ID                                       NUMBER(16)
     CO_CODRAP_ID                                       NUMBER(16)
     VALIDE_DU                                 NOT NULL DATE
     VALIDE_AU                                          DATE
     CODE_LANGUE                                        NUMBER(16)
     ABREGE                                             VARCHAR2(20)
     NOM                                                VARCHAR2(255)
     DESIGNATION                                        VARCHAR2(255)
     DESCRIPTION                                        VARCHAR2(255)
     EXERCICE_VALIDE                           NOT NULL NUMBER(1)
     GRAND_LIVRE                               NOT NULL NUMBER(1)
     BUDGET                                    NOT NULL NUMBER(1)
     DEBITEURS                                 NOT NULL NUMBER(1)
     CREANCIERS                                NOT NULL NUMBER(1)
     IMMOBILISATIONS                           NOT NULL NUMBER(1)
     ANALYTIQUE                                NOT NULL NUMBER(1)
     MULTI_DEVISES                             NOT NULL NUMBER(1)
     CODE_INTERNE                                       VARCHAR2(20)
     SEQ_TRI                                            NUMBER(4)
     ARRONDI_DEFAUT_ID                                  NUMBER(16)
     SUPERVISEUR_PASSWORD                               VARCHAR2(255)
     EST_SUPERVISEUR_EXCLU                              NUMBER(1)
     IS_REPORT_SOLDE_BLOQUE                             NUMBER(1)
     VENTILER_TOUS_COMPTES                     NOT NULL NUMBER(1)
    Ensuite c'est une insertion dans CO_ECRITURE_COMPTA qui déclenche le trigger, soit le code (la partie en gras-italique est le code qui plante) :

    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
    CREATE OR REPLACE TRIGGER TRG_COECRCPTA_MISAJOUR_SOLDE
     BEFORE DELETE OR INSERT OR UPDATE OF DB_ELEMENT_ID
    , CO_COMPTE_PRIMAIRE_ID
    , MONTANT_DEBIT
    , MONTANT_CREDIT
    , MONTANT_DEV_DEBIT
    , IS_EXECUTE_TRIGGER_SOLDE
    , DATE_VALEUR
    , MONTANT_DEV_CREDIT
     ON CO_ECRITURE_COMPTA
     REFERENCING OLD AS OLD NEW AS NEW
     FOR EACH ROW
    DECLARE
    
    
    
    nb_periode  NUMBER := 0;
    seq_solde   NUMBER;
    cpte_model  NUMBER;
    cpte_model_old NUMBER :=0;
    periode_fin DATE;
    exercice_id NUMBER;
    mon_base    NUMBER;
    mon_cpte    NUMBER;
    mt_dev_debit NUMBER;
    mt_dev_credit NUMBER;
    mt_dev_debit_old NUMBER;
    mt_dev_credit_old NUMBER;
    Begin
        /* Mise a jour des soldes lors de la creation d'une ecriture */
        /* Nouvelle ecriture  */
        if INSERTING then
           /* recherche de la monnaie de base */
           select AD_MONNAIE_ID into mon_base from DB_ELEMENT_COMPTA
             where ELE_ID = :new.DB_ELEMENT_ID;
    
           /* recherche de la monnaie du compte */
           select AD_MONNAIE_ID into mon_cpte from CO_COMPTE
             where ID = :new.CO_COMPTE_PRIMAIRE_ID;
    
           if mon_base <> mon_cpte then
             mt_dev_debit := nvl(:new.montant_dev_debit,0);
             mt_dev_credit := nvl(:new.montant_dev_credit,0);
           else
             mt_dev_debit := nvl(:new.montant_debit,0);
             mt_dev_credit := nvl(:new.montant_credit,0);
    
    end if;
    
    
    if :new.IS_EXECUTE_TRIGGER_SOLDE=1 then
              /* Recherche des periodes de validite de l'exercice */
              Select VALIDE_AU, ID Into periode_fin, exercice_id
                from CO_EXERCICE
               Where VALIDE_DU <= :new.DATE_VALEUR
                 and VALIDE_AU >= :new.DATE_VALEUR
                 and DB_ELEMENT_ID = :new.DB_ELEMENT_ID;
               /* Recherche de l'ID du compte modele */
               Select CO_CPTEPLAN_ID Into cpte_model
                 from CO_COMPTE_SOC
                Where DB_ELEMENT_ID = :new.DB_ELEMENT_ID
                  and CO_EXERC_ID = exercice_id
                  and CO_COMPTE_ID = :new.CO_COMPTE_PRIMAIRE_ID;
               /* Mise a jour des montants Debit et Credit lors de l'enregistrement
                  des ecritures initiales */
               if :new.IS_ECRITURE_INITIALE = 1 then
                   Update CO_SOLDE_PERIODIQUE set
                     MONT_DEBIT = MONT_DEBIT + nvl(:new.MONTANT_DEBIT,0),
                     MONT_CREDIT = MONT_CREDIT + nvl(:new.MONTANT_CREDIT,0),
                     MONT_DEV_DEBIT = MONT_DEV_DEBIT + mt_dev_debit,
                     MONT_DEV_CREDIT = MONT_DEV_CREDIT + mt_dev_credit
    --                 MONT_DEBIT_CUMUL = MONT_DEBIT_CUMUL + nvl(:new.MONTANT_DEBIT,0),
    --                 MONT_CREDIT_CUMUL = MONT_CREDIT_CUMUL + nvl(:new.MONTANT_CREDIT,0),
    --                 MONT_DEV_DEBIT_CUMUL = MONT_DEV_DEBIT_CUMUL + nvl(:new.MONTANT_DEV_DEBIT,0),
    --                 MONT_DEV_CREDIT_CUMUL = MONT_DEV_CREDIT_CUMUL + nvl(:new.MONTANT_DEV_CREDIT,0)
                   Where DATE_SOLDE = :new.DATE_VALEUR
                     and CO_COMPTE_ID in (
                    Select CO_COMPTE_ID From CO_COMPTE_SOC
                     Where CO_EXERC_ID = exercice_id
                       and CO_CPTEPLAN_ID in (
                         Select ID From CO_COMPTE_PLAN
                          Start with ID = cpte_model
                          Connect by prior CO_CPTE_TOTALIS_ID=ID));
               else
                 /* Mise a jour des montants Debit et Credit lors de l'enregistrement
                 */
                  Update CO_SOLDE_PERIODIQUE set
                   MONT_DEBIT = MONT_DEBIT + nvl(:new.MONTANT_DEBIT,0),
                   MONT_CREDIT = MONT_CREDIT + nvl(:new.MONTANT_CREDIT,0),
                   MONT_DEV_DEBIT = MONT_DEV_DEBIT + mt_dev_debit,
                   MONT_DEV_CREDIT = MONT_DEV_CREDIT + mt_dev_credit
                  Where DATE_SOLDE = LAST_DAY(:new.DATE_VALEUR)
                   and CO_COMPTE_ID in (
                    Select CO_COMPTE_ID From CO_COMPTE_SOC
                     Where CO_EXERC_ID = exercice_id
                       and CO_CPTEPLAN_ID in (
                         Select ID From CO_COMPTE_PLAN
                          Start with ID = cpte_model
                          Connect by prior CO_CPTE_TOTALIS_ID=ID));
               end if;
               /* Mise a jour des cumuls pour les periodes qui suivent la date de valeur
                  et qui se trouvent dans la validite de l'exercice */
               if :new.IS_ECRITURE_INITIALE = 1 then
                  Update CO_SOLDE_PERIODIQUE set
                    MONT_SOLDE = MONT_SOLDE + :new.MONTANT_DEBIT - :new.MONTANT_CREDIT,
                    MONT_DEV_SOLDE = MONT_DEV_SOLDE + mt_dev_debit - mt_dev_credit,
                    MONT_DEBIT_CUMUL = nvl(MONT_DEBIT_CUMUL,0) + :new.MONTANT_DEBIT,
                    MONT_CREDIT_CUMUL = nvl(MONT_CREDIT_CUMUL,0) + :new.MONTANT_CREDIT,
                    MONT_DEV_DEBIT_CUMUL = nvl(MONT_DEV_DEBIT_CUMUL,0) + mt_dev_debit,
                    MONT_DEV_CREDIT_CUMUL = nvl(MONT_DEV_CREDIT_CUMUL,0) + mt_dev_credit
                   Where DATE_SOLDE >= :new.DATE_VALEUR
                     and DATE_SOLDE <= periode_fin
                     and CO_COMPTE_ID in (
                      Select CO_COMPTE_ID From CO_COMPTE_SOC
                       Where CO_EXERC_ID = exercice_id
                         and CO_CPTEPLAN_ID in (
                          Select ID From CO_COMPTE_PLAN
                           Start with ID = cpte_model
                           Connect by prior CO_CPTE_TOTALIS_ID=ID));
               else
                 Update CO_SOLDE_PERIODIQUE set
                  MONT_SOLDE = MONT_SOLDE + :new.MONTANT_DEBIT - :new.MONTANT_CREDIT,
                  MONT_DEV_SOLDE = MONT_DEV_SOLDE + mt_dev_debit - mt_dev_credit,
                  MONT_DEBIT_CUMUL = nvl(MONT_DEBIT_CUMUL,0) + :new.MONTANT_DEBIT,
                  MONT_CREDIT_CUMUL = nvl(MONT_CREDIT_CUMUL,0) + :new.MONTANT_CREDIT,
                  MONT_DEV_DEBIT_CUMUL = nvl(MONT_DEV_DEBIT_CUMUL,0) + mt_dev_debit,
                  MONT_DEV_CREDIT_CUMUL = nvl(MONT_DEV_CREDIT_CUMUL,0) + mt_dev_credit
                 Where DATE_SOLDE >= last_day(:new.DATE_VALEUR)
                   and DATE_SOLDE <= periode_fin
                   and CO_COMPTE_ID in (
                    Select CO_COMPTE_ID From CO_COMPTE_SOC
                     Where CO_EXERC_ID = exercice_id
                       and CO_CPTEPLAN_ID in (
                        Select ID From CO_COMPTE_PLAN
                         Start with ID = cpte_model
                         Connect by prior CO_CPTE_TOTALIS_ID=ID));
               end if;
               /* Mise a zero des soldes en devise pour les groupes de compte */
               Update CO_SOLDE_PERIODIQUE set
                  MONT_DEV_DEBIT = 0,
                  MONT_DEV_CREDIT = 0,
                  MONT_DEV_SOLDE = 0,
                  MONT_DEV_DEBIT_CUMUL = 0,
                  MONT_DEV_CREDIT_CUMUL = 0
               Where CO_COMPTE_ID in (
                  Select c.CO_COMPTE_ID from CO_COMPTE_SOC c, CO_COMPTE_PLAN p
                   Where c.CO_CPTEPLAN_ID = p.ID
                     and c.DB_ELEMENT_ID = :new.DB_ELEMENT_ID
                     and c.CO_EXERC_ID = exercice_id
                     and p.CO_TCPTE_CI = 'A-GRP'
                     and p.ID in (Select ID From CO_COMPTE_PLAN
                                  Start with ID = cpte_model
                                  Connect by prior CO_CPTE_TOTALIS_ID=ID));
            end if;
        end if;   /* fin de la partie Insert */
    
        if UPDATING then
           /* recherche de la monnaie de base */
           select AD_MONNAIE_ID into mon_base from DB_ELEMENT_COMPTA
             where ELE_ID = :new.DB_ELEMENT_ID;
    
           /* recherche de la monnaie du compte */
           select AD_MONNAIE_ID into mon_cpte from CO_COMPTE
             where ID = :new.CO_COMPTE_PRIMAIRE_ID;
    
           if mon_base <> mon_cpte then
             mt_dev_debit := nvl(:new.montant_dev_debit,0);
             mt_dev_credit := nvl(:new.montant_dev_credit,0);
             mt_dev_debit_old := nvl(:old.montant_dev_debit,0);
             mt_dev_credit_old := nvl(:old.montant_dev_credit,0);
           else
             mt_dev_debit := nvl(:new.montant_debit,0);
             mt_dev_credit := nvl(:new.montant_credit,0);
             mt_dev_debit_old := nvl(:old.montant_debit,0);
             mt_dev_credit_old := nvl(:old.montant_credit,0);
    
    end if;
    
           if :new.IS_EXECUTE_TRIGGER_SOLDE=1 then
              /* Recherche des periodes de validite de l'exercice */
              Select VALIDE_AU, ID Into periode_fin, exercice_id
                from CO_EXERCICE
               Where VALIDE_DU <= :new.DATE_VALEUR
                 and VALIDE_AU >= :new.DATE_VALEUR
                 and DB_ELEMENT_ID = :new.DB_ELEMENT_ID;
               /* Recherche de l'ID du compte modele */
               Select CO_CPTEPLAN_ID Into cpte_model
                 from CO_COMPTE_SOC
                Where DB_ELEMENT_ID = :new.DB_ELEMENT_ID
                  and CO_EXERC_ID = exercice_id
                  and CO_COMPTE_ID = :new.CO_COMPTE_PRIMAIRE_ID;
    
               /* Recherche de l'ancien ID du compte modele */
               if :new.CO_COMPTE_PRIMAIRE_ID <> :old.CO_COMPTE_PRIMAIRE_ID then
                  Select CO_CPTEPLAN_ID Into cpte_model_old
                    from CO_COMPTE_SOC
                   Where DB_ELEMENT_ID = :new.DB_ELEMENT_ID
                     and CO_EXERC_ID = exercice_id
                     and CO_COMPTE_ID = :old.CO_COMPTE_PRIMAIRE_ID;
               else
                  cpte_model_old := cpte_model;
    
    end if;
    
               /* Mise a jour des montants Debit et Credit lors de l'enregistrement
                  des ecritures initiales */
    
    if :new.IS_ECRITURE_INITIALE = 1 then
    
                  /* Diminution des montants pour l'ancienne date valeur ou l'ancien compte */
                  Update CO_SOLDE_PERIODIQUE set
                     MONT_DEBIT = MONT_DEBIT - :old.MONTANT_DEBIT,
                     MONT_CREDIT = MONT_CREDIT - :old.MONTANT_CREDIT,
                     MONT_DEV_DEBIT = MONT_DEV_DEBIT - mt_dev_debit_old,
                     MONT_DEV_CREDIT = MONT_DEV_CREDIT - mt_dev_credit_old
    --                 MONT_SOLDE = MONT_SOLDE - :old.MONTANT_DEBIT + :old.MONTANT_CREDIT,
    --                 MONT_DEV_SOLDE = MONT_DEV_SOLDE - :old.MONTANT_DEV_DEBIT + :old.MONTANT_DEV_CREDIT,
    --                 MONT_DEBIT_CUMUL = MONT_DEBIT_CUMUL - :old.MONTANT_DEBIT,
    --                 MONT_CREDIT_CUMUL = MONT_CREDIT_CUMUL - :old.MONTANT_CREDIT,
    --                 MONT_DEV_DEBIT_CUMUL = MONT_DEV_DEBIT_CUMUL - :old.MONTANT_DEV_DEBIT,
    --                 MONT_DEV_CREDIT_CUMUL = MONT_DEV_CREDIT_CUMUL - :old.MONTANT_DEV_CREDIT
                  Where DATE_SOLDE = :old.DATE_VALEUR
                    and CO_COMPTE_ID in (
                   Select CO_COMPTE_ID From CO_COMPTE_SOC
                    Where CO_EXERC_ID = exercice_id
                      and CO_CPTEPLAN_ID in (
                        Select ID From CO_COMPTE_PLAN
                         Start with ID = cpte_model_old
                         Connect by prior CO_CPTE_TOTALIS_ID=ID));
    
    
                  /* Mise a jour du solde avec la nouvelle date valeur ou le nouveau compte */
                  Update CO_SOLDE_PERIODIQUE set
                     MONT_DEBIT = MONT_DEBIT + :new.MONTANT_DEBIT,
                     MONT_CREDIT = MONT_CREDIT + :new.MONTANT_CREDIT,
                     MONT_DEV_DEBIT = MONT_DEV_DEBIT + mt_dev_debit,
                     MONT_DEV_CREDIT = MONT_DEV_CREDIT + mt_dev_credit
    --                 MONT_SOLDE = MONT_SOLDE + :new.MONTANT_DEBIT - :new.MONTANT_CREDIT,
    --                 MONT_DEV_SOLDE = MONT_DEV_SOLDE + :new.MONTANT_DEV_DEBIT - :new.MONTANT_DEV_CREDIT,
    --                 MONT_DEBIT_CUMUL = MONT_DEBIT_CUMUL + :new.MONTANT_DEBIT,
    --                 MONT_CREDIT_CUMUL = MONT_CREDIT_CUMUL + :new.MONTANT_CREDIT,
    --                 MONT_DEV_DEBIT_CUMUL = MONT_DEV_DEBIT_CUMUL + :new.MONTANT_DEV_DEBIT,
    --                 MONT_DEV_CREDIT_CUMUL = MONT_DEV_CREDIT_CUMUL + :new.MONTANT_DEV_CREDIT
                  Where DATE_SOLDE = :new.DATE_VALEUR
                    and CO_COMPTE_ID in (
                   Select CO_COMPTE_ID From CO_COMPTE_SOC
                    Where CO_EXERC_ID = exercice_id
                      and CO_CPTEPLAN_ID in (
                        Select ID From CO_COMPTE_PLAN
                         Start with ID = cpte_model
                         Connect by prior CO_CPTE_TOTALIS_ID=ID));
    
               else
                /* Mise a jour des montants Debit et Credit lors de l'enregistrement
                */
                 Update CO_SOLDE_PERIODIQUE set
                  MONT_DEBIT = MONT_DEBIT - :old.MONTANT_DEBIT,
                  MONT_CREDIT = MONT_CREDIT - :old.MONTANT_CREDIT,
                  MONT_DEV_DEBIT = MONT_DEV_DEBIT - mt_dev_debit_old,
                  MONT_DEV_CREDIT = MONT_DEV_CREDIT - mt_dev_credit_old
                 Where DATE_SOLDE = last_day(:old.DATE_VALEUR)
                  and CO_COMPTE_ID in (
                   Select CO_COMPTE_ID From CO_COMPTE_SOC
                    Where CO_EXERC_ID = exercice_id
                      and CO_CPTEPLAN_ID in (
                        Select ID From CO_COMPTE_PLAN
                         Start with ID = cpte_model_old
                         Connect by prior CO_CPTE_TOTALIS_ID=ID));
    
                 Update CO_SOLDE_PERIODIQUE set
                  MONT_DEBIT = MONT_DEBIT  + :new.MONTANT_DEBIT,
                  MONT_CREDIT = MONT_CREDIT + :new.MONTANT_CREDIT,
                  MONT_DEV_DEBIT = MONT_DEV_DEBIT + mt_dev_debit,
                  MONT_DEV_CREDIT = MONT_DEV_CREDIT + mt_dev_credit
                 Where DATE_SOLDE = last_day(:new.DATE_VALEUR)
                  and CO_COMPTE_ID in (
                   Select CO_COMPTE_ID From CO_COMPTE_SOC
                    Where CO_EXERC_ID = exercice_id
                      and CO_CPTEPLAN_ID in (
                        Select ID From CO_COMPTE_PLAN
                         Start with ID = cpte_model
                         Connect by prior CO_CPTE_TOTALIS_ID=ID));
    
    end if;
               /* Mise a jour des cumuls pour les periodes qui suivent la date de valeur
                  et qui se trouvent dans la validite de l'exercice */
               if :new.IS_ECRITURE_INITIALE = 1 then
                 Update CO_SOLDE_PERIODIQUE set
                  MONT_SOLDE = MONT_SOLDE - :old.MONTANT_DEBIT + :old.MONTANT_CREDIT,
                  MONT_DEV_SOLDE = MONT_DEV_SOLDE - mt_dev_debit_old + mt_dev_credit_old,
                  MONT_DEBIT_CUMUL = MONT_DEBIT_CUMUL - :old.MONTANT_DEBIT,
                  MONT_CREDIT_CUMUL = MONT_CREDIT_CUMUL - :old.MONTANT_CREDIT,
                  MONT_DEV_DEBIT_CUMUL = MONT_DEV_DEBIT_CUMUL - mt_dev_debit_old,
                  MONT_DEV_CREDIT_CUMUL = MONT_DEV_CREDIT_CUMUL - mt_dev_credit_old
                 Where DATE_SOLDE >= :old.DATE_VALEUR
                   and DATE_SOLDE <= periode_fin
                   and CO_COMPTE_ID in (
                     Select CO_COMPTE_ID From CO_COMPTE_SOC
                      Where CO_EXERC_ID = exercice_id
                        and CO_CPTEPLAN_ID in (
                         Select ID From CO_COMPTE_PLAN
                         Start with ID = cpte_model_old
                         Connect by prior CO_CPTE_TOTALIS_ID=ID));
    
                 Update CO_SOLDE_PERIODIQUE set
                  MONT_SOLDE = MONT_SOLDE + :new.MONTANT_DEBIT - :new.MONTANT_CREDIT,
                  MONT_DEV_SOLDE = MONT_DEV_SOLDE + mt_dev_debit - mt_dev_credit,
                  MONT_DEBIT_CUMUL = MONT_DEBIT_CUMUL + :new.MONTANT_DEBIT,
                  MONT_CREDIT_CUMUL = MONT_CREDIT_CUMUL + :new.MONTANT_CREDIT,
                  MONT_DEV_DEBIT_CUMUL = MONT_DEV_DEBIT_CUMUL + mt_dev_debit,
                  MONT_DEV_CREDIT_CUMUL = MONT_DEV_CREDIT_CUMUL + mt_dev_credit
                 Where DATE_SOLDE >= :new.DATE_VALEUR
                   and DATE_SOLDE <= periode_fin
                   and CO_COMPTE_ID in (
                     Select CO_COMPTE_ID From CO_COMPTE_SOC
                      Where CO_EXERC_ID = exercice_id
                       and CO_CPTEPLAN_ID in (
                        Select ID From CO_COMPTE_PLAN
                         Start with ID = cpte_model
                         Connect by prior CO_CPTE_TOTALIS_ID=ID));
               else
                 Update CO_SOLDE_PERIODIQUE set
                  MONT_SOLDE = MONT_SOLDE - :old.MONTANT_DEBIT + :old.MONTANT_CREDIT,
                  MONT_DEV_SOLDE = MONT_DEV_SOLDE - mt_dev_debit_old + mt_dev_credit_old,
                  MONT_DEBIT_CUMUL = MONT_DEBIT_CUMUL - :old.MONTANT_DEBIT,
                  MONT_CREDIT_CUMUL = MONT_CREDIT_CUMUL - :old.MONTANT_CREDIT,
                  MONT_DEV_DEBIT_CUMUL = MONT_DEV_DEBIT_CUMUL - mt_dev_debit_old,
                  MONT_DEV_CREDIT_CUMUL = MONT_DEV_CREDIT_CUMUL - mt_dev_credit_old
                 Where DATE_SOLDE >= last_day(:old.DATE_VALEUR)
                   and DATE_SOLDE <= periode_fin
                   and CO_COMPTE_ID in (
                     Select CO_COMPTE_ID From CO_COMPTE_SOC
                      Where CO_EXERC_ID = exercice_id
                        and CO_CPTEPLAN_ID in (
                         Select ID From CO_COMPTE_PLAN
                         Start with ID = cpte_model_old
                         Connect by prior CO_CPTE_TOTALIS_ID=ID));
    
    
                 Update CO_SOLDE_PERIODIQUE set
                  MONT_SOLDE = MONT_SOLDE + :new.MONTANT_DEBIT - :new.MONTANT_CREDIT,
                  MONT_DEV_SOLDE = MONT_DEV_SOLDE + mt_dev_debit - mt_dev_credit,
                  MONT_DEBIT_CUMUL = MONT_DEBIT_CUMUL + :new.MONTANT_DEBIT,
                  MONT_CREDIT_CUMUL = MONT_CREDIT_CUMUL + :new.MONTANT_CREDIT,
                  MONT_DEV_DEBIT_CUMUL = MONT_DEV_DEBIT_CUMUL + mt_dev_debit,
                  MONT_DEV_CREDIT_CUMUL = MONT_DEV_CREDIT_CUMUL + mt_dev_credit
                 Where DATE_SOLDE >= last_day(:new.DATE_VALEUR)
                   and DATE_SOLDE <= periode_fin
                   and CO_COMPTE_ID in (
                     Select CO_COMPTE_ID From CO_COMPTE_SOC
                      Where CO_EXERC_ID = exercice_id
                       and CO_CPTEPLAN_ID in (
                        Select ID From CO_COMPTE_PLAN
                         Start with ID = cpte_model
                         Connect by prior CO_CPTE_TOTALIS_ID=ID));
    
    end if;
               /* Mise a zero des soldes en devise pour les groupes de compte */
               Update CO_SOLDE_PERIODIQUE set
                  MONT_DEV_DEBIT = 0,
                  MONT_DEV_CREDIT = 0,
                  MONT_DEV_SOLDE = 0,
                  MONT_DEV_DEBIT_CUMUL = 0,
                  MONT_DEV_CREDIT_CUMUL = 0
               Where CO_COMPTE_ID in (
                  Select c.CO_COMPTE_ID from CO_COMPTE_SOC c, CO_COMPTE_PLAN p
                   Where c.CO_CPTEPLAN_ID = p.ID
                     and c.DB_ELEMENT_ID = :new.DB_ELEMENT_ID
                     and c.CO_EXERC_ID = exercice_id
                     and p.CO_TCPTE_CI = 'A-GRP'
                     and p.ID in (Select ID From CO_COMPTE_PLAN
                                  Start with ID = cpte_model
                                  Connect by prior CO_CPTE_TOTALIS_ID=ID));
    
               Update CO_SOLDE_PERIODIQUE set
                  MONT_DEV_DEBIT = 0,
                  MONT_DEV_CREDIT = 0,
                  MONT_DEV_SOLDE = 0,
                  MONT_DEV_DEBIT_CUMUL = 0,
                  MONT_DEV_CREDIT_CUMUL = 0
               Where CO_COMPTE_ID in (
                  Select c.CO_COMPTE_ID from CO_COMPTE_SOC c, CO_COMPTE_PLAN p
                   Where c.CO_CPTEPLAN_ID = p.ID
                     and c.DB_ELEMENT_ID = :new.DB_ELEMENT_ID
                     and c.CO_EXERC_ID = exercice_id
                     and p.CO_TCPTE_CI = 'A-GRP'
                     and p.ID in (Select ID From CO_COMPTE_PLAN
                                  Start with ID = cpte_model_old
                                  Connect by prior CO_CPTE_TOTALIS_ID=ID));
    
    end if;
        end if;   /* fin de la partie Updating */
    
        /* Mise a jour des soldes lors de la suppression d'une ecriture */
        if DELETING then
           /* recherche de la monnaie de base */
           select AD_MONNAIE_ID into mon_base from DB_ELEMENT_COMPTA
             where ELE_ID = :old.DB_ELEMENT_ID;
    
           /* recherche de la monnaie du compte */
           select AD_MONNAIE_ID into mon_cpte from CO_COMPTE
             where ID = :old.CO_COMPTE_PRIMAIRE_ID;
    
           if mon_base <> mon_cpte then
             mt_dev_debit_old := nvl(:old.montant_dev_debit,0);
             mt_dev_credit_old := nvl(:old.montant_dev_credit,0);
           else
             mt_dev_debit_old := nvl(:old.montant_debit,0);
             mt_dev_credit_old := nvl(:old.montant_credit,0);
    
    end if;
    
    
    if :old.IS_EXECUTE_TRIGGER_SOLDE=1 then
              /* Recherche des periodes de validite de l'exercice */
              Select VALIDE_AU, ID Into periode_fin, exercice_id
                from CO_EXERCICE
               Where VALIDE_DU <= :old.DATE_VALEUR
                 and VALIDE_AU >= :old.DATE_VALEUR
                 and DB_ELEMENT_ID = :old.DB_ELEMENT_ID;
               /* Recherche de l'ID du compte modele */
               Select CO_CPTEPLAN_ID Into cpte_model
                 from CO_COMPTE_SOC
                Where DB_ELEMENT_ID = :old.DB_ELEMENT_ID
                  and CO_EXERC_ID = exercice_id
                  and CO_COMPTE_ID = :old.CO_COMPTE_PRIMAIRE_ID;
               /* Mise a jour des montants Debit et Credit lors de l'enregistrement
                  des ecritures initiales */
               if :old.IS_ECRITURE_INITIALE = 1 then
                  Update CO_SOLDE_PERIODIQUE set
                     MONT_DEBIT = MONT_DEBIT - :old.MONTANT_DEBIT,
                     MONT_CREDIT = MONT_CREDIT - :old.MONTANT_CREDIT,
                     MONT_DEV_DEBIT = MONT_DEV_DEBIT - mt_dev_debit_old,
                     MONT_DEV_CREDIT = MONT_DEV_CREDIT - mt_dev_credit_old
      --               MONT_SOLDE = MONT_SOLDE - :old.MONTANT_DEBIT + :old.MONTANT_CREDIT,
      --               MONT_DEV_SOLDE = MONT_DEV_SOLDE - :old.MONTANT_DEV_DEBIT + :old.MONTANT_DEV_CREDIT,
      --               MONT_DEBIT_CUMUL = MONT_DEBIT_CUMUL - :old.MONTANT_DEBIT,
      --               MONT_CREDIT_CUMUL = MONT_CREDIT_CUMUL - :old.MONTANT_CREDIT,
      --               MONT_DEV_DEBIT_CUMUL = MONT_DEV_DEBIT_CUMUL - :old.MONTANT_DEV_DEBIT,
      --               MONT_DEV_CREDIT_CUMUL = MONT_DEV_CREDIT_CUMUL - :old.MONTANT_DEV_CREDIT
                  Where DATE_SOLDE = :old.DATE_VALEUR
                    and CO_COMPTE_ID in (
                   Select CO_COMPTE_ID From CO_COMPTE_SOC
                    Where CO_EXERC_ID = exercice_id
                      and CO_CPTEPLAN_ID in (
                        Select ID From CO_COMPTE_PLAN
                         Start with ID = cpte_model
                         Connect by prior CO_CPTE_TOTALIS_ID=ID));
               else
                /* Mise a jour des montants Debit et Credit lors de l'enregistrement
                  des ecritures initiales */
                Update CO_SOLDE_PERIODIQUE set
                  MONT_DEBIT = MONT_DEBIT - :old.MONTANT_DEBIT,
                  MONT_CREDIT = MONT_CREDIT - :old.MONTANT_CREDIT,
                  MONT_DEV_DEBIT = MONT_DEV_DEBIT - mt_dev_debit_old,
                  MONT_DEV_CREDIT = MONT_DEV_CREDIT - mt_dev_credit_old
                Where DATE_SOLDE = last_day(:old.DATE_VALEUR)
                 and CO_COMPTE_ID in (
                   Select CO_COMPTE_ID From CO_COMPTE_SOC
                    Where CO_EXERC_ID = exercice_id
                      and CO_CPTEPLAN_ID in (
                        Select ID From CO_COMPTE_PLAN
                         Start with ID = cpte_model
                         Connect by prior CO_CPTE_TOTALIS_ID=ID));
               end if;
               /* Mise a jour des cumuls pour les periodes qui suivent la date de valeur
                  et qui se trouvent dans la validite de l'exercice */
               if :old.IS_ECRITURE_INITIALE = 1 then
                Update CO_SOLDE_PERIODIQUE set
                  MONT_SOLDE = MONT_SOLDE - :old.MONTANT_DEBIT + :old.MONTANT_CREDIT,
                  MONT_DEV_SOLDE = MONT_DEV_SOLDE - mt_dev_debit_old + mt_dev_credit_old,
                  MONT_DEBIT_CUMUL = MONT_DEBIT_CUMUL - :old.MONTANT_DEBIT,
                  MONT_CREDIT_CUMUL = MONT_CREDIT_CUMUL - :old.MONTANT_CREDIT,
                  MONT_DEV_DEBIT_CUMUL = MONT_DEV_DEBIT_CUMUL - mt_dev_debit_old,
                  MONT_DEV_CREDIT_CUMUL = MONT_DEV_CREDIT_CUMUL - mt_dev_credit_old
                Where DATE_SOLDE >= :old.DATE_VALEUR
                 and DATE_SOLDE <= periode_fin
                 and CO_COMPTE_ID in (
                   Select CO_COMPTE_ID From CO_COMPTE_SOC
                    Where CO_EXERC_ID = exercice_id
                      and CO_CPTEPLAN_ID in (
                        Select ID From CO_COMPTE_PLAN
                         Start with ID = cpte_model
                         Connect by prior CO_CPTE_TOTALIS_ID=ID));
               else
                Update CO_SOLDE_PERIODIQUE set
                  MONT_SOLDE = MONT_SOLDE - :old.MONTANT_DEBIT + :old.MONTANT_CREDIT,
                  MONT_DEV_SOLDE = MONT_DEV_SOLDE - mt_dev_debit_old + mt_dev_credit_old,
                  MONT_DEBIT_CUMUL = MONT_DEBIT_CUMUL - :old.MONTANT_DEBIT,
                  MONT_CREDIT_CUMUL = MONT_CREDIT_CUMUL - :old.MONTANT_CREDIT,
                  MONT_DEV_DEBIT_CUMUL = MONT_DEV_DEBIT_CUMUL - mt_dev_debit_old,
                  MONT_DEV_CREDIT_CUMUL = MONT_DEV_CREDIT_CUMUL - mt_dev_credit_old
                Where DATE_SOLDE >= last_day(:old.DATE_VALEUR)
                 and DATE_SOLDE <= periode_fin
                 and CO_COMPTE_ID in (
                   Select CO_COMPTE_ID From CO_COMPTE_SOC
                    Where CO_EXERC_ID = exercice_id
                      and CO_CPTEPLAN_ID in (
                        Select ID From CO_COMPTE_PLAN
                         Start with ID = cpte_model
                         Connect by prior CO_CPTE_TOTALIS_ID=ID));
               end if;
               /* Mise a zero des soldes en devise pour les groupes de compte   */
               Update CO_SOLDE_PERIODIQUE set
                  MONT_DEV_DEBIT = 0,
                  MONT_DEV_CREDIT = 0,
                  MONT_DEV_SOLDE = 0,
                  MONT_DEV_DEBIT_CUMUL = 0,
                  MONT_DEV_CREDIT_CUMUL = 0
               Where CO_COMPTE_ID in (
                  Select c.CO_COMPTE_ID from CO_COMPTE_SOC c, CO_COMPTE_PLAN p
                   Where c.CO_CPTEPLAN_ID = p.ID
                     and c.DB_ELEMENT_ID = :old.DB_ELEMENT_ID
                     and c.CO_EXERC_ID = exercice_id
                     and p.CO_TCPTE_CI = 'A-GRP'
                     and p.ID in (Select ID From CO_COMPTE_PLAN
                                  Start with ID = cpte_model
                                  Connect by prior CO_CPTE_TOTALIS_ID=ID));
            end if;
        end if;  /* Fin de la partie Delete */
    exception when others then
        raise_application_error(-20001,'Erreur lors de la mise a jour des soldes, compte id '||:new.CO_COMPTE_PRIMAIRE_ID ||' Verifiez le compte et la date valeur de l''ecriture / ' || SQLERRM);
    END TRG_COECRCPTA_MISAJOUR_SOLDE;
    Dans le trigger de test, j'ai affiché la valeur de :NEW.DATE_VALEUR avec une conversion implicite en VARCHAR2. La valeur retourné était "01-JAN-09".

    Besoin d'autres choses?

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Oui, est-ce que DATE_VALEUR de la table CO_ECRITURE_COMPTA est bien un champ date ?

    Est-ce que ces trois champs ont des heures / minutes / secondes ou bien ce sont des jours - vous pouvez le vérifier si trunc(champ_date) = champ_date ?

    Est-ce que vous êtes certains que votre DB_ELEMENT_ID vaut 5 (comme dans vos requêtes de test) quand votre DATE_VALEUR vaut to_date('01/01/2009','DD/MM/YYYY') ?

    Une remarque au passage, dans le format 'DD-MON-YY' vous vous créez deux problèmes inutiles :
    1- cf. le bug de l'an 2000, il n'y a aucun intérêt à écrire vos années sur deux digits. Aucun aucun aucun !
    2- MON implique que vous êtes dépendant de votre NLS_DATE_LANGUAGE. C'est moins grave que le premier point, mais si vous transposez vos mois en numériques, vous n'avez plus ce problème.

    C'est pour celà qu'il vaut mieux utiliser, quand vous devez convertir des dates en char, le format 'DD/MM/YYYY' (ou YYYYMMDD, l'idée est de rester avec des chiffres qui ne nécessitent pas de traduction).
    Après je ne dis pas que pour de l'applicatif vous ne serez pas amener à utiliser d'autres formats, mais quand vous restez au niveau BDD, pensez-y !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Par défaut
    Alors pour répondra à vos questions :

    1. La description de la table CO_ECRITURE_COMPTA (le champ est en gras-italique)

    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
    SQL> DESC CO_ECRITURE_COMPTA
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     DATE_CREATION                             NOT NULL DATE
     USER_CREATION                             NOT NULL VARCHAR2(40)
     ELEMENT_CREATION                          NOT NULL NUMBER(16)
     DATE_MUTATION                                      DATE
     USER_MUTATION                                      VARCHAR2(40)
     STATUS                                    NOT NULL NUMBER(4)
     DB_ELEMENT_ID                             NOT NULL NUMBER(16)
     NO_CLASS                                           NUMBER(16)
     LEVEL_CLASS                                        NUMBER(16)
     ID                                        NOT NULL NUMBER(16)
     CO_COMPTE_PRIMAIRE_ID                     NOT NULL NUMBER(16)
     CO_JOUNAL_OPERATION_ID                    NOT NULL NUMBER(16)
     CO_CONTREPARTIE_ID                                 NUMBER(16)
     AD_MONNAIE_ID                             NOT NULL NUMBER(16)
     CO_GRPE_STAT_ID                                    NUMBER(16)
     CO_TVA_TIERS_ID                                    NUMBER(16)
     NO_LOT                                             NUMBER(16)
     EST_ENTETE                                NOT NULL NUMBER(1)
     NO_LOT_SUITE                                       NUMBER(16)
     NO_LOT_ASSOCIATION                                 NUMBER(16)
     DATE_VALEUR                                        DATE
     DATE_DOCUMENT                                      DATE
     NO_PIECE                                           VARCHAR2(255)
     LIBELLE                                            VARCHAR2(255)
     UNITE_CHANGE                                       NUMBER(16)
     COURS                                              NUMBER(18,8)
     MONTANT_DEBIT                                      NUMBER(18,8)
     MONTANT_CREDIT                                     NUMBER(18,8)
     MONTANT_DEV_DEBIT                                  NUMBER(18,8)
     MONTANT_DEV_CREDIT                                 NUMBER(18,8)
     MONTANT_VALEUR_ABSOLU                              NUMBER(18,8)
     MONTANT_VALEUR_ABSOLU_DEV                          NUMBER(18,8)
     ECRITURE_CACHEE                                    NUMBER(1)
     CO_CODE_TVA_ID                                     NUMBER(16)
     TAUX_TVA                                           NUMBER(18,8)
     BASE_TVA                                           NUMBER(18,8)
     MONTANT_TVA                                        NUMBER(18,8)
     MONTANT_TVA_DEV                                    NUMBER(18,8)
     RECUPERATION_TVA                                   NUMBER(18,8)
     HORS_TAXE_DEV                                      NUMBER(18,8)
     TTC_DEV                                            NUMBER(18,8)
     DB_ARRONDI_ID                                      NUMBER(16)
     IS_EXECUTE_TRIGGER_SOLDE                  NOT NULL NUMBER(1)
     IS_ECRITURE_INITIALE                      NOT NULL NUMBER(1)
     CLEF_TVA_TVA_CODE_ID                               NUMBER(16)
     CLEF_TVA_TVA_TIERS_ID                              NUMBER(16)
     CLEF_TVA_TAUX                                      NUMBER(6,2)
     MONTANT_TIERS_DEV_DEBIT                            NUMBER(18,8)
     MONTANT_TIERS_DEV_CREDIT                           NUMBER(18,8)
     CO_LETTRAGE_ID                                     NUMBER(16)
     ANALYTIQUE_CLE_REF                                 VARCHAR2(255)
     CO_DECOMPTE_TVA_ENTETE_ID                          NUMBER(16)
    2. Alors ce sont des jours soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SQL> SELECT VALIDE_DU, VALIDE_AU, ID
      2  FROM CO_EXERCICE
      3  WHERE TRUNC(VALIDE_DU) = VALIDE_DU AND
      4        DB_ELEMENT_ID = 5;
     
    VALIDE_DU VALIDE_AU         ID
    --------- --------- ----------
    01-JAN-09 31-DEC-09         56
    01-JAN-07 31-DEC-07         18
    01-JAN-08 31-DEC-08         24
    Les deux anciens exercices proviennent de la base lorsqu'elle était en 9i. Ce problème n'apparait pas en 9i.

    Vos remarques sont pertinentes et ont été prises en compte. L'insertion dans Oracle se fait avec le format 'DD.MM.YYYY' pour éviter les deux problèmes que vos cités.

    Par contre lors de l'installation d'Oracle 10g, j'ai laissé les paramètres par défaut pour le NLS_LANGUE = AMERICAN.AMERICA.WE8ISO8859P15. Le format affiché dans les vues NLS_*_PARAMETERS, de mon premier post, est la valeur par défaut.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    En tout cas votre requête est correcte, vous comparez bien des dates avec des dates (donc pas de soucis de format) et des nombres avec des nombres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select VALIDE_AU, ID Into periode_fin, exercice_id
    from CO_EXERCICE
    Where VALIDE_DU <= :new.DATE_VALEUR
    and VALIDE_AU >= :new.DATE_VALEUR
    and DB_ELEMENT_ID = :new.DB_ELEMENT_ID;
    Si la réponse à la question suivante est OUI, je n'ai plus d'idée
    Est-ce que vous êtes certain que votre DB_ELEMENT_ID vaut 5 (comme dans vos requêtes de test) quand votre DATE_VALEUR vaut to_date('01/01/2009','DD/MM/YYYY') ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Par défaut
    Pour répondre à votre dernière question, malheureusement oui , le DB_ELEMENT_ID représente la société pour laquelle l'exercice existe. Et depuis l'application de PROD, on voit que l'exercice 2009 existe pour la société en question.

    Maintenant, je me pose la question suivante "le langage de programmation que l'on utilise s'appelle Magic et ce dernier n'est pas garantie pour une compatibilité avec Oracle 10g..." Est-ce que cela pourrait être une piste?

    En effet, ce langage utilise un générateur automatique de code SQL pour l'envoie a Oracle, est-il possible que le format de la date reçu par :NEW.DATE_VALEUR soit incorrect?

    Si oui, pourquoi son affichage, dans mon message d'erreur Oracle avec une conversion implicite en VARCHAR2, me retourne une date valide (01-JAN-09) ?

    Merci d'avance pour vos réponses avisés!

  8. #8
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Bonjour,

    pouvez vous nous envoyez le vrai message d'erreur,

    au lieu de l'erreur personnalisé actuelle

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     exception
          when others then
            begin
            dbms_output.put_line('SQLCODE: '||SQLCODE);
             dbms_output.put_line('Message: '||SQLERRM);
           end;
       end;

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 69
    Par défaut
    Là, je commence vraiment à me faire du souci...

    En voulant sortir le message Oracle j'ai relancé le processus et cette foie, il a été jusqu'au bout du traitement...

    J'ai vérifié que la base n'as pas été redémarré depuis mon problème dans l'alert_IDPROD.log et qu'il n'y a pas eu des modification des paramètres de la base.

    Cette fois le traitement est passé avec les commandes suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Select VALIDE_AU, ID Into periode_fin, exercice_id
                from CO_EXERCICE
               Where TO_CHAR(VALIDE_DU,'DD-MON-YY') <= :new.DATE_VALEUR
                 and TO_CHAR(VALIDE_AU,'DD-MON-YY') >= :new.DATE_VALEUR
                 and DB_ELEMENT_ID = :new.DB_ELEMENT_ID;
     
    ou
     
    Select VALIDE_AU, ID Into periode_fin, exercice_id
                from CO_EXERCICE
               Where VALIDE_DU <= :new.DATE_VALEUR
                 and VALIDE_AU >= :new.DATE_VALEUR
                 and DB_ELEMENT_ID = :new.DB_ELEMENT_ID;

    Nos clients ont également eu des problèmes depuis ce matin dans d'autres modules de l'application. Je leur ai donc demandé d'exécuter à nouveau leur manipulation afin de garantir que tout fonctionne normalement. Ce qui a été le cas !????!

    Je crois que des tests en DEV dans tous les sens sont nécessaire pour vérifier si le problème réapparait!!! Car là, je ne comprends vraiment plus...

    Est-ce que qqn a une idée pour permettre de retrouver ce qui a généré ou provoqué cette erreur.

Discussions similaires

  1. Problème avec un trigger...
    Par nasgektw dans le forum Développement
    Réponses: 3
    Dernier message: 28/04/2006, 17h41
  2. [T-SQL] problème avec un trigger
    Par karine77 dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 26/09/2005, 10h45

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