x++

qr_code_ax

 

http://twit88.com

 

QR_code

La api de google nos permite la instalación de forma sencilla de vistosos cuadros de mando.

generate_charts_google_api

example AX2009 – Google_charts.rar

http://code.google.com/intl/es-ES/apis/chart/

 

static void AXL_TestSHA1(Args _args)
{
#define.ClrFileStream (‘System.IO.FileStream’)
#define.ClrFileModeEnum (‘System.IO.FileMode’)
#define.ClrFileModeOpen (‘Open’)
#define.ClrFileAccessEnum (‘System.IO.FileAccess’)
#define.ClrFileAccessWrite (‘Write’)
#define.ClrFileAccessRead (‘Read’)//(‘ReadWrite’)

System.IO.FileStream fileStream;
ClrObject fileMode;
ClrObject fileAccess;
str _filename = ‘C:\\Log.txt’;

System.Type typeOfByte;
System.Array arrayOfByte;
int arrayOfByteLength = 1;
int i;
System.Security.Cryptography.SHA1CryptoServiceProvider SHA1;
System.Text.ASCIIEncoding encoding;

str strError;
CLRObject exc;
CLRObject innerExc;
CLRObject clrExcMessage;
int Struct1[];
container cont;
;
try
{
typeOfByte = System.Type::GetType(“System.Byte”);
arrayOfByte = System.Array::CreateInstance( typeOfByte, arrayOfByteLength );

fileMode = CLRInterop::parseClrEnum(#ClrFileModeEnum, #ClrFileModeOpen);
fileAccess = CLRInterop::parseClrEnum(#ClrFileAccessEnum, #ClrFileAccessRead);
SHA1 = new System.Security.Cryptography.SHA1CryptoServiceProvider();
fileStream = new CLRObject(#ClrFileStream, _filename, fileMode, fileAccess);
arrayOfByte = SHA1.ComputeHash(fileStream);
fileStream.Close();

arrayOfByteLength = ClrInterop::getAnyTypeForObject(arrayOfByte.get_Length());
for( i = 0; i < arrayOfByteLength; ++i )
{
cont = conins(cont,i+1,(ClrInterop::getAnyTypeForObject( arrayOfByte.GetValue( i ) )));
print int2hex(ClrInterop::getAnyTypeForObject( arrayOfByte.GetValue( i ) ));
}
}
catch( Exception::Internal )
{
// BP Deviation Documented
exc = CLRInterop::getLastException();
if( exc )
{
clrExcMessage = exc.get_Message();
// BP Deviation Documented
strError = CLRInterop::getAnyTypeForObject( clrExcMessage );

throw error(strError);
}

}
catch( Exception::CLRError )
{
// BP Deviation Documented
exc = CLRInterop::getLastException();
if( exc )
{
clrExcMessage = exc.get_Message();
innerExc = exc.get_InnerException();

while(innerExc != null)
{
clrExcMessage = innerExc.get_Message();
innerExc = innerExc.get_InnerException();
}

// BP Deviation Documented
strError = CLRInterop::getAnyTypeForObject( clrExcMessage );

throw error(strError);
}

}

pause;
}

Delete sample

// Execute a query to retrieve an editable record
// where the name is MyStateUpdated.
axRecord.ExecuteStmt(“select forupdate * from %1 where %1.Name ==
‘MyStateUpdated’”);

// If the record is found then delete the record.
if (axRecord.Found)
{
// Start a transaction that can be committed.
ax.TTSBegin();
axRecord.Delete();
// Commit the transaction.
ax.TTSCommit();
}

INSERT

// Create the .NET Business Connector objects.
Axapta ax;
AxaptaRecord axRecord;
string tableName = “AddressState”;

try
{
// Login to Microsoft Dynamics AX.
ax = new Axapta();
ax.Logon(null, null, null, null);

// Create a new AddressState table record.
using (axRecord = ax.CreateAxaptaRecord(tableName));
{

// Provide values for each of the AddressState record fields.
axRecord.set_Field(“NAME”, “MyState”);
axRecord.set_Field(“STATEID”, “MyState”);
axRecord.set_Field(“COUNTRYREGIONID”, “US”);
axRecord.set_Field(“INTRASTATCODE”, “”);

// Commit the record to the database.
axRecord.Insert();
}
}
catch (Exception e)
{
Console.WriteLine(“Error encountered: {0}”, e.Message);
// Take other error action as needed.
}
READ

// Create the .NET Business Connector objects.
Axapta ax;
AxaptaRecord axRecord;
string tableName = “AddressState”;

// The AddressState field names for calls to
// the AxRecord.get_field method.
string strNameField = “NAME”;
string strStateIdField = “STATEID”;

// The output variables for calls to the
// AxRecord.get_Field method.
object fieldName, fieldStateId;

try
{
// Login to Microsoft Dynamics AX.
ax = new Axapta();
ax.Logon(null, null, null, null);

// Create a query using the AxaptaRecord class
// for the StateAddress table.
using (axRecord = ax.CreateAxaptaRecord(tableName));
{

// Execute the query on the table.
axRecord.ExecuteStmt(“select * from %1″);

// Create output with a title and column headings
// for the returned records.
Console.WriteLine(“List of selected records from {0}”,
tableName);
Console.WriteLine(“{0}\t{1}”, strNameField, strStateIdField);

// Loop through the set of retrieved records.
while (axRecord.Found)
{
// Retrieve the record data for the specified fields.
fieldName = axRecord.get_Field(strNameField);
fieldStateId = axRecord.get_Field(strStateIdField);

// Display the retrieved data.
Console.WriteLine(fieldName + “\t” + fieldStateId);

// Advance to the next row.
axRecord.Next();
}
}
}

catch (Exception e)
{
Console.WriteLine(“Error encountered: {0}”, e.Message);
// Take other error action as needed.
}

UPDATE

// Create an Axapta record for the StateAddress table.
axRecord = ax.CreateAxaptaRecord(tableName);

// Execute a query to retrieve an editable record where the name is MyState.
axRecord.ExecuteStmt(“select forupdate * from %1 where %1.Name ==
‘MyState’”);

// If the record is found then update the name.
if (axRecord.Found)
{
// Start a transaction that can be committed.
ax.TTSBegin();
axRecord.set_Field(“Name”, “MyStateUpdated”);
axRecord.Update();

// Commit the transaction.
ax.TTSCommit();
}

Guía rápida de instalación ax2009. Sobre W2003 R2 y SQL2005

Instalación del servidor Windows 2003.

Instalación de SQL server 2005

Instalar Aplication Role

Al ejecutar el instalador nos cargara los prerrequisitos automáticamente.

Necesario permisos de Administrador.

Crear base de datos para AX 2009.

Para ello el usuario(login) debe ser miembro del grupo “dbcreator“ en SQL server.

Instalar el AOS Role.

Dar permios al usuario(login) que instala AOS dentro de la base de datos como securityadmin.

Comprobar tras la instalación que se crea el inicio de sesión para el AOS “domain\host$” con los permisos “db_datareader”, “db_datawriter”, “db_ddladmin”, “public” sobre la BBDD.

Validar permisos de ejecución para el inicio de sesión del usuario de AOS (“domain\host$”) y las credenciales que arranque del servicio de AOS para los procedimientos almacenados, “CREATESERVERSESSIONS”, “CREATEUSERSESIONS”

Instalar Client Role.

Necesario permisos de Administrador.

Al iniciar sesión se crean los perfiles ,“Admin “y “guest” en la “userinfo” .

Instalar .NET bussines conector.

User: AXDOS\ProxyAX .

pass: Axapta20.

Instalar Role center and Enterprise Portal.

Necesario permisos de Administrador.

Requisitos previos:

- Crear la cuenta bussines conector en el dominio.

- Instalar el framework 3.5 básico sin SP

- Crear un grupo de aplicaciones en IIS y asignarle el usuario para Bussines conector.

- Crear un directorio virtual y asignarle la aplicación anterior.

- ASP .NET 2.0.

- Microsoft SQL Server 2005 ADOMD.Net

- Microsoft Windows SharePoint Service 3.0 SP1

Estos se instalan de forma automática con desde el instaler de AX2009.

Es necesario descargar de la pagina de Microsoft Sharepoint sp1.

http://www.microsoft.com/downloads/details.aspx?familyid=EF93E453-75F1-45DF-8C6F-4565E8549C2A&displaylang=en

Durante la instalación puede aparecer el siguiente error:

Error executing code: SysDevelopmentProxy (object) has no valid runable code in method ‘generate’.

(C)\Classes\SysDevelopmentProxy\generate
(C)\Classes\SysEPDeployment\clrGenerateProxies – line 7
(C)\Classes\SysEPDeployment\deployProxies
(C)\Classes\SysEPDeployment\deployAllWebParts
(C)\Classes\SysEPDeployment\deployEPOnSharepoint
(C)\Classes\SysEPDeployment\installEnterprisePortal


Microsoft.Dynamics.BusinessConnectorNet.BusinessConnectorException
at Microsoft.Dynamics.BusinessConnectorNet.AxaptaObject.Call(String methodName, Object[] paramList)
at Microsoft.Dynamics.BusinessConnectorNet.AxaptaObject.Call(String methodName, Object param1)
at Microsoft.Dynamics.Framework.BusinessConnector.Session.DynamicsObjectAdapter.Call(String methodName, Object param1)

An error occurred during setup of Role Centers and Enterprise Portal.
Reason: No .NET Business Connector session could be found.
=== Rolling back setup of Role Centers and Enterprise Portal due to error =

Este es provocado por un error en la referencia al conector, al compilar la aplicación sin haber instalado el “bussines conector”.

Puede aparecer este error el desplegar las áreas de negocio.

Ha ocurrido un error inesperado.

A ProgressTemplate must be specified on UpdateProgress control with ID ‘AxProgressControl’.

System.InvalidOperationException

at System.Web.UI.UpdateProgress.CreateChildControls()

at System.Web.UI.Control.EnsureChildControls()

at System.Web.UI.UpdateProgress.get_Controls()

at Microsoft.Dynamics.Framework.Portal.UI.WebControls.AxProgressControl.Create()

at Microsoft.Dynamics.Framework.Portal.UI.WebControls.AxProgressControl.AddToPage(Control control)

at Microsoft.Dynamics.Framework.Portal.UI.WebControls.AxContentPanel.Page_PreLoad(Object sender, EventArgs e)

at System.EventHandler.Invoke(Object sender, EventArgs e)

at System.Web.UI.Page.OnPreLoad(EventArgs e)

at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Este error es debido a la instalación del SP1 sobre el framework 3.5. El Share point y Dynamics no admiten este parche.

Args  es utiliza para pasar argumentos al constructor de una clase. Args pueden transmitir información como el nombre, y los parámetros que llaman a una nueva clase.

Los formularios, informes y consultas utilizan  la clase Args como primer argumento en el constructor.

Pasandole el nombre del objeto a crear a una clase args y despues llamar a classfactory con estos argumentos podemos inicializar fomularios, informes etc.

    Args a = new Args(“CustTable”);
    formRun fr = ClassFactory.FormRunClass(a);
    fr.init();
    fr.run();
 

para recuperar el objeto args en la clase de destino, por regla general existe un metodo que nos devuelve este dato.

elment.args() en el caso de formulario.

El objetivo de esto es poder pasar a traves de args objetos completos a otros contextos de ejecución de forma que podriamos abrir un formulario inicial F1 ejecutar otro formulario secundario F2 y poder ejecutar metodos del formulario 1 desde el formulario 2.

un ejemplo.

Hemos creado un from con un metodo para recuperar el texto de un strignedit y este texto lo vamos a pintar desde un report, utilizando para ello una clase intermedia o el metodo del form que lo ha llamado.

fir_dem.xpo 

public void init()
{
    object ob;
    FIR_ReportClas FIR_ReportClas;

    super();

    //axl si no es la clase entonces es el formmm…
    if (classIdGet(element.args().caller()) == classNum(FIR_ReportClas))
    {
            FIR_ReportClas = element.args().caller();
            print FIR_ReportClas.texto();
    }
    else
    {
        ob = element.args().caller();
        print ob.texto();
    }

dibujoaaxxzee.bmp