Nuestro objetivo de hoy es crear documentos de Word directamente desde AX 2012. Para ello utilizaremos una plantilla de Word previamente diseñada, que después utilizaremos en nuestro código x++.
Crearemos nuestra plantilla, para ello insertaremos los marcadores de posición en el lugar deseado, según veis en la imagen:
Después ejecutaremos el siguiente job para enviar los datos a los marcadores, así como también rellenar la tabla que contendrá la lineas del pedido.
// ------------------------------------------------(c) 2016 Last
// System: Microsoft Dynamics AX 2013 R3 CU9
// Description: JOB de ejemplo para crear documentos de MS Word
// Pre-conditions: Imprimir a Word el Pedido nº 001461
// Creator: Juan Ruiz Romero
// Creation date: 23.06.16
// -----------------------------------------------------------------
// -----------------------------------------------------------------
static void JR_CreateWordDocument(Args _args)
{
COM word, documents, document, bookmarks, bookmark, tables, table, rows, row, cells, cell, range;
SalesTable _salesTable;
SalesLine _salesLine;
int i;
// Funcion Auxiliar para procesar los marcadores
void processBookmark(str _name, anytype _value) {
if (!bookmarks.exists(_name)) {
info("El marcador no existe");
return;
}
bookmark = bookmarks.item(_name);
range = bookmark.range();
switch (typeOf(_value)) {
case Types::Real:
range.insertAfter( num2str(_value, 4, 2, 2, 1) );
break;
case Types::Date:
range.insertAfter(date2str(_value, 123, dateDay::Digits2,DateSeparator::Slash,DateMonth::Digits2,DateSeparator::Slash,DateYear::Digits4));
break;
case Types::String:
range.insertAfter(_value);
break;
default:
range.insertAfter(_value);
break;
}
} // End Funcion Auxiliar
#define.WordApp('Word.Application')
#define.template(@'C:\template.dotx')
try {
word = new COM(#WordApp);
} catch (Exception::Internal) {
if (word == null)
throw error('Microsoft Word is not installed');
}
documents = word.documents(); document = documents.add(#template); bookmarks = document.bookmarks();
_salesTable = SalesTable::find('001461'); // Pedido de ejemplo
// Enviar los marcadores de la cabecera del pedido
processBookmark('SalesId', _salesTable.SalesId);
processBookmark('CustName', _salesTable.customerName()); processBookmark('Address', _salesTable.deliveryAddressing());
processBookmark('CustAccount', _salesTable.CustAccount); processBookmark('DeliveryDate', _salesTable.DeliveryDate);
processBookmark('PurchOrderFormNum', _salesTable.PurchOrderFormNum); processBookmark('CustomerRef', _salesTable.CustomerRef);
// Rellenamos la tabla que contiene las lineas del pedido
tables = document.tables(); table = tables.item(2); rows = table.rows(); i = 1; // Nos posicionamos en la tabla nº2 de Word
while select _salesLine index hint SalesLineIdx where _salesLine.SalesId == _salesTable.SalesId {
i++;
row = rows.item(i); // Posicion de fila
cells = row.cells();
cell = cells.item(1); range = cell.range(); range.insertAfter(_salesLine.ItemId);
cell = cells.item(2); range = cell.range(); range.insertAfter(_salesLine.Name);
cell = cells.item(3); range = cell.range(); range.insertAfter(_salesLine.SalesUnit);
cell = cells.item(4); range = cell.range(); range.insertAfter(num2str(_salesLine.SalesQty ,4, 2, 2, 1));
cell = cells.item(5); range = cell.range(); range.insertAfter(num2str(_salesLine.SalesPrice ,4, 2, 2, 1));
cell = cells.item(6); range = cell.range(); range.insertAfter(num2str(_salesLine.LineAmount ,4, 2, 2, 1));
row = rows.add();
}
if (i > 1)
row.delete();
word.visible(true);
}
El resultado lo podéis ver en la siguiente imagen:
Espero que os sirva de ayuda. La plantilla utilizada la podéis descargar en el siguiente enlace: Plantilla.


Buen post!
ResponderEliminar