AX developerları olarak her projede çok fazla csv-excel aktarımları yazıyoruz. Bundan 6 yıl önce bir projede o kadar çok yazdım ki, en sonunda canıma tak etti ve aşağıda size tanıtacağım sınıfları yazdım. O günden beride bu sınıfları kullanıyorum, gerektikçe yeni özellikler ekleyerek geliştiriyorum.
Özellikleri
- Bu sınıflar ile aşağıdaki örneklerde de görebileceğiniz gibi dosyadan aktarım yazmak çok kısa sürüyor.
- Her seferinde dialog dan dosyanın path’ini al, formatını kontrol et,
döngüde dön dosyayı satır satır oku gibi kodları tekrar tekrar yazmaktan ve kod karmaşasından kurtuluyorsunuz. - Yazdığınız aktarımı csv’den excel’e çevirmek yada tam tersini yapmak 2 saniyenizi alıyor.
- Aktarım sırasında kayıt sayısını algılayıp, otomatik progress bar çıkararak işlenen / kalan kayıt sayısını gösteriyor.
- Hata alındığında, hatanın alındığı satır bilgisini otomatik dönüyor.
- Başlangıç-bitiş vererek dosyadan sadece istediğiniz satırları alabiliyorsunuz.
İndirme
Sınıfları buradan indirebilirsiniz. AX 2012 ve
D365 F&O için direkt çalışmaktadır. AX 2009’a ise ufak düzenlemelerle aktatıp kullanabilirsiniz.
XPO içinde aşağıdaki gibi 3 sınıf göreceksiniz.
- GvnImport
- GvnImport_Csv
- GvnImport_Excel
Bu 3 sınıfı AX’da içeri almanız yeterli. Ben çalıştığım her projede bu sınıfların prefixlerini, çalıştığımız partner’a göre düzenleyip aktarıyorum
(ObsImport, PRGImport, ETG, DMR vs…).
Kullanımı
Örnek olarak SalesPool tablosuna dosyadan kayıt aktaralım. Aşağıdaki resimdeki gibi 2 kolonlu bir dosya hazırlayın. Bunu ister csv ister excel olarak kaydedin.
- İndirdiğiniz yardımcı sınıfları ax’da içeri aldıktan sonra yeni bir sınıf oluşturuyoruz.
- Aktarım yapmak istediğimiz formata göre ilgili sınıfı extend ediyoruz. GvnImport_Csv yada GvnImport_Excel.
- main method’unu oluşturup sınıfı çağırıyoruz. Gerekli parametreleri burada tanımlayabiliriz.
- doEveryRow method’unu override edip, dosyanın her bir satırında yapmasını istediğimiz işlemi buraya yazıyoruz.
CSV Aktarımı
// Güven Şahin
// guvensahin.com
class GvnIMPSalesPoolCsv extends GvnImport_Csv
{
}
public static void main(Args _args)
{
GvnIMPSalesPoolCsv GvnIMPSalesPoolCsv;
;
GvnIMPSalesPoolCsv = new GvnIMPSalesPoolCsv();
GvnIMPSalesPoolCsv.parmCaption("Sipariş havuzları aktarımı - CSV");
if (GvnIMPSalesPoolCsv.prompt())
{
// 2. satırdan başla. kolon başlığını okuma
GvnIMPSalesPoolCsv.run(2);
}
}
protected void doEveryRow()
{
SalesPool SalesPool;
;
SalesPool.SalesPoolId = this.getCol(1);
SalesPool.Name = this.getCol(2);
SalesPool.insert();
}
Excel Aktarımı
// Güven Şahin
// guvensahin.com
class GvnIMPSalesPoolExcel extends GvnImport_Excel
{
}
public static void main(Args _args)
{
GvnIMPSalesPoolExcel GvnIMPSalesPoolExcel;
;
GvnIMPSalesPoolExcel = new GvnIMPSalesPoolExcel();
GvnIMPSalesPoolExcel.parmCaption("Sipariş havuzları aktarımı - Excel");
if (GvnIMPSalesPoolExcel.prompt())
{
// 2. satırdan başla. kolon başlığını okuma
GvnIMPSalesPoolExcel.run(2);
}
}
protected void doEveryRow()
{
SalesPool SalesPool;
;
SalesPool.SalesPoolId = this.getCol(1);
SalesPool.Name = this.getCol(2);
SalesPool.insert();
}
Parametreler
getCol | String olarak ilgili kolondaki değeri döner |
getColBoolean | Boolean olarak ilgili kolondaki değeri döner |
getColDate | Date olarak ilgili kolondaki değeri döner |
getColInt | Integer olarak ilgili kolondaki değeri döner |
getColInt64 | Int64 olarak ilgili kolondaki değeri döner |
getColReal | Real olarak ilgili kolondaki değeri döner |
parmFilePath | Okunacak dosya yolu. Prompt method’u çağrılırsa, dialog çıkararak kullanıcıdan alınır. |
parmCaption | Prompt method’unun çağırdığı dialogda gözükecek başlık |
parmDialogText | Prompt method’unun çağırdığı dialogda, caption’ın altındaki text. Genellikle kolon sıralaması bilgisi girilir. |
setUserDefinedRowNum | Bu parametre işaretli ise run method’una verilen start, end parametreleri geçersiz kılınır. Dialog’a okumaya başlanacak ve bitirilecek satır adında parametreler eklenir. |
setCsvSeperator | Csv dosyasında veriler arasındaki ayraç tanımlanır. Varsayılan olarak noktalı virgüldür. |
parmSheetNum | Excelde okunacak sheet (sayfa). Varsayılan olarak ilk sheet’e okur. |
getRowNum | Hata alınması vb durumlarda hatanın alındığı satır bilgisini döner |
isRowEmpty | İlgili satırın ilk kolonunda değer olup olmadığını kontrol eder. |
Aktarımları birbirine çevirmek
Bunun için tek yapmanız gereken extend ettiğiniz sınıfı değiştirmek. Bu kadar basit. Eğer run method’u gibi methodları override ettiyseniz yada
setCsvSeperator gibi csv’ye, parmSheetNum gibi excel’e özel methodları kullandıysanız, bunları düzenlemeniz gerekiyor.
Sınıfları buradan indirebilirsiniz.
Efsane :)