Cube OLAP varibale

onjour forum,

J'ai un cube OLAP qui est liée à une base SQL, elle est monté avec une seul dimension, mais 5 niveaux supplémentaire.

Dimension = No Projet

niv 1 = Nom employé

niv 2 = secteur

Mon but est que selon le numéro de projet d'une cellule, le cude sort toutes les informations de tous les niveaux supplémentaires liés à ce projet, et de les sortir dans un tableau sur la même feuille.

J'ai déjà essayé avec une simple requête MSQuery, mais ma base de donnée est trop lourde la requête prend 5-6 min d'actualisation.

J'ai essayer de le faire avec l'éditeur de macros, voici ce que ça donne

Sub Cube ()
ActiveSheet.PivotTables("Tableau croisé dynamique7").CubeFields(1). _
        TreeviewControl.Drilled = Array(Array("", "", "", "", "", "", ""), Array( _
        "[NoProjet].[Tous].[PP2128]", "", "", "", "", "", ""), Array( _
        "[NoProjet].[Tous].[PP2128].[Alain Trépanier]", _
        "[NoProjet].[Tous].[PP2128].[Christine Hamel]", _
        "[NoProjet].[Tous].[PP2128].[Joannie Dussault]", _
        "[NoProjet].[Tous].[PP2128].[Pierre Pilote]", "", "", ""), Array( _
        "[NoProjet].[Tous].[PP2128].[Alain Trépanier].[2]", _
        "[NoProjet].[Tous].[PP2128].[Christine Hamel].[2]", _
        "[NoProjet].[Tous].[PP2128].[Joannie Dussault].[2]", _
        "[NoProjet].[Tous].[PP2128].[Pierre Pilote].[2]", "", "", ""), Array( _
        "[NoProjet].[Tous].[PP2128].[Alain Trépanier].[2].[2]", _
        "[NoProjet].[Tous].[PP2128].[Christine Hamel].[2].[4]", _
        "[NoProjet].[Tous].[PP2128].[Joannie Dussault].[2].[4]", _
        "[NoProjet].[Tous].[PP2128].[Pierre Pilote].[2].[4]", "", "", ""), Array( _
        "[NoProjet].[Tous].[PP2128].[Alain Trépanier].[2].[2].[L3]", _
        "[NoProjet].[Tous].[PP2128].[Alain Trépanier].[2].[2].[L5]", _
        "[NoProjet].[Tous].[PP2128].[Alain Trépanier].[2].[2].[L9]", _
        "[NoProjet].[Tous].[PP2128].[Christine Hamel].[2].[4].[T2]", _
        "[NoProjet].[Tous].[PP2128].[Joannie Dussault].[2].[4].[T1]", _
        "[NoProjet].[Tous].[PP2128].[Joannie Dussault].[2].[4].[T2]", _
        "[NoProjet].[Tous].[PP2128].[Pierre Pilote].[2].[4].[T4]"))
End sub

Si quelqu'un peut m'aider j'en serais très heureux

Merci d'avance

Bonjour,

Est-ce que ça ne serait pas plus simple de faire une procédure stocké dans ta base SQL et d'appeler le résultat?

Bonjour math, content de te revoir

pour ta réponse peut-être, mais je connais rien en SQL et j'ai pas vraiment accès à la base étant donnée mon poste, mais je pourrais me renseigner si je peux y avoir accès.

Je voudrais seulement savoir si cela implique beaucoup de développement ou c'est une procédure simple.

Ensuite comme je disais lorsque je fais une connexion avec la base SQL, la connexion est très longue à effectuer, et est-ce que l'appel de la procédure va prendre le même temps, ou elle va être rapide.

Merci

Quand tu parles de base SQL, j'imagine que vous êtes sous SQL Server?

Créer la procédure stocké ne prend pas vraiment de temps, tout dépend de la complexité de la Base de donnée. Un fois la procédure terminé, elle est "compilé" et l'accès est beaucoup plus rapide qu'avec MSQuery.

Une autre solution serait de faire une requête au serveur depuis Excel en VB. Si c'est pas trop confidentiel poste ton code SQL de la commande MS Query. D'après moi ça sera quand même assez rapide.

Oui c'est un SQL server, et pour le code est-ce celui la?

SELECT operation_0.NoProjet, employe_0.NomEmploye, employe_0.Departement, operation_0.HrsTotal, employe_0.GrandSecteur, operation_0.CodeActivite, operation_0.DateHrsDebut, operation_0.DateHrsFin

