VB.Net kullanarak Axapta işlemleri

Bir önceki makalemizde Axapta Business Connector arabirimini ve arabirimde bulunan fonksiyonları tanımıya çalışmıştık.

Şimdi VB.Net kullanarak Axapta'ya nasıl bağlanacağımızı (logon), bir Axapta Class'ını nasıl çağıracağımızı ve Axapta'dan bunu nasıl karşılayacağımıza bakalım.

İlk olarak açtığımız .net projemizde Axapta Business Connector 'ü projemizin referanslarına eklememiz gerekmektedir.

Bu yapabilmek için projemizin "references" kısmına gelerek yeni bir referans ekleyiniz, COM sekmesinde "Axapta COM Connector 1.2 Type Library " i bulunuz ve OK tuşuna basınız. Bu işlem proje referanslarına Axapta Business Connector 'ü ekleyecektir.

Projemizin referanslarına COM connector'ü eklediğimizi düşünelim. Dikkat edecek olursanız referanslara eklediğimiz dll aslında Axapta Configuration Utility kullanarak register (bilgi kütüğü) ettiğimiz "axcom.dll' lidir.

Projemizin Public Class'ında referans a eklediğimiz COM Connector'u tanımlamalıyız.

Private axapta As AxaptaCOMConnector.Axapta2

Şimdi Axapta'ya nasıl bağlanacağımız bakalım.

NOT : Örneklerini göreceğiniz foksiyonların hata ve sonlandırma kısımlarını ihtiyaca bağlı olarak değişeceğinden fazla detaylı yazmadım. Genel .Net kurallarına göre yazabilirsiniz.

Private Function Logon2(ByVal defaultLogon As String, ByVal configuration As String, ByVal company As String, ByVal Password As String)
Const FUNCTION_NAME = "GetNotificationHeader"
Try
axapta = New AxaptaCOMConnector.Axapta2
axapta.Logon2(defaultLogon, Password, company, "", "", "", configuration, "false", "", "")
Catch ex As Exception
Dim strErrorMessage As String
strErrorMessage = " ERROR IN " & MODULE_NAME & "." & FUNCTION_NAME & _
" ERRSOURCE: " & Err.Source & _
" ERRCODE: " & Err.Number & _
" ERRDESC: " & Err.Description & _
" ERRLINE: " & Erl()
InformationManager.HandleError(MODULE_NAME, FUNCTION_NAME, strErrorMessage, InformationManager.LOG_TYPE_ERROR)
Err.Clear()
Finally
End Try
End Function
  • defaultLogon: Axapta'ya bağlanacak kullanıcı. configuration: Axapta'ya bağlantı kuracağımız konfigürasyon'un ismi. company: Axapta da şirket ismi. Password: Axapta'ya bağlanacak kullanıcının parolası. Bu örnekte kullanıcımız Axapta'da tanımlı normal Axapta kullanıcısıdır.
  • axapta = New AxaptaCOMConnector.Axapta2 Axapta değişkenimizi new'leyerek yeni bir nesne olarak tanımlıyoruz.
  • axapta.Logon2(defaultLogon, Password, company, "", "", "", configuration, "false", "", "") Axapta2 arabirimini kullanarak IAxapta2::Logon2 fonksiyonu ile Axapta'ya bağlanıyoruz. Diğer parametrelerini görmek için bir önceki makalemizi inceleyebilirsiniz.
  • InformationManager.HandleError bir hata olması durumunda hatayı sistem event log 'una kayıt atar.
Axapta'ya bağlandıktan sonra aynı Axapta nesnesini kullanarak Axapta içinde bulunan Global Class ına ait operatingSystem metod'unu çağırmaya çalışalım.

Private Function getOSName() As String
Dim result As Object
Try
result = axapta.CallStaticClassMethod("Global", "operatingSystem",
Nothing, Nothing, Nothing, Nothing, Nothing, Nothing)
If (Not result Is Nothing) Then
Return result.ToString()
Else
Return Nothing
End If
Catch ex As Exception
Finally
If Not axapta Is Nothing Then
Try
axapta.Logoff()
Catch ex As Exception
End Try
End
If
End Try
End Function


  • Bu fonsiyon bize kullandığımız operasyon sistemimizi döndürecektir.
  • result = axapta.CallStaticClassMethod("Global", "operatingSystem", Nothing, Nothing, Nothing, Nothing, Nothing, Nothing) Axapta2 arabiriminin IAxapta::CallStaticClassMethod fonksiyonunu kullandık. Hatırlayacağınız gibi CallStaticClassMethod fonksiyonunun ilk parametresi Class ismi ikinci parametresi ise Class'a ait metod du.
  • result.ToString() operatingSystem metodu tarafından dönen değer.
  • axapta.Logoff() sistemle bağlantımızı keser.

