Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/01/2012, 07h44   #1
Membre éprouvé
 
Inscription : janvier 2009
Messages : 301
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 301
Points : 454
Points : 454
Par défaut Transformer une requête en vue

Bonjour,

J'ai créé la requête, ci-après, pour être utilisée avec Firebird version 2.1.4. L'objectif est de présenter en colonne l'échéance des factures. Cette affichage doit se faire pour 8 décades. La difficulté principale est de traiter les décades de fin mois qui peuvent être 31/01, 29/02 et 31/03.

Pour cela, je fais l'ajustement dans l'applicatif et transmets par paramètres les valeurs à la requête.

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
WITH w_Enc AS (
  SELECT C.FACT_ID,
    SUM(ECRIT_D_C * ECRIT_VALEUR) AS vEnc
  FROM ENCAISSER C
    LEFT JOIN ECRITURE E ON E.ECRIT_COMPT = 1 AND C.ECRIT_ID = E.ECRIT_ID
  GROUP BY C.FACT_ID
),
w_Solde AS (
  SELECT F.FACT_ID, FACT_TTC - COALESCE(vEnc, 0) AS vSolde
  FROM FACTURE F
    LEFT JOIN w_Enc R ON F.FACT_ID = R.FACT_ID
)
SELECT CLIENT_NUM, CLIENT_CHANT, FACT_NUM, FACT_ECH, FACT_TTC, COMMENT_LIB,
  CASE WHEN FACT_ECH <= :pDate1 THEN vSolde END AS vMont_0,
  CASE WHEN FACT_ECH BETWEEN :pDate1 AND :pDate_01 THEN vSolde END AS vMont_1,
  CASE WHEN FACT_ECH BETWEEN :pDate_01 + 1 AND :pDate_02 THEN vSolde END AS vMont_2,
  CASE WHEN FACT_ECH BETWEEN :pDate_02 + 1 AND :pDate_03 THEN vSolde END AS vMont_3,
  CASE WHEN FACT_ECH BETWEEN :pDate_03 + 1 AND :pDate_04 THEN vSolde END AS vMont_4,
  CASE WHEN FACT_ECH BETWEEN :pDate_04 + 1 AND :pDate_05 THEN vSolde END AS vMont_5,
  CASE WHEN FACT_ECH BETWEEN :pDate_05 + 1 AND :pDate_06 THEN vSolde END AS vMont_6,
  CASE WHEN FACT_ECH BETWEEN :pDate_06 + 1 AND :pDate_07 THEN vSolde END AS vMont_7,
  CASE WHEN FACT_ECH BETWEEN :pDate_07 + 1 AND :pDate_08 THEN vSolde END AS vMont_8
FROM FACTURE F
  INNER JOIN CLIENT C ON F.CLIENT_ID = C.CLIENT_ID
  INNER JOIN w_Solde S ON F.FACT_ID = S.FACT_ID
  LEFT JOIN COMMENT T ON F.FACT_ID = T.FACT_ID
WHERE F.FACT_ARCH = 0 AND vSolde <> 0 AND F.FACT_ECH <= :pDate_08 ORDER BY CLIENT_NUM
Tous ceci fonctionne parfaitement et me donne le résultat souhaité.

Question

Mon interrogation est comment transformer cette requête dans une VUE, car il n'est pas possible de passer les paramètres fin de décade.

La mise en œuvre d'une procédure stockée serait-elle plus appropriée ?

Il n'est pas interdit de modifier ma requête pour lui permettre de la transformer dans une vue.

Je remercie d'avance tous ceux qui pourront m'aider à résoudre ma difficulté.

Editer à 9 h 22
Après réflexion, la solution passe peut être par la création d'une table qui enregistrerait les dates de fin de décade.

Merci pour les conseils que vous pouvez me donner vers cette piste ou tout autre.
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 15h18   #2
Membre éprouvé
 
Inscription : janvier 2009
Messages : 301
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 301
Points : 454
Points : 454
Bonjour,

@Cinephil

Il me semble dommage d'avoir déplacé ma discussion de la section SGBD -SQL vers Firebird.

