Sunday, 25 December 2016

Transaction Log - AX 2012 - Cannot create a record in Audit trail (TransactionLog)

 If you got the following error you might have for problems in the system sequence table.


 Just run the following in SSMS:



select * from SYSTEMSEQUENCES where id = -2

 and then

select * from TRANSACTIONLOG where CREATEDTRANSACTIONID > returnedID order by CREATEDTRANSACTIONID asc


 If you have any records returned by the second statement then you should look into why you have a lower system number saved.


To over come this issue, please find the below code modifications in Tables-->TransactionLog-->Methods-->create.
The existing Code:

if (appl.lastTransactionIdCreated() != appl.curTransactionId())
{
transactionLog.Type = _type;
transactionLog.Txt = _txt;

transactionLog.insert();

appl.lastTransactionIdCreated(transactionLog.CreatedTransactionId);

appl.transactionlogUpdateTTSControl().revoke();
}



The changes to make: 

if (appl.lastTransactionIdCreated() != appl.curTransactionId())
{
if (!TransactionLog::find(appl.curTransactionId()))
{
transactionLog.Type = _type;
transactionLog.Txt = _txt;

transactionLog.insert();

appl.lastTransactionIdCreated(transactionLog.CreatedTransactionId);
}
appl.transactionlogUpdateTTSControl().revoke();
}

http://axfaq.blogspot.com.eg/2013/09/transaction-log-ax-2012-cannot-create.html

Wednesday, 27 July 2016

Axapta 2012 set financial dimension x++

 InventTable _InventTable; 
    RecId _RecId;   
    DimensionAttributeValueSetStorage  dimStorage;
    Counter               i;
    DimensionAttribute         _dimAttribute;
    DimensionAttributeValue       _dimAttributeValue;
   
    
  while  select forUpdate _InventTable where _InventTable.ProdPoolId == '0101'
    {
    _RecId = _InventTable.RecId;
    
      dimStorage = DimensionAttributeValueSetStorage::find(_RecId);
    
     _dimAttribute = DimensionAttribute::findByName("AF_Department",false);
     _dimAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(_dimAttribute,"501",true,true);
     dimStorage.addItem(_dimAttributeValue);
      
     _dimAttribute = DimensionAttribute::findByName("AF_Product_Section",false);
     _dimAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(_dimAttribute,"01",true,true);
     dimStorage.addItem(_dimAttributeValue);    
        
     _dimAttribute = DimensionAttribute::findByName("AF_Product_Line",false);
     _dimAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(_dimAttribute,"0111",true,true);
     dimStorage.addItem(_dimAttributeValue);     
        
    _InventTable.DefaultDimension = dimStorage.save();
    _InventTable.update();
    info('Done ' + _InventTable.ItemId );
    }
    

Sunday, 24 July 2016

AX 2012 The simplest way to lookup the financial dimension in a form

In this article, giving an example for defining the lookup for dimensions in simple way.
This example will cover only for user Defined dimensions.
For this
1)      Created a form and added two string controls.
2)      Named as
Control: Name: Dimensionlist, Auto declaration – Yes
Control: Name: DimValues
3)      Override the lookup method for Dimensionlist

public void lookup()
{
Query           query;
SysTableLookup  sysTableLookup;
super();
sysTableLookup = SysTableLookup::newParameters(tableNum(DimensionAttribute), this);
sysTableLookup.addLookupfield(fieldNum(DimensionAttribute, Name));
query = new Query();
query.addDataSource(tableNum(DimensionAttribute)).
addRange(fieldNum(DimensionAttribute, Type)).
value(queryValue(DimensionAttributeType::CustomList));
sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();
}

------------------------------------------------------------------------------