FROM ultrahrsgest.employe employe_0, ultrahrsgest.operation operation_0

WHERE employe_0.NoUtilisateur = operation_0.NoUtilisateur AND ((operation_0.NoProjet=?))

Merci

Voici un exemple uniquement avec Excel:

Public Sub GetInfoProjet(intNoProjet As Integer)
    Dim Cnn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim strSQL As String

    Set Cnn = New ADODB.Connection
    Cnn.ConnectionString = "Provider=SQLOLEDB;Server=TonAdresseServeur;Database=TaBD;User ID=NomUser; Password=MotDePasse;"
    Cnn.Open

    Set rs = New ADODB.Recordset
    strSQL = "SELECT O.NoProjet, E.NomEmploye, E.Departement, O.HrsTotal, E.GrandSecteur, O.CodeActivite, O.DateHrsDebut, O.DateHrsFin " & _
             "FROM ultrahrsgest.employe E INNER JOIN ultrahrsgest.operation O ON E.NoUtilisateur = O.NoUtilisateur " & _
             "WHERE O.NoProjet=" & intNoProjet
    rs.Open strSQL, Cnn, adOpenDynamic, adLockReadOnly

    Sheets("Feuil1").Range("A10").CopyFromRecordset rs
End Sub

Copie ce code dans un module de ton classeur. Il faut que tu active la référence à "Microsoft ActiveX Data Objects X.X Library. Ensuite remplit les bons paramêtres de la ligne CNN.ConnectionString. Tu peux voir que j'ai un peu modifier ta requête à la ligne FROM. Cette ligne définie les tables utilisée pour faire la requête. Quand il y a plus de d'une table, c'est mieux de les lier avec JOIN. Ici la table employe est lier à la table operation par le champ NoUtilisateur. La liaison était fait plus loin dans la ligne WHERE mais je préfère la faire avec le FROM, c'est plus performant et aussi moins déroutant quand il y a plusieurs tables. J'ai aussi donné un surnom plus cours aux tables.

E au lieu de employe_0 et O au lieu de operation_0. Le critère est dans la variable de la ligne WHERE intNopojet, j'ai supposé qu'il était de type integer, à modifier pour qu'il soit de même type que le champs NoProjet dans ta table opération. Finalement je copie tout le résultat de la requête à la dernière avec la commande CopyFromRecordset. Il y a d'autre façon de voir le résultat, ex avec une boucle :

Dim i As Integer
i = 0
Do While Not rs.EOF
  Sheets("Feuil1").Range("A10").Offset(i).Value = rs.Fields("NomEmploye").Value
  i = i + 1
  rs.MoveNext
Loop

ici j'affiche les noms d'employés uniquement. Ça dépend de tes besoins. Essaie ça et donne moi des nouvelles pour la suite. Ça risque surement de coincer à la ligne ConnectionString mais on devrait pouvoir se débrouiller

Math

Merci mais j'ai 2-3 questions

1- L'adresse de mon server, de quel façon je doit l'écrire 10.10. ... ou 10/10/...

2- Il y a-t-il un raison pour mettre "int" devant Noprojet, car mon NoProjet est de type String

3- C'est quand que je vais indiquer mon NoProjet que je désire sélectionné.

4- Et il y a-t-il un risque de me connecter de cette façon, celui qui s'occupe de gérer le server n'aime pas trop me voir jouer la dedans.

Merci

1- Inscrit ton adresse avec les points 10.10. ... j'utilise SQL Server Express, si c'est ton cas il faut ajouter \EXPRESS après les points.

2- Le int est un indicateur que j'utilise pour savoir quel est le type de la variable, ( et ne pas la confondre avec le champs de ta BD du même nom.) Tu peux y donner le nom que tu veux. Par contre change

Public Sub GetInfoProjet(intNoProjet As Integer)

pour

Public Sub GetInfoProjet(intNoProjet As String)

3- Le code que j'ai posté est une procedure pour aller chercher les infos dans la BD. Il faut l'appeler dans ton code. Ex. sur le clique d'un bouton.

Private Sub CommandButton1_Click()
    Call GetInfoProjet(Range("A1").Value)
End Sub

où le no de projet est inscrit en A1. C'est à toi de voir quand tu veux afficher les résultats