Ma difficulté n'est pas créer une vue, mais de voir comment rédiger la requête autrement pour qu'elle puisse être transformée en vue. Tout cela en SQL standard.

La précision d'utilisation de Firebird était simplement pour éviter d'obtenir une réponse avec des instructions qui ne sont pas présentent dans le serveur employé. Exemple 'decade' qui existe dans PostgreSQL, mais pas dans Firebird

Il serait bien de la replacer dans la section SGBD - SQL

Pour compléter ma demande, est-il possible de présenter la requête d'une manière différente pour qu'elle puisse être transformée en une vue

D'avance merci
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 18h39   #3
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
decade dans postgresql c'est
Citation:
The year field divided by 10
et toi ta définition d'une décade c'est quoi exactement ?
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 21h59   #4
Membre éprouvé
 
Inscription : janvier 2009
Messages : 301
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 301
Points : 454
Points : 454
Bonjour,

@makowski

Merci de vous intéresser à ma demande.

Effectivement, la notion de décade peut avoir plusieurs interprétations. Pour moi, il s'agit de la décade habituellement utilisée dans le monde de la finance.

Dans cette approche, chaque mois comporte 3 décades qui vont du 1 au 10 du mois (1ère décade), du 11 au 20 du mois (2ème décade) et du 21 à la fin du mois (3ème décade).

Or, cette troisième décade est variable suivant le mois. En janvier 2012, elle aura 11 jours, en février 2012, elle sera de 9 jours alors qu'elle était de 8 jours pour février 2011.

Je n'ai pas réussi à trouver une méthode pour assurer un découpage conforme à la décade financière. C'est pour cette raison que j'ai écrit la requête présentée dans mon précédent message.

Elle répond à mes attentes, mais j'aurai préféré, pour des raisons internes à l'entreprise, pourvoir transformer cette requête en vue. Maintenant, si cela n'est pas possible, nous resterons en l'état.

Je peux également envisager une procédure stockée. Mais je ne mesure pas les avantages et inconvénients par à une vue.

J'aimerais bien obtenir un ou deux avis pour me fixer dans mon choix définitif. Peut-être que je me complique la vie pour rien.

D'avance merci à ceux qui sont en mesure de m'aider.
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 14h27   #5
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
pour avoir la decade d'une date (numéroté de 1 à 3) :

Code :
SELECT MINVALUE((((EXTRACT(DAY FROM DATE '31.01.2012')-1)/10)+1),3)  FROM RDB$DATABASE
pour avoir la decade d'une date (numéroté de 1 à 36)

Code :
SELECT MINVALUE((((EXTRACT(DAY FROM DATE '31.12.2012')-1)/10)+1),3)+(3*(EXTRACT(MONTH FROM DATE '31.12.2012')-1)) FROM RDB$DATABASE
donc juste avec une date, on peut avoir sa décade

du coup, tu dois pouvoir réécrire ta requête
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 07h37   #6
Membre éprouvé
 
Inscription : janvier 2009
Messages : 301
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 301
Points : 454
Points : 454
Bonjour,

@makowski

Je te remercie pour les modèles qui vont me permettre de transformer mes dates en décade.

Je vais revoir ma requête en conséquence, je présenterai le résultat après réalisation.

Hier matin, en me rasant "Certains pensent à devenir président de la république d'autres réfléchissent comme modifier une requête SQL. A chacun son centre d'intérêt", je m'étais dit qu'il fallait passer EXTRACT. Étant absent, je n'avais rien vérifier. Hier soir, j'ai découvert ta réponse.

Encore merci
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2012, 14h07   #7
Membre éprouvé
 
Inscription : janvier 2009
Messages : 301
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 301
Points : 454
Points : 454
Bonjour,

Je considère ce problème comme résolu pour l'instant.

J'ai actuellement une requête qui fonctionne parfaitement. Je n'ai donc pas fait de transformation en vue.

Je reprendrai ce point plus tard, lorsque le développement en cours sera terminé. Si j'ai besoin d'aide je reviendrai

Merci à tous ceux qui m'ont aidé.

A+
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h49.


 
 
 
 
Partenaires

Hébergement Web