2.6   Odczyt wartości archiwalnych zmiennych procesowych

 

 

Oprócz dostępu do wartości bieżących zmiennych, system skryptów pozwala także na odczyt zgromadzonych wartości archiwalnych. Typowe zastosowanie to generacja raportów oraz wyliczanie wskaźników produkcyjnych bazujących na danych archiwalnych.

Odczyt danych archiwalnych może być wykonany za pośrednictwem dwóch mechanizmów. Bardziej uniwersalne jest wykorzystanie interfejsu IVariable. Metoda ta pozwala na bardziej precyzyjną kontrolę procesu odczytu. W prostych przypadkach można wykorzystać metodę GetVariableArcData interfejsu IApplication.

W poniższym przykładzie pokazano, w jaki sposób utworzyć prosty raport w formacie HTML, korzystając z interfejsu IVariable. Przykład użycia metody GetVariableArcData znajduje się w opisie tej metody. Sposób wykorzystania odczytanych danych jest identyczny dla obu mechanizmów. 

C#

using System;
using
 System.IO;
using
 System.Windows.Forms;
using
 Askom.AsixEvo.Scripting;
 

public
 class RaportHtml : IScript
{

   public
 bool Initialize(string[] aParameters, IApplication aApplication)
   {
       IVariable v = aApplication.GetVariable(aParameters[0], 
false);
       
if(v == null)
       {
          aApplication.ReportMessage( EvoMessageType.Error,

                          "Błąd generowania raportu: Brak zmiennej " + aParameters[0]);
          return true;
       }
 
       DateTime day = DateTime.Today;
       DateTime day0 = day.AddDays(-1);
       ArcQuery q = new ArcQuery(day0, day, "average", TimeSpan.FromHours(1));
 
       IArcQueryResult res = v.OrderArcData(q);
 
       int loopCnt = 0;
       while(res.ResultStatus == ArcResultStatus.Processing)
       {
          if(loopCnt > 200)
          {
             aApplication.ReportMessage(EvoMessageType.Error,                                                    "Błąd generowania raportu! Przekroczono czas oczekiwania na odpowiedź.");
             v.Dispose();
             return true;
          }
 
          aApplication.Sleep(TimeSpan.FromMilliseconds(100));
          loopCnt++;
       }
 
       if(res.ResultStatus == ArcResultStatus.Ready)
          {                             
             StreamWriter sw = null;
             System.Text.StringBuilder sb = new System.Text.StringBuilder();
             try
             {                  
                 sb.AppendLine(

   "<html><head><title>Raport - Srednie godzinowe z poprzedniego dnia</title></head><body>");               sb.AppendLine("<table width=\"25%\" align=\"center\" border=\"1\" >");
                sb.AppendLine("<tr><th>Godzina</th><th>Srednia</th></tr>");
 
                if(res.Values != null)
                {
                    foreach(ArcVariableState p in res.Values)
                    {          

                         sb.AppendLine(

                 "<tr><td>" + p.TimeStamp.ToString() + "</td><td>" + p.Value + "</td></tr>");                  }
                }
                sb.AppendLine("</table>");
                sb.AppendLine("</body></html>");
 
                 string file = Path.Combine(aApplication.ApplicationWorkingDirectory,

                                             "reports\\report.html");

                sw = new StreamWriter(file);
                sw.Write(sb.ToString());
                System.Diagnostics.Process.Start(file);
             }
             catch(Exception ex)
             {
                aApplication.ReportMessage(EvoMessageType.Error,

                                                       "Błąd zapisu pliku: " + ex.Message);
             }
             finally
             {
                if(sw != null)
                {
                    sw.Close();
                    sw.Dispose();
                }
             }                  
          }
          else if(res.ResultStatus == ArcResultStatus.Error)
             aApplication.ReportMessage(EvoMessageType.Error,

                                    "Błąd generowania raportu! " + res.ErrorDescription);
 
       v.Dispose();
       
return true;
   }
 

   public
 void FinalizeScript()
   {
   }
}
 

 

VB

 

Imports System
Imports
 System.Windows.Forms
Imports
 Askom.AsixEvo.Scripting
 

Public
 Class RaportHtmlVB
    