Bir de bizim yazdığımız bir Axapta Class'ını nasıl çağıracağımıza bakalım. Yukarıda yazdığımız fonksiyonu da kullanalım. Yazacağımız örnekte bir recordSet'i göndermeye çalışacağız.

Private Function CallAxaptaClassMethod(ByVal axRecorset As ADODB.Recordset, ByVal strAxMethodName As String)
Const FUNCTION_NAME = "CallAxaptaClassMethod"
Dim osName As String
Dim returnd As Object
Dim ssss As String
Try
osName = getOSName()
If Not osName Is Nothing Then
axapta.TTSBegin()
returnd = axapta.CallStaticClassMethod("dataInAxapta", strAxMethodName, axRecorset, Nothing, Nothing, Nothing, Nothing, Nothing)
axapta.TTSCommit()
Else
Throw New Exception("Axapta Connection Not Setvvvv")
End If

Catch ex As Exception
Dim strErrorMessage As String
axapta.TTSAbort()
If Not axapta Is Nothing Then
axapta.Logoff()
End If
strErrorMessage = " ERROR IN " & MODULE_NAME & "." & FUNCTION_NAME & _
" ERRSOURCE: " & Err.Source & _
" ERRCODE: " & Err.Number & _
" ERRDESC: " & Err.Description & _
" ERRLINE: " & Erl()
InformationManager.HandleError(MODULE_NAME, FUNCTION_NAME, strErrorMessage, InformationManager.LOG_TYPE_ERROR)
Err.Clear()
Finally
End Try
End Function
  • Bu örnekte CallStaticClassMethod kullanarak bizim tanımladığımız dataInAxapta Class'ımızın strAxMethodName parametresi ile belirtiğimiz metod 'u çağırıyoruz. Gördüğünüz gibi bir recordset'i de parametre olarak göndere biliriz.

Şimdi son olarak Axapta da bu işlemi nasıl karşılayacağımızı görelim.

Static boolean axaptaCOM(COM _recordSet)
{
CCADORecordSet CCADORecordSet;
;
try
{
CCADORecordSet = new CCADORecordSet(_recordSet);

while (!CCADORecordSet.EOF())
{
Alan = CCADORecordSet.fields().itemName("Alanİsmi").value();
...................

CCADORecordSet.moveNext();
}
return true;
}

catch(Exception::Error)
{
.................
return False;
}
....................
}
}
  • Dikkate ederseniz VB.Net ile gönderdiğimiz recordset 'i bir COM nesnesi olarak içeri alıyoruz. Bunu bir recordset'e dönüştürmemiz için Axaptada tanımlanmış CCADORecordSet Class'ını kullanabiliriz. Axapta isimlendirmesi biraz garip olduğu için aramalarda bulamaya bilirsiniz ama CC ile başlayan Class'ların çoğu bu tür işlemler için hazırlanmış Class'lardır. İncelemenizde fayda olduğunu düşünüyorum.

Daya çok bilgi için http://msdn2.microsoft.com/en-us/library/default.aspx sayfasını ziyaret edebilirsiniz.

Volkan Acar

volkan.vacar@gmail.com

Dynamics AX 3.0 'da Axapta Business Connector (COM+ )-2

Axapta Business Connector (COM+ nesnesi) 'e ister Vb ister Vb.net istersek C# kullanarak erişiyor olalım, COM+ nesnesi üzerinden Axapta'ya erişimimizi sağlayacak Axapta Interface (arabirim)'ine ait fonksiyonlardan en çok kullanılanları tanımaya çalışacağız.

Axapta'ya erişmemizi sağlayan ve IAxapta a olarak bilinen arabirimler, IDisPatch arabiriminden türetilmiştir.

IAxapta arabirimini kullanarak yaratabileceğimiz nesneler(Object) Class Object, Record(Kayıt) Object, Container Object ve Buffer Object dir.

