Показать сообщение отдельно
Старый 13.12.2009, 22:18   #10  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
! Методам и переменным нельзя передать более 47 аргументов
Цитата:
Сообщение от Gustav Посмотреть сообщение
P.S. Попутно выяснился предел кол-ва параметров функции strFmt. Если добавить еще один (_par48), то компилятор ругается ошибкой переполнения стека.
Аналогичная проблема появилась при передаче 48 и более аргументов методу, который принимает значения типа Container в формате [арг1, арг2,арг3 ...]. Проблема решилась передачей методу переменной типа Container, а не указанной кострукции. Это навело меня на мысль, что:

методам и переменным хардкодом нельзя передать более 47 аргументов

Например, даже переменной типа Container путем грубой силы не может быть присвоено более 47 аргументов:
X++:
//Проверка максимального количества аргументов, которые можно передавать в коде через запятую
static void ArgsLimitCheck(Args _args)
{
    InventTable     inventTable;
    Container       conFields;
    int             i;
    ;

    select firstFast inventTable;

    conFields = conIns([
                    inventTable.ItemGroupId     //1
                    ,inventTable.ItemId     //2
                    ,inventTable.ItemName     //3
                    ,inventTable.ItemType     //4
                    ,inventTable.PurchModel     //5
                    ,inventTable.Height     //6
                    ,inventTable.Width     //7
                    ,inventTable.SalesModel     //8
                    ,inventTable.ReqGroupId     //9
                    ,inventTable.EPCManager     //10
                    ,inventTable.PrimaryVendorId     //11
                    ,inventTable.NetWeight     //12
                    ,inventTable.Depth     //13
                    ,inventTable.UnitVolume     //14
                    ,inventTable.BOMUnitId     //15
                    ,inventTable.Density     //16
                    ,inventTable.Dimension     //17
                    ,inventTable.Dimension     //18
                    ,inventTable.Dimension     //19
                    ,inventTable.CostModel     //20
                    ,inventTable.UseAltItemId     //21
                    ,inventTable.AltItemId     //22
                    ,inventTable.Intracode     //23
                    ,inventTable.ProdFlushingPrincip     //24
                    ,inventTable.PBAItemAutoGenerated     //25
                    ,inventTable.BOMManualReceipt     //26
                    ,inventTable.StopExplode     //27
                    ,inventTable.Phantom     //28
                    ,inventTable.IntraUnit     //29
                    ,inventTable.BOMLevel     //30
                    ,inventTable.BatchNumGroupId     //31
                    ,inventTable.AutoReportFinished     //32
                    ,inventTable.OrigCountryRegionId     //33
                    ,inventTable.StatisticsFactor     //34
                    ,inventTable.AltConfigId     //35
                    ,inventTable.StandardConfigId     //36
                    ,inventTable.ProdPoolId     //37
                    ,inventTable.PropertyId     //38
                    ,inventTable.ABCTieUp     //39
                    ,inventTable.ABCRevenue     //40
                    ,inventTable.ABCValue     //41
                    ,inventTable.ABCContributionMargin     //42
                    ,inventTable.CommissionGroupId     //43
                    ,inventTable.Configurable     //44
                    ,inventTable.SalesPercentMarkup     //45
                    ,inventTable.SalesContributionRatio     //46
                    ,inventTable.SalesPriceModelBasic     //47
/*                    ,inventTable.MinAverageSettle     //48     Для проверки переместить комментарий на одну строку ниже
                    ,inventTable.NameAlias     //49
                    ,inventTable.ProdGroupId     //50
                    ,inventTable.projCategoryId     //51
                    ,inventTable.grossDepth     //52
                    ,inventTable.grossWidth     //53
                    ,inventTable.grossHeight     //54
                    ,inventTable.standardPalletQuantity     //55
                    ,inventTable.qtyPerLayer     //56
                    ,inventTable.sortCode     //57
                    ,inventTable.ConfigSimilar     //58
                    ,inventTable.SerialNumGroupId     //59
                    ,inventTable.DimGroupId     //60
                    ,inventTable.ModelGroupId     //61
                    ,inventTable.ItemBuyerGroupId     //62
                    ,inventTable.TaxPackagingQty     //63
                    ,inventTable.WMSPalletTypeId     //64
                    ,inventTable.OrigStateId     //65
                    ,inventTable.WMSPickingQtyTime     //66
                    ,inventTable.TaraWeight     //67
                    ,inventTable.PackagingGroupId     //68
                    ,inventTable.ScrapVar     //69
                    ,inventTable.ScrapConst     //70
                    ,inventTable.StandardInventColorId     //71
                    ,inventTable.StandardInventSizeId     //72
                    ,inventTable.ItemDimCombinationAutoCreate     //73
                    ,inventTable.ItemDimCostPrice     //74
                    ,inventTable.ItemIdCompany     //75
                    ,inventTable.AltInventSizeId     //76
                    ,inventTable.AltInventColorId     //77
                    ,inventTable.ForecastDMPInclude     //78
                    ,inventTable.PalletTagging     //79
                    ,inventTable.ItemTaggingLevel     //80
                    ,inventTable.BOMCalcGroupId     //81
                    ,inventTable.PBAItemConfigurable     //82
                    ,inventTable.PBAInventItemGroupId     //83
                    ,inventTable.PBAHideDialog     //84
                    ,inventTable.PBAHideApproval     //85
                    ,inventTable.PBAAutoStart     //86
                    ,inventTable.PBAMandatoryConfig     //87
                    ,inventTable.Packing_RU     //88
                    ,inventTable.IntrastatWeight_CZ     //89
                    ,inventTable.dataAreaId     //90
                    ,inventTable.recVersion     //91
                    ,inventTable.RecId     //92
                    */
                      ], 1);

    for (i = 1 ; i <= conLen(conFields); i++)
    {
        info(strFmt("%1 - %2", i, typeOf(conPeek(conFields, i)) ));
    }
}
Но если присваивать переменной-контейнеру значения в цикле, то проблему можно избежать.

Думаю, ограниченние введено нарочно, чтобы разработчики шевелили извилинами, а не баловались копипейстом .

upd: изменил джоб, убрал поля DEL_. Джоб работает в AX4.0 SP2, в AX2009 SP1 -- не работает. Времени не хватило придумать новый пример.

Последний раз редактировалось Kabardian; 14.12.2009 в 00:07.