Показать сообщение отдельно
Старый 02.03.2018, 06:16   #1  
Blog bot is offline
Blog bot
Участник
 
25,475 / 846 (79) +++++++
Регистрация: 28.10.2006
AX 2012 R3 CU13 Bug: DMF default value mapping for String type
Источник: http://alexvoy.blogspot.com/2018/03/...ult-value.html
==============

There is bug in AX 2012 R3 CU13.

If you check Default type for your data entity staging mapping field of String type, then the system tries to find any first record matching to "Default" value as XML name to get the linked field and compare against its string length.










To fix it, we need to make the following changes in three methods of the form DMFStagingDefaultTable


public class FormRun extends ObjectRun
{
SysDictField dictField;
DMFFieldType dmfFieldType;
DMFSourceXMLToEntityMap dmfSourceXMLToEntityMap;
Types valueType;
// Begin: Alexey Voytsekhovskiy
int wblMaxStrSize;
// End: Alexey Voytsekhovskiy
}



public void init()
{
Args args;
DMFEntity entity;
DMFDefinitionGroupEntityXMLFields dmfDefinitionGroupEntityXMLFields;
SysDictType dictType;

#define.Integer('Integer')
#define.String('String')
#define.RealMacro('Real')
#define.DateMacro('Date')
#define.DateTimeMacro('UtcDateTime')
#define.Time('Time')

super();

if (!element.args() || element.args().dataset() != tableNum(DMFSourceXMLToEntityMap))
{
throw error(strfmt("@SYS25516", element.name()));
}

args = element.args();

dmfSourceXMLToEntityMap = args.record();
// Begin: Alexey Voytsekhovskiy
select firstOnly FieldType, FieldSize from dmfDefinitionGroupEntityXMLFields
where dmfDefinitionGroupEntityXMLFields.FieldName == dmfSourceXMLToEntityMap.EntityField
&& dmfDefinitionGroupEntityXMLFields.Entity == dmfSourceXMLToEntityMap.Entity
&& dmfDefinitionGroupEntityXMLFields.DefinitionGroup == dmfSourceXMLToEntityMap.DefinitionGroup
;
wblMaxStrSize = dmfDefinitionGroupEntityXMLFields.FieldSize ? dmfDefinitionGroupEntityXMLFields.FieldSize : 256;
// End: Alexey Voytsekhovskiy
if (dmfDefinitionGroupEntityXMLFields.FieldType && !dmfSourceXMLToEntityMap.IsAutoDefault)
{
dmfFieldType = dmfDefinitionGroupEntityXMLFields.FieldType;
if (dmfsourceXMLToEntityMap.EntityField)
{
entity = DMFEntity::find(dmfsourceXMLToEntityMap.Entity);
dictField = new SysDictField(tableName2id(entity.EntityTable), fieldName2id(tableName2Id(entity.EntityTable),dmfsourceXMLToEntityMap.EntityField));
}
switch(dmfDefinitionGroupEntityXMLFields.FieldType)
{
case #Integer:
DMFStagingConversionTable_StagingIntValue.visible(true);
break;
case #String:
DMFStagingConversionTable_StagingStrValue.visible(true);
break;
case #RealMacro:
DMFStagingConversionTable_StagingRealValue.visible(true);
break;
case #DateMacro:
DMFStagingConversionTable_StagingDateValue.visible(true);
break;
case #DateTimeMacro:
DMFStagingConversionTable_StagingUtcDataTime.visible(true);
break;
case #Time:
DMFStagingConversionTable_StagingTimeValue.visible(true);
break;
default:
warning("@DMF694");
element.close();
}
}
else if(dmfSourceXMLToEntityMap.IsAutoDefault)
{
entity = DMFEntity::find(dmfsourceXMLToEntityMap.Entity);
dictField = new SysDictField(tableName2id(entity.EntityTable),fieldName2id(tableName2Id(entity.EntityTable),dmfsourceXMLToEntityMap.EntityField));
dictType = new SysDictType(dictField.typeId());
if (dictType && dictType.isTime())
{
valueType = Types::Time;
}
else
{
valueType = dictField.baseType();
}
dmfFieldType = enum2str(dictField.baseType());
switch(valueType)
{
case Types::Integer:
DMFStagingConversionTable_StagingIntValue.visible(true);
break;
case Types::String:
DMFStagingConversionTable_StagingStrValue.visible(true);
break;
case Types::Real:
DMFStagingConversionTable_StagingRealValue.visible(true);
break;
case Types::Date:
DMFStagingConversionTable_StagingDateValue.visible(true);
break;
case Types::UtcDateTime:
DMFStagingConversionTable_StagingUtcDataTime.visible(true);
break;
case Types::Time:
DMFStagingConversionTable_StagingTimeValue.visible(true);
break;
case Types::Guid:
DMFStagingConversionTable_StagingGuidValue.visible(true);
break;
default:
warning("@DMF694");
element.close();
}
}

else
{
element.close();
}
}


and on the sole form data source field StagingStrValue

public boolean validate()
{
boolean ret;
DMFDefinitionGroupEntityXMLFields dmfDefinitionGroupEntityXMLFields;

ret = super();

if(ret)
{
// Begin: Alexey Voytsekhovskiy
if(strLen(DMFStagingConversionTable.StagingStrValue) > wblMaxStrSize)
{
throw error("@DMF788");
}

// select firstOnly FieldSize from dmfDefinitionGroupEntityXMLFields
// where dmfDefinitionGroupEntityXMLFields.FieldName == dmfSourceXMLToEntityMap.XMLField;
//
// if(dmfDefinitionGroupEntityXMLFields.FieldSize)
// {
// if(strLen(DMFStagingConversionTable.StagingStrValue) > dmfDefinitionGroupEntityXMLFields.FieldSize)
// {
// throw error("@DMF788");
// }
// }
// End: Alexey Voytsekhovskiy
}

return ret;
}




Источник: http://alexvoy.blogspot.com/2018/03/...ult-value.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.