Crear atributos de numeración automática
Con Dynamics 365 Customer Engagement (on-premises) versión 9 puede agregar un atributo de numeración automática para cualquier entidad. Actualmente, puede agregar el atributo mediante programación. No hay ninguna interfaz de usuario para agregar este tipo de atributo. Este artículo explica cómo puede crear mediante programación un atributo de numeración automática y establecer un valor de semilla para los elementos de la secuencia. Además, este artículo muestra cómo establecer el número de secuencia del registro siguiente si necesita restablecer el valor de semilla en cualquier momento más adelante.
Nota
El establecimiento de un valor de semilla es opcional. No es necesario llamar a la semilla si no es necesario volver a sembrar el valor.
Puede crear un atributo de numeración automática del mismo modo que se crea un atributo de cadena mediante la clase StringAttributeMetadata excepto que en este caso se usa la nueva propiedad AutoNumberFormat. Utilice la propiedad AutoNumberFormat para definir un modelo que incluya números secuenciales y cadenas aleatorias mediante la composición de marcadores de posición, que indica la longitud y el tipo de valores que se generan. Las cadenas aleatorias le ayudan a evitar duplicados o colisiones, en especial cuando los clientes sin conexión intentan crear números automáticamente.
Cuando se crea un atributo de numeración automática, los valores de la propiedad StringAttributeMetadata.FormatName o de la propiedad StringAttributeMetadata.Format deben ser de texto. Puesto que estos son los valores predeterminados, normalmente no será necesario definir esta propiedad. No se puede crear un atributo de numeración automática que utiliza cualquier otro tipo de formato especial como Email, Phone, TextArea, Url o cualquier otro formato existente.
La secuenciación de numeración automática es administrada por SQL y se garantiza que sea única.
Nota
Los valores de autonumeración son preseleccionados por la base de datos al iniciar el registro. Si se inicia un registro pero se cancela, el número que se asignó no se usa. Si, durante este tiempo, otro registro se completa con el número secuencial siguiente, los huecos estarán presentes en la numeración automática de registros.
Nota
Puede modificar un atributo de texto de formato existente para que sea un formato de numeración automática.
En el cliente web heredado, al agregar un control en un formulario vinculado a un atributo de numeración automática, el control se deshabilita automáticamente y se comporta como de solo lectura en el formulario donde los usuarios finales no pueden editar el control. En Interfaz unificada, los controles vinculados a un atributo de numeración automática deben establecerse explícitamente como deshabilitados. Si no establece el valor del atributo inicial en el formulario, el valor se establece solo después de guardar la entidad. La numeración automática se puede aplicar a valores de campo de atributo en vistas, cuadrículas, etc.
Ejemplos
Los siguientes ejemplos muestran cómo crear un nuevo atributo de numeración automática llamado new_SerialNumber para una entidad personalizada llamada new_Widget que tengan un valor similar a este: WID-00001-AB7LSFG-20170913070240. Mediante el servicio de la organización con las clases CreateAttributeRequest y StringAttributeMetadata de ensamblados de SDK:
CreateAttributeRequest widgetSerialNumberAttributeRequest = new CreateAttributeRequest
{
EntityName = "newWidget",
Attribute = new StringAttributeMetadata
{
//Define the format of the attribute
AutoNumberFormat = "WID-{SEQNUM:5}-{RANDSTRING:6}-{DATETIMEUTC:yyyyMMddhhmmss}",
LogicalName = "new_serialnumber",
SchemaName = "new_SerialNumber",
RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
MaxLength = 100, // The MaxLength defined for the string attribute must be greater than the length of the AutoNumberFormat value, that is, it should be able to fit in the generated value.
DisplayName = new Label("Serial Number", 1033),
Description = new Label("Serial Number of the widget.", 1033)
}
};
_serviceProxy.Execute(widgetSerialNumberAttributeRequest);
Usar la API web
Puede crear y actualizar definiciones de entidad mediante la API web.
Más información: Crear y actualizar definiciones de entidad mediante la API web > Crear atributos.
Solicitar
POST [Organization URI]/api/data/v9.1/EntityDefinitions(LogicalName='new_widget')/Attributes HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
{
"AttributeType": "String",
"AttributeTypeName": {
"Value": "StringType"
},
"Description": {
"@odata.type": "Microsoft.Dynamics.CRM.Label",
"LocalizedLabels": [
{
"@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
"Label": "Serial Number of the widget.",
"LanguageCode": 1033
}
]
},
"DisplayName": {
"@odata.type": "Microsoft.Dynamics.CRM.Label",
"LocalizedLabels": [
{
"@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
"Label": "Serial Number",
"LanguageCode": 1033
}
]
},
"RequiredLevel": {
"Value": "None",
"CanBeChanged": true,
"ManagedPropertyLogicalName": "canmodifyrequirementlevelsettings"
},
"SchemaName": "new_SerialNumber",
"AutoNumberFormat": "WID-{SEQNUM:5}-{RANDSTRING:6}-{DATETIMEUTC:yyyyMMddhhmmss}",
"@odata.type": "Microsoft.Dynamics.CRM.StringAttributeMetadata",
"FormatName": {
"Value": "Text"
},
"MaxLength": 100
}
Response
HTTP/1.1 204 No Content
OData-Version: 4.0
OData-EntityId: [Organization URI]/api/data/v9.1/EntityDefinitions(00aa00aa-bb11-cc22-dd33-44ee44ee44ee)/Attributes(11bb11bb-cc22-dd33-ee44-55ff55ff55ff)
Opciones de AutoNumberFormat
Estos ejemplos muestran cómo puede configurar la propiedad AutoNumberFormat para obtener resultados diferentes:
Valor de AutoNumberFormat | Valor de ejemplo |
---|---|
CAR-{SEQNUM:3}-{RANDSTRING:6} |
CAR-123-AB7LSF |
CNR-{RANDSTRING:4}-{SEQNUM:4} |
CNR-WXYZ-1000 |
{SEQNUM:6}-#-{RANDSTRING:3} |
123456-#-R3V |
KA-{SEQNUM:4} |
KA-0001 |
{SEQNUM:10} |
1234567890 |
QUO-{SEQNUM:3}#{RANDSTRING:3}#{RANDSTRING:5} |
QUO-123#ABC#PQ2ST |
QUO-{SEQNUM:7}{RANDSTRING:5} |
QUO-0001000P9G3R |
CAS-{SEQNUM:6}-{RANDSTRING:6}-{DATETIMEUTC:yyyyMMddhhmmss} |
CAS-002000-S1P0H0-20170913091544 |
CAS-{SEQNUM:6}-{DATETIMEUTC:yyyyMMddhh}-{RANDSTRING:6} |
CAS-002002-2017091309-HTZOUR |
CAS-{SEQNUM:6}-{DATETIMEUTC:yyyyMM}-{RANDSTRING:6}-{DATETIMEUTC:hhmmss} |
CAS-002000-201709-Z8M2Z6-110901 |
Los marcadores de posición de cadena aleatoria son opcionales. Puede incluir más de un marcador de posición de cadena aleatorio. Utilice cualquiera de los marcadores de posición de valores de formato para de fecha y hora Cadenas con formato de fecha y hora estándar.
Longitud de cadena
En la tabla se muestra el valor de la longitud de cadena para los marcadores de posición aleatorios y secuenciales.
Marcador de posición | Longitud de cadena | Escenario de salida |
---|---|---|
{RANDSTRING:MIN_LENGTH} |
El valor de MIN_LENGTH está entre 1 y 6. | Cuando se guarda la entidad, el atributo de numeración automática genera la cadena aleatoria con la longitud definida si el valor está entre 1 y 6. Si usa un valor MIN_LENGTH de 7 o más, obtendrá un error de argumento no válido. |
{SEQNUM:MIN_LENGTH} |
El valor mínimo de MIN_LENGTH es 1. El número sigue aumentando más allá de la longitud mínima. | Cuando se guarda la entidad, el atributo de numeración automática funciona bien y sigue funcionando correctamente para valores mayores de MIN_LENGTH. |
Para marcadores de posición de valores secuenciales, MIN_LENGTH es una longitud mínima. Si establece el valor en 2, el valor inicial será 01 y el valor de la entidad número 100 será 100. El número seguirá aumentando más allá de la longitud mínima. El valor en la configuración de la longitud de los valores secuenciales sirve para establecer una longitud coherente para el valor generado automáticamente agregando ceros adicionales al valor inicial. Esto no limitará el valor absoluto. Los marcadores de posición de valores aleatorios siempre serán la misma longitud.
Como los valores secuenciales pueden ser mayores que la longitud mínima asignada, no debería ajustar la propiedad StringAttributeMetadata.MaxLength para que coincida con la longitud del valor con formato. Esto no es de gran utilidad porque podría producir un error en el futuro si el valor supera el valor de MaxLength. Asegúrese de que queda suficiente espacio para un intervalo realista de valores de la secuencia.
Nota
No se necesita ninguna validación de los valores de marcador de posición cuando se crea el atributo. El error aparece solo cuando intenta guardar una instancia de entidad que utiliza un valor de AutoNumberFormat configurado incorrectamente. Por ejemplo, si especifica la longitud de la cadena aleatoria como mayor de 6, la primera persona en crear una nueva instancia de entidad obtendrá un error Argumento no válido al intentar guardar por primera vez la entidad que contiene el nuevo atributo de numeración automática.
Actualizar atributos de numeración automática
Si crea un atributo de numeración automática con una configuración incorrecta o si desea modificar un atributo de numeración automática existente, puede actualizar el valor AutoNumberFormat del atributo.
El siguiente fragmento de código explica cómo recuperar, modificar y actualizar el atributo de numeración automática.
Para modificar un atributo de numeración automática existente, debe recuperar el atributo mediante la clase RetrieveAttributeRequest.
// Create the retrieve request
RetrieveAttributeRequest attributeRequest = new RetrieveAttributeRequest
{
EntityLogicalName = entityName.ToLower(),
LogicalName = "new_serialnumber",
RetrieveAsIfPublished = true
};
// Retrieve attribute response
RetrieveAttributeResponse attributeResponse = (RetrieveAttributeResponse)_serviceProxy.Execute(attributeRequest);
Después de recuperar el atributo de numeración automática, debe modificar y actualizar el atributo.
//Modify the retrieved auto-number attribute
AttributeMetadata retrievedAttributeMetadata = attributeResponse.AttributeMetadata;
retrievedAttributeMetadata.AutoNumberFormat = "CAR-{RANDSTRING:5}{SEQNUM:6}"; //Modify the existing attribute by writing the format as per your requirement
// Update the auto-number attribute
UpdateAttributeRequest updateRequest = new UpdateAttributeRequest
{
Attribute = retrievedAttributeMetadata,
EntityName = "newWidget",
};
// Execute the request
_serviceProxy.Execute(updateRequest);
Establecer un valor de semilla
De forma predeterminada, todos los valores de la secuencia de numeración automática comienzan con 1000 y utilizan 0 como prefijo según la longitud. De este modo, la longitud del valor siempre es el misma. Si desea cambiar el valor inicial, debe cambiar el valor de semilla inicial mediante la API que se indica a continuación para establecer el número siguiente que se usará para el segmento de la secuencia.
Por ejemplo, si no usó un valor semilla, o si estableció el valor semilla en un solo dígito, su primer número sería un solo dígito con un prefijo de ceros agregado para igualar la longitud del número. Un valor semilla de un solo dígito con una longitud de visualización de 5 resultaría en mostrar "5" como "00005". El uso de un valor semilla le permite comenzar con un valor inicial mayor, por lo que si establece su valor semilla como "10000", un valor de 5 se mostrará como "10005".
Si desea elegir un valor inicial diferente después de crear el atributo de numeración automática, utilice el mensaje SetAutoNumberSeed. Utilice la clase SetAutoNumberSeedRequest cuando use los ensamblados de SDK y la acción SetAutoNumberSeed cuando use la API de web.
El mensaje AutoNumberSeed tiene los siguientes parámetros:
Nombre | Tipo | Descripción |
---|---|---|
EntityName | cadena | El nombre lógico de la entidad que contiene el atributo en el que desea establecer el valor de semilla. |
AttributeName | cadena | El nombre lógico del atributo en el que desea establecer el valor de semilla. |
valor | entero | El siguiente valor de numeración automática del atributo. |
Nota
Establecer el valor de inicialización sólo cambia el valor numérico actual para el atributo especificado en el entorno actual. No implica un valor de inicio común para el atributo. El valor de inicialización no se incluye en una solución cuando se instala en diferentes entornos. Para establecer el número de inicio después de una importación de solución, use el mensaje SetAutoNumberSeed en el entorno de destino.
Ejemplos
Los siguientes ejemplos establecen el valor de semilla en 10000 para un atributo de numeración automática llamado new_SerialNumber para una entidad personalizada llamada new_Widget.
Usando el servicio de organización con la clase SetAutoNumberSeedRequest de ensamblados de SDK:
//Define the seed
SetAutoNumberSeedRequest req = new SetAutoNumberSeedRequest();
req.EntityName = "newWidget";
req.AttributeName = "newSerialnumber";
req.Value = 10000;
_serviceProxy.Execute(req);
Con la acción SetAutoNumberSeed de la API web.
Más información: Use las acciones de API de web > Acciones sin enlazar
Solicitar
POST [Organization URI]/api/data/v9.1/SetAutoNumberSeed HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
{
"EntityName": "new_Widget",
"AttributeName": "new_Serialnumber",
"Value": 10000
}
Response
HTTP/1.1 204 No Content
OData-Version: 4.0
Herramientas de la Comunidad
Administrador de número automático
Auto Number Manager para XrmToolBox es una herramienta impulsada por la comunidad para Dynamics 365 Customer Engagement (on-premises) que proporciona una interfaz de usuario para configurar, actualizar y quitar el formato de numeración automática en atributos nuevos y existentes. Consulte el artículo Herramientas del desarrollador para ver las herramientas desarrolladas por la comunidad y anm.xrmtoolbox.com para obtener más información sobre Auto Number Manager.
Nota
Las herramientas de la comunidad no son un producto de Microsoft Dynamics y no se incluyen en el soporte técnico. Si tiene alguna duda relacionada con la herramienta, póngase en contacto con el Editor. Más información: XrmToolBox.
Vea también
Modelos de metadatos y datos
Personalizar metadatos de atributos de entidad