none
Es valido una Columna calculada para campo codigo en SQL? RRS feed

  • Pregunta

  • Hola, que tan factible es hacer una columna calculada para generar un campo de codigo alfanumerico, ejemplo:

    --Tabla PRODUCTO
    CREATE TABLE PRODUCTO(
        id_producto INT IDENTITY(1,1) NOT NULL PRIMARY KEY
        nombre VARCHAR(50) NOT NULL,
        DescripcionVARCHAR(50) NOT NULL,
        codproducto AS ('PROD-' + CONVERT(VARCHAR,id_producto)))
    
    GO
    

    Cada  vez que se inserten registros la calumna codigo tomara la cadena "PROD-" + el numero que le asigne el identity:

    ejemplo:

    idproducto            codproducto

    1                            PROD-1

    2                            PROD-2

    3                            PROD-3

    ...

    viernes, 8 de julio de 2016 22:03

Respuestas

  • Jose Alrey,

    ¿El hilo Columna calculada para campo codigo en SQL, es también de tu autoría? Lo menciono porque trata del mismo caso a pesar de ser usuarios distintos los que crearon el hilo.

    Si es un caso distinto entonces -a pesar de ya haber platicado al respecto- copio lo mismo que mencioné al otro usuario:

    Una columna marcada con la propiedad IDENTITY no vale para casos donde se exija un correlativo sin brechas, eso sin duda alguna. Debes ocuparte en implementar una rutina que sume en 1 al valor anterior y esa simple operación se puede tornar compleja en tanto tu aplicación sea ocupada por mas de un usuario a la vez (concurrencia); aprender a gestionar transacciones no es tarea simple pero te dejo unos enlaces que pueden servirte a entender el caso: 

    Entendiendo el Aislamiento en base de datos

    Guía de versiones de fila y bloqueo de transacciones de SQL Server

    Obtención de contador sin identity

    El escenario más simple se dará cuando el proceso de registrar productos lo realice un usuario a la vez, si de eso tienes certeza entonces la única restricción que debes implementar es crear un índice único a la columna para salvaguardar la unicidad de los valores.

    Por otro lado, un código de producto (SKU) no tiene sentido si sólo colocarás un número, ¿tiene alguna relevancia ese valor? ¿Guarda algún significado coherente con el producto como lo haría un código de barras por ejemplo?

    José, ¿sobre todo lo platicado aún tienes dudas? Vi otros hilos que aperturaste con la misma pregunta, ¿hay algo que no tienes claro? Sería bueno lo comentes y cierres toda duda.

    • Propuesto como respuesta JoséMiel sábado, 9 de julio de 2016 17:53
    • Marcado como respuesta José De Alva viernes, 15 de julio de 2016 14:44
    viernes, 8 de julio de 2016 22:10

