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 :

Comparaison des lignes dans un Curser


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Par défaut Comparaison des lignes dans un Curser
    Salut à tous
    voici ma table
    CREATE TABLE SIHO_DEMANDE_BLOC
    (
    SIHO_COD_ETAB VARCHAR2(10 BYTE) NOT NULL,
    SIHO_ANN_DEM_BLOC NUMBER(4) NOT NULL,
    SIHO_NUM_DEM_BLOC NUMBER(10) NOT NULL,
    SIHO_ANN_ADM NUMBER(4) NOT NULL,
    SIHO_NUM_ADM NUMBER(10) NOT NULL,
    SIHO_COD_SERVICE VARCHAR2(10 BYTE) NOT NULL,
    SIHO_CODE_BLOC VARCHAR2(10 BYTE) NOT NULL,
    SIHO_MAT_MED VARCHAR2(10 BYTE) NOT NULL,
    SIHO_ANN_PRES_BLOC NUMBER(4),
    SIHO_NUM_PRES_BLOC NUMBER(5),
    SIHO_DATE_DEM_BLOC DATE,
    SIHO_NAT_DEM_BLOC VARCHAR2(1 BYTE),
    SIHO_OBS_DEM_BLOC VARCHAR2(1000 BYTE),
    SIHO_TECH_CH VARCHAR2(1000 BYTE),
    SIHO_BESOINS VARCHAR2(1000 BYTE),
    SIHO_DATE_PINT_BLOC DATE,
    SIHO_HEURE_PINT_BLOC DATE,
    SIHO_ETAT_DEM_BLOC CHAR(1 BYTE),
    SIHO_DUREE_HPINT_BLOC NUMBER(3),
    SIHO_DUREE_MPINT_BLOC NUMBER(3)
    )

    les dates et l'heure à comparer sont SIHO_DATE_PINT_BLOC et SIHO_HEURE_PINT_BLOC donc si SIHO_DATE_PINT_BLOC n =SIHO_DATE_PINT_BLOC n+1 et SIHO_HEURE_PINT_BLOC n=SIHO_HEURE_PINT_BLOC n+1 alors SIHO_HEURE_PINT_BLOC n+1=SIHO_HEURE_PINT_BLOC n+1 + SIHO_DUREE_HPINT_BLOC n + SIHO_DUREE_MPINT_BLOC n
    sinon affiche la date n
    repete l'algo
    c'est un peu cela ma difficulté
    je travaille avec forms 9i
    Merci de vos conseils A++++

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Utilises des variables.
    Sinon, tu peux peut être coder ça avec des fonctions analytiques, mais l'algo décrit n'est pas assez précis pour que je te dise si c'est possible.

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    avec des fonctions analytiques, ça ne me parait pas simple, je pense que la clause MODEL serait plus appropriée.

    Ex:
    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
     
    create table t as (
      select date '2000-01-01' d, 12 h from dual union all
      select date '2000-01-01' d, 12 from dual union all
      select date '2000-01-02' d, 12 from dual union all
      select date '2000-01-03' d, 22 from dual union all
      select date '2000-01-03' d, 22 from dual union all
      select date '2000-01-03' d, 22 from dual union all
      select date '2000-01-04' d, 12 from dual union all
      select date '2000-01-04' d, 12 from dual union all
      select date '2000-01-04' d, 13 from dual);
     
    select d, h
    from (select * from t order by d,h)
    model
    dimension by (rownum r)
    measures (d, h)
    rules (
    h[r]=case when d[cv()-1]+h[cv()-1]/24>=d[cv()]+h[cv()]/24 then mod(h[cv()-1]+1,24) else h[cv()] end,
    d[r]=case when d[cv()-1]+h[cv()-1]/24>=d[cv()]+h[cv()]/24 then d[cv()-1]+trunc((h[cv()-1]+1)/24) else d[cv()] end
    )
    order by r;
     
    D            H
    ---------- ---
    2000-01-01  12
    2000-01-01  13
    2000-02-01  12
    2000-03-01  22
    2000-03-01  23
    2000-04-01  00
    2000-04-01  12
    2000-04-01  13
    2000-04-01  14
    si tu as un curseur pl/sql, alors c'est tout simple, non?

    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
     
    declare d date; h number;
    begin 
      for f in (select * from t order by d,h) loop 
        if (d+h/24>=f.d+f.h/24) 
    	then 
    	  d:=d+trunc((h+1)/24);
    	  h:=mod(h+1,24); 
    	else 
    	  d:=f.d;h:=f.h; 
    	end if;
    	dbms_output.put_line(d||' '||h); 
      end loop;
    end;
    /

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Par défaut
    salut,Laurent est ce que je peux avoir des docs pour comprendre
    ta requéte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT d, h
    FROM (SELECT * FROM t ORDER BY d,h)
    model
    dimension BY (rownum r)
    measures (d, h)
    rules (
    h[r]=case when d[cv()-1]+h[cv()-1]/24>=d[cv()]+h[cv()]/24 then mod(h[cv()-1]+1,24) else h[cv()] end,
    d[r]=case when d[cv()-1]+h[cv()-1]/24>=d[cv()]+h[cv()]/24 then d[cv()-1]+trunc((h[cv()-1]+1)/24) else d[cv()] end
    )
    ORDER BY r;

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    fait une petite recherche sur MODEL et tu trouveras quelques exemples

    http://download-uk.oracle.com/docs/c...2.htm#i2171160

  6. #6
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Je crois que cette seule clause meriterait un article à elle seule...

  7. #7
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Par défaut
    Un grand Merci Laurent

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Avec les fonctions analytiques (MODEL marche pas pour ma base 9)
    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
    WITH t AS (
      SELECT DATE '2000-01-01' d, 12 h FROM dual UNION ALL
      SELECT DATE '2000-01-01' d, 12 FROM dual UNION ALL
      SELECT DATE '2000-01-02' d, 12 FROM dual UNION ALL
      SELECT DATE '2000-01-03' d, 22 FROM dual UNION ALL
      SELECT DATE '2000-01-03' d, 22 FROM dual UNION ALL
      SELECT DATE '2000-01-03' d, 22 FROM dual UNION ALL
      SELECT DATE '2000-01-04' d, 12 FROM dual UNION ALL
      SELECT DATE '2000-01-04' d, 12 FROM dual UNION ALL
      SELECT DATE '2000-01-04' d, 13 FROM dual)
    	SELECT d, h, TRUNC(d + h2 / 24) AS d3, TO_NUMBER(TO_CHAR(d + h2/24, 'HH24')) AS h3
    	FROM
    	(
    	SELECT d, h,
    			NVL(lag(h, 1) over (PARTITION BY d, h ORDER BY d, h) 
    			+ ROW_NUMBER() over ( PARTITION BY d, h ORDER BY d, h) - 1,
    			h) AS h2
    	FROM t 
    	ORDER BY d,h
    	)
    D H D3 H3
    01/01/2000 12 01/01/2000 12
    01/01/2000 12 01/01/2000 13
    02/01/2000 12 02/01/2000 12
    03/01/2000 22 03/01/2000 22
    03/01/2000 22 03/01/2000 23
    03/01/2000 22 04/01/2000 0
    04/01/2000 12 04/01/2000 12
    04/01/2000 12 04/01/2000 13
    04/01/2000 13 04/01/2000 13

  9. #9
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    McM, dans ton exemple tu as deux fois

    04/01/2000 13

Discussions similaires

  1. Insérer des lignes dans une StringGrid
    Par da_latifa dans le forum Composants VCL
    Réponses: 1
    Dernier message: 26/09/2005, 12h45
  2. Réponses: 14
    Dernier message: 22/09/2005, 16h49
  3. Ajout/Suppression dynamique des lignes dans une table
    Par codexomega dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/08/2005, 18h50
  4. [C#] Affichage des lignes dans un tableau.
    Par maldufleur dans le forum ASP.NET
    Réponses: 4
    Dernier message: 21/04/2004, 11h28
  5. Couleur des lignes dans DBGrid
    Par eddie dans le forum C++Builder
    Réponses: 5
    Dernier message: 21/06/2002, 18h15

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