none
Agregar numero correlativo RRS feed

  • Pregunta

  • Hola chicos, necesito ayuda, tengo un archivo pdf el cual subo a mi plataforma y viene con una cadena de números y letras que significan diferentes cosas, lo que tengo que hacer es que al final de esta cadena agregarle un numero correlativo, este debe empezar con 001, es decir si el nombre de mi archivo ("nombrearchivo") es 80326500376435463KC012016N este debiese quedar como 80326500376435463KC012016N001, y cada vez que se suba un archivo debe ir sumando osea 002, 003, 004 y estos números no se deben repetir, como lo puedo hacer?

    ayuda plis, gracias

    les dejo el código

    Public Sub Ingresos(ByVal NombreArchivo As String, ByVal archivo As HttpPostedFile) Dim extencion As String = System.IO.Path.GetExtension(NombreArchivo) If extencion = ".pdf" Then

    Dim FileName As String = Replace(NombreArchivo, ".pdf", "") If CertificadosCOLP.BEC.FinderArchivoxnombre(NombreArchivo) = False Then If Len(FileName) < 27 Then Dim RutMandante As String = formatearRut(Left(FileName, 9)) '' rut mandante Dim RutProveedor As String = formatearRut(Left(FileName.Remove(0, 9), 9)) ''rut proveedor Dim TipoContrato As String = Left(FileName.Remove(0, 18), 1) '' tipo contrato Dim Periodo As String = Left(FileName.Remove(0, 19), 6) ''fecha Dim TipoCertificado As String = Left(FileName.Remove(0, 25), 1) '' tipo certificado Try Dim Colp As New BE.CertificadosCOLP Colp.RutMandante = RutMandante Colp.RutProveedor = RutProveedor Colp.TipoContrato = TipoContrato Colp.TipoCertificado = TipoCertificado Colp.Periodo = Periodo Colp.FechaCarga = DateTime.Now Colp.Usuario = DirectCast(HttpContext.Current.User.Identity, System.Web.Security.FormsIdentity).Ticket.Name Colp.Folio = FW.Foliador.Foliador.ObtenerNuevoFolio(FW.Foliador.TiposDeFolio.RPCOMPLEMENTARIOS) BC.AlmacenamientoArchivos.Instance.SubirArchivo(Repositorio.RPCOMPLEMENTARIOS, Colp.Folio, New BC.ArchivoSubido(archivo))

    Colp.EstadoCarga = "Sin Procesar" Colp.Archivo = NombreArchivo BE.CertificadosCOLP.BEC.Persist(Colp) Dim cert As New BE.CertificadosCOLP cert = BE.CertificadosCOLP.BEC.FinderCertificadoxFolio(Colp.Folio) Log(cert.Id, cert.Archivo, Colp.EstadoCarga, "") Catch ex As Exception End Try Else End If Else End If Else End If End Sub






    martes, 17 de mayo de 2016 15:18

