X++에서 XML 파일로 데이터 저장하고 읽기

Posted by Alvin You
2014. 8. 2. 09:35 Dynamics AX/Development

오늘은 AX의 데이터를 XML 파일로 저장 후 다시 데이터를 읽어 오는 샘플 코드를 보여 드릴까 합니다. 외부 시스템과의 데이터 교환을 DB-To-DB 형태로 교환 할 수도 있지만, 특정 시스템들은 XML 파일로 주고 받을 수 있기 때문에 시스템 구축시 아래 코드가 도움이 되었으면 좋겠습니다.

  • VendTable에서 데이터를 읽어와 vendList.xml 파일로 저장

static void ZSPK_CreateXMLFile(Args _args)

{

XmlDocument doc;

XmlElement nodeXml;

XmlElement nodeTable;

XmlElement nodeAccount;

XmlElement nodeName;

VendTable vendTable;

Filename fileName;

int i;

#WinAPI

;

 

doc = XmlDocument::newBlank();

nodeXml = doc.createElement('xml');

doc.appendChild(nodeXml);

 

while select vendTable order by vendTable.AccountNum

{

i++;

nodeTable = doc.createElement(tableStr(VendTable));

nodeTable.setAttribute(fieldStr(VendTable, RecId), int642str(vendTable.RecId));

nodeXml.appendChild(nodeTable);

 

nodeAccount = doc.createElement(fieldStr(VendTable, AccountNum));

nodeAccount.appendChild(doc.createTextNode(vendTable.AccountNum));

nodeTable.appendChild(nodeAccount);

 

nodeName = doc.createElement(fieldStr(vendTable, ZSPK_Name));

nodeName.appendChild(doc.createTextNode(vendTable.ZSPK_Name));

nodeTable.appendChild(nodeName);

 

if (i == 5) break;

}

 

fileName = WinAPI::getFolderPath(#CSIDL_PERSONAL);

fileName += '\\vendList.xml';

doc.save(fileName);

info("완료");

}

 

  • vendList.xml 파일을 읽어오는 코드 샘플 코드

static void ZSPK_DataSetRead(Args _args)

{

System.Data.DataSet dataSet;

System.Data.DataTableCollection dataTableCollection;

System.Data.DataTable dataTable;

System.Data.DataRowCollection dataRowCollection;

System.Data.DataColumnCollection dataColumnCollection;

System.Data.DataRow dataRow;

System.Data.DataColumn dataColumn;

int i,j,TotalCol,TotalRow;

str _xml;

;

 

dataSet = new System.Data.DataSet();

dataSet.ReadXml(@"C:\Users\Administrator\Documents\vendList.xml");

dataTableCollection = dataSet.get_Tables();

dataTable = dataTableCollection.get_Item(0);

dataColumnCollection = dataTable.get_Columns();

dataRowCollection = dataTable.get_Rows();

TotalRow = dataRowCollection.get_Count();

TotalCol = dataColumnCollection.get_Count();

 

for (i=0;i < TotalRow; i++)

{

dataRow = dataRowCollection.get_Item(i);

//setprefix(CLRInterop::getAnyTypeForObject(DataRow.get_item(i)));

for (j=0;j < TotalCol; j++)

{

//dataRow = dataRowCollection.get_item(i);

if (dataRow.IsNull(j))

_xml = 'null';

else

_xml = dataRow.get_Item(j);

 

info(strFmt("%1 - %2 - %3", i, j, _xml));

}

}

 

}

 

사용자가 Session Date 변경을 못하도록 권한 빼기

Posted by Alvin You
2014. 7. 30. 23:31 Dynamics AX

오늘은 Dynamics AX에서 과거 날짜의 Transaction Data를 발생시키기 위한 방법 중 하나인 File > Tools > Session date and time 메뉴에 대한 권한을 막는 방법에 대해서 설명해 드리겠습니다.

특정 권한을 가진 Key User(Power User)에게만 권한이 주어지면 좋겠지만 System User Role이라는 가장 기본적인 Role에 해당 권한이 들어가 있어 모든 사용자가 아래와 같은 날짜 변경 화면을 사용할 수 있도록 되어 있습니다.

 

결론을 말씀 드리면, Session Date and time 메뉴의 Entry Points인 SystemDate가 속한 ClientEssentials Privileges에서 해당 Entry Points를 빼고 새롭게 만든 Privileges에 해당 Entry Points를 넣으면 System User Role에 해당하는 일반 사용자에게서 해당 권한이 빠지게 됩니다.

Role

Duty

Privileges

Entry Points

System User

  

  

  

  

SysServerAXBasicMaintain

  

  

  

  

ClientEssentials

  

  

  

  

SystemDate

 

ERP 시스템에서 중요하게 다루어져야 하는 Transaction Date에 대해서 생각해 봤습니다.

X++에서 직접 SQL 실행하기

Posted by Alvin You
2014. 7. 29. 20:17 Dynamics AX/Development

X++에서 직접 SQL을 실행시키는 코드는 아래 내용을 참고 하시면 됩니다.

static void getCustomersDirectSQL(Args _args)

{

Connection userConnection;

Statement stmt;

str sqlString;

ResultSet rs;

;

 

userConnection = new Connection();

stmt = userConnection.createStatement();

sqlString = 'select * from custTable';

new SqlStatementExecutePermission(sqlString).assert();

rs = stmt.executeQuery(sqlString);

CodeAccessPermission::revertAssert();

 

while(rs.next())

{

// print rs.getString(1);

info(rs.getString(1));

}

}

Job에서 직접 코딩 후 실행시키면 아래와 같은 에러창이 뜨면서 실행이 되지 않습니다.

해당 코드는 Server 환경에서 실행되어야 하는데 Job에서는 해당 내용을 지시할 수 없어 아래 그림과 같이 Action Menu를 만들어 Run On 속성에서 Server를 지정해 주신 후 Action Menu를 실행시키시면 됩니다.

실행 결과 :