Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - elqueteconte

#1
Epale Elektro;

Gracias por la información amigo.

El año pasado me diste una enorme ayuda con un utilitario que me ayudaste a desarrollar cuyo objetivo es el de tomar unos txt y empaquetarlos; ahora tengo que incluir en este una función para verificar cada txt; pero ocurre que pueden haber dos grupos de txt a verificar, dependiendo de la opción que indique el usuaior.

Te paso el paquete a ver donde me sugieres que deba colocar la verificarción del archivo antes de hacer todo el trabajo de fusión y empaquetado de los archivos.

Te adjunto el paquete:
https://www.dropbox.com/s/f06pdzxxov2bp3w/WindowsApplication6.rar?dl=0
#2
Saludos amigos,

Tiempo sin andar por acá.

En esta oportunidad vengo a hacerles una consulta; necesito hacer tres cosas:
1.- Leer la estructura de un archivo txt cuyos campos están separados por punto y coma.
2.- Leer cada campo del registro y validar si el campo tiene datos o está vacio, si tiene valores numericos cuando debe ser alfanumericos.
3.- Si encuentra errores en los registros ir guardandolos en otro txt y al fina dar un resumen, es decir, se procesaron X registros los cuales Y tienen errores e indicar cada registro con su error al lado

Alguien podría darme una mano con esto?

Gracias mil desde ya.

#3
.NET (C#, VB.NET, ASP) / Re: Leer nombre de carpetas
19 Noviembre 2015, 16:42 PM
RESUELTO...!!!!  :laugh: ;-) :silbar: ::)

Encontré la solución...

Explicación:

El problema era que en la definición de la variable directories; el primer parametro que el metodo SelectDirectories recibe es el sourcedir (directorio origen) y yo le estaba pasando dateDir (directorio destino) entonces pues se generaba un conflicto y el metodo no generaba la lista de los días y se generaba la variable vacía.

La solución fue utilizar el valor del SelectedPath y voilà caso resuelto.
La definición quedaría de la siguiente manera:
Código (vbnet) [Seleccionar]
Dim directories As IEnumerable(Of DirectoryInfo) = DateUtil.SelectDirectories(Me.fdg.SelectedPath, Me.year, monthNumber, DateUtil.DirNameFormat)

Sigo trabajando....