Respuestas

  • MichelleRebeca,

    Sumar una unidad al valor que tengas en un contenedor de datos (en la aplicación) no es seguro porque corres el riesgo de que otro usuario -desde otro punto- haya tomado la misma cuenta e intentes grabar una secuencia equivocada, menciono "intentar" porque en tanto hayas implementado la restricción de unicidad la base de datos no permitirá la duplicidad, pero es un riesgo innecesario.

    Lo correcto es tomar desde la base de datos el valor máximo de la cadena y luego sumarle una unidad, la sentencia sql debería tener la siguiente forma:

    SELECT MAX(SUBSTRING(Archivo, CHARINDEX('-', Archivo) + 1, 3)) + 1 FROM MiTabla

    El formato de los 3 dígitos lo das desde la aplicación.

    martes, 17 de mayo de 2016 18:02
  • Te pongo un ejemplo de función que te recorre un directorio y te devuelve el nº máximo de los ficheros que contenga:

    Private Function UltimoNumero(ByVal Directorio As String) As Integer

            UltimoNumero = 0

            Try

                For Each File As String In IO.Directory.GetFiles(Directorio)
                    'aquí pones el código necesario para ir llenando el listbox
                    Dim PosPunto As Integer = File.ToString.LastIndexOf(".")
                    If PosPunto > 0 Then
                        Dim Numero As Integer
                        If Integer.TryParse(File.ToString.Substring(PosPunto - 3, 3), Numero) Then
                            If Numero > UltimoNumero Then
                                UltimoNumero = Numero
                            End If
                        End If
                    End If
                Next
            Catch ex As Exception
                MsgBox(Err.Description)
            End Try

    End Function

    La llamada la harías con:

    MsgBox(UltimoNumero("c:\borrar\") + 1.ToString("D3"))


    Saludos, Javier J

    miércoles, 18 de mayo de 2016 7:23

Todas las respuestas

  • Hola:

     Cuando dices "subo a mi plataforma" a que te refieres?, lo subes a alguna Bd? o simplemente cargas el archivo en una carpeta especifica?

     Si es aun Bd, entonce el camino es mas sencillo pero antes de responderte seria mejor conocer los detalles.


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 17 de mayo de 2016 15:26
  • Holaa, si lo subo a la web y luego se carga en la BD. 


    martes, 17 de mayo de 2016 15:51
  • el nombre solamente es el que se guarda, al final de la N debe decir 001, el que sigue 002, 003, pero no se debe repetir el nombre de los archivos.

    martes, 17 de mayo de 2016 15:55
  • Hola:

     Entonces para agregar el correlativo que deseas yo ejecutaría un consulta sql a la tabla que contiene esta información para saber la cantidad de filas que contiene y así poder sumarle una unidad para obtener el numero siguiente:

     "SELECT COUNT(*) FROM NombreTabla"

     Esta consulta devolvera un entero, a este entero le sumo +1 y con esto tienes el numero que sigue para concatenarlo al nombre de tu archivo.


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 17 de mayo de 2016 16:08
  • Veo un problema en la respuesta de JoséLuis,

    Si en una primera consulta el Count(*) devuelve 005, pero luego se elimina un registro, la próxima vez Count(*) va a volver a devolver nuevamente 005, por lo que si el nombre de archivo ya existe va a crear registros duplicados.

    Mi consejo es llevar almacenado en algún sitio (campo de base de datos, registro del sistema, archivo, etc.) el contador e ir incrementándolo.


    martes, 17 de mayo de 2016 17:21
  • Yo lo que haría es una función que antes de subir el archivo recorra el contenido de la carpeta destino comprbando los 3 últimos caracteres del nombre (sin extensión) de los archivos que contiene tomando el valor mayor que será el que devuelva. Al archivo que subas le añades a su nombre ese valor incrementado en 1.

    Saludos, Javier J

    • Propuesto como respuesta Willams Morales martes, 17 de mayo de 2016 17:30
    martes, 17 de mayo de 2016 17:28
  • Hola PGF:

     No veo el problema que mencionas al eliminar un registro, al eliminarlo no puede haber duplicados, esto suponiendo que no existen otras reglas ni consideraciones.

     Lo que mencionas es valido, supongo que entre mas información nos proporcionen mas acertada sera nuestra respuesta.


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 17 de mayo de 2016 17:32
  • Hola MichelleRebeca,

    Efectivamente, la recomendación de Javier es la correcta, a eso agregaría de que "refuerzes" la unicidad de ese valor en la tabla y para ello te sugiero implementar un índice único sobre la columna [Archivo]:

    CREATE UNIQUE NONCLUSTERED INDEX AK_NombreIndice ON dbo.MiTabla (Archivo ASC);

    martes, 17 de mayo de 2016 17:34
  • Hola PGF:

     No veo el problema que mencionas al eliminar un registro, al eliminarlo no puede haber duplicados, esto suponiendo que no existen otras reglas ni consideraciones.

     Lo que mencionas es valido, supongo que entre mas información nos proporcionen mas acertada sera nuestra respuesta.


    Saludos desde Monterrey, Nuevo León, México!!!

    José,

    Es correcto la advertencia de PGF_MSDN y no solo en ese caso, otro caso puede ser que la secuencia no inicie en 1, o que la sefcuencia tenga brechas, en todos esos casos la cuenta no refleja necesariamente la secuencia, claro, el OP no advierte esos casos pero al ser un riesgo entonces lo mejor es optar por capturar el valor máximo y sumarle una unidad



    martes, 17 de mayo de 2016 17:37
  • y en codigo vb.net no se puede en vez de en la bd, ya que el registro en la bd del archivo se guarda después de que subo el archivo a la página

    por lo que quiero que este numero se ponga antes de generar un archivo en la bd, no se podrá con algun for? yo le puse num += 1

    pero no se si con eso no se vuelva a repetir el numero

    martes, 17 de mayo de 2016 17:43
  • eso es lo que quiero exactamente, como puedo hace esa función que me agregue 001 antes del número, cuando llegue a mas 020, por ejemplo como lo puedo hacer?
    martes, 17 de mayo de 2016 17:44
  • Hola Willams:

     A eso iba con "Suponiendo que no existan otras reglas ni consideraciones" si la tabla ya esta creada y contiene registros previos que no pueden ser modificados entonce es claro que la cuenta no reflajara la continuidad de la serie puesto que al insertar un nuevo registro se tomara el valor total de registros y se le sumara una unidad pero, si la tabla esta vacia y "no existen reglas ni consideraciones adicionales" entonces el conteo reflejara la secuencia que se desea llevar.

     No obstante considero también que la respuesta de javier es la mas acertada puesto que podría requerirse la eliminación de un registro incluido el archivo que no necesariamente tiene que ser el ultimo insertado ahí si se rompería la secuencia.


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 17 de mayo de 2016 17:45
  • MichelleRebeca,

    Sumar una unidad al valor que tengas en un contenedor de datos (en la aplicación) no es seguro porque corres el riesgo de que otro usuario -desde otro punto- haya tomado la misma cuenta e intentes grabar una secuencia equivocada, menciono "intentar" porque en tanto hayas implementado la restricción de unicidad la base de datos no permitirá la duplicidad, pero es un riesgo innecesario.

    Lo correcto es tomar desde la base de datos el valor máximo de la cadena y luego sumarle una unidad, la sentencia sql debería tener la siguiente forma:

    SELECT MAX(SUBSTRING(Archivo, CHARINDEX('-', Archivo) + 1, 3)) + 1 FROM MiTabla

    El formato de los 3 dígitos lo das desde la aplicación.

    martes, 17 de mayo de 2016 18:02
  • Estoy de acuerdo con la propuesta de Javier, pero cuidado con el orden de los archivos (primeros caracteres del nombre) que no ocurra lo siguiente (ejemplo):

    1008525548N001.pdf

    2008525548N002.pdf

    3008525548N004.pdf

    4008525548N003.pdf

    martes, 17 de mayo de 2016 18:04
  • Te pongo un ejemplo de función que te recorre un directorio y te devuelve el nº máximo de los ficheros que contenga:

    Private Function UltimoNumero(ByVal Directorio As String) As Integer

            UltimoNumero = 0

            Try

                For Each File As String In IO.Directory.GetFiles(Directorio)
                    'aquí pones el código necesario para ir llenando el listbox
                    Dim PosPunto As Integer = File.ToString.LastIndexOf(".")
                    If PosPunto > 0 Then
                        Dim Numero As Integer
                        If Integer.TryParse(File.ToString.Substring(PosPunto - 3, 3), Numero) Then
                            If Numero > UltimoNumero Then
                                UltimoNumero = Numero
                            End If
                        End If
                    End If
                Next
            Catch ex As Exception
                MsgBox(Err.Description)
            End Try

    End Function

    La llamada la harías con:

    MsgBox(UltimoNumero("c:\borrar\") + 1.ToString("D3"))


    Saludos, Javier J

    miércoles, 18 de mayo de 2016 7:23
  •         Dim archivoEjemplo As String = "C:\ejemplo.pdf"
            Dim ruta As String = Path.GetDirectoryName(archivoEjemplo)
            Dim NombreArchivo As String = Path.GetFileNameWithoutExtension(archivoEjemplo)
            Dim extensionArchivo As String = Path.GetExtension(archivoEjemplo)
    
            Dim nuevoArchivo As String = ""
    
            nuevoArchivo = ruta & "\" & NombreArchivo & extensionArchivo
    
            If File.Exists(nuevoArchivo) Then
    
                Dim correlativo As Integer = 1
                Dim paths() As String = Directory.GetFiles(ruta & "\", NombreArchivo & "*" & extensionArchivo)
                If paths.Length > 0 Then '
                    For Each docu As String In paths
                        correlativo = correlativo + 1
                    Next
                End If
    
                NombreArchivo = NombreArchivo & "-" & correlativo
                nuevoArchivo = ruta & "\" & NombreArchivo & extensionArchivo
    
            End If


    miércoles, 25 de mayo de 2016 20:26