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

PL/SQL Oracle Discussion :

Créer un PL/SQL pour alimenter une table periode


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 39
    Points : 26
    Points
    26
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 281
    Points
    281
    Par défaut Essai de réponse en PlSql
    Bonjour djalil,

    Je vois que personne ne répond alors je me lance.
    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
     
    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

Discussions similaires

  1. connexion Hashtable pour alimenter une Table BD (SQL)
    Par bluerequin dans le forum VB.NET
    Réponses: 1
    Dernier message: 04/06/2009, 10h26
  2. recupérer les info d'une table X pour alimenter une table Y
    Par lemerite dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/09/2008, 11h31
  3. script sql pour recopier une table
    Par sylvain1554 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 04/05/2007, 12h33
  4. Réponses: 3
    Dernier message: 06/01/2007, 17h44
  5. utiliser le quickreport et le sql pour interroger une table
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 7
    Dernier message: 28/07/2005, 08h46

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