Bonjour,

Voici une procédure stockée que j'aimerai modifier : j'aimerai ajouter un catch pour gérer l'absence de résultats pour setter des valeurs manuellement concernant cette section :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
 -- Vérification de l'existence du client
        SELECT COUNT(*) INTO n_enreg
          FROM finalclients
         WHERE client_id_pms = c1_resa_num_client_pms;
 
        -- Si le client existe on CONTINUE
        IF n_enreg > 0 THEN ==> j'aimerai gérer le où on ne trouve pas d'enregistrement
Voici le code global

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
 
BLOCK1: BEGIN
    DECLARE c1_resa_num_pms VARCHAR(32);
    DECLARE c1_room VARCHAR(32);
    DECLARE c1_resa_num_client_pms VARCHAR(32);
    DECLARE c2_date_nuitee VARCHAR(32);
    DECLARE c2_depart VARCHAR(32);
    DECLARE c2_resa_montant VARCHAR(32);
    DECLARE n_enreg INT;
    DECLARE resaClientId INT;
    DECLARE resaMontantTotal INT;
    DECLARE resaDateMeilleureNuitee VARCHAR(32);
    DECLARE resaMeilleureNuiteeMontant INT;
    DECLARE resaDateArrivee VARCHAR(32);
    DECLARE resaDateDepart VARCHAR(32);
    DECLARE resaNbNuitee INT;
    DECLARE resaPMS VARCHAR(32);
    DECLARE resaBlocDirecteur INT;
    DECLARE clientOptinPS INT;
    DECLARE clientOptinPromo INT;
    DECLARE b_First BOOLEAN;
    DECLARE dateDuJour VARCHAR(32);
    DECLARE resaOutilPms VARCHAR(32) DEFAULT("FIDELIO");
    DECLARE resaHotel VARCHAR(32);
    DECLARE resaDate VARCHAR(32);
    DECLARE resaStatus VARCHAR(32);
    DECLARE resaPeriode VARCHAR(32) DEFAULT 'Indefini';
    DECLARE resaSource VARCHAR(255);
    DECLARE resaDiscrimiant_r VARCHAR(255);
    DECLARE resaDateUpdate VARCHAR(255);
    DECLARE resaNbAdults INT;
    DECLARE resaNbChilds INT;
    DECLARE resaRateCode VARCHAR(32);
    DECLARE resaStatutChambre INT;
    DECLARE resaRoomRevenue INT;
    DECLARE resaOherRevenue INT;
    DECLARE resaFoodRevenue INT;
    DECLARE resaTotalRevenue INT;
    DECLARE resaTotalRoomTax INT;
    DECLARE resaTotalOtherTax INT;
    DECLARE resaTotalTax INT;
    DECLARE resaDateFlag VARCHAR(32);
    DECLARE resaLock INT;
    DECLARE diffDepart INT;
    DECLARE diffArrivee INT;
 
 
    DECLARE compteur1 INT DEFAULT 0;
    DECLARE compteur2 INT DEFAULT 0;
    DECLARE compteur2_total INT DEFAULT 0;
 
    DECLARE no_more_rows1 BOOLEAN DEFAULT FALSE;
 
    -- Curseur qui regroupe toutes les réservations de la table temporaire
    DECLARE curseur1 CURSOR FOR
    SELECT resa_num_pms, room, resa_num_client_pms
      FROM fidelioresaslivelocal
    GROUP BY resa_num_pms, room, resa_num_client_pms;
 
    DECLARE CONTINUE handler FOR NOT FOUND SET no_more_rows1 = TRUE;
 
    -- Parcours du 1er curseur (réservations)
    OPEN curseur1;
    LOOP1: LOOP
        FETCH curseur1 INTO c1_resa_num_pms, c1_room, c1_resa_num_client_pms;
        IF no_more_rows1 THEN
            CLOSE curseur1;
            LEAVE LOOP1;
        END IF;
        SET compteur1 = compteur1 + 1;
 
        -- Initialisation des variables
        SET compteur2 = 0;
        SET resaClientId = NULL;
        SET b_First = TRUE;
        SET resaDateArrivee = NULL;
        SET resaDateDepart = NULL;
        SET resaNbNuitee = 0;
        SET resaMontantTotal = 0;
        SET resaDateMeilleureNuitee = NULL;
        SET resaMeilleureNuiteeMontant = 0;
 
        -- Vérification de l'existence du client
        SELECT COUNT(*) INTO n_enreg
          FROM finalclients
         WHERE client_id_pms = c1_resa_num_client_pms;
 
        -- Si le client existe on CONTINUE
        IF n_enreg > 0 THEN
            -- Parcours du 2nd curseur (lignes d'une réservation)
            BLOCK2: BEGIN
                DECLARE no_more_rows2 BOOLEAN DEFAULT FALSE;
 
                -- Curseur qui concerne toutes les lignes d'une même réservation
                DECLARE curseur2 CURSOR FOR
                SELECT date_nuitee, depart, resa_montant, 'FIDELIO', discriminant_r, resa_date, resa_source, resa_statut, discriminant_r, date_update_resa, nb_adults, 
                       nb_children, rate_code, statut_resa_chambre, room_revenue, other_revenue, food_revenue, total_revenue, total_room_tax, total_other_tax, total_tax
                  FROM fidelioresaslivelocal
                 WHERE resa_num_pms = c1_resa_num_pms
                ORDER BY date_nuitee ASC;
 
                DECLARE CONTINUE handler FOR NOT FOUND SET no_more_rows2 = TRUE;
 
                OPEN curseur2;
                LOOP2: LOOP
 
                    FETCH curseur2 INTO c2_date_nuitee, c2_depart, c2_resa_montant, resaOutilPms, resaHotel, resaDate, resaSource, resaStatus, resaDiscrimiant_r,
                    resaDateUpdate, resaNbAdults, resaNbChilds, resaRateCode, resaStatutChambre, resaRoomRevenue, resaOherRevenue, resaFoodRevenue, resaTotalRevenue,
                    resaTotalRoomTax, resaTotalOtherTax, resaTotalTax;
 
                    IF no_more_rows2 THEN
                        CLOSE curseur2;
                        LEAVE LOOP2;
                    END IF;
                    SET compteur2 = compteur2 + 1;
                    SET compteur2_total = compteur2_total + 1;
 
                    -- Si c'est le premier enregistrement il s'agit de la première nuit
                    IF b_First THEN
                        SET resaDateArrivee = c2_date_nuitee;
                        SET b_First = FALSE;
                    END IF;
 
                    IF IFNULL(c2_depart, 'N') = 'Y' THEN
                        -- Date de départ
                        SET resaDateDepart = c2_date_nuitee;
                    ELSE
                        -- Nombre de nuitées
                        SET resaNbNuitee = resaNbNuitee + 1;
 
                        -- Montant total
                        SET resaMontantTotal = resaMontantTotal + c2_resa_montant;
 
                        -- Meilleure nuitée
                        IF c2_resa_montant > resaMeilleureNuiteeMontant THEN
                            SET resaDateMeilleureNuitee = c2_date_nuitee;
                            SET resaMeilleureNuiteeMontant = c2_resa_montant;
                        END IF;
 
                        -- Resa Statut
                        IF (TO_DAYS(resaDateArrivee) - TO_DAYS(NOW()) > 0) THEN
                            SET resaPeriode = 'Client attendu';
                        ELSE
                            IF(TO_DAYS(resaDateDepart) - TO_DAYS(NOW()) >= 0) THEN
                                SET resaPeriode = 'Client present';
                            ELSE
                                SET resaPeriode = 'Client parti';
                            END IF;
                        END IF;
                    END IF;
                END LOOP LOOP2;
            END BLOCK2;
 
            -- Vérification de l'existence de l'enregistrement dans la table finale
            SELECT COUNT(*) INTO n_enreg
              FROM finalresas
             WHERE resa_num_pms = c1_resa_num_pms
               AND room = c1_room
               AND resa_num_client_pms = c1_resa_num_client_pms;
 
            -- Récupération des infos du client
            SELECT DISTINCT IFNULL(client_id,0) AS client_id, IFNULL(optin_post_sejour, 1) AS optin_post_sejour, IFNULL(optin_email_promo, 1) AS optin_email_promo INTO resaClientId, clientOptinPS, clientOptinPromo
              FROM finalclients
             WHERE client_id_pms = c1_resa_num_client_pms;
 
            -- Si l'enregistrement existe on met à jour, sinon on insère...
            IF n_enreg > 0 THEN
                UPDATE finalresas
                   SET resa_client_id = resaClientId,
                       resa_montant_total = resaMontantTotal,
                       resa_nb_nuitee = resaNbNuitee,
                       date_meilleure_nuitee = resaDateMeilleureNuitee,
                       resa_meilleure_nuitee_montant = resaMeilleureNuiteeMontant,
                       resa_date_arrivee = resaDateArrivee,
                       resa_date_depart = resaDateDepart,
                       resa_bloc_directeur = IF(((clientOptinPS = 0) && (clientOptinPromo = 0)), 1, 0),
                       resa_vip = IF((resaMeilleureNuiteeMontant >= get_seuil_vip_fidelio()), 1,0),
                       resa_outil_pms = resaOutilPms,
                       resa_hotel = resaHotel,
                       resa_date = resaDate,
                       resa_statut = resaStatus,
                       resa_periode = resaPeriode,
                       resa_source = resaSource,
                       discriminant_r = resaDiscrimiant_r,
                       date_update_resa = resaDateUpdate,
                       nb_adults = resaNbAdults,
                       nb_children = resaNbChilds,
                       rate_code = resaRateCode,
                       statut_resa_chambre = resaStatutChambre,
                       room_revenue = resaRoomRevenue,
                       other_revenue = resaOherRevenue,
                       food_revenue = resaFoodRevenue,
                       total_revenue = resaTotalRevenue,
                       total_room_tax = resaTotalRoomTax,
                       total_other_tax = resaTotalOtherTax,
                       total_tax = resaTotalTax,
                       date_flag = NOW()
 
                 WHERE resa_num_pms = c1_resa_num_pms
                   AND room = c1_room
                   AND resa_num_client_pms = c1_resa_num_client_pms;
            ELSE
                INSERT INTO finalresas (resa_id, resa_num_pms, room, resa_num_client_pms, resa_client_id,
                                        resa_montant_total,
                                        resa_nb_nuitee, date_meilleure_nuitee, resa_meilleure_nuitee_montant,
                                        resa_date_arrivee, resa_date_depart,
                                        resa_bloc_directeur, resa_vip, resa_outil_pms, resa_hotel, resa_date, resa_statut, resa_periode, resa_source, discriminant_r, date_update_resa, nb_adults,
                                        nb_children, rate_code, statut_resa_chambre, room_revenue, other_revenue, food_revenue, total_revenue, total_room_tax, total_other_tax, total_tax, date_flag, resa_lock)
                                VALUES (null, c1_resa_num_pms, c1_room, c1_resa_num_client_pms, resaClientId,
                                        resaMontantTotal,
                                        resaNbNuitee, resaDateMeilleureNuitee, resaMeilleureNuiteeMontant,
                                        resaDateArrivee, resaDateDepart,
                                        IF(((clientOptinPS = 0) && (clientOptinPromo = 0)), 1, 0), IF((resaMeilleureNuiteeMontant >= get_seuil_vip_fidelio()), 1,0), resaOutilPms, resaHotel, resaDate, resaStatus, resaPeriode, resaSource,
                                         resaDiscrimiant_r, resaDateUpdate, resaNbAdults, resaNbChilds, resaRateCode, resaStatutChambre, resaRoomRevenue, resaOherRevenue, resaFoodRevenue, resaTotalRevenue,
                                         resaTotalRoomTax, resaTotalOtherTax, resaTotalTax, NOW(), 0);
            END IF;
        END IF;
    END LOOP LOOP1;
END BLOCK1
D'avance merci pour votre aide