Axapta Business Connector'e baktığımızda üç tane IAxapta arabirimi göreceksiniz (AxaptaCOMConnector.Axapta.1, AxaptaCOMConnector.Axapta.2.1, AxaptaCOMConnector.AxaptaParameterList.1) AxaptaCOMConnector.Axapta.2.1 arabirimi AxaptaCOMConnector.Axapta.1 arabiriminin bir üst versiyonudur. Axapta 2.1 de sadece logon metod'unda değişiklik yapılmıştır. Tavsiyem sizin de 2. versiyonu kullanmanız yönündedir.

Şimdi fonksiyonları tanımaya çalışalım:

IAxapta::CreateObject :

Bu fonksiyon Axapta'da tanımlı bir Class'ımızı nesne(objects) olarak yaratmamızı sağlar. Nesne(Objects) olarak yarattığımız Class'ımıza ait metod'ları IAxaptaObject::Call ve IAxaptaObject::CallEx fonksiyonları ile çağırabiliriz.

CreateObject(
[in] BSTR bstrClass,
[in, optional] VARIANT v1,
[in, optional] VARIANT v2,
[in, optional] VARIANT v3,
[in, optional] VARIANT v4,
[in, optional] VARIANT v5,
[in, optional] VARIANT v6,
[out, retval] IAxaptaObject **ppObject
)

Paramerteler

bstrClass : Yaratacağımız nesnenin ismi. (Axaptada bulunan Class ismi)
v1-v6: Metod'a ailt parametrelere üyeleri. Bu parametre bilgisini göndermek isteğe bağlıdır.
ppObject: Fonksiyonun döndürdüğü değer, yaratılan COM nesnesine ait pointer.

MyObject = Axapta.CreateObject("MyClass", "new parameter1", 2)

IAxapta::CallStaticClassMethod

Bu fonksiyon Axapta içinde bulunan Class ve Class'a ait static metod'unu çağırmayı sağlar. En çok kullanılan fonksiyonlardan birisidir.

CallStaticClassMethod(
[in] BSTR bstrClass,
[in] BSTR bstrMethod,
[in, optional] VARIANT v1,
[in, optional] VARIANT v2,
[in, optional] VARIANT v3,
[in, optional] VARIANT v4,
[in, optional] VARIANT v5,
[in, optional] VARIANT v6,
[out, retval] VARIANT *pResult
)

Parametreler

bstrClass : Static metod'u olan Class ismi
btsMethot: bstrClass parametresinde kullandığımız Class'a ait Static Metod ismi. Metod mutlaka Static olaması gerekir.
v1-v6: Metod'a ailt parametrelere üyeleri. Bu parametre bilgisini göndermek isteğe bağlıdır. Dikkat edilirse parametre olarak Variant tipi değişkenler kullanıyoruz. Axapta'ya string, XML,Recordset vb. kullana biliriz. Bu değişkenleri Axapta tarafında COM değişkeni ile karşılayacağız makalemizin ilerleyen bölümlerinde bu konudaki örneklerimizi göreceksiniz.
ppObject: Fonksiyonun döndürdüğü değer, yaratılan COM nesnesine ait pointer.

IAxapta arabirimine ait fonksiyonlara baktığımızda fonsiyonlarının bazılarının sonunda Ex bulunan versiyonlarını göreceksiniz. Ex'li olan versiyonlar kullandığımız 6 parametrenin yerine yada 6 parametreden fazla parametre kullanmamız gerektiğinde bir parametre listesi kullanmamızı sağlayan fonsiyonlardır. (IAxaptaParameterList) Neden 6 parametre sorusu da aklınıza geliyor olabilir. Bunun cevabı ise bir fonksiyonun yada metod'un 6 dan fazla parametre kullanması o foksiyonun veya metod'un esnekliğini bozar. Bu konu hakkındaki daha geniş bilgiyi genel yazılım kuralları konusundaki makalelerde veya ilgili kitaplarda bulabilirsiniz.

txt = Axapta.CallStaticClassMethod("MyClass", "MyMethod", "parameter1", 2)

IAxapta2::Logon2

Axapta sistemine bağlanmamızı (Connect) olmamızı sağlar.

