martes, 19 de noviembre de 2013

Rellenar de ceros a la izquierda un numero con sql server

Supongamos que tenemos en la BD un valor de tipo entero menor que 10000 y queremos obtener el valor con el formato: 00001 (para el 1) ... 00159 (para el 159) y así para el resto. La idea sería completar por la izquierda con ceros hasta llegar al tamaño de cadena deseado en nuestro ejemplo 5 caracteres: por tanto completamos con 5 ceros. para el ejemplo del 159 quedaría 00000159 y despues quedarnos con los 5 digitos mas a la derecha de este modo tendremos los ceros necesarios para completar la cadena: 

La funcion que se encarga de repetir el cero es REPLICATE('0', NUMERO_DE_REPETICIONES). 

Con el simbolo "+" concatenamos la cadena de ceros y nos traemos de la base de datos un campo llamado "idPoint" que será tipo entero y por tanto le realizamos una conversión (o Casting) a cadena Cast(idPoint as varchar(7). 

A Todo el valor conseguido le aplicamos la funcion Right para quedarnos con los digitos que digamos empezando por la derecha.


Rellenar de ceros a la izquierda un numero con sql server

Para rellenar de ceros hacia el lado izquierdo un numero podemos hacer la siguiente instrucción sql

select x, y,  RIGHT(REPLICATE('0', 7)+ CAST(idpoint AS VARCHAR(7)), 7)

from tabla

11 comentarios:

  1. Muchas gracias, me ha servido mucho esta información... Es justo lo que andaba buscando. "Como anillo al dedo"

    ResponderEliminar
    Respuestas
    1. Hasta yo mismo consulto alguna vez este artiículo porque con tantos lenguajes y síntaxis hay veces que no termino de recordar... xD. Gracias por el comentario. Vuelve cuando quieras.

      Eliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. segun el nuevo regimen de facturacion tiene que ser asi N°:000-002-01-00000001, el corelativo N°:000-002-01-00000001 donde los primeros 8 digitos no son cambiantes N°:000-002-01- los ultimos 8 si 00000001 no es podido lograr rellenar con ceros ahora de imprimir la factura sale de la siguiente manera N°:000-002-01-1 y asi N°:000-002-01-2, N°:000-002-01-3...N°:000-002-01-100 pero no he podido hacer que se rellene los ceros a la izquierda, necesito me pueda ayudar por favor, tengo una plantilla en xml de la siguiente forma.

    PrintTransactionType
    =============================
    -->
    < name="PrintTransactionType">

    "Large"
    tbNone

    "^"
    PageWidth

    Transaction.Type = transactionPayout

    "GASTO"



    Transaction.Type = transactionDrop

    "RETIRO DE EFECTIVO"



    Transaction.ReceiptReturnMode = TRUE


    "DEVOLUCION"



    (Transaction.Type = transactionAccountPayment)

    "ABONO A CUENTA"



    Transaction.Total > 0

    Transaction.ReceiptTransactionName


    "ANULAR/DEVOLUCION"













    Transaction.Type <> transactionDrop & Transaction.Type <> transactionPayout & Transaction.Type <> transactionNoSale & Transaction.Type <> transactionAccountPayment & Transaction.Type <> transactionQuote & Transaction.Type <> transactionworkorder & Transaction.Type <> transactionlayaway

    Session.Variable9



    Transaction.ReceiptReferenceNumber

    Session.Variable9


    Transaction.ReceiptTransactionNumber







    tbNone

    "<~"
    PageWidth * 0.60
    ""


    "<~"
    PageWidth * 0.50
    ""


    Transaction.ReceiptReferenceNumber

    Transaction.ReceiptReferenceNumberCaption



    "N°:000-002-01-" Transaction.ReceiptTransactionNumber



    Len(Customer.AccountNumber)

    "RTN:" Customer.AccountNumber


    "Cliente:" Customer.Name
    "Dirección:" Customer.HomeAddress.Company
    "Fecha: " Transaction.Date "|H:"Transaction.Time
    "Cajero: " Cashier.Number "|Caja #: " Register.Number
    1


    Vendedor = 1 & len(Entry.Salesrep.Name)

    "Vendedor: "Entry.Salesrep.Name "|" "Artículos: " Transaction.TotalQuantity
    2






    ResponderEliminar
    Respuestas
    1. No entiendo muy bien la pregunta. Porque no conozco toda la información del contexto: Este artículo se refiere a rellenar con ceros en una sentencia SQL con motor de base de datos SQL Server. Por ello, suponiendo que el "numero cambiante correlativo" lo tienes en la BD en el campo "numero" de tipo entero de la tabla "facturas" y la primera parte es fija:

      quedaría algo así

      select '000-002-01-' + RIGHT(REPLICATE('0', 8)+ CAST((numero + 1) AS VARCHAR(8)), 8)
      from facturas
      where idFactura= 7

      La idea es .. concatener una parte fija: '000-002-01-'
      tomar el valor entero incrementarlo en uno y realizar el casting a cadena para poder concatenar el resultado: CAST((numero + 1) AS VARCHAR(8)

      completar hasta 8 ceros el valor y quedarnos con la parte derecha puesto que al concatenar 8 a los valores obtenidos obtendremos siempre una cadena de tamaño superior a 8.

      Espero que pueda ayudarte

      Eliminar
  4. Buenas Su Blog es Muy Interesante, Puesto que ando Buscando la Manera correcta de generar esta forma de control para la emisión de facturas aquí en peru mire te explico breve mente necesito generar esto 0001-0000001,0001-0000002,0001-0000003,...0001-9999999,0002-0000001,0002-0000002,0002-0000003,..... Bueno Asi Sucesivamente No se Si Me podría Ayudar Le Puedo Brindar mas detalles solo Dígame si me podría ayudar y BUeno Buen Blog y Gracias Nuevamente

    ResponderEliminar
  5. Hola nill frank ushiñahua flores. Gracias por tus comentarios de aliento.

    Por la entrada en la que me haces la pregunta entiendo que ya tienes en la base de datos lo campos con los valores incrementados por el punto donde vaya el contador.
    En el ejemplo 0001-0000001, "0001" será la "serie" de facturación y "0000004" cada factura de la serie. Por tanto tu debes tener alguna forma de almacenamiento de dichos contadores. Supongamos que tienes una tabla "contadores" con el registro "facturas" y los campos "serie", "contador" que ya estan incrementados con los valores por los que va la serie y número de factura.

    Ejemplo: Tabla contadores

    Tipo_contador SERIE NUMERO
    Facturas 1 4

    La consulta para el formato que quieres sería

    select RIGHT(REPLICATE('0', 4)+ CAST(SERIE AS VARCHAR(4)), 4) serie_factura, RIGHT(REPLICATE('0', 4)+ CAST(NUMERO AS VARCHAR(8)), 8) numero_factura,
    RIGHT(REPLICATE('0', 4)+ CAST(SERIE AS VARCHAR(4)), 4) + '-' + RIGHT(REPLICATE('0', 4)+ CAST(NUMERO AS VARCHAR(8)), 8) serie_numero_factura
    from CONTADORES
    where Tipo_contador = 'Facturas'


    Devolveria solo la serie: "0001", solo el numero: "00000004" y en el alias serie_numero_factura el resultado "0001-00000004" que buscas.

    Espero haberte ayudado.

    Saludos Y suerte


    ResponderEliminar

Jesús Moreno - Ingeniero Ténico Informático - consultor Informático

Hola, soy Jesús Moreno Ingeniero Técnico Informático en sistemas por la US y propietario de éste blog. Mi trabajo en los ultimos años se ...