Cała aplikacja zbudowana będzie z jednej tabeli i dwóch formularzy.
1. Na początek założymy tabelę RSSTable, gdzie będziemy przechowywać listę kanałów RSS w podziale na użytkowników:
Należy dodać pola jak powyżej, a ich typy rozszerzone (Extended Data Types) nazywają się tak samo. Na tablicy oczywiście można stworzyć grupę pól składającą się np. z URL i Name.
2. Następnie stworzymy prosty formularz, gdzie będzie można uzupełniać dane kanałów. W tym celu tworzymy nowy formularz i do DataSource przeciągamy tablicę RSSTable, następnie do Grida na formularzu przeciągamy stworzoną grupę pól. Kreatywni mogą pokusić się o bardziej zaawansowane rozwiązania, lecz do moich celów w zupełności efekt końcowy jest zadowalający:
Dla przykładu dodałem wiadomości z portalu Gazeta.pl i serwisu Microsoft.
3. Czas przejść do bardziej zaawansowanego formularza, który będzie wyświetlał wiadomości z wprowadzonych kanałów RSS. W tym celu założymy nowy formularz RSS i dodamy do niego komponenty Tree i ActiveX - Microsoft Web Broswer:
Komponent Tree będzie służył do wyświetlania kanałów wraz z nagłówkami wiadomości, a po kliknięciu na odpowiednią gałąź do przeglądarki zostanie załadowana strona z pełną zawartością artykułu.
4. Pobieranie zawartości RSS w postaci pliku XML z internetu można zrealizować na dwa sposoby:
- pierwszy sposób za to pobieranie pliku pomocą klasy WiniInet, która już nie występuje w AX2009: 
private XmlDocument getRssXmlOld(str url) { XmlDocument rss; WinInet inet; int handle; TextBuffer textBuffer = new TextBuffer(); ; // pobieramy xml'a inet = new WinInet(); handle = inet.internetOpenUrl(url); textBuffer.appendText(inet.internetReadFile(handle)); inet.internetCloseHandle(handle); // wczytujemy do XmlDocument rss = new XmlDocument(); rss.loadXml(textBuffer.getText()); return rss; } - drugi sposób to pobranie pliku za pomocą klas .NET - działa pod AX 4 i 5: 
private XmlDocument getRssXml(str url) { XmlDocument rss; TextBuffer textBuffer = new TextBuffer(); System.Net.WebRequest webrequest; System.Net.HttpWebResponse httpresponse; System.IO.Stream stream; System.IO.StreamReader streamReader; str string; ; webrequest = System.Net.WebRequest::Create(url); httpresponse = webrequest.GetResponse(); stream = httpresponse.GetResponseStream (); streamReader = new System.IO.StreamReader (stream); string = streamReader.ReadToEnd (); streamReader.Close(); stream.Close(); httpResponse.Close(); textBuffer.appendText(string); // wczytujemy do XmlDocument rss = new XmlDocument(); rss.loadXml(textBuffer.getText()); return rss; } 
void setTree()
{
    FormTreeItem rssAddress;
    FormTreeItem header;
    XmlDocument rss;
    XmlNode root;
    XmlNodeList headerList;
    XmlNode message;
    XmlNode quickMessage;
    XmlNode title;
    XmlNode link;
    int i, j, nodeIndex;
    ;
    while select rssTable where rssTable.UserID == curUserID()
    {
        // pobieramy listę wiadomości z kanału rss
        root = this.getRssXml(rssTable.url).documentElement();
        try
        {
            if (root != null)
            {
                headerList = root.selectNodes("//item//link");
                rssAddress = new FormTreeItem(rssTable.Name, 0, headerList.length(), "");
                nodeIndex = tree.addItem(0 ,0, rssAddress);
                for ( i =0; i < headerList.length(); i++)
                {
                    title = headerList.item(i).selectSingleNode(strfmt("//item[link='%1']//title", headerList.item(i).text()));
                    link = headerList.item(i).selectSingleNode(strfmt("//item[link='%1']//link", headerList.item(i).text()));
                    header = new FormTreeItem(title.text(), 0, 0,link.text());
                    tree.addItem(nodeIndex, i, header);
                }
             }
         }
         catch
         {
            error("Wystąpił błąd tworzenia drzewa.");
         }
    }
}Aby zrozumieć szerzej powyższą funkcję należałoby zrozumieć budowę pliku XML i polecenia XPath. Do tego celu polecam ciekawe lektury mojego ulubionego wydawnictwa:
public void selectionChanged(FormTreeItem _OldItem, FormTreeItem _NewItem, FormTreeSelect _how)
{
   super(_OldItem, _NewItem, _how);
   if (_newItem.data() != "")
   {
        ActiveX.Navigate(_newItem.data());
   }
}7. Ostatnim etapem jest dodanie wywołania metody setTree do przeciążonej metody run na formularzu: public void run()
{
    this.setTree();
    super();
}
Tak wygląda czytnik RSS dla Dynamics AX:
Teraz kiedy szef patrzy możemy oglądać wiadomości w DAX ;)
Brak komentarzy:
Prześlij komentarz