Gracias mil...!
#4
.NET (C#, VB.NET, ASP) / Re: Leer nombre de carpetas
16 Noviembre 2015, 14:58 PM
Saludos amigo,

Gracias mil por la acotación creo que mezcle peras con manzanas.

Voy a dividir las dudas en función de la manera como se puede llamar al método MoveDateDirectories
1.- Mensual:
La definición o declaración de la variable sería:
Código (vbnet) [Seleccionar]
Dim directories As IEnumerable(Of DirectoryInfo) = DateUtil.SelectDirectories(dateDir, Me.year, monthNumber, DateUtil.DirNameFormat)
El llamado al metodo sería:
Código (vbnet) [Seleccionar]

MoveDirectories(directories, dateDir)


Pero al hacer debuging y evaluar los resultados, el metodo no está moviendo las carpetas, revisando mas a fondo encuentro que al evaluar la variable directories esta emite un mensaje que reza: Empty = "La enumeración no produjo ningún resultado".


2.- Semanal:
La definición o declaración de la variable sería:
Código (vbnet) [Seleccionar]
Dim directories As IEnumerable(Of DirectoryInfo) = SelectDirectories(dateDir, Me.year, monthNumber, Enumerable.Range(InitialDate.Day, differenceInDays), DateUtil.DirNameFormat)
El llamado al metodo sería el mismo que el mensual:
Código (vbnet) [Seleccionar]
MoveDirectories(directories, dateDir)

Preguntas:
a.- Porque la variable directories tiene ese mensaje de error?

b.- Donde y para qué se colocaría la declaración de:
Código (vbnet) [Seleccionar]

Public Shared targetDirInfo As DirectoryInfo
Public Shared dirInfo As DirectoryInfo


Desde ya mil gracias brother. :laugh:

Un abrazo y el mejor de los días para todos....

#5
.NET (C#, VB.NET, ASP) / Re: Leer nombre de carpetas
12 Noviembre 2015, 17:28 PM
Saludos,

Me puse a estudiar el metodo Enumerable.Range y me día cuenta que lo que decía antes era un soberano disparate pues el range utiliza el valor del día de la fecha inicial (para mi caso especíifico) y el segundo valor es la cantida de días; es decir; que si la fecha de inicio es 01-11-2015 y la fecha fin es 12-11-2015; entonces el primero valor será el 1 y el segundo valor será el 11.

Esto significa que debo sacar una operación matematica pra calcular la diferencia.

Código (vbnet) [Seleccionar]

Dim InitialDate As Date = DTPSince.Value
Dim FinalDate As Date = DTPUntil.Value
Dim tspan As TimeSpan
Dim differenceInDays As Integer
tspan = InitialDate - FinalDate
differenceInDays = tspan.Days


Una vez obtenido esto la definición de la variable directories sería:
Código (vbnet) [Seleccionar]

Dim directories As IEnumerable(Of DirectoryInfo) = SelectDirectories(dateDir, Me.year, monthNumber, Enumerable.Range(InitialDate.Day, differenceInDays))


Pero me sigue dando error de IEnumerable (Of Integer) to String.

Que estoy haciendo mal? :-\
#6
Saludos;

1.-  
Código (vbnet) [Seleccionar]
Enumerable.Range(inicio, fin)
Donde inicio y fin son el valor del DateTmePiker que seleccionó el usuario.

Sería algo como:
Código (vbnet) [Seleccionar]

Dim directories As IEnumerable(Of DirectoryInfo) = SelectDirectories(dateDir, Me.year, monthNumber, Enumerable.Range(Me.DTPSince.Value, Me.DTPUntil.Value))


Pero dado que el valor que espera el método Enumerable es un entero y el valor que tiene el objeto DTPSince es un string hay que hacer la conversión, que inicialmente sería con esto:

Código (vbnet) [Seleccionar]
Convert.ToInt32(DTPUntil.Value.ToString("yyyyMMdd"))

Es esto correcto?

Así quedaría la definición de la variable:
Código (vbnet) [Seleccionar]

Dim directories As IEnumerable(Of DirectoryInfo) = SelectDirectories(dateDir, Me.year, monthNumber, Enumerable.Range(Convert.ToInt32(DTPSince.Value.ToString("yyyyMMdd")), Convert.ToInt32(DTPUntil.Value.ToString("yyyyMMdd"))))


2.- La definición de la variable sería entonces asi:
Código (vbnet) [Seleccionar]
Dim directories As IEnumerable(Of DirectoryInfo) = DateUtil.SelectDirectories(dateDir, Me.year, monthNumber, DateUtil.DirNameFormat)

Como quedaría el llamado al metodo?

Pues he intentado con la variable targetDirInfo y dirInfo pero  me está dando error de no declarado o inaccesible.

Gracias!
#7
Cita de: Eleкtro en  9 Noviembre 2015, 21:27 PM
Lo has entendido todo a la perfección y lo has sabido adaptar al código sin aydua :).

Solo que, aquí, no se si lo has entendido del todo, yo creo que deberías averiguar el día/semana que haya seleccionado en tu control DateTimePicker, y usarlo en el rango, por que esta función lo que hace es devolver un rango de valores desde X hasta Y: Enumerable.Range(desde_primer_dia_X, hasta_último_dia_Y):

Código (vbnet) [Seleccionar]
Dim directories As IEnumerable(Of DirectoryInfo) = SelectDirectories(dateDir, Me.year, monthNumber, Enumerable.Range(1, semana))



Aunque bueno, eso es como tú lo quieras hacer.

Saludos!

Gracias, gracias, gracias jejejejeje

No entendí lo ultimo, acerca de la función de los días; la idea es que el usuario coloque al menos 2 días, es decir, desde el 01 al 02, pero no va a poder seleccionar varios días salteado por ejemplo, 01, 03, 05 y 09. En este caso sería como seleccionar entre el 01 y el 09.

So, siempre habrá un rango que será igual o mayor a dos días y menor al ultimo día del mes. La fecha desde no puede ser posterior a la fecha hasta y la fecha hasta no puede ser inferior a la fecha desde, estas son reglas que se colocarán en la validación del campo con el evento onChange.

En este caso te pregunto como sería la función Enumerable.Range ?

Otra cosa:
Al función SelectDirectories espera 4 parámetros y en el llamaddo yo le estoy colocando solo 3, me falta el dateFormat, de donde lo saco?

Código (vbnet) [Seleccionar]

Dim directories As IEnumerable(Of DirectoryInfo) = DateUtil.SelectDirectories(dateDir, Me.year, monthNumber, ME FALTA ESTE PARÁMETRO)


De nuevo gracias mil.
#8
Cita de: Eleкtro en  9 Noviembre 2015, 17:29 PM
No xD, para nada, todo lo contrario, solo que el código estaba un poco ""feo"" y yo soy muy "tiquismiquis" para ciertas cosas.

Sobre lo demás, te comentaré en privado.

Saludos!

Limpiando el código como me comentas, tenemos entonces:
Código (vbnet) [Seleccionar]

       Public Sub MoveDateDirectories(ByVal year As Integer,
                                       ByVal month As Integer,
                                       ByVal dateFormat As String,
                                       ByVal sourceDir As String,
                                       ByVal targetDir As String)
            If (CStr(year).Length <> 4I) Then
                Throw New ArgumentOutOfRangeException(paramName:="year", message:="A value of 4 digits' is required.")
            Else
                Dim sourceDirInfo As New DirectoryInfo(sourceDir)
                Dim targetDirInfo As New DirectoryInfo(targetDir)
                Dim dateDirNames As IEnumerable(Of String) =
                    From day As Integer In Enumerable.Range(1, DateTime.DaysInMonth(year, month))
                    Select dateFormat.Replace("yyyy", CStr(year)).
                                                  Replace("MM", CStr(month).PadLeft(2, "0"c)).
                                                  Replace("dd", CStr(day).PadLeft(2, "0"c))
                Dim directories As IEnumerable(Of DirectoryInfo) =
                    From dirInfo As DirectoryInfo In sourceDirInfo.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)
                    Where dateDirNames.Contains(dirInfo.Name)
                If (Not directories.Any) Then
                    Dim msg As String = String.Format("No ha sido encontrado ningún directorio en '{0}' que cumpla las condiciones de formato de fecha.", sourceDirInfo.FullName)
                    MessageBox.Show(msg, " ", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Else
                    For Each dirInfo As DirectoryInfo In directories
                        Debug.WriteLine(String.Format("Moviendo: {0}", dirInfo.FullName))
                        Try
                            dirInfo.MoveTo(Path.Combine(targetDirInfo.FullName, dirInfo.Name))
                        Catch ex As Exception
                            Throw
                            MessageBox.Show(ex.Message & Environment.NewLine & ex.StackTrace, "By Elektro", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        End Try
                    Next dirInfo
                    MessageBox.Show("Operación finalizada.", "By Elektro", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            End If
        End Sub


Esta es la que en la actualizadad hace el movimiento de los directorios; ahora bien en mi evento Click del botón aceptar tengo:

Código (vbnet) [Seleccionar]

    Private Sub BtAccept_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles BtAccept.Click
        Dim monthNumber As Integer = Me.DTPMonth.Value.Month
        Dim dateDir As String = DateUtil.GetDateDirPath("es-ES", Me.fdg.SelectedPath, Me.year, monthNumber)
        ' Creo el directorio con fecha (si no existe).
        DateUtil.CreateDirectory(dateDir)
        If RBMonth.Checked Then
            DateUtil.MoveDateDirectories(Me.year, monthNumber, DateUtil.DirNameFormat, Me.fdg.SelectedPath, dateDir)
        Else [b]
'El usuario a seleccionado empaquetar solo una semana en particular aqui iria el codigo que corresponde al movimiento de las carpetas que esten dentro del rango de las indicadas por el usuario.[/b]
        End If
        ' Merge text files.
        DateUtil.FindAndMergeFiles(Me.fdg.SelectedPath, Me.CMBComp)
    End Sub


De acuerdo a lo que me estas indicando yo debería:
1.- Quitar la función MoveDateDirectories
2.- Copiar y pegar las funciones que haz desarrollado
3.- En el If si el usuario ha solicitado hacerlo mensual colocar:
Código (vbnet) [Seleccionar]

    Dim directories As IEnumerable(Of DirectoryInfo) = SelectDirectories(dateDir, Me.year, monthNumber)
MoveDirectories(directories, Path.Combine(targetDirInfo.FullName, dirInfo.Name))

En caso de haber seleccionado una semana sería:
Código (vbnet) [Seleccionar]

Dim directories As IEnumerable(Of DirectoryInfo) = SelectDirectories(dateDir, Me.year, monthNumber,Enumerable.Range(1, 15))
MoveDirectories(directories, Path.Combine(targetDirInfo.FullName, dirInfo.Name))


Es así como lo entiendo.

Desde ya gracias....!
#9
Hola Elektro buen día;

Gracias mil por el apoyo, tendré muy presente tus recomendaciones.

Te envié por MP el avance que he adelantado con respecto a esto, con el fin de que (dentro de tus posibilidades) le direas un vistazo y me orientaras al respecto.

Estoy totalmente de acuerdo contigo, no se puede hacer un solo método que haga multiples funciones lo ideal es uno por mes y otro por semana.

Quiero tambien disculparme si he cometido alguna falta al mencionar que la función la habias hecho tu, pero me pareció poco etico y profesional que yo me atribuyera algo que no me pertenece, sería un plagio.

Desde ya mil gracias por tu constante y valioso apoyo....

Seguiremos en contacto.

#10
.NET (C#, VB.NET, ASP) / Leer nombre de carpetas
9 Noviembre 2015, 14:50 PM
Saludos amigos,

Tengo una función que lee el nombre de carpetas tomando en cuenta la selección de un mes, y las mueve a una carpeta principal.

Esta función fue desarrollada por Elektro y aquí se las comparto.

Código (vbnet) [Seleccionar]

        Public Sub MoveDateDirectories(ByVal year As Integer,
                                       ByVal month As Integer,
                                       ByVal dateFormat As String,
                                       ByVal sourceDir As String,
                                       ByVal targetDir As String)
            If (CStr(year).Length <> 4I) Then
                Throw New ArgumentOutOfRangeException(paramName:="year", message:="A value of 4 digits' is required.")
                'ElseIf (month < 1I) OrElse (month > 12I) Then
                '    Throw New ArgumentOutOfRangeException(paramName:="month", message:="A value from range '1' to '12' is required.")
                'ElseIf (dateFormat.Replace("y", "").Replace("M", "").Replace("d", "").Length <> 0) Then
                '    Throw New NotImplementedException(message:="Specified date format is not implemented, only 'yyyy', 'MM' and 'dd' are interchangeable.")
                'ElseIf Not Directory.Exists(sourceDir) Then
                '    Throw New DirectoryNotFoundException(message:=String.Format("Source directory not found: '{0}'", targetDir))
                'ElseIf Not Directory.Exists(targetDir) Then
                '    Throw New DirectoryNotFoundException(message:=String.Format("Target directory not found: '{0}'", targetDir))
            Else
                Dim sourceDirInfo As New DirectoryInfo(sourceDir)
                Dim targetDirInfo As New DirectoryInfo(targetDir)
                ' Obtengo una colección con los nombres de directorio con el formato de fecha especificado. (ej. de Octubre 2015:  20151001 ... 20151031)
                Dim dateDirNames As IEnumerable(Of String) =
                    From day As Integer In Enumerable.Range(1, DateTime.DaysInMonth(year, month))
                    Select dateFormat.Replace("yyyy", CStr(year)).
                                                  Replace("MM", CStr(month).PadLeft(2, "0"c)).
                                                  Replace("dd", CStr(day).PadLeft(2, "0"c))
                ' Obtengo una colección con las rutas absolutas de los directorios que cumplen los requisitos.
                Dim directories As IEnumerable(Of DirectoryInfo) =
                    From dirInfo As DirectoryInfo In sourceDirInfo.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)
                    Where dateDirNames.Contains(dirInfo.Name)
                ' Un simple mensaje de información o aviso cuando no se encuentra ningún directorio el cual mover.
                If (Not directories.Any) Then
                    Dim msg As String = String.Format("No ha sido encontrado ningún directorio en '{0}' que cumpla las condiciones de formato de fecha.", sourceDirInfo.FullName)
                    MessageBox.Show(msg, " ", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Else
                    ' Por último, muevo los directorios que cumplieron las condiciones de formato de fecha.
                    For Each dirInfo As DirectoryInfo In directories
                        Debug.WriteLine(String.Format("Moviendo: {0}", dirInfo.FullName))
                        Try
                            dirInfo.MoveTo(Path.Combine(targetDirInfo.FullName, dirInfo.Name))
                        Catch ex As Exception
#If DEBUG Then
                            Throw
#Else
                        MessageBox.Show(ex.Message & Environment.NewLine & ex.StackTrace, "By Elektro", MessageBoxButtons.OK, MessageBoxIcon.Error)
#End If
                        End Try
                    Next dirInfo
                    '                MessageBox.Show("Operación finalizada.", "By Elektro", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If ' Not directories.Any
            End If ' dateFormat...
        End Sub


Esta trabaja perfecto sin problemas; salvo que ahora necesito adecuarla de manera que sea posible mover días, es decir, si el usuario selecciona desde el 01-12-2015 hasta el 15-12-2015 (ambos inclusive); el proceso solo mueva esos días.

Alguien podría orientarme de como adecuar esta función para que haga lo que necesito?

Desde ya mil gracias...