4- Il n'y a pas vraiment de danger pour que tu modifies des données de la BD ou que tu bug le tout. C'est la ligne suivante qui lance le travail sur la BD

rs.Open strSQL, Cnn, adOpenDynamic, adLockReadOnly

le dernier paramêtre "adLockReadOnly", ouvre la table en lecture seule, pas de danger d'affecter les données et ça occupe moins de ressource du serveur.

J'ai un erreur D'exécution

sur la ligne de code

Cnn.Open

[DBNETLIB][ConnectionOpen(Connect()).]SQL Serveur does not exist or access denied.

J'ai pourtant entré l'adresse de 2 façon avec 10.10.... ou par le nom du server Ls-s... et pour mon et le mot de passe c'est supposé être le bon peut-il y avoir une autre raison ou c'est seulement que je me suis trompé dans les infos.

Merci

essaie la ligne suivante pour ta String de connection:

Cnn.ConnectionString = "Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;"

remplace par tes infos, sauf le Network Library. Concerve le ,1433 après l'adresse IP, c'est le no du port par défaut de SQL server.

Si ça t'intéresse, va voir ce lien: www.connectionstrings.com, qui liste plusieurs strings pour ce connecter à SQL Server.

Ok j'ai trouvé le problème,

J'ai essayé ce matin de vérifier si les info que j'avais étaient bonne et j'ai trouvé pourquoi il ne trouvait ma base SQL, c'est parce que ce n'est pas un SQL serveur mais MySQL ODBC 3.51 Driver, je suis désolé, mon gars du département est mêlé je crois, enfin, j'espère qu'il n'y aura pas grand chose à changer.

Sinon j'ai testé la connexion, en créent une nouvelle source de donnée avec Excel et ça fonction alors je crois que c'était ça le problème.

Merci

-- Jeu Juil 15, 2010 8:46 pm --

J'ai modifié la connection, maintenant il se connect mais j'ai une erreur

ODBC Driver does not support the requested properties.

rs.Open strSQL, Cnn, adOpenDynamic, adLockReadOnly

Voici le code modifié

Public Sub GetInfoProjet(intNoProjet As String)
    Dim Cnn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim strSQL As String

    Set Cnn = New ADODB.Connection
    Cnn.ConnectionString = "Driver={MySQL ODBC 3.51 Driver};Server=10.10...;Database=Data;User=Gille; Password=se091;Option=3;"
    Cnn.Open

    Set rs = New ADODB.Recordset
    strSQL = "SELECT O.NoProjet, E.NomEmploye, E.Departement, O.HrsTotal, E.GrandSecteur, O.CodeActivite, O.DateHrsDebut, O.DateHrsFin " & _
             "FROM ultrahrsgest.employe E INNER JOIN ultrahrsgest.operation O ON E.NoUtilisateur = O.NoUtilisateur " & _
             "WHERE O.NoProjet=" & intNoProjet
    rs.Open strSQL, Cnn, adOpenDynamic, adLockReadOnly

    Sheets("Feuil1").Range("A10").CopyFromRecordset rs
End Sub

Bonjour,

essaie de modifier cette ligne:

rs.Open strSQL, Cnn, adOpenDynamic, adLockReadOnly

par

rs.Open strSQL, Cnn, adOpenStatic, adLockReadOnly

si ça marche toujours pas enleve les propriétés pour voir si ça passe

rs.Open strSQL, Cnn

Est-ce que tu va être le seul à utiliser ce code?

 rs.Open strSQL, Cnn

Ce code fonctionne, et non je ne devrais pas être le seul à l'utilser, mais nous ne seront pas 2 personnes à utiliser cette macros en même temps.

C'est pour un fichier rapport majoriairement utilisé par moi mais certains directeurs peuvent parfois l'utilisé.

Tant mieux si ça fonctionne, je voulais savoir comment de personne utilise le code car j'avais une solution de rechange. Les propriétés que je t'ai fais enlevé servent à définir la façon d'accéder à table, mais vu que dans ton code tu ne fais que lire des informations, je ne pense pas qu'il y aura de problème.

Maintenant est-ce que tu as besoin d'aide pour afficher les données?

Non c'est correct le reste c'est un autre macros qui fait le travail, je te remercie pour l'aide et si il y a quelque chose je te recontact

Salut et merci encore

Rechercher des sujets similaires à "cube olap varibale"