CSV ile Veri Aktarımı
Bir önceki konumuzda kod ile Excelden Axapta tablolarına nasıl veri atabileceğimizden bahsetmiştik. Bu konumuzda ise veri aktarımını bir diğer yöntemi olan CSV ile axapta tablolarına nasıl veri atabileceğimiz göstereceğim. Bu iki konu yazım olarakta birbirine benzese de csv ye has bazı özellikler mevcut ihtiyaca göre hangisi ile işlem yapacağınızı siz belirleyebilirsiniz.
Önceki konuda olduğu gibi bu konuda da kendi oluşturduğumuz tabloya csv ile nasıl kayıt atabiliriz onu göreceğiniz.
CSV şablonu ekteki gibidir. Excelde oluşturup CSV yede çevirebilirsiniz.
Not: Real alanlar için csv formatın da virgül değil nokta ile ayrılması gerekmektedir. Eğer virgül ile ayırılırsa Axapta tabloya alırken virgülden sonraki işlemleri değerlendirmiyor.
static void Erkn_CSVileVeriAktarim(Args _args) { Dialog dialog = new Dialog(); dialogfield dfile; AsciiIo importFile; str filePath, fileNameOnly; filetype type; container record; str Delimiter = ";"; //CSV de alanların ayracı bu şekilde tanımlanır int totalRecords; ItemId itemId; Name name; Qty qty; SalesPrice price; TransDate transDate; TestCSVAktarim testCSVAktarim; boolean retValidate = true; str retMessage; str rel; dfile = dialog.addField(extendedTypeStr(FileNameOpen), "Dosya seç", "Aktarılacak dosyayı seç"); dialog.caption("Dosya seçimi"); dialog.filenameLookupFilter(['csv','*.csv']); //Seçilecek dosyanın uzantıları ayarlanır if(!dialog.run()) { return; } [filePath, fileNameOnly, type] = fileNameSplit(dfile.value()); importFile = new AsciiIo(dfile.value(), 'R'); if((!importFile) || (importFile.status() != IO_Status::Ok)) { warning("Aktarılacak dosya açılamadı"); throw(Exception::Error); } importFile.inFieldDelimiter(Delimiter); //CSV de alanların ayracı kullanımı if((!importFile) || (importFile.status() != IO_Status::Ok)) { warning("Log dosyası açılamadı"); throw(Exception::Error); } try { ttsbegin; record = importFile.read(); while(importFile.status() == IO_Status::Ok) { record = importFile.read(); if(!record) break; totalRecords = totalRecords + 1; itemId = conPeek(record,1); name = conPeek(record,2); qty = conPeek(record,3); price = conPeek(record,4); transDate = str2Date(conPeek(record,5),2); testCSVAktarim.clear(); testCSVAktarim.ItemId = itemId; testCSVAktarim.Name = name; testCSVAktarim.Qty = qty; testCSVAktarim.Price = price; testCSVAktarim.TransDate = transDate; testCSVAktarim.insert(); } ttscommit; } catch(Exception::Error) { Throw(Exception::Error); } info(strFmt("Aktarılan kayıt sayısı: %1",totalRecords)); }
Sonuçta gördüğünüz excelde olduğu gibi istediğimiz alanları tabloya yazdırmış olduk. Gelen alanları değişkene atamadan direk tablonun alanınada eşitleyebilirdik veya çeşitli manuel kontrollerden geçirebilirdik. Bu şekilde bu Jobu metoda veya classa ekleyerek istediğiniz yerde kullanabileceğiniz bir hale getirebilirsiniz.
Eylül ayında paylaştığınız konuların hepsi çok işime yaradı kodların çalışır olması da uygulanabilmesini kolaylaştırıyor. Emeğiniz için teşekkürler.
Takip ettiğiniz ve yorumunuz için teşekkürler Filiz hanım. Size faydalı olduğuna çok sevindim. Konularımın takip edildiğini bildikçe ve fırsatım oldukça yeni konular paylaşmaya devam edeceğim.
Merhaba ,
Bir sorum var :
Formdaki alanda sağ click view detail seçimi yapıldığında ilgili detay formun açılması için ne yapmam gerekiyor?
Merhaba Filiz hanım,
Kendi formunuzdan ilgili alana sağ tuş view detail yapabilmeniz için iki yöntem vardır.
İlki ilgili alanınızın EDT sinde bir “Table Referans” belirlemeniz gereklidir ve bu tabloyla aynı isimde bir formunuz olması gerekmektedir.
Diğer yöntem ise ilgili alanın metodlarından JumpRef metodunu override ederek daha önce koddan form çağırma yöntemleriyle kendi gideceğiniz formu açabilirsiniz.
teşekkür ederim.
Teşekkür ederim bu kodu çok aramıştım sayenizde buldum