4)      Override the lookup method for DimValues
public void lookup()
{
DimensionAttribute                  dimensionAttribute;
DimensionAttributeDirCategory       dimAttributeDirCategory;
Query                               query = new Query();
SysTableLookup                      sysTableLookup;
dimensionAttribute = DimensionAttribute::findByName(Dimensionlist.text());
super();
// Only user defined dimensions will have a financial tag category
if (dimensionAttribute.Type == DimensionAttributeType::CustomList)
{
select firstonly DirCategory from dimAttributeDirCategory where dimAttributeDirCategory.DimensionAttribute == dimensionAttribute.RecId;
sysTableLookup = SysTableLookup::newParameters(tableNum(DimensionFinancialTag), this);
// Add name field to be shown in the lookup form.
sysTableLookup.addLookupfield(fieldNum(DimensionFinancialTag, Value));
sysTableLookup.addLookupfield(fieldNum(DimensionFinancialTag, Description));
query = new Query();
query.addDataSource(tableNum(DimensionFinancialTag)).
addRange(fieldNum(DimensionFinancialTag, FinancialTagCategory)).
value(queryValue(dimAttributeDirCategory.DirCategory));
sysTableLookup.parmQuery(query);
// Perform the lookup.
sysTableLookup.performFormLookup();
}
}

Monday, 18 July 2016

Read XML string (elements, attributes, texts) [AX2012]

static void readXMLString(Args _args)
{
    // Define XML Document and its nodes
    XmlDocument     doc;
    XmlNodeList     xmlScriptList;
    XmlNodeList     xmlProjectList;
    XmlElement      nodeScript;
    XmlElement      nodeProject;
    XmlElement      nodeNote;
    XMLParseError   xmlError;
    // Define temporary variables
    str _xmlMsg;
    int i, j;

    ;

    // XML string to read
    _xmlMsg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><XMLScript Version=\"2.0\"><Project Name=\"Holidays\"><Format>C:\NotesDesign\Note.jpg</Format><PrintSetup><Printer>PDFPrinter</Printer></PrintSetup><Note Date=\"2014/12/10\" ID=\"N001\"><To>Tim</To><Body>Make sure all tasks are completed before holidays!</Body></Note><Note Date=\"01/01/2015\" ID=\"N002\"><To>Sophie</To><Body>Don't forget your Christmas shopping this weekend!</Body></Note></Project></XMLScript>";

    // Create the XML Document
    doc = new XmlDocument();
    doc.loadXml(_xmlMsg);

    // Verify XML Document Structure
    xmlError  = doc.parseError();
    if(xmlError && xmlError.errorCode() != 0)
    {
        throw error(strFmt("XML Error: %1", xmlError.reason()));
    }

    // Get the root element and its child nodes
    nodeScript = doc.getNamedElement("XMLScript");
    xmlScriptList = nodeScript.childNodes();

    for(i=0; i < xmlScriptList.length(); i++)
    {
        nodeProject = xmlScriptList.item(i);
        xmlProjectList = nodeProject.childNodes();

        info("### Project information: ");

        // Print out node and attribute values
        info(strFmt("XML Document Version: %1", nodeScript.getAttribute("Version")));
        info(strFmt("Project Name: %1", nodeProject.getAttribute("Name")));
        info(strFmt("Format: %1", nodeProject.getNamedElement("Format").text()));
        info(strFmt("PrintSetup (innerXML): %1", nodeProject.getNamedElement("PrintSetup").innerXml()));
        info(strFmt("Printer (text): %1 OR Printer (innerText): %2", 
                    nodeProject.getNamedElement("PrintSetup").getNamedElement("Printer").text(), 
                    nodeProject.getNamedElement("PrintSetup").innerText()));

        // Loop through the repeating nodes
        info("### Notes: ");       
        for (j=2; j < xmlProjectList.length(); j++)
        {
            nodeNote = xmlProjectList.item(j);

            info(strFmt("ID: %1, Date: %2", nodeNote.getAttribute("ID"), nodeNote.getAttribute("Date")));
            info(strFmt("To: %1", nodeNote.getNamedElement("To").text()));
            info(strFmt("Body: %1", nodeNote.getNamedElement("Body").text()));
        }
    }    
}