Logon2(
[in, optional] VARIANT user,
[in, optional] VARIANT userPassword,
[in, optional] VARIANT company,
[in, optional] VARIANT language,
[in, optional] VARIANT serverManager,
[in, optional] VARIANT objectServer,
[in, optional] VARIANT configuration,
[in, optional] VARIANT isWebUser,
[in, optional] VARIANT reserved2,
[in, optional] VARIANT reserved3
)

Parametreler

user: Sisteme bağlanacak kullanıcı. Bu parametre bilgisini göndermek isteğe bağlıdır.
userPassword:Sisteme bağlanacak kullanıcının parolası. Bu parametre bilgisini göndermek isteğe bağlıdır.
company:Bağlanılacak şirket bilgisi. Bu parametre bilgisini göndermek isteğe bağlıdır.
language:Dil bilgisi. Bu parametre bilgisini göndermek isteğe bağlıdır.
serverManager:Bağlanacak server manager bilgisi. Bu parametre bilgisini göndermek isteğe bağlıdır.
objectServer:Bağlanacak object server bilgisi. Bu parametre bilgisini göndermek isteğe bağlıdır.
configuration: Axaptaya bağlanacağımız konfigürasyonun ismi. Bu parametre bilgisini göndermek isteğe bağlıdır.
isWebUser: user olarak normal Axapta kullanıcısı mı ? Yoksa Web kullanıcısı mı ? bağlanacak. Bu parametre bilgisini göndermek isteğe bağlıdır.
reserved2-reserved2: ileride kullanılmak üzere ayrılmış parametreler. Bu parametre bilgisini göndermek isteğe bağlıdır.

Gördüğünüz gibi sisteme bağlanmamız sağlayan bir çok parametre bulunmaktadır. Bu parametrelerden user, userPassword, configuration en çok kullanılan parametrelerdir. Sağlıklı bir şekilde bağlanmamız için bu parametreler yeterlidir. "Axapta Configuration Utility" de belirtilen parametrelerin çoğunu tanımlamaktayız. Doğru ve istenilen şekilde çalışan bir "Axapta Configuration" 'u ve yetki tanımlaması yapılmış normal Axapta kullanıcı ile sorunsuz bir şekilde bağlantı kurabilirsiniz. Aslında dikkat edecek olursanız normal kullanıcılarımızda aynı yöntemle Axapta'ya bağlanmaktadırlar.

Bir kaç kritik noktayı belirmek gerekir. Eğer web kullanıcı ile bağlanacaksak isWebUser bilgisi sıfırdan farklı olmalı ve web kullanıcısının sistemde tanımlı olması gerekir. Unutmayalım ki web kullanıcısının şirket tanımı sabittir.

serverManager ve objectServer parametreleri three-tiered yapılarda kullanılır. two-tiered yapılarda kullanılmaz.

Axapta.Logon2 "MyUserName", "MyPassword", "", "", "", "", "MyConfiguration"

IAxapta::Logoff

Sistemle bağlantıyı keser. İşlemimiz bittiğinde bu fonksiyonu çalıştırmayı unutmamalıyız.

Axapta.Logoff

IAxapta::Stop

Eğer COM+ nesnesi çalışıyorsa nesneyi kapatır. Logon fonksiyonu ile axaptaya bağlandığımızda COM+ nesnesi çalışmaya başlayacaktır. Durumunu Component Services den kontrol edebilirsiniz.

IAxapta::TTSAbort , IAxapta::TTSBegin , IAxapta::TTSCommit

Axapta X++ kodunda kullandığımız TTSBegin,TTSCommit ve TTSAbort fonksiyonlarını çağırır . Axapta içinde kullandığımız şartların tamamı için burada da kullanmalıyız.

Axapta.TTSBegin, Axapta.TTSCommit, Axapta.TTSAbort

Sonraki makalelerimizde bu fonksiyonlardan bazılarının kullanım şekillerini göreceğiz.

Tüm foksiyonları görmek yada daha fazla bilgi edinmek için; benim de kaynak olarak kullandığım Axapta Client klasörü içinde bulunan bin klasöründeki ''AxDvgCOMUs.chm" isimli yardım dökümanını okuya bilirsiniz.

Eğer COM+ nesneleri hakkında daha fazla bilgi almak isterseniz http://msdn.microsoft.com/library/en-us/dnanchor/html/complus_anchor.asp sayfasında bulunan bilgilere göz atabilirsiniz.

Volkan Acar

volkan.vacar@gmail.com