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

Bases de données Delphi Discussion :

[delphi 7] [firebird] Cube de décision.


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 125
    Points : 78
    Points
    78
    Par défaut [delphi 7] [firebird] Cube de décision.
    Bonjour,
    Je cherche un moyen d'afficher des statistiques de vente.
    J'arrive à calculer des statistiques simples (SUM).
    Mon problème c'est pour calculer des statistiques plus en détail: ventes par mois.
    Je pensais utiliser un decisioncube mais ça me semble être une usine à gaz et j'ai toujours le même message d'erreur auquel je n e comprends strictement rien: "la capacité du cube de décision est faible. Désactiver des dimensions ou modifier le dataset"
    Auriez vous une autre idée à me soumettre ou des conseils sur l'utilisation du decisioncube
    D'avance merci

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Citation Envoyé par MickSou Voir le message
    Mon problème c'est pour calculer des statistiques plus en détail: ventes par mois.
    Par forcement nécessaire de passer par un DecisionCube (que je connais pas ou très mal).

    Un simple regroupement dans ta requête est peut être suffisant.
    Par exemple:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
      EXTRACT(MONTH FROM CHAMP_DATE) AS MOIS, SUM(QTE) TOTAL
    FROM 
      MA_TABLE
    GROUP BY
      1;

    A adapter à tes données, bien sûr.

    @+ Claudius.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 125
    Points : 78
    Points
    78
    Par défaut
    Salut Claudius,
    Merci pour ton aide. j'ai fait le extract du mois sur la date effectivement mais je me retrouve avec des lignes genre
    "PRODUIT A JUIN 15
    PRODUIT A JUILLET 20"....
    Pour l’affichage dans un DBgrid ça va pas être génial. A moins d'utiliser un dbgrid pour chaque mois de l'année?

    Moi j'espérais avoir un tableau avec sur chaque ligne un nom de produit, sur chaque colonne un mois de l'année et les valeurs dans le tableau...
    Je me sens un peu perdu sans ce decisioncube...

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Oui effectivement une requête de ce type ne sera pas suffisante.
    Malheureusement DecisionCube et moi, cela fait deux.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 125
    Points : 78
    Points
    78
    Par défaut
    A l'impossible nul n'est tenu....


    Menfin moi j'ai fait sécher Claudius quand même!
    Y'en a pas beaucoup qui ont du y arriver

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Moi aussi 'décision cube + moi = 2'
    avec
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    WITH  A  AS (SELECT
      PRODUIT,EXTRACT(MONTH FROM CHAMP_DATE) AS MOIS, SUM(QTE) TOTAL
    FROM 
      MA_TABLE
    GROUP BY 1,2) 
     
    SELECT PRODUIT,LIST(TOTAL) FROM A GROUP BY 1

    ça le fait presque .
    Reste 'seulement' deux problèmes' a résoudre
    - l'affichage ne peu plus être un dbgrid à cause du list
    -il faut gérer les mois sans , mais y a la réponse quelque part dans le forum Firebird
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par MickSou Voir le message
    ....
    Moi j'espérais avoir un tableau avec sur chaque ligne un nom de produit, sur chaque colonne un mois de l'année et les valeurs dans le tableau...
    Je me sens un peu perdu sans ce decisioncube...
    Salut,

    Pourquoi ne pas utiliser un StringGrid, je fais excatement la même chose et avecun StringGrid ta pas de limite de présentation, dans le sens que tu veux.

    1) tu fait la requete proposé par claudius
    2) tu l'affiche dans ton sting grid.

    a+

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 125
    Points : 78
    Points
    78
    Par défaut
    Merci pour ces propositions.

    Sergio: je parle pas encore le SQL très très bien alors "list", "with", tout ça je vais fouiller pour voir ce que c'est!!

    Buzzl'eclair: StringGrid jamais encore utilisé... C'est Grizzly qui a développé ça je crois? peux tu me faire une petite présentation rapide.

    Ma solution que j'ai réfléchi cette nuit: créer une vue de la table du type

    PRODUIT SUMJUIN SUMJUILLET SUMAOUT SUMSEPTEMBRE

    et balancer cette vue dans le DBgrid. Qu'en pensez vous?
    Merci

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    WITH et LIST ne sont valable que depuis firebird 2.5

    DBGrid est un descendant de TStringGrid la seule 'difficulté' est de le remplir a la main

    une autre piste
    une requete avec cte (une table par mois) et jointure

    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
    WITH  
    JANVIER  AS (SELECT  PRODUIT, SUM(QTE) AS TOTAL FROM 
      MA_TABLE WHERE EXTRACT(MONTH FROM CHAMP_DATE)=1 
    GROUP BY 1),
    FEVRIER  AS (SELECT  PRODUIT, SUM(QTE) AS TOTAL FROM 
      MA_TABLE WHERE EXTRACT(MONTH FROM CHAMP_DATE)=2 
    GROUP BY 1),
    MARS  AS (SELECT  PRODUIT, SUM(QTE) AS TOTAL FROM 
      MA_TABLE WHERE EXTRACT(MONTH FROM CHAMP_DATE)=3 
    GROUP BY 1)
    etc....
     
    SELECT PRODUIT,COALESCE(JANVIER.TOTAL,0),COALESCE(FEVRIER.TOTAL,0),COALESCE(MARS.TOTAL,0) etc....
    FROM TABLE_PRODUIT 
    LEFT JOIN JANVIER ON JANVIER.PRODUIT=PRODUIT
    LEFT JOIN FEVRIER ON FEVRIER.PRODUIT=PRODUIT
    LEFT JOIN MARS ON MARS.PRODUIT=PRODUIT
    etc...
    ca doit marcher , mais je ne garanti rien , j'ai fais un test sur un fichier énorme 4 année de ventes 2000 à 3000 ref , donc temps très long
    je préfère nettement le LIST
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 125
    Points : 78
    Points
    78
    Par défaut
    Firebird 2.0 chez moi il va falloir que je demande le nouveau au père Noël!!
    Merci quand même Sergio!

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Le passage de 2.0 a 2.5 est un jeu d'enfant et le père noël ne se ruinera pas
    [Edit] de plus c'etait à partir de 2.1 pas 2.5 (mea culpa)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 125
    Points : 78
    Points
    78
    Par défaut
    Sauf que le père Noël devra avoir de la patience car le passage d'une appli développée avec les IBX de Firebird 2.0 vers 2.5 en nécessitera sûrement
    La prochaine appli sera la bonne, promis!

  13. #13
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut MickSou,

    Comme le dit mon ami @Sergio, le DbGrid est un descendant d'un TStringGrid (le TStringGrid est un composant delphi standard).
    Une différence entre les deux c'est que le DBGrid est liable à un DataSet ce qui n'est pas le cas d'un TStringGrid (enfin cela pourrais être discuter).

    Ce que je te propose, puisque tes requetes sont difficillement attachable à un DBGrid, le mieux c'est donc de remplir à la main le TStringGrid, je te rassures rien de bien compliqué.

    1) Tu fais ta requete
    2) Tu parcours ta requete
    3) Pour chaque ligne tu rempli ton TStringGrid (et là tu fais comme bon te semble

    Exemple (attention cele me conviens à moi)
    Ici je fais des stats, en ligne j'ai des ressources, en colonne j'ai des rubriques et je calcule le nbr d'heures par rubrique pour chaque ressource.
    Mon calcul prévoi aussi un calcul par jour / semaine / Mois / Année.

    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
     case sComboBoxPeriode.ItemIndex of
      0: // semaine
      begin
    {$REGION Par Semaine}
        With FData.QryMaTable Do
        Begin
          Try
            Try
              SQL.Clear;
              SQL.Add('SELECT MaTable.DateDebut, MaTable.DateFin, ');
              SQL.Add('MaTable.RepereHeureDebut, MaTable.RepereHeureFin, ');
              SQL.Add('Categorie.Libelle, MaTable.CodeRessource ');
              SQL.Add('FROM Ressource INNER JOIN (Categorie INNER JOIN MaTable ON Categorie.Code = MaTable.CodeCategorie) ');
              SQL.Add('ON Ressource.Code = MaTable.CodeRessource ');
              SQL.Add('Where (DateDebut >= :xDebut1 And Datedebut <= :xDebut2) ');
              SQL.Add('Order By Ressource.Nom, Ressource.Prenom, MaTable.CodeRessource, Categorie.Libelle');
              Parameters.ParamByName('xDebut1').Value := FormatDatetime('dd/mm/yyyy',StartOfTheWeek(nNow));
              Parameters.ParamByName('xDebut2').Value := FormatDatetime('dd/mm/yyyy',EndOfTheWeek(nNow));
              Open;
              Ressource   := FieldByName('CodeRessource').AsString;
              Categorie := FieldByName('Libelle').AsString;
              NbHeure   := 0;
              While not eof do
              Begin
                if Ressource = FieldByName('CodeRessource').AsString then
                begin
                  if Categorie = FieldByName('libelle').AsString then
                  begin
                  // la tache est dans le même jour
                    if FieldByName('DateDebut').AsDateTime = FieldByName('DateFin').AsDateTime then
                    begin
                      NbHeure := NbHeure +
                      (((FieldByName('RepereHeureFin').AsInteger) - (FieldByName('RepereHeureDebut').AsInteger))/2);
    //...
                    end
                 // la tache se fini un autre jour de la semaine
                    else
                    begin
                      HeureDepart := FieldByName('RepereHeureDebut').AsInteger;
                      nDaysBetween := DaysBetween(FieldByName('Datefin').AsDateTime,FieldByName('DateDebut').AsDateTime);
                      case nDaysBetween of
                        0:
                        begin
                          NbHeure := NbHeure + ((30 - HeureDepart) / 2);
                        end;
                        else
                        begin
                          for n := 0 to nDaysBetween do
                          begin
                            if n <> nDaysBetween then // on est pas à la fin
                            begin
                              NbHeure := NbHeure + ((30 - HeureDepart) / 2);
    //...
                            end
                            else
                            begin
                              NbHeure := NbHeure + (FieldByName('RepereHeureFin').AsInteger div 2);
    //...
                            end;
                            HeureDepart := 0;
                          end;
                        end;
                      end;
                    end;
                    next;
                  end
                  else
                  begin
                    for n := 0 to StringGrid1.RowCount - 1 do
                    begin
                      CodeRessourceInString := Copy
                        (StringGrid1.Cells[0,n],
                        Pos('[',StringGrid1.Cells[0,n])+1,
                        Pos(']',StringGrid1.Cells[0,n])
                        -
                        Pos('[',StringGrid1.Cells[0,n])
                        -1);
                      if CodeRessourceInString = Ressource then
                      begin
                        for m := 0 to StringGrid1.ColCount - 1 do
                        begin
                          if StringGrid1.Cells[m,0] = Categorie then
                          begin
                            StringGrid1.Cells[m,n] := FormatFloat('#0.00;;#',NbHeure);
                            Break;
                          end;
                        end;
                        Break;
                      end;
                    end;
                    Categorie := FieldByName('Libelle').AsString;
                    NbHeure   := 0;
                  end;
                end
                else
    // ...
     
              end;
            Except
              on E : Exception do
              Begin
                // message d'erreur
              end;
            end;
          Finally
            Close;
          end;
        end;
    {$ENDREGION Par Semaine}
      end;
      1: // jour
      begin
    Evidement j'ai retiré pas mal de calcul mais c'est pour te montrer, et puis c'est trés rapide.



    A plus

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par MickSou Voir le message
    Sauf que le père Noël devra avoir de la patience car le passage d'une appli développée avec les IBX de Firebird 2.0 vers 2.5 en nécessitera sûrement
    La prochaine appli sera la bonne, promis!
    si tu as lu mon [edit] c'est a partir de 2.1 et là les IBX passent encore
    d'ailleurs mon test a été fait en 2.1 , ca mérite d'essayer la migration douce non ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Delphi 2007 Firebird/Interbase
    Par dlewin dans le forum Bases de données
    Réponses: 2
    Dernier message: 15/05/2007, 02h53
  2. Delphi avec FireBird 2
    Par Doucoure dans le forum Delphi
    Réponses: 2
    Dernier message: 19/02/2007, 19h02
  3. Delphi et Firebird
    Par nassoft dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/11/2006, 15h25
  4. Cube de décisions
    Par shane dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 06/07/2005, 00h35
  5. composants delphi pour firebird
    Par devalender dans le forum Débuter
    Réponses: 1
    Dernier message: 07/02/2005, 13h24

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