Una clase dialog vería así:
Ahora el código:
public class GRWPurchAgreementAddItem extends RunBase
{
//Declarando lo que se va a ocupar en la clase
PurchAgreementHeader purchAgreementHeader;
TmpPurchLine tmpPurchLine;
ItemId itemId;
DialogField dlgItemId;
}
public ClassDescription caption()
{
//Titulo que aparece el usuario (se ve en la imagen)
return "Agregar artículo al acuerdo" ;
}
//Esta la importante
protected Object dialog()
{
DialogRunbase dialog = super ();
FormStringControl control;
;
dialog = super ();
//Aquí agregamos el campo a nuestra clase dialog, hasta todo igual que una
//clase dialog cualquiera
dlgItemId = dialog.addFieldValue( extendedTypeStr (ItemId), itemId);
//Esta es la parte importante, aquí sobreescribimos el lookup del control que acabamos
//de crear y lo llenamos con el resultado de nuestro query (metodo en la misma clase: itemIdLookup)
//que es la consulta que nos va a traer los datos que queremos presentar
control = dlgItemId.control();
control.registerOverrideMethod( methodStr (FormStringControl, lookup), methodStr (GRWPurchAgreementAddItem, itemIdLookup), this);
return dialog;
}
public boolean getFromDialog()
{
;
//Rescatamos el valor que el usuario seleccione en el combo
itemId = dlgItemId.value();
return super();
}
public void itemIdLookup(FormStringControl _control)
{
//Consultamos los valores que queremos presentar en el combo
SysTableLookup sysTableLookup;
QueryBuildDataSource queryBuildDataSource;
QueryBuildRange rangeitemId;
Query query = new Query();
queryBuildDataSource = query.addDataSource( tablenum(AgreementLine));
sysTableLookup = SysTableLookup::newParameters( tablenum(AgreementLine), _control);
sysTableLookup.addLookupfield( fieldnum(AgreementLine, ItemId), true);
//Aqui solo estoy aplicando un filtro al query que yo necesito por regla de negocio
rangeitemId = query.dataSourceNo( 1).addRange(fieldNum (AgreementLine, Agreement));
rangeitemId.value( int642str(purchAgreementHeader.RecId));
sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();
}
public container pack()
{
return connull();
}
public PurchAgreementHeader parmPurchAgreementHeader(PurchAgreementHeader _purchAgreementHeader = purchAgreementHeader)
{
purchAgreementHeader = _purchAgreementHeader;
return purchAgreementHeader;
}
public TmpPurchLine parmTmpPurchLine(TmpPurchLine _tmpPurchLine = tmpPurchLine)
{
tmpPurchLine = _tmpPurchLine;
return tmpPurchLine;
}
public void run()
{
;
try
{
ttsbegin;
//Aquí va lo que se vaya a hacer con el valor que selecciono el usuario en el combo
tmpPurchLine.ItemId = itemId;
tmpPurchLine.insert();
ttscommit;
}
catch (Exception::Deadlock)
{
retry;
}
catch (Exception::UpdateConflict)
{
if (appl.ttsLevel() == 0)
{
if (xSession::currentRetryCount() >= 3)
{
throw Exception::UpdateConflictNotRecovered;
}
else
{
retry;
}
}
else
{
throw Exception::UpdateConflict;
}
}
}
public boolean runsImpersonated()
{
return true;
}
public boolean unpack(container packedClass)
{
return true;
}
En mi caso yo necesitaba mandar llamar la clase a partir de un form
public void grwAddItem()
{
GRWPurchAgreementAddItem gRWPurchAgreementAddItem;
;
//Enviar a la clase, la temporal de las líneas
//Enviar el purchAgreementHeader
gRWPurchAgreementAddItem = new GRWPurchAgreementAddItem();
gRWPurchAgreementAddItem.parmPurchAgreementHeader(purchAgreementHeader);
gRWPurchAgreementAddItem.parmTmpPurchLine(TmpPurchLine);
if (gRWPurchAgreementAddItem.prompt())
{
gRWPurchAgreementAddItem.run();
TmpPurchLine_ds.executeQuery();
}
}
Lookup para dimensiones financieras de organización
Rellenar o incluir caracteres en cadenas con strFix
Y por cierto, acuerdate de darle click a algún anuncio si el post te sirvio de algo.
No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma.
Rellenar o incluir caracteres en cadenas con strFix
Y por cierto, acuerdate de darle click a algún anuncio si el post te sirvio de algo.
No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma.
Buenos días, quisiera hacerle una consulta muy puntual, en el reporte que desarrolle tengo un combo que selecciona el periodo(Semanal o Mensual), de acuerdo a lo seleccionado esto actualiza el rango de fechas(Fecha Inicio y Fecha Final). hasta ahí funciona a la perfección.
ResponderBorrarperiodoProgramacionField = this.bindInfo().getDialogField(this.dataContractObject(), methodstr(CMHProgramaOrdenTrabajoContract, parmPlanningPeriodoRecId));
//Asigno el evento modificar periodo.
periodoProgramacionField.registerOverrideMethod(methodStr(FormInt64Control, modified), methodStr(CMHProgramaOrdenTrabajoUIBuilder, periodoModified), this);
// Metodo para modificar el rango de periodos.
public void periodoModified(FormInt64Control _control)
{
EAMPlanningPeriod _EAMPlanningPeriod;
str periodoDescricion;
FromDate fech;
_control.modified();
periodoProgramacionField = this.bindInfo().getDialogField(this.dataContractObject(), methodstr(CMHProgramaOrdenTrabajoContract, parmPlanningPeriodoRecId));
periodoRecId = periodoProgramacionField.value();
periodoRecId = _control.value();
//Obtenemos la descripción del periodo.
while select firstOnly1 Description from _EAMPlanningPeriod
where _EAMPlanningPeriod.RecId == periodoRecId
{
periodoDescricion = _EAMPlanningPeriod.Description;
}
planningEngine = new EAMPlanningEngine_PlanningBoardDetails(grupoProgramacionField.value(),periodoProgramacionField.value());
fechaInicioField.value(planningEngine.boardStartDate());
fechaFinalField.value(planningEngine.boardEndDate());
periodoProgramacionField.value(periodoRecId);
}
una vez seleccionado el periodo paso a ejecutar el reporte esto hace que el Periodo se borre lo que esta seleccionado, esto a que se debe?? seguramente me falta actualizar el parámetro del Datacontract.
si te das cuenta lo estoy actualizando los 3 parámetros con los nuevos valores.
fechaInicioField.value(planningEngine.boardStartDate());
fechaFinalField.value(planningEngine.boardEndDate());
periodoProgramacionField.value(periodoRecId);
solo de ellos permanece con su valor estos 2 parámetros.
fechaInicioField.value(planningEngine.boardStartDate());
fechaFinalField.value(planningEngine.boardEndDate());
mientras el parámetro periodoProgramacionField se borra al ejecutar el reporte.
Espero que me puedan apoyar con este problema,
Saludos.