Créer un PL/SQL pour alimenter une table periode
Bonjour
j'utilise oracle 9i ,J'ai une table periode qui a le structure suivante
periode(PERIOD_COD, PERIOD_LIB,PERIOD_NUM, ANN_COD, DEB_PERIOD, END_PERIOD)
Que j'alimente avec une procedure pl/sql le script est ci-dessous
La periode doit suivre la logique 5-4-4 (semaines) et la premiere periode doit commencer le 1 december.
mon script me permet d'avoir cette logique mais ne me permet pas de commencer tjs la periode de l'année d'après le 1 decembre. du coup je veux faire un pl/sql qui fait ça.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| SELECT
case when mod(rownum-1,12)+1 <10 then
trunc((rownum-1)/12)+ to_number(to_char(date '2007-12-01','YYYY'))||0||cast(mod(rownum-1,12)+1 as varchar(2))
else
trunc((rownum-1)/12)+ to_number(to_char(date '2007-12-01','YYYY'))||cast(mod(rownum-1,12)+1 as varchar(2))
end period_COD,
'P'||cast(mod(rownum-1,12)+1 as varchar(2)) as period_lib,
mod(rownum-1,12)+1 as PERIOD_NUM,
trunc((rownum-1)/12)+ to_number(to_char(date '2007-12-01','YYYY')) as fiscal_year,
date '2007-12-01' + trunc((rownum+1)*13/3)*7 -56 deb_period,
date '2007-12-01' + trunc((rownum+2)*13/3)*7 -57 end_period,
CURRENT_DATE as date_cre,CURRENT_DATE as date_MAJ
FROM dual
connect BY level<43 |
merci pour vos réponse
Essai de réponse en PlSql
Bonjour djalil,
Je vois que personne ne répond alors je me lance.
Code:
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
|
Declare
-- Variables de travail
ln_cpt_ligne Number; -- Compteur de lignes
ln_cpt_lig_annee Number; -- Compteur de ligne pour l'année
ld_dat_debut Date; -- Date de début de période
ld_dat_fin Date; -- Date de fin de période
ln_annee Number; -- Année fiscale
-- Variables pour la table
PERIOD_COD Varchar2(6);
PERIOD_LIB Varchar2(3);
PERIOD_NUM Number;
ANN_COD Varchar2(4);
DEB_PERIOD Date;
END_PERIOD Date;
Begin
-- Initialisation
ld_dat_debut := to_date('01/12/2007', 'DD/MM/YYYY');
ln_annee := to_number(to_char(ld_dat_debut, 'YYYY'));
--
For ln_cpt_ligne In 1 .. 42 Loop
-- Changement d'année fiscale tous les 12 mois
If Mod(ln_cpt_ligne - 1, 12) = 0 Then
ln_annee := to_number(to_char(ld_dat_debut, 'YYYY'));
ld_dat_debut := to_date('01/12/' || to_char(ln_annee), 'DD/MM/YYYY');
ln_cpt_lig_annee := 1;
End If;
-- Changement du nombre de semaines à ajouter selon la séquence 5-4-4
If Mod(ln_cpt_ligne, 3) = 1 Then
ld_dat_fin := ld_dat_debut + 34;
Else
ld_dat_fin := ld_dat_debut + 27;
End If;
-- Valorisation des colonnes
PERIOD_COD := to_char(ln_annee) || to_char(ln_cpt_lig_annee, 'FM00');
PERIOD_LIB := 'P' || to_char(ln_cpt_lig_annee);
PERIOD_NUM := ln_cpt_lig_annee;
ANN_COD := to_char(ln_annee);
DEB_PERIOD := ld_dat_debut;
END_PERIOD := ld_dat_fin;
-- Affichage de contrôle
dbms_output.put_line(PERIOD_COD || ' ' ||
PERIOD_LIB || ' ' ||
to_char(PERIOD_NUM) || ' ' ||
ANN_COD || ' ' ||
to_char(DEB_PERIOD, 'DD/MM/YYYY') || ' ' ||
to_char(END_PERIOD, 'DD/MM/YYYY'));
--
ld_dat_debut := ld_dat_fin + 1;
ln_cpt_lig_annee := ln_cpt_lig_annee + 1;
End Loop;
End;
/ |
Le coup du level sur la table Dual je ne connaissais pas c'est épatant.
A+
Pozzy