|
■No86580 (mako さん) に返信
>>さらにループも時間毎にグループ化する必要がないのでループのネストが不要になります。
> No86531でのこの部分は結局どうすれば良いのか分かりませんでした。
hでのGroup化をなくせば
For Each rowItm In itm.rows
のループをはずすことが出来ます
>>dtRow(0) = Uridat(i).Jikoku '時刻
> もしかしてこの時点で先に文字列型から日付型 (Date)に変換しておいた方がプログラムの簡素化には繋がるのでしょうか?
確かにその通りですが、DataTable dtの定義が
.Add("時刻", GetType(String))
となっている部分が実際の実装上不可欠ということであれば変換しても文字列になるので無意味です。
.Add("時刻", GetType(Date))
と出来るのであればいみがあります。
>
> なお、↓のプログラムですと、60分を越える120分(1時間)、240分(2時間)などともなると表示は60分と同じともなってしまいます。
>
> If d.Minute Mod IntrMin = 0 Then
この条件が0分を起点として割ったあまりが0という条件なのでそうなります。
そういうことであれば起点とする時間からの総分数に対し条件判定を行う必要があります。
ループの部分の改良版は以下となります。
*マークの付くデータが最初に現れないと正常に動作しません。
Dim tmFirst As Date = Nothing
For Each rowItm In (From r In Src.Tables(0).Select()
Let d = Function(s As String) As Date
Dim d2 As Date = Nothing
If Date.TryParseExact(s, {"HH:mm", "HH: mm", "H:m"}, Nothing, Nothing, d2) Then
Return d2
Else
Return CDate(Nothing)
End If
End Function(r.Field(Of String)("時刻"))
Order By d)
Dim row = rowItm.r
Dim d = rowItm.d
Dim isMark = CType(row("マーク"), String) = "*"
Dim disp = isMark
If isMark Then
tmFirst = d.AddMinutes(-tmFirst.Minute)
Else
If CInt(d.Subtract(tmFirst).TotalMinutes) Mod IntrMin = 0 Then
disp = True
End If
End If
If disp Then
If CType(row("マーク"), String) = "*" Then
For i = 1 To 2
ret.Rows.Add(x, DBNull.Value, DBNull.Value, DBNull.Value) : x += 5
Next
End If
ret.Rows.Add(x, d, row("数量1"), row("数量2"))
x += 5
End If
Next
|