Crear columnas de autonumeración
Con Microsoft Dataverse, puede agregar una columna de autonumeración para cualquier tabla. Para crear columnas de autonumeración en Power Apps, consulte Columnas de autonumeración.
El artículo explica cómo puede crear mediante programación un atributo de autonumeración y establecer un valor de semilla para los elementos de la secuencia. Además, el 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 una columna de numeración automática del mismo modo que se crea una columna de cadena mediante la clase StringAttributeMetadata excepto que en este caso se usa la nueva propiedad AutoNumberFormat. Utilice AutoNumberFormat
property 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 crea una columna de numeración automática, los valores de la propiedad FormatName o Property deben ser Text
. Puesto que valores son los valores predeterminados, normalmente no será necesario definir esta propiedad. No puede crear una columna de autonumeración que use cualquier otro tipo de formato especial como Email
, Phone
, TextArea
, Url
o cualquier otro formato existente.
SQL genera el segmento secuencial que garantiza la unicidad.
Nota
Puede modificar una columna de texto de formato existente para que sea un formato de autonumeración.
En aplicaciones basadas en modelos que usan interfaz unificada, los controles vinculados a una columna de numeración automática deben configurarse explícitamente como deshabilitados. Si no establece el valor de la columna inicial en el formulario, el valor se establece solo después de guardar la tabla. La numeración automática se puede aplicar a valores de columna en vistas, cuadrículas, etc.
Ejemplos
Los siguientes ejemplos muestran cómo crear una nueva columna de autonumeración llamada new_SerialNumber
para una tabla personalizada llamada new_Widget
que tendrá un valor parecido al siguiente: WID-00001-AB7LSFG-20170913070240
usando la API Web y el SDK de Dataverse para .NET.
Puede crear y actualizar definiciones de tabla mediante la API web. Más información: Crear y actualizar definiciones de tabla mediante la API web.
Solicitud:
POST [Organization URI]/api/data/v9.0/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
}
Respuesta:
HTTP/1.1 204 No Content
OData-Version: 4.0
OData-EntityId: [Organization URI]/api/data/v9.0/EntityDefinitions(402fa40f-287c-e511-80d2-00155d2a68d2)/Attributes(f01bef16-287c-e511-80d2-00155d2a68d2)
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.
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 valores de formato de marcadores de posición de datetime de 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 fila, la columna de autonumeración genera la cadena aleatoria con la longitud definida si el valor está entre 1 y 6. Si usa un MIN_LENGTH value 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 fila, la columna de autonumeración 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 fila número 100 será 100. El número sigue 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. Establecer esta propiedad tiene poco valor 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 al crear la columna. El error aparece solo cuando intenta guardar una tabla que utiliza un AutoNumberFormat
value 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 tabla obtendrá un error Argumento no válido al intentar guardar por primera vez la tabla que contiene la nueva columna de numeración automática.
Actualizar columnas de autonumeración
Si crea una columna de autonumeración con una configuración incorrecta o desea modificar una columna de autonumeración existente, puede actualizar en la columna el AutoNumberFormat
value.
El siguiente fragmento de código explica cómo recuperar, modificar y actualizar la columna de autonumeración usando el SDK para .NET:
Para modificar una columna de numeración automática existente, debe recuperar la columna mediante la clase RetrieveAttributeRequest.
// Create the retrieve request
var attributeRequest = new RetrieveAttributeRequest
{
EntityLogicalName = entityName.ToLower(),
LogicalName = "new_serialnumber",
RetrieveAsIfPublished = true
};
// Retrieve attribute response
var attributeResponse = (RetrieveAttributeResponse)_serviceProxy.Execute(attributeRequest);
Después de recuperar la columna de autonumeración, debe modificar y actualizar la columna.
//Modify the retrieved autonumber column
AttributeMetadata retrievedAttributeMetadata = attributeResponse.AttributeMetadata;
//Modify the existing column by writing the format as per your requirement
retrievedAttributeMetadata.AutoNumberFormat = "CAR-{RANDSTRING:5}{SEQNUM:6}";
// Update the autonumber column
var 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 el mensaje SetAutoNumberSeed
para establecer el número siguiente que se usará para el segmento de la secuencia.
Por ejemplo, cuando la longitud del número de secuencia es 5, es posible que desee comenzar con un valor inicial de 10 000 en lugar del valor predeterminado de 00001.
Si desea elegir un valor inicial diferente después de crear la columna de autonumeración, 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 tabla que contiene la columna en el que desea establecer el valor de semilla. |
AttributeName |
cadena | El nombre lógico de la columna en la que desea establecer el valor de semilla. |
Value |
entero | Siguiente valor de autonumeración para la columna. |
Nota
Establecer el valor de inicialización solo cambia el valor numérico actual para la columna especificada en el entorno actual. No implica un valor de inicio común para la columna. 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 de SetAutoNumberSeed
Los siguientes ejemplos establecen el valor de semilla en 10000 para una columna de autonumeración llamada new_SerialNumber
para una tabla personalizada llamada new_Widget
.
Con la API web SetAutoNumberSeed Action.
Solicitud:
POST [Organization URI]/api/data/v9.0/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
}
Respuesta:
HTTP/1.1 204 No Content
OData-Version: 4.0
Más información: Use las acciones de API de web > Acciones sin enlazar
Herramientas de la Comunidad
Administrador de número automático
Administrador de numeración automática para XrmToolBox es una herramienta impulsada por la comunidad para Dataverse que proporciona una interfaz de usuario para configurar, actualizar y quitar el formato de numeración automática en columnas nuevas 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 Dataverse 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.
Consulte también
Trabajar con definiciones de tabla mediante código
Personalizar definiciones de tablas
Nota
¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)
La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).