Merhaba
Axapta standardında herhangi bir tablonun satırına istediğiniz kadar belge ekleyebilirsiniz.
Bunun için öncelikle Temel / Belge Yönetimi” altındaki tanımları yapmanız gerekmektedir.
Belge Yönetimi menüsü altında:
1.Belge Tipleri
Farklı belge tipleri tanımlayıp bunların farklı klasörlerde tutulmasını sağlayabilirsiniz.
Genel sekmesinde bulunan tanımlarla birçok esnekliği otomatik şekilde tanımlayabilirsiniz. Örneğin silinen dosyanın sadece kaydını silme veya hem kaydı hemde fiziksel dosyayı sılme işlermlerini seçebilirsiniz.
2.Etkin belge tabloları
Burda Axtablolarının bir listesi var Belge ekleme ikonunun görünmesiniistediğiniz tabloyu burdan seçmelisiniz.
3.Parametreler
Parametrelerde Belge tiplerini numara serisinivbtanımları yapabilirsiniz.Burada bulunan arşiv dizini tnaımlamasını yapmayı unutmayın.
Burdaki tanımlamalar bittikten sonra Belge eklemenin etkin olduğu tablonun formunda Aşşağıdaki ikon görünür. İkona tıklayarak gerekli belgeleri ekleyebilir. Yeni Excel Word ve txt dosyayısı oluşturabilirsiniz. Daha Önce oluşturduğunuz dosyalarıda buradan takip edebilirsiniz.
Peki bu belge yönetiminde farklı isteklerle karşılaşırsanız neler yapabilirsiniz bunları konuşalım.
Bir müşterimizde şöyle bir istek oldu: Firmadaki bütün personellerin sicil belgeleri pdf formatında axaptada tutulmak istendi .
1000 personel olduğunu ve bunların 10 tane dosyası olduğunun ve personel değişimlerinide göz önüne alınca bir klasörde bütün dosyaların tutulmasının sistem açısında sakıncalı olacağı düşünülü bu yüzden dosyaların farklı klasorlerde tutulacağı bir geliştirme istedi.
Bizim bu isteğe cevap vermek için yaptığımız bazı işlemleri anlatayım. Öncelikle bir tablo form yapıp kişinin gerekli olna belgelerinin kayıtlarını burada oluşturabilmelerini sağladık. DocuViewformu axaptanın standart belge eklem formudur tablosu DocuRef ve DocuValue dur ayrıca işlemler Docu , DocuAction ,DocuActionArchive vb claslarda yapılmaktadır . yeri gelince değineceğim.
DocuView formunun initinde şu kodu yazarak kendi tablomdan çağırıldığını anlayabilirim
if (element.args().dataset() == tablenum(ETGDocuMan)) { callerForm = element.args().caller(); // çağıran formun ismi ETGDocuMan = element.args().record(); // benim oluşturduğum tablo }
bu sayede formdaki işlemleri kendi ihtiyaçlarıma göre özelleştirebilirim.
Bir örnek : ben açtığım dosya eklemede kendimin oluşturduğu tek tipte dosya eklensin istiyorum. Standart dosya eklemde bir çok seçenek karşınıza çıkar
if(callerform)
{
if(callerForm.name() == formStr(ETGDocuMan))
{
DocuRef.EmplId = ETGDocuMan.EmplId;
while select docuType
index TypeIdx
where docuType.TypeId == ETGDocuSetup::find(ETGDocuMan.DTDocuType).DocuTypeId
{
itemButtonCtrl = menuCtrl.addControl(FormControlType::MenuFunctionButton,docuType.TypeId);
itemButtonCtrl.menuItemType(MenuItemType::Action);
itemButtonCtrl.menuItemName(menuitemactionstr(ETGDocuActionNew)); // DocuAction clasından çogalttığım ve bazı kısımları kendime göre özelleştirdiğim clasımı çağırıyorum
itemButtonCtrl.text(docuType.TypeId);
}
}
}
else
{
while select docuType
index TypeIdx
{
itemButtonCtrl = menuCtrl.addControl(FormControlType::MenuFunctionButton,docuType.TypeId);
itemButtonCtrl.menuItemType(MenuItemType::Action);
itemButtonCtrl.menuItemName(menuitemactionstr(DocuActionNew));
itemButtonCtrl.text(docuType.TypeId);
}
}
DocuActionArchive clasının add metodunda eklenecek olan dosyanın yolu parametrelerden alınıp belirleniyor. Biz burayı değiştireceğiz
//———————————————————
if(_docuRef.EmplId) // emplId yi biz tabloya kaydediyoruz kendiaçtığımız bir sutun olduğu için sadece bizim formda doldurulduğundan eminiz
docuFilename = _docuRef.ETGpath(_docuRef.EmplId)
+ strfmt(“%1-%2-%3”,_docuRef.EmplId, _docuRef.TypeId, smmDocuments::getNonExistingFileName(numSeq,_docuRef.ETGpath(_docuRef.EmplId),this.fileType()))
// Dosya ismini medifiye ediyoruz dosya ismi şöyle oldu ” emplId-dosyaturu-numara serisi.tipi”
//burada onemli olan başka bir kısım “docuRef.ETGpath()” docuref tablosunda path metodu var biz ETGpath metodu yazıp onu çağırıyoruz.Ve burada EmplId ye göre klsor oluşturup oraya kayıt edilmesini sağlayacağız.
+ ‘.’
+ this.fileType(); //new Filename
//uses curFileType
else
docuFilename = _docuRef.path()
+ smmDocuments::getNonExistingFileName(numSeq,_docuRef.path(),this.fileType())
+ ‘.’
+ this.fileType(); //new Filename
//uses curFileType
//———————————————————–
docuRef.ETGpath metoduna bakalım
// Changed on 26 Kas 2010 at 14:00:29 by etg-f
// Belge yönetimi personelin numarasına göre klasör oluşturup belgeleri tutma işlemi
FilePath ETGpath(EmplId _EmplId)
{
#WinApi
DocuValue docuValue;
DocuType docuType;
FilePath filePath;
FilePath tempDirectory;
Query q;
dataAreaId actualCompanyId;
boolean callFromEP;
FileIOPermission fileIOPerm;
InteropPermission permission;
FilePath endSlash(FilePath _filePath)
{
return Docu::fileCheckPath(_filePath);
}
;
callFromEP = global::clientKind() == ClientType::COMObject;
actualCompanyId = this.ActualCompanyId ? this.ActualCompanyId : curext();
changecompany (actualCompanyId)
{
docuType = this.docuType();
// Only use docuValue.path when nocopy
if (docuType.RecId && docuType.FilePlace == DocuFilePlace::NoCopy)
{
docuValue = this.docuValue();
if (docuValue.RecId && docuValue.Path)
{
// Specific path – eg. when docuType.fileplace == DocuFilePlace::NoCopy
filePath = endSlash(docuValue.Path);
if (callFromEP)
{
fileIOPerm = new FileIOPermission(filePath, ‘r’);
fileIOPerm.assert();
// BP Deviation Documented
if (! WinAPIServer::pathExists(filePath))
throw error(strfmt(“@SYS90169”,filePath));
}
else
{
if (! WinAPI::pathExists(filePath))
throw error(strfmt(“@SYS90169”,filePath));
}
return filePath;
}
}
// Nocopy or archive
if (docuType.RecId && docuType.FilePlace != DocuFilePlace::Database)
{
if (docuType.ArchivePath)
{
// Type archivepath
filePath = endSlash(docuType.ArchivePath);
// TODO parametreye alınacak
// Biz yolu burda tanıumlıyoruz her EmplId için
filePath = strfmt(“C:\\fd\\%1\\”,_EmplId);
// filePath izinlerini veriyoruz
permission = new InteropPermission(InteropKind::ClrInterop);
permission.assert();
if (callFromEP)
{
fileIOPerm = new FileIOPermission(filePath, ‘r’);
fileIOPerm.assert();
}
// eğer EmplId ye göre klasor yoksa oluşturuyoruz
if(!System.IO.Directory::Exists(filePath))
{
WinAPI::createDirectoryPath(filePath);
}
if (filePath && ! (callFromEP ? WinAPIServer::pathExists(filePath) : WinAPI::pathExists(filePath)))
{
q = new Query();
q.addDataSource(tablenum(DocuType)).addRange(fieldnum(DocuType,TypeId)).value(queryValue(docuType.TypeId));
throw error(strfmt(“@SYS90175″,filePath),”,
SysInfoAction_FormrunQuery::newFormnameControlnameQuery(
formstr(docuType),
identifierstr(Setup_ArchivePath),q));
}
return filePath;
}
return endSlash(Docu::archivePath());
}
}
if (Session::isBusinessConnector())
{
// Use .NET to return the temporary directory on the
// Server or BC.NET tiers
new InteropPermission(InteropKind::ClrInterop).assert();
tempDirectory = endSlash(System.IO.Path::GetTempPath());
CodeAccessPermission::revertAssert();
return tempDirectory;
}
return endSlash(WinAPI::getFolderPath(#CSIDL_INTERNET_CACHE));
}
artık girilen EmplId ye göre Klasor oluşturup belgesini kaydedebiliyoruz.
kayıt işlemi böyle edit ve silme işlemlerinde de güncelleme yapmak gerekiyor . Yazdıklarımız ışında onlarıda kolayca yapabilirsiniz.
fırsat bulduğumda bu gelişitmenin XPO sunu ekleyeceğim.
Selamlar.