Member 14524579 Ответов: 1

Мне нужно пропустить выходные.


доброе утро,
Я работаю над проектом, где пользователь добавляет дату в текстовое поле и программа создает список действий с начальной и конечной датами, а также создает действия в зависимости от количества барабанов Ci, то, что я ищу, это то, что программа создает список действий с датами с понедельника по пятницу или с понедельника по субботу или с понедельника по воскресенье, потому что если вы этого не сделаете, программа вычисляет дни без условий.

Как я могу решить эту проблему?


 Dim Table As New DataTable
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim date1 As Date
        Try
            date1 = CType(TextBox1.Text, Date)
        Catch
            Exit Sub
        End Try
                Dim numRows As Integer

                If Integer.TryParse(TextBox4.Text, numRows) Then
                    If (numRows >= 1) Then
                For i As Integer = 1 To numRows
                    Table.Rows.Add("Manufacturing", "Channel", "Cut plate C" & i, DateAdd(DateInterval.Day, 1, date1), DateAdd(DateInterval.Day, 2, date1))
                    Table.Rows.Add("Manufacturing", "Channel", "Rolled plate C" & i, DateAdd(DateInterval.Day, 3, date1), DateAdd(DateInterval.Day, 4, date1))
                    Table.Rows.Add("Manufacturing", "Channel", "Longituid welding C" & i, DateAdd(DateInterval.Day, 5, date1), DateAdd(DateInterval.Day, 6, date1))
                    Table.Rows.Add("Manufacturing", "Channel", "Re rolled C" & i, DateAdd(DateInterval.Day, 7, date1), DateAdd(DateInterval.Day, 8, date1))
                    date1 = DateAdd(DateInterval.Day, 8, date1)
                Next
                    Else
                        MessageBox.Show("Value: " & TextBox4.Text & " El numero de filas debe ser mayor o igual a 1", "Error")
                    End If
                Else
                    MessageBox.Show("Value: " & TextBox4.Text & " Número invalido", "Error")
                End If

                For C As Integer = 0 To DataGridView1.Columns.Count - 1
                    DataGridView1.Columns(C).AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
                Next C

    End Sub


Что я уже пробовал:

Dim Eleccion As Integer = 0
  Private Sub RBEleccionXXX_CheckedChanged(sender As Object, e As EventArgs) Handles RBEleccion1.CheckedChanged, RBEleccion2.CheckedChanged, RBEleccion3.CheckedChanged
      Select Case sender.name
          Case "RBEleccion1"
              Eleccion = 1
          Case "RBEleccion2"
              Eleccion = 2
          Case "RBEleccion3"
              Eleccion = 3
      End Select


Select Case Eleccion                ' Los días son Domigo = 0, Lunes = 1, …, Sabado = 6.
    Case 1
        If date1.DayOfWeek = 6 Then
            date1 = date1.AddDays(2)
        ElseIf date1.DayOfWeek = 0 Then
            date1 = date1.AddDays(1)
        End If
    Case 2
        If date1.DayOfWeek = 0 Then
            date1 = date1.AddDays(1)
        End If
    Case 3
        ' Nada hacer
End Select

ZurdoDev

Легко. Проверьте день недели, а затем либо добавьте его, либо не добавляйте. Где ты застрял?

Maciej Los

Ваш вопрос не совсем ясен. Пожалуйста, будьте более конкретны и предоставьте более подробную информацию о вашей проблеме. Какое условие вам нужно определить для расчета дат.

1 Ответов

Рейтинг:
7

Maciej Los

Предполагая, что все действия начинаются со следующего дня и каждый день...
Предположим, что каждая отдельная дата деятельности зависит от предыдущей даты...

Вы можете создать простой класс (называемый "ManufacturingActivities"), который получает начальную дату и возвращает набор дат действий. Например:

Public Class ManufacturingActivities
	
	Public Property CutPlateC As Date 
	Public Property RolledPlateC As Date 
	Public Property LongituidWeldingC As Date 
	Public Property ReRolledC As Date
	
	Public Sub New(initialDate As Date)
		
		CutPlateC = GetNextWorkingDay(initialDate.AddDays(1))
		RolledPlateC = GetNextWorkingDay(CutPlateC.AddDays(1))
		LongituidWeldingC = GetNextWorkingDay(RolledPlateC.AddDays(1))
		ReRolledC = GetNextWorkingDay(LongituidWeldingC.AddDays(1))
		
	End Sub

	Private Function GetNextWorkingDay(dateToCheck As Date) As Date
		
		Dim retVal As Date = dateToCheck
		
		Do While retVal.DayOfWeek = DayOfWeek.Saturday Or retVal.DayOfWeek = DayOfWeek.Sunday
			retVal = retVal.AddDays(1)
		Loop
		
		Return retVal
		
	End Function

End Class


Использование:
Dim initialdate As Date = DateTime.Today

Dim ma As ManufacturingActivities = New ManufacturingActivities(initialDate)

Console.WriteLine($"CutPlateC = {ma.CutPlateC.ToString("yyyy-MM-dd")}")
Console.WriteLine($"RolledPlateC = {ma.RolledPlateC.ToString("yyyy-MM-dd")}")
Console.WriteLine($"LongituidWeldingC = {ma.LongituidWeldingC.ToString("yyyy-MM-dd")}")
Console.WriteLine($"ReRolledC = {ma.ReRolledC.ToString("yyyy-MM-dd")}")


Результат:
CutPlateC = 2019-07-11
RolledPlateC = 2019-07-12
LongituidWeldingC = 2019-07-15
ReRolledC = 2019-07-16


Как видите, суббота (13) и воскресенье (14) июля были пропущены.