Business intelligence(cu forecast pe curs Euro) revine

Nu eram deloc multumit de cum facusem predictia de curs valutar – exportam datele din tabela de SqlServer in Excel, pe aceasta analizam “in the cloud” si apoi generam fisierul html cu un macro de Excel …Naspa rau! Normal ca vroiam sa se generewze automat de la datele din tabela – si apoi sa se verse singra intr-o BD.

Asa incit am luat decizia sa studiez un pic cum se face(rezultate aici) –si iata ideile principale:

1. Nu va fie frica sa va creati sursele de date , cuburile si dimensiunile (folositi pentru aceasta VS, nu SSMS – din pacate NU merge in SSMS !). E acelasi lucru ca si cum ati defini o BD normala – si ati lucra cu ea.Dupa ce creeati, va trebui sa ii faceti “Deploy”c a sa o vedeti si in Analysis Services. O sa trec la nivelul urmator (generare automata a BI din cod) mai tirziu.

2.Chiar daca Baza de date principala isi schimba valorile,ca sa isi schimbe si Analysis Services  trebuie sa ii dati “Process” din nou …Neplacut, dar asta e. In mod programatic din C#:

using(Microsoft.AnalysisServices.Server s=new Microsoft.AnalysisServices.Server())
            {
                s.Name = "localhost";
                s.Connect("localhost");
                s.Refresh();
                using(Database d=s.Databases["analtest1"])
                {
                    d.Refresh();
                    d.Process(ProcessType.ProcessFull);
                }
            }

3. Pentru a obtine valorile forecastate, sintaxa este uimitor de asemanatoare cu cea obisnuita din ADO.NET:

using (AdomdConnection con = new AdomdConnection())
            {
                con.ConnectionString = "Data Source=localhost;Catalog=xxx";
                con.Open();
                using (AdomdCommand cmd = new AdomdCommand())
                {
                    cmd.CommandText = "select PredictTimeSeries(Valoare,25) AS Predictie from [Vw Eur]";
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = con;
                    using (AdomdDataReader dr = cmd.ExecuteReader())
                    {

                        while (dr.Read())
                        {

Totusi, te poti insela rapid:

4. Ca sa obtin tabelul de predictie, a trebuit sa vad in SSMS rezultatul si asa m-am prins ca dr are un singur rind, si acela fiind tot un AdomdDataReader 

while (dr.Read())
                       {
                           using (AdomdDataReader pred = dr["Predictie"] as AdomdDataReader)
                           {

                               while (pred.Read())
                               {

4. Nu exista o modalitate standard de a obtine un DataTable dintr-un AdomdDataReader   – iar GetSchemaTable nu intoarce rezultatele ca schema. Asa ca am ajuns la modalitatea obisnuita de a genera DataTable :

while (dr.Read())
                       {
                           using (AdomdDataReader pred = dr["Predictie"] as AdomdDataReader)
                           {

                               int fields = pred.FieldCount;
                               DataTable dt = new DataTable("nume");
                               for (int i = 0; i < fields; i++)
                               {
                                   dt.Columns.Add(pred.GetName(i), pred.GetFieldType(i));
                               }
                               while (pred.Read())
                               {
                                   object[] p = new object[fields + 1];
                                   for (int i = 0; i < fields; i++)
                                   {
                                       p[i] = pred[i];
                                   }
                                   dt.Rows.Add(p);
                               }                                
                           }

De ce n-am facut-o extension method la AdomdDataReader    ? Din YAGNI ( Ok, puturosenie …) Daca o sa fie nevoie , (re)fac…

5. E clar ca nu merge rapid cu BI-ul …nici macar cu ceva simplu ca un forecast amarit …Deci,la treaba!

Leave a Reply

Your email address will not be published. Required fields are marked *