다음 소스는 Dynamics AX의 레코드에 첨부된 파일을 로컬 폴더에 저장하는 코드입니다.

하나의 레코드에 첨부된 여러 파일 또는 여러개의 레코드에 첨부된 파일을 로컬 폴더에 일괄 저장 할 수 있습니다.


public void FileDownload()
{
    BinData     binData;
    Filename _fileName;
    DocuRef docuRef;
    DocuValue   docuValue;

    docuRef = docuRef::find(curext(), 파일이 첨부된 레코드 ID);

    _fileName = "저장할 파일명과 경로";

    docuValue = docuRef.docuValue();

    binData = new BinData();

    binData.setData(docuValue.File);
    binData.saveFile(_fileName);
}


Happy DAXing!!

Posted by Isaac Lee

Dynamics AX는 레코드 별로 파일을 첨부하여 저장할 수 있습니다.

다음 소스는 UI가 아닌 X++ 로 특정 레코드에 파일을 첨부하는 기본코드입니다.

이를 활용하면 필요에 따라 다중 파일 일괄 업로드도 가능합니다.


public void multiFileUpload()
{
    DocuRef docuRef;
    DocuActionArchive archive;
    Filename _fileName;
    FilePath _filePath;

    _fileName = "업로드 파일 명 (전체경로)";

    if(WinAPI::fileExists(_fileName))
    {
        ttsBegin;
        docuRef.clear();
        docuRef.RefRecId = 첨부할 테이블의 레코드ID;
        docuRef.RefTableId = 첨부할 테이블 No.; // 예) tableNum("CustTable");
        docuRef.RefCompanyId = curext();
        docuRef.Name = _fileName;
        docuRef.TypeId = 'File';
        docuRef.insert();

        archive = new DocuActionArchive();
        archive.add(docuRef, _fileName);
        ttsCommit;
    }
}


Happy DAXing!!

Posted by Isaac Lee

AX의 Server측에서 실행되는 Batch나 Job 실행시 WinAPI를 사용할 경우 'Microsoft.Dynamics.Ax.Xpp.InvalidRemoteCallException' was thrown. 메시지가 표시되며 작동하지 않는다. 이 경우 WinAPI 대신 WinAPIServer를 사용하면 된다.


오류 화면 : 

수정 소스 :


Happy Daxing!!




Posted by Isaac Lee

Dynamics AX의 Form에서 탭으로 컨트롤의 포커스 이동시 기본 순서는 아래와 같이 위->아래, 좌->우의 순서로 이동합니다.


이를 개발자가 원하는 순서로 변경하기 위해서는 다음과 같이 form의 Init 메소드에서 조정이 가능합니다.

public void init()
{
    Array tabOrder = new Array(Types::Integer);

    super();

    tabOrder.value(1, NormalControl.id());

    tabOrder.value(2, Column sized Control.id());

    tabOrder.value(3, Control1.id());
    tabOrder.value(4, Control3.id());
    tabOrder.value(5, Control2.id());
    tabOrder.value(6, Control4.id());

    element.tabOrder(tabOrder);
}


Happy Daxing!!





Posted by Isaac Lee

Dynamics AX에서 Display method에 Database query를 사용하여 Field를 표시하는 경우가 종종 있습니다. 아주 유용하긴 하지만 과도하게 많이 사용할 경우 Display 필드의 표시 특성상 화면을 움직이거나 스크롤바 이동, 커서 이동등을 사용한 레코드 이동시에 속도를 따라가지 못하여 화면이 물결 치는(?) 현상이 나타나게 됩니다. 이는 해당 필드를 표시해야 할 필요성이 있을 때마다 DB에 Query를 보내기 때문인데 이를 조금이나마 줄여주면 성능이 개선 될 수 있습니다.

아래 소스는 Form의 Datasource에 Display Method를 만들어야 합니다.

1. classDeclaration 에 Map 선언

public class FormRun extends ObjectRun
{
    Map localMap;
}


2. 조회 버튼 클릭시 Map 초기화

void clicked()
{
    boolean ret = true;

    super();

    localMap = new Map(Types::Record, Types::Real);  // Unique Key 값을 사용

}


3. Form Datasource의 Display Method 

