Axapta 以编程方式将发票添加到Dynamics AX 2009

Axapta 以编程方式将发票添加到Dynamics AX 2009,axapta,dynamics-ax-2009,x++,ax,Axapta,Dynamics Ax 2009,X++,Ax,我对Dynamics AX 2009非常陌生,因为我还没有真正找到解决我正在做的事情的方法,所以我决定在这里提问 我需要通过X++发布(?)发票 我已经找到了这个,即使它是西班牙语的,我想你会明白的 以下是我从链接中修改的代码: static void JAEE_PurchFormLetter(Args _args) { Num _invoiceNum; // Núm. factura TransDate _invoice

我对Dynamics AX 2009非常陌生,因为我还没有真正找到解决我正在做的事情的方法,所以我决定在这里提问

我需要通过X++发布(?)发票

我已经找到了这个,即使它是西班牙语的,我想你会明白的

以下是我从链接中修改的代码:

static void JAEE_PurchFormLetter(Args _args)
{
    Num                 _invoiceNum;    // Núm. factura
    TransDate           _invoiceDate;   // Fecha factura

    MyPurchFormLetter     purchFormLetter =       PurchFormLetter::construct(DocumentStatus::Invoice);
    PurchParmUpdate     purchParmUpdate;
    PurchParmTable      purchParmTable;
    PurchParmLine       purchParmLine;

    TradeLineRefId      tableRefId;
    PurchTable          purchTable;
    PurchLine           purchLine;
    ;

    ttsbegin;

    _invoiceNum = 'Facbyjob';
    _invoiceDate = str2date('14-01-2013', 123);

    purchTable = PurchTable::find('00000019_062'); // Primer pedido
    // Inizializar purchFormLetter con el primer pedido
    purchFormLetter.parmCallerTable(purchTable);
    purchFormLetter.callInitParmPurchTable(purchTable);
    purchFormLetter.proforma(false);                                // Proforma: NO     (Registrar: SI)
    purchFormLetter.enableUpdateNowField(true);                     // Actualizar ahora: SI
    purchFormLetter.printFormLetter(false);                         // Imprimir: NO
    purchFormLetter.transDate(_invoiceDate);                        // Fecha de factura

    // Inizializar purchParmUpdate con el primer pedido
    purchParmUpdate.clear();
    purchParmUpdate.initValue();
    purchParmUpdate.ParmId              = purchFormLetter.parmId();
    purchParmUpdate.SumBy               = AccountOrder::Account;    // Agrupar por cliente
    purchParmUpdate.SumNum              = _invoiceNum;              // Núm. Factura
    purchParmUpdate.SpecQty             = PurchUpdate::All;         // Actualizar: Todo
    purchParmUpdate.DocumentStatus      = DocumentStatus::Invoice;  // Tipo documento: Factura
    purchParmUpdate.Proforma            = NoYes::No;                // Proforma: NO
    purchParmUpdate.SumIncludePending   = NoYes::No;                // Incluir pendiente: NO
    if (purchParmUpdate.validateWrite())
        purchParmUpdate.insert();
    else
        throw Exception::Error;

    purchFormLetter.purchParmUpdate(purchParmUpdate);
    purchFormLetter.parmParmTableNum(purchParmUpdate.SumNum);

    // Tabla temporal, se crea un registro de cabecera del primer pedido (sólo uno)
    purchParmTable.clear();
    purchParmTable.TableRefId = FormLetter::getTableRef();
    purchFormLetter.createParmTable(purchParmTable, purchTable);
    if (purchParmTable.validateWrite())
        purchParmTable.insert();
    else
        throw Exception::Error;

    tableRefId  = purchParmTable.TableRefId;

    // BEGIN - LINEAS
    //       - Repetir para cada línea que se quiera facturar y para cada una y 
    //       - asignar las variabies purchTable y purchLine según proceda
    purchParmLine.clear();
    purchParmLine.initValue();

    // Ajustar cantidades según necesidades

    // Catnidades de compra
    [purchParmLine.ReceiveNow,
     purchParmLine.RemainBefore,
     purchParmLine.RemainAfter] = purchFormLetter.qtyPurch(purchLine, naReal());

    // Cantidades de inventario
    [purchParmLine.InventNow,
     purchParmLine.RemainBeforeInvent,
     purchParmLine.RemainAfterInvent] = purchFormLetter.qtyInvent(purchLine, naReal());

    if (purchParmLine.ReceiveNow)
    {
        purchParmLine.ParmId = purchParmUpdate.ParmId;
        purchParmLine.initFromPurchLine(purchLine);
        purchParmLine.setLineAmount();
        purchParmLine.TableRefId = tableRefId;

        if (purchParmLine.validateWrite())
            purchParmLine.insert();
        else
            throw Exception::Error;
    }
    // END - LINEAS

    // Registrar!
    purchFormLetter.reArrangeNow(false); // No organizar
    purchFormLetter.run();

    ttscommit;
}
我的问题在这行:
purchormletter.callInitParmPurchTable(purchTable)

为什么要从purchormletter的派生类中调用
initparmpourchtable()

还有,如何做到这一点?我尝试声明我自己的类
mypurchormletter
,它扩展了
purchormletter
,添加了
callInitParmPurchTable()
方法,但编译器告诉我,当我试着运行代码时,对象没有该方法

内容如下:

Error al ejecutar código: Object objeto no tiene el método 'callInitParmPurchTable'.
编辑:


我所做的是将该方法添加到类中,这样
callInitParmPurchTable()
就是对象的一部分。但是我没有回答这个问题,因为我认为这不是正确的方法。

您是否修改了
purchormletter::construct(DocumentStatus::Invoice)
返回MyPurchFormLetter


再看看“向前编译”功能,我发现了以下几点:

正确的做法是创建一个继承自
purchormletter
的类,并在其中实现方法
callInitParmPurchTable()
,该方法显然是执行
initParmPurchTable()
的方法


我最可能缺少的一部分是编译
mypurchormletter
,这样编译器就可以知道方法存在了。

好建议。尝试右键单击AOT中的PurchFormLetter,然后单击“向前编译”。@davidLawson@sshaheen,感谢您的建议,但是返回的是一个
PurchFormLetter\u Invoice
对象,通过判断代码,我觉得它应该保持这种状态。@ackzell,类MyPurchFormLetter上存在callInitParmPurchTable,不购买发票。您正在从PurchFormLetter::construct返回PurchFormLetter\u发票,因此尝试调用该PurchFormLetter\u发票对象上不存在的方法再次感谢@DavidLawson,我想我已经改变了方法,正如我在编辑问题后解释的那样。