Axapta belge ekleme işlemleri

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.

 
  1. No comments yet.

  1. No trackbacks yet.