display InventQty getQty(FormDataSource _view)
{
    InventQty _returnQty;

    if (localMap.exists(_view))

    {
        _returnQty = localMap.lookup(_view);
    }
    else
    {
        select query 구문;

        _returnQty = Query 결과값;

        localMap.insert(_view, _returnQty);
    }

    return _returnQty;
}


Happy Daxing!!

Posted by Isaac Lee

텍스트 파일을 읽어서 지정 문자열을 치환하는 소스입니다.


str file = @'파일명';

TextBuffer tb = new TextBuffer();

tb.fromFile(file);

tb.replace("대상 문자열", "치환 문자열");

tb.toFile(file);



Happy Daxing;

Posted by Isaac Lee

어느정도 AX 개발에 익숙하신 분들은 굳이 ERD가 없어도 큰 불편함을 느끼지 못하지만 Microsoft DynamicsAX 2012 R2 의 ERD가 필요하신 분은 아래 사이트를 참조하시기 바랍니다.

 

Happy DAXing!!

 

http://www.microsoft.com/dynamics/ax/erd/ax2012r2/

 

 

Posted by Isaac Lee

Dynamics AX의 View Detail (Go to main table) 기능을 수정 하려면 아래처럼 jumpRef() 메소드를 Override 하면 됩니다. 아래 코드는 2012이전 버전에서도 작동합니다.

 

public void jumpRef()
{

    EmplTable emplTable;
    Args args;
    MenuFunction menuFunction;

    emplTable = EmplTable::find(EmplID);
    if (!emplTable)
    {
        return;
    }


    args = new Args();
    args.caller(element);
    args.record(emplTable);
    menuFunction = new MenuFunction(menuitemdisplaystr(EmplTable), MenuItemType::Display);
    menuFunction.run(args);
}

Posted by Isaac Lee

DynamicsAX 2012에서 재고이동분개장 (Invent Transfer Journal)을 생성 > 포스팅 > 분개장 화면 오픈 하는 소스입니다.

ItemId나 Qty 등 적절히 수정하여 사용하세요.

 

// 선언부

InventJournalTable      journalTable;
InventJournalTableData  journalTableData;
InventJournalTrans inventJournalTrans;
InventDim          toInventDim;
    
Args args = new Args();    
JournalCheckPost        journalCheckPost;

 

// 분개장 헤더 생성
journalTable.clear();
journalTable.JournalNameId  = InventParameters::find().TransferJournalNameId;
journalTableData            = JournalTableData::newTable(journalTable);
journalTable.JournalId      = journalTableData.nextJournalId();
journalTable.Reservation    = ItemReservation::Automatic;
journalTable.JournalType    = InventJournalType::Transfer;

journalTableData.initFromJournalName(journalTableData.JournalStatic().findJournalName(journalTable.jourNameId));
journalTable.Description    = "분개장 생성";
journalTable.insert();
    
// 분개장 라인 생성
inventJournalTrans.JournalId      = journalTable.JournalId;
inventJournalTrans.JournalType    = InventJournalType::Transfer;
inventJournalTrans.TransDate      = systemdateget();
inventJournalTrans.ItemId         = ItemId;
inventJournalTrans.Qty            = Qty;

inventJournalTrans.InventDimId    = FromInventDimId;
inventJournalTrans.initFromInventTable(InventTable::find(ItemId), False, False);

toInventDim.inventSiteId         = toInventDim.InventSiteId;
toInventDim.InventLocationId     = toInventDim.InventLocationId;
inventJournalTrans.ToInventDimId = InventDim::findOrCreate(toInventDim).inventDimId;
inventJournalTrans.insert();
    
// 분개장 Posting
journalCheckPost = InventJournalCheckPost::newPostJournal(journalTable);

if(journalCheckPost.validate())
{
    try
    {
        journalCheckPost.run();
    }
    catch
    {
        journalTable.delete();
    }
}
    
// 분개장 화면 Open
args.record(inventJournalTable);
new MenuFunction(MenuItemDisplayStr(InventJournalTableTransfer),MenuItemType::Display).run(Args);

 

Posted by Isaac Lee

AX 2012 공인 매뉴얼 제본판입니다. 책상에 올려두었는데 다른 책들에 밀려 더이상 보관할 공간이 없네요. ㅜㅜ

혹 필요하신 분이 있을라나요~ 책상태는 부끄럽게도 아~주 깨끗하답니다.

 

Posted by Isaac Lee