Показать сообщение отдельно
Старый 29.07.2008, 01:12   #1  
Qaz Qwerty is offline
Qaz Qwerty
китайский стажер
 
152 / 37 (2) +++
Регистрация: 12.05.2008
Добавление новых строк в SalesLine
Пришлось написать коротенькую шпаргалку, у которой две цели:
1) При добавлении новых полей в SalesLine и SalesTable поддерживать стандартный механизм обновления строк из заголовка.
2) Поддерживать обновление новых полей при работе с AIF.

Не думаю, что это великие знания, но может кому-нибудь полезно будет, раз мне это было полезно.

Собрано из двух статей:
- (http://www.fotovallescrivia.it/publi...rder-lines.htm
- http://axapta.mazzy.ru/lib/salestable2line/

На английском

1. Add new fields to SalesTable and place new fields which should be updated in SalesLine to group HeaderToLineUpdate.

2. Add new fields to SalesLine.

3 How to use standard mechanism to update fields in Salesline from Salestable
3.1 SalesTable2LineField class, modify the LineUpdateDescription() method. Add the new fields from SalesTable you want to copy to SalesLines. SalesTable2LineField::lineDescription(). The text line will be used in the dialog for lines updating.
eg:

X++:
case fieldnum(salesTable, NewField)     :
            return fieldid2pName(tableNum(SalesLine), fieldnum(salesLine,  NewField));
            break;
3.2 Reinitialize table SalesTable2LineParameters. Clear this table; next create and run job which has one command: SalesTable2LineParameters::initiate();

3.3 Add instructions into method SalesLineType::initFromSalesTable() to initialize values in order lines used by default. The method will be called when you create a new line.

4. Next for AIF:

4.1 AxSalesTable class: Add a parameter set and get method

eg:

X++:
public NewField NewField (NewField  _NewField  = Value)
{
    if (!prmisdefault(_NewField ))
    {
        this.setField(fieldNum(SalesTable, NewField ), _NewField );
    }
    return SalesTable.NewField ;
}
and

X++:
protected void setNewField ()
{
    if (this.isMethodExecuted(funcName()))
    {
        return;
    }
    if (this.isFieldSetExternally(fieldNum(SalesTable, NewField )))
    {
        if (this.isSetMethodsCalledFromSave())

        {
            return;
        }
    }
    else
    {
        if (this.isFieldSet(fieldNum(SalesTable, NewField )))
        {
            return;
        }
        if (!this.NewField ())
        {
            if (this.isSetMethodsCalledFromSave())
            {
                this.NewField (Value);
            }
        }
    }
}

4.2 Do the same for class axSalesLine:

eg:

X++:
public NewField NewField(NewField _NewField= Value)
{
    if (!prmisdefault(_NewField))
    {
        this.setField(fieldNum(SalesLine, NewField), _NewField);
    }
    return salesLine.NewField;
}
And

X++:
protected void SetNewField()
{
    if (this.isMethodExecuted(funcName(), fieldNum(SalesLine, NewField)))
    {
        return;
    }
    this.setAxSalesTableFields();
    if (this.isAxSalesTableFieldsSet() || 
this.AxSalesTable().isFieldModified(fieldNum(SalesTable, NewField)))
    {
        this.NewField(this.AxSalesTable().NewField());
    }
}
4.3 Adjust the method SetTableFields() in the axSalesLine class. Add the call of the new method NewField().
За это сообщение автора поблагодарили: Logger (1), jeky (1).