X++: HTTP Web Request to URL

//This method makes HTTP web request to the given url and returns the response
System.Net.WebRequest webrequest;

System.Net.HttpWebResponse httpresponse;

System.IO.Stream stream;

System.IO.StreamReader streamReader;

xml responseXML;

System.Byte[] arrayOfBytes;

System.Text.Encoding encoding;
System.String netString = "Net string.";
  System.Exception netExcepn;

;

try

{

new InteropPermission(InteropKind::ClrInterop).assert();

//Use .Net framework reflections to make HttpRequest and get the response back

encoding = System.Text.Encoding::get_UTF8();
arrayOfBytes = encoding.GetBytes("");

webrequest = System.Net.WebRequest::Create('http://localhost/AxService/myService.asmx/HelloWorld');

webrequest.set_Method("POST");
webrequest.set_PreAuthenticate(true);
webrequest.set_Credentials(System.Net.CredentialCache::get_DefaultCredentials());

webrequest.set_ContentType("application/x-www-form-urlencoded");
webrequest.set_ContentLength(arrayOfBytes.get_Length());
stream = webrequest.GetRequestStream();
stream.Write(arrayOfBytes,0,arrayOfBytes.get_Length());
stream.Close ();



httpresponse = webrequest.GetResponse();

stream = httpresponse.GetResponseStream ();

streamReader = new System.IO.StreamReader (stream);

responseXML = streamReader.ReadToEnd ();

streamReader.Close ();

stream.Close ();

httpResponse.Close ();



codeAccessPermission::revertAssert();
    info(responseXML);
}

 catch (Exception::Error)
    {
        info("Caught 'Exception::Error'.");
    }
    catch (Exception::CLRError)
    {
        info("Caught 'Exception::CLRError'.");
        netExcepn = CLRInterop::getLastException();
        info(netExcepn.ToString());
    }

Thursday, 16 June 2016

Axapta 2009 This transaction has been marked for settlement by another user.

one of end user of AR is got stuck for knock off the account.
Then I  make  a solution that logon to database server of the AX 2009 then write a query
select * from SPECTRANS
then select a amount in table where Red Dot is came and put in the query
select * from SPECTRANS where BALANCE01=398.700
now check that record is came
Now delete that record by writing a query
delete from SPECTRANS where  BALANCE01=398.700
now again go to check the settlement transaction ,Red Dot  is gone .

Monday, 25 April 2016

Overdelivery of line is 100,00 percent, but the allowed overdelivery is only 0 percent.

We had the same problem with one of our client. The reason behind was, there were some orphans purchParmSubLine records lying in the table, which led to add up the remain del note qty and attempting to post Delivery note again. We suspected, the reasons these records were left in the table, when posting failed for any reason or client session crashed when posting was being done. Anyways, simple way to resolve it by creating a simple job to clean up those records and Hallelujah! the problem is gone!
static void tecDeleteOrphanParmRecords(Args _args)
{
   PurchParmTable purchParmTable;
   PurchParmLine  purchParmLine;
   ;
   ttsbegin;
   while select forupdate purchParmTable
       join forupdate purchParmLine
       where purchParmLine.ParmId == purchParmTable.ParmId
       && purchParmLine.TableRefId    == purchParmTable.TableRefId
       && purchParmTable.PurchId  == "Your PO number"
       && purchParmTable.ParmJobStatus == ParmJobStatus::Waiting
       && purchParmTable.Ordering == DocumentStatus::Invoice
   if(purchParmTable.RecId || purchParmLine.RecId)
   {
       purchParmTable.delete();
       purchParmLine.delete();
   }
   ttscommit;
}
Cleaning up PurchParmTable and Line will also clean up related tables (Sub tables) by itself.
Try posting again.  Everything should work smoothly.
Cheers!
PG