Entre la ayuda que da Microsoft en los MOCs de desarrollo están las APIs para crear diarios de contabilidad y diarios de la gestión de inventario. Lo que pretendo con este documento es explicar como crear los diarios que se utilizan en el módulo de producción.


En producción existen 4 tipos de diarios en el módulo de producción:


  • Lista de selección: usado para el stock de las materias primas usadas.
  • Tarjeta de ruta: usado para el consumo de las rutas de producción.
  • Tarjeta de trabajo: usado para el consumo en los cetros de trabajo.
  • Notificar como terminado: usado para los artículos terminados.

Para una demos que teníamos que hacer con una integración entre un aplicación de control en planta con el módulo de producción de DAX 2009 para comunicarle los consumos, tuvimos que crear diarios de lista de selección, Tarjeta de ruta.


Para ello buscamos en las APIs de los MOCs y no figuraba nada por ello tuvimos que investigar como se creaba desde los diarios de forma manual y el resultado se muestra a continuación.


Diarios Lista de selección


Se necesitan declarar la siguientes variables


    ProdJournalTable            prodJournalTable;    ProdJournalBOM              prodJournalBOM;
ProdBOMCalc prodBOMCalc;
ProdBOM prodBOM;
boolean addRefPurch = true;
OprNum operNum;
BOMCalcData bomCalcData;
ProdTable _prodTable;
#OCCRetryCount
Container canswer;
ProdJournalName _prodJournalName;

Se crear la cabecera del diario, para ello hemos usado una tabla intermedia llamada consumption. Sería necesario validar el estado de la orden de producción a usar en el diario.


    _prodJournalName = ProdJournalName::find(ProdParametersDim::findDefault().BOMJournalNameId);     _prodJournalTable.clear();
_prodJournalTable.initValue();
_prodJournalTable.Description = "Diario Entrada de datos Lista Selección";
_prodJournalTable.JournalNameId = _prodJournalName.JournalNameId;
_ProdJournalTable.VoucherDraw = _prodJournalName.VoucherDraw;
_prodJournalTable.VoucherSeqId = _prodJournalName.VoucherSeqId;
_prodJournalTable.VoucherChange = _prodJournalName.VoucherChange;
_prodJournalTable.ProdId = consumption.Orden;
_prodJournalTable.JournalType = ProdJournalType::Picklist;
_prodJournalTable.qtyError = consumption.QMalas;
_prodJournalTable.qtyGood = consumption.QBuenas;
_prodJournalTable.NumOfLines = 1;
_prodJournalTable.insert();

Se crean las líneas del diario usando la clase BOMCalcDate y recorriendo las líneas de la ProdBOM. Debería estar con el control de errores el código.


    operNum = str2int(consumption.Fase);
bomCalcData = BOMCalcData::newProdTable(consumption.QBuenas + consumption.QMalas,_prodTable);
while select forupdate prodBOM
index hint NumIdx
where prodBOM.ProdId == consumption.Orden &&
prodBOM.OprNum >= operNum
{
prodBOMCalc = ProdBOMCalc::newBOMCalcData(bomCalcData,
prodBOM,
ProdBOMConsumpProposal::Qty,
BOMAutoConsump::Always,
!prodBOM.ConstantReleased,
NoYes::No,
false,
true);

if (prodBOMCalc.bomConsump() ||
prodBOMCalc.inventConsump() )
{
prodJournalBOM.clear();
prodJournalBOM.JournalId = _prodJournalTable.JournalId;
prodJournalBOM.initValue();
prodJournalBOM.initFromInventTable(InventTable::find(prodBOM.ItemId));
prodJournalBOM.initFromProdBOM(prodBOM);
prodJournalBOM.setInventReturnFlag(prodBOM);
prodJournalBOM.TransDate = systemdateget();
prodJournalBOM.EndConsump = NoYES::No;
prodBOMCalc.setProdJournalBOM(prodJournalBOM);
prodJournalBOM.bomProposal = prodJournalBOM.bomConsump;
prodJournalBOM.InventProposal = prodJournalBOM.InventConsump;
prodJournalBOM.insert();
}
}

Diarios Tarjeta de ruta


Se necesitan declarar la siguientes variables


    ProdJournalRoute _prodJournalRoute;    ProdJournalTable _prodJournalTable;
ProdJournalName _prodJournalName;
ProdTable _prodTable;
ProdRoute _prodRoute;
#OCCRetryCount
OprNum oprNum;
ProdJobType prodJobType;