Implements IScript
 
    
Public Function Initialize(ByVal aParameters() As StringByVal aApplication As _

                                      IApplication) As Boolean Implements IScript.Initialize
 
        Dim v As IVariable
        v = aApplication.GetVariable(aParameters(0), False)
        If (v Is NothingThen
            aApplication.ReportMessage(EvoMessageType.Error, _

                              "Błąd generowania raportu: Brak zmiennej " & aParameters(0))
            Return True
        End If
 
        Dim day, day0 As DateTime
        day = DateTime.Today
        day0 = day.AddDays(-1)
        Dim q As ArcQuery
        q = New ArcQuery(day0, day, "average", TimeSpan.FromHours(1))
 
        Dim res As IArcQueryResult
        res = v.OrderArcData(q)
 
        Dim loopCnt As Integer
        loopCnt = 0
        While (res.ResultStatus = ArcResultStatus.Processing)
 
            If (loopCnt > 200) Then
                aApplication.ReportMessage(EvoMessageType.Error, _
                 "Błąd generowania raportu! Przekroczono czas oczekiwania na odpowiedź.")
                v.Dispose()
                Return True
            End If
 
            aApplication.Sleep(TimeSpan.FromMilliseconds(100))
            loopCnt += 1
 
        End While
 
        If (res.ResultStatus = ArcResultStatus.Ready) Then
 
            Dim sw As System.IO.StreamWriter
            sw = Nothing
            Dim sb As System.Text.StringBuilder
            sb = New System.Text.StringBuilder()
            Try
                sb.AppendLine( _

     "<html><head><title>Raport - Srednie godzinowe z poprzedniego dnia</title></head><body>")
                sb.AppendLine("<table width=""25%"" align=""center"" border=""1"" >")
                sb.AppendLine("<tr><th>Godzina</th><th>Srednia</th></tr>")
 
                If (Not res.Values Is NothingThen
 
                    For Each p As ArcVariableState In res.Values
                        sb.AppendLine( _                   "<tr><td>" & p.TimeStamp.ToString() & "</td><td>" & p.Value & "</td></tr>")
                    Next p
                    sb.AppendLine("</table>")
                    sb.AppendLine("</body></html>")
 
                    Dim file As String
                    file = System.IO.Path.Combine( _

                             aApplication.ApplicationWorkingDirectory, "reports\\report.html")
                    sw = New System.IO.StreamWriter(file)
                    sw.Write(sb.ToString())
                    System.Diagnostics.Process.Start(file)
 
                End If
 
            Catch ex As Exception
                aApplication.ReportMessage(EvoMessageType.Error, _

                                                 "Błąd zapisu pliku: " & ex.Message)
            Finally
                If (Not sw Is NothingThen
                    sw.Close()
                    sw.Dispose()
                End If
            End Try
        ElseIf (res.ResultStatus = ArcResultStatus.Error) Then
            aApplication.ReportMessage(EvoMessageType.Error, _

                                        "Błąd generowania raportu! " & res.ErrorDescription)
        
End If
 
        v.Dispose()
        
Return True
 
    
End Function
 
    
Public Sub FinalizeScript() Implements IScript.FinalizeScript
 
    
End Sub
 

End
 Class 

 

Odczyt wartości archiwalnych inicjowany jest wywołaniem funkcji OrderArcData interfejsu IVariable. Parametrem wywołania jest obiekt klasy ArcQuery określający, jakie dane i z jakiego okresu mają zostać pobrane. W przykładzie dane pobierane są z okresu poprzedniego dnia, a zwracane wartości to średnie 1-godzinowe.

Po zainicjowaniu odczytu należy zaczekać na koniec operacji poprzez testowanie statusu wykonania operacji ResultStatus (alternatywną metodą oczekiwania jest zadeklarowanie funkcji zwrotnej wywoływanej w momencie zakończenia odczytu). Po stwierdzeniu, że operacja zakończyła się poprawnie skrypt wykonuje generację raportu wynikowego. Wartości archiwalne zwracane są w kolekcji Values dostępnej poprzez obiekt statusu wykonania. Kolekcja składa się z obiektów ArcVariableState­ - każdy obiekt określa wartość, status i stempel czasu pojedynczej wartości archiwalnej.

Po wygenerowaniu raportu, wywołanie metody Start obiektu Process powoduje otwarcie raportu w oknie domyślnej przeglądarki www.