Makale Özeti

ERP yazılımlarının sadece şirket içindeki veriyi yönetmekle sınırlı olmaması, dış dünyayla bağlantımızda da kullanılabilir olması gerekmektedir. Peki müşterilerize ERP yazılımımızı kullandırmanın en kolay yolu nedir dersek, bir çoğumuz web uygulaması cevabını verecektir. Dünyanın herhangi bir yerindeki internet'e bağlı bir müşteri, web portalımız üzerinden sipariş geçebilmeli, siparişlerini ve stoklarımızı sorgulayabilmelidir.

Makale

ERP yazılımlarının sadece şirket içindeki veriyi yönetmekle sınırlı olmaması, dış dünyayla bağlantımızda da kullanılabilir olması gerekmektedir. Peki müşterilerize ERP yazılımımızı kullandırmanın en kolay yolu nedir dersek, bir çoğumuz web uygulaması cevabını verecektir. Dünyanın herhangi bir yerindeki internet'e bağlı bir müşteri, web portalımız üzerinden sipariş geçebilmeli, siparişlerini ve stoklarımızı sorgulayabilmelidir.

Dynamics AX da dış dünyaya açılabilmemiz için entegre web portalı sunmaktadır. Üstelik web portalın kurulumu AX içerisinden çok kısa sürede yapılabildiği gibi, portal geliştirmelerinizi de yine Dynamics AX içerisinden yaparsınız. Bu da bizlere uygulamanın her noktasına ve verilerimize doğrudan erişmemizi sağlar.

Müşterilerimizin ihtiyaçlarını karşılayacak bir çok fonksiyon web portal üzerinde hazır olarak gelmesine rağmen, bizim de eklemek zorunda kalacağımız fonksiyonaliteler olacaktır. Bu makalemizde kullanıcının geçmiş faturalarını excel raporu halinde sorgulamasını sağlayacak uygulama yazacağız. Web üzerinden excel formatında rapor sunmak, Dynamics AX'in standardında bulunmadığı için bazı işlemleri manuel yapacağız.

Kullanıcı menüden "Fatura Bilgileri (Excel)" i tıkladığında raporumuzu hazırlamalı ve kullanıcıya göndermeliyiz.

İşlem sıramız aşağıdaki gibi olacaktır :

1. Menü aracaılığıyla çalıştırabileceğimiz bir sınıf yaratılmalı ve main() metodu içine excel dosyası yaratacak kod yazılmalıdır. Excel dosyası diske kaydedilmelidir.
2. Sunucu üzerinde bizi ilgili excel dosyasına yönlendirecek .asp dosyası yaratılmalıdır.
3. Bu .asp dosyası EnterprisePortal sınıfı içerisindeki özel bir metodu çağırmalı ve dosyayı kullanıcıya yönlendirmelidir.
4. Kullanıcıya gönderilen dosya anında silinmelidir.

Öncelikle AOT üzerinden Classes sekmesine gelerek yeni bir sınıf yaratalım. Sınıfın görünümü (ABH_EPFaturalarExcel) aşağıdaki gibi olacaktır. Sınıfa main() metodunu eklediğimizde, menü üzerinden çalıştırılabilir hale getirmiş olacağız.

Asıl işimiz burada başlıyor. Main() metodu içinde Excel dosyası yaratıp, içini veriyle doldurup sunucu üzerine kaydetmeliyiz. Buradaki örneğimizde, web portal müşterisinin yılbaşından bugüne kadar ki tüm faturalarını listeliyor olacağız. Örnek kodumuz aşağıdaki gibi olacaktır.

static void Main(args _args)
{
    // Excel dosyasını tamamladıktan sonra yönleneceğimiz dosyanın yolu 
    str url; 
 
    // Excel uygulaması için gerekli değişkenler
    SysExcelApplication SysExcelApplication; 
    SysExcelWorksheets SysExcelWorksheets;
    SysExcelWorksheet SysExcelWorksheet; 
    SysExcelWorkbook SysExcelWorkbook;
    SysExcelCell SysExcelCell;
    SysExcelRange SysExcelRange;
 
    // Sistemdeki web kullanıcısı ve müşteri numarası
    WebUser curWebUser = WebUser::current();
    CustAccount musteriNo;
   
    // Fatura bilgilerinin bulunduğu tablo
    CustInvoiceJour CustInvoiceJour;
   
    TransDate yilbasi;
    int satirNo = 2;         // Excel dosyasında üzerinde bulunduğumuz satır
    Filename _filename;  // Dosyayı nereye kaydedeceğiz 
    ;
    musteriNo = curWebUser.CustAccount;
    yilbasi = mkdate(1,1,year(today()));
   
    // Excel dosyasını yaratıyoruz
    try
    {
         SysExcelApplication = SysExcelApplication::construct(); 
         SysExcelApplication.workbooks().add();
         SysExcelWorkbook = SysExcelApplication.workbooks().item(1);
         SysExcelWorksheets = SysExcelWorkbook.worksheets();
         SysExcelWorksheet = SysExcelWorksheets.itemFromNum(1); 
    }
    catch
    {
         SysExcelApplication.quit();
         info("Excel uygulaması başlatılamadı");
         return;
    }

    // Dosyanın 1. satırına başlıkları yazıyoruz. 
    SysExcelCell = SysExcelWorksheet.cells().item(1,1);
    SysExcelCell.value("Fatura No");
    SysExcelCell = SysExcelWorksheet.cells().item(1,2);
    SysExcelCell.value("Sipariş No");
    SysExcelCell = SysExcelWorksheet.cells().item(1,3);
    SysExcelCell.value("Fatura Tarihi");
    SysExcelCell = SysExcelWorksheet.cells().item(1,4);
    SysExcelCell.value("Tutar"); 

    /* İlgili müşterinin bu yılbaşından itibaren kesilen tüm faturalarını okuyup
     excel dosyasına yazıyoruz */

    WHILE SELECT CustInvoiceJour
    WHERE CustInvoiceJour.InvoiceAccount == musteriNo &&
                   CustInvoiceJour.InvoiceDate >= yilbasi &&
                   CustInvoiceJour.InvoiceDate <= today()
    {
         SysExcelCell = SysExcelWorksheet.cells().item(satirNo,1);
         SysExcelCell.value(CustInvoiceJour.InvoiceId);
         SysExcelCell = SysExcelWorksheet.cells().item(satirNo,2);
         SysExcelCell.value(CustInvoiceJour.SalesId);
         SysExcelCell = SysExcelWorksheet.cells().item(satirNo,3);
         SysExcelCell.value(CustInvoiceJour.InvoiceDate);
         SysExcelCell = SysExcelWorksheet.cells().item(satirNo,4);
         SysExcelCell.value(CustInvoiceJour.InvoiceAmount);
         satirNo ++;
    } 

    /* Dosyayı web portalının bulunduğu klasöre kaydediyor ve Excel
    uygulamasını kapatıyoruz */

    _filename = @"D:\inetpub\wwwroot\Portal\EPMusteriFatura.xls";
    SysExcelWorkbook.saveAs(_filename);
    SysExcelApplication.quit(); 

    /* Kullanıcıya dosyayı gönderecek kodu tetikleyecek asp sayfasına
    yönleniyoruz */
   
url = strfmt("MusteriFatura.asp");
    WebSession().redirectUrl(url);

Bu aşamada portalın kurulu olduğu dizine gidip, "MusteriFatura.asp" dosyasını yaratıyoruz. Dosyanın içindeki kod aşağıdaki gibi olmalıdır.

<% response.buffer = TRUE response.expires = -1%> <% response.buffer = TRUE response.expires = -1%> <% response.buffer = TRUE response.expires = -1%> <% response.buffer = TRUE response.expires = -1%>
<!-- #include file="i_axapta.asp" -->
<% if (session("LoggedOff") = "1") then
session.abandon
response.redirect "default.asp"
end if
WebApplication().Call("sendMusteriFaturaExcel") %> <% if (session("LoggedOff") = "1") then session.abandon response.redirect "default.asp" end if WebApplication().Call("sendMusteriFaturaExcel") %> <% if (session("LoggedOff") = "1") then session.abandon response.redirect "default.asp" end if WebApplication().Call("sendMusteriFaturaExcel") %> <% if (session("LoggedOff") = "1") then session.abandon response.redirect "default.asp" end if WebApplication().Call("sendMusteriFaturaExcel") %>

Bu kodun en önemli kısmı son satırıdır. WebApplication().Call("...") metodu aracılığıyla EnterprisePortal sınıfındaki istediğimiz metoda erişebiliriz. Sunucu üzerindeki dosyayı kullanıcıya gönderecek ve dosyayı silecek kodu bu sınıfın içerisine yazacağız. EnterprisePortal sınıfına yeni bir metod ekliyor ve ismini sendMusteriFaturaExcel olarak veriyoruz.

void sendMusteriFaturaExcel()
{
   IISResponse response = WebSession().response();
   BinData binData;
   str _filename;
   int fileSize; 
  
   ;
   _fileName = @"D:\inetpub\wwwroot\Portal\EPMusteriFatura.xls";
   filesize = WinAPI::fileSize(_fileName); 
  
   response.contentType("application/octet-stream");
   response.addHeader("Content-Disposition","attachment; filename=" + _fileName);
   response.addHeader("File-size",strfmt("%1",fileSize));
   binData = new BinData();
   binData.loadFile(_fileName);
   response.binaryWrite(binData.getVariant());
   response.flush();
   // Dosyayı gönderdikten sonra mutlaka silmelisiniz
   winAPI::deleteFile(_filename); 
}

Excel dosyasını oluşturacak ve müşteriye gönderecek kodumuzu yazdık. Şimdi  ABH_EPFaturalarExcel sınıfını çağıracak Action tipinde bir menü nesnesi yaratmalı ve ilgili menü nesnesini WebMenus sekmesi altında bulunan menülerden birine eklemelisiniz. Bundan sonra Resim1'de gördüğünüz menü'ye ulaşacak ve ilgili butona bastığınızda excel raporu alıyor olacaksınız.

Sağlıcakla kalın,

Anıl Özay
Bilgisayar Mühendisi
MVP Dynamics AX
anil.ozay@bilisimanadolu.com