Se crear la cabecera del diario, para ello hemos usado una tabla intermedia llamada consumption. Sería necesario validar el estado de la orden de producción a usar en el diario.


    _prodJournalName = ProdJournalName::find(ProdParametersDim::findDefault().RouteJournalNameId);
_prodJournalTable.clear();
_prodJournalTable.initValue();
_prodJournalTable.ProdId = consumption.Orden;
_prodJournalTable.JournalNameId = _prodJournalName.JournalNameId;
_ProdJournalTable.VoucherDraw = _prodJournalName.VoucherDraw;
_prodJournalTable.VoucherSeqId = _prodJournalName.VoucherSeqId;
_prodJournalTable.JournalType = ProdJournalType::RouteCard;
_prodJournalTable.VoucherChange = _prodJournalName.VoucherChange;
_prodJournalTable.qtyError = consumption.QMalas;
_prodJournalTable.qtyGood = consumption.QBuenas;
_prodJournalTable.NumOfLines = 2; //Se crean una para configuración y otra para proceso
_prodJournalTable.Description = "Diario Entrada de datos Tarjeta de Ruta";
_prodJournalTable.insert();

Se crean las líneas del diario usando la clase ProdJobType y hemos generado 2 líneas en el diario, una para el tiempo de configuración y otro para el de proceso. Debería estar con el control de errores el código.


    operNum = str2int(consumption.Fase);
_prodRoute = ProdRoute::find(consumption.Orden,oprNum,RouteOprPriority::Primary);
//Se crea la línea de proceso
_prodJournalRoute.clear();
_prodJournalRoute.JournalId = _prodJournalTable.JournalId;
_prodJournalRoute.initValue();
_prodJournalRoute.ProdId = consumption.Orden;
_prodJournalRoute.TransDate = systemdateget();
_prodJournalRoute.OprNum = oprNum;
_prodJournalRoute.JobType = RouteJobType::Process;
prodJobType = ProdJobType::construct(_prodJournalRoute.JobType);
prodJobType.initProdJournalRoute(_prodRoute,_prodJournalRoute);
_prodJournalRoute.Hours = consumption.TiempoProd / 3600;
_prodJournalRoute.ExecutedPct = _prodJournalRoute.proposalRouteExecutedPct();
_prodJournalRoute.insert();
//Se crea la línea de configuración
_prodJournalRoute.clear();
_prodJournalRoute.initValue();
_prodJournalRoute.JournalId = _prodJournalTable.JournalId;
_prodJournalRoute.ProdId = consumption.Orden;
_prodJournalRoute.TransDate = systemdateget();
_prodJournalRoute.OprNum = oprNum;
_prodJournalRoute.JobType = RouteJobType::Setup;
prodJobType = ProdJobType::construct(_prodJournalRoute.JobType);
prodJobType.initProdJournalRoute(_prodRoute,_prodJournalRoute);
_prodJournalRoute.Hours = consumption.TiempoPrep / 3600;
_prodJournalRoute.ExecutedPct = _prodJournalRoute.proposalRouteExecutedPct();
_prodJournalRoute.insert();

Espero que os sirva, y los otros diarios son bastante similares. Para registrar estos diarios se usan las clases ProdJournalCheckPostBOM y ProdJournalCheckPostRoute.

Crosposting from http://www.ax3.es/blog

Visitas: 9

Comentario por Jose Alirio Yepes el septiembre 3, 2010 a las 8:45pm
Buen día, Puedes documentar la estructurta de la tabla temporal, y si tienes un ejemplo o documentación de crear un diario de contabilidad, uff seria perfecto
Comentario por Adolfo Castillo el septiembre 6, 2010 a las 11:50am
Los APIs de los diarios contables los tienes en los MOCs, si no recuerdo mal, dentro de los de AX 4.0 en desarrollo IV el capitulo 10.

La estructura de la tabla no puedo facilitártela porque no es mía, es del cliente.
Comentario por Jose Alirio Yepes el septiembre 6, 2010 a las 5:56pm
ok, muchas gracias, echare una mirada.

Comentar

¡Necesitas ser un miembro de El Rincón Dynamics para añadir comentarios!

Participar en El Rincón Dynamics

© 2012   Creado por Antonio Gilabert.

Emblemas  |  Reportar un problema  |  Términos de servicio