Todas las respuestas

  • Hola,

    Una columna marcada con la propiedad IDENTITY no vale para casos donde se exija un correlativo sin brechas, eso sin duda alguna. Debes ocuparte en implementar una rutina que sume en 1 al valor anterior y esa simple operación se puede tornar compleja en tanto tu aplicación sea ocupada por mas de un usuario a la vez (concurrencia); aprender a gestionar transacciones no es tarea simple pero te dejo unos enlaces que pueden servirte a entender el caso: 

    Entendiendo el Aislamiento en base de datos

    Guía de versiones de fila y bloqueo de transacciones de SQL Server

    Obtención de contador sin identity

    El escenario más simple se dará cuando el proceso de registrar productos lo realice un usuario a la vez, si de eso tienes certeza entonces la única restricción que debes implementar es crear un índice único a la columna para salvaguardar la unicidad de los valores.

    Por otro lado, un código de producto (SKU) no tiene sentido si sólo colocarás un número, ¿tiene alguna relevancia ese valor? ¿Guarda algún significado coherente con el producto como lo haría un código de barras por ejemplo?


    viernes, 8 de julio de 2016 22:05
  • Jose Alrey,

    ¿El hilo Columna calculada para campo codigo en SQL, es también de tu autoría? Lo menciono porque trata del mismo caso a pesar de ser usuarios distintos los que crearon el hilo.

    Si es un caso distinto entonces -a pesar de ya haber platicado al respecto- copio lo mismo que mencioné al otro usuario:

    Una columna marcada con la propiedad IDENTITY no vale para casos donde se exija un correlativo sin brechas, eso sin duda alguna. Debes ocuparte en implementar una rutina que sume en 1 al valor anterior y esa simple operación se puede tornar compleja en tanto tu aplicación sea ocupada por mas de un usuario a la vez (concurrencia); aprender a gestionar transacciones no es tarea simple pero te dejo unos enlaces que pueden servirte a entender el caso: 

    Entendiendo el Aislamiento en base de datos

    Guía de versiones de fila y bloqueo de transacciones de SQL Server

    Obtención de contador sin identity

    El escenario más simple se dará cuando el proceso de registrar productos lo realice un usuario a la vez, si de eso tienes certeza entonces la única restricción que debes implementar es crear un índice único a la columna para salvaguardar la unicidad de los valores.

    Por otro lado, un código de producto (SKU) no tiene sentido si sólo colocarás un número, ¿tiene alguna relevancia ese valor? ¿Guarda algún significado coherente con el producto como lo haría un código de barras por ejemplo?

    José, ¿sobre todo lo platicado aún tienes dudas? Vi otros hilos que aperturaste con la misma pregunta, ¿hay algo que no tienes claro? Sería bueno lo comentes y cierres toda duda.

    • Propuesto como respuesta JoséMiel sábado, 9 de julio de 2016 17:53
    • Marcado como respuesta José De Alva viernes, 15 de julio de 2016 14:44
    viernes, 8 de julio de 2016 22:10
  • Seria recomendable que elimines este hilo, inicialmente la consulta fue planteada por mi y la has duplicado sin ninguna necesidad. saludos.
    viernes, 8 de julio de 2016 23:19
  • Hola Williams, si la pregunta es de mi autoria, el otro usuario no se porque duplico lo mismo.

    Con respecto ala consulta, si todavia me se hace dificil no aplicarlo si no escoger cual es la mejor manera de realizar una columna de codigo, la aplicacion si debe ser utilizada por varios usuarios unos registran y otros simplemente consultan y modifican datos.

    .Debes ocuparte en implementar una rutina que sume en 1 al valor anterior y esa simple operación se puede tornar compleja en tanto tu aplicación sea ocupada por mas de un usuario a la vez (concurrencia);

    Lo que comentas es sumamente importante y es a lo que no le encuentro respuesta tambien, si  bien es cierto puedo hacerlo asi (una rutina que sume en 1 al valor anterior), al momento de que varios usuarios gestion los datos es donde estaria el problema de concurrencia, claramente lo has dicho.

    Resumiendo entonces Willians: Me gustaria implementar un tipo de codigo  para poder identificar de manera mas facil un atributo llamese, ya sea producto,expediente,cliente,curso..etc, y que los mismos se generen de manera secuencial ejemplo EXP001,EXP002...EXP250,EXP938..etc, que evite la probematica de concurrencia en un ambiente multiusuario?

    Ademas eh visto que ahora se utiliza  el objeto "secuencias"en vez del Identity, que tan funcional es  trabajar con el?


    • Editado Jose Alrey sábado, 9 de julio de 2016 8:49
    viernes, 8 de julio de 2016 23:36
  • Jose Alrey,

    De seguro hay una confusión, he notado que el mismo usuario a respondido otra pregunta de otro usuario como si fuese de su autoría. De seguro algún moderador lo observará y revisará si existe algún problema técnico o de usuario.

    viernes, 8 de julio de 2016 23:41
  • Hol Jose:

    Creo que lo que buscas es implementar un codigo tipo contable, donde una parte de la cadena representa una dependencia de la bodega (o locacion del producto en tu cadena de abastecimiento), otra parte representa un tipificacion del producto, otra parte represente la marca, otra el proveedor, y esto no necesariamente implica que ese sea el orden de creacion, sino que se emplearia como un diccionario de datos, para crear anàlisis un poco mas complejos y elaborados.

    Ahora en cuanto a la pregunta tecnicamente, es posible, que sea o no una buena practica, es debatible y sujeto de controversia, pero lo puedes manejar automaticamente mediante una implementacion de un sistema diccionario, que dependiendo de las caracteristicas del producto genere el codigo inteligente que deseas implementar. He visto que este tipo de estrategias las tiene implementadas en productos tales como "Microsft Great Plains", pero te recomiendo le des una leida al siguiente link, que cita que "las claves inteligentes resultan siendo estupidas, mientras que las estupidas resultan siendo mas inteligentes", por aquello de la "Ingeniera Social Inversa".

    Cordialmente.


    Camilo Villa

    lunes, 11 de julio de 2016 14:00