MDB Pivotabfrage Sekunden in Zeit "hh:mm:ss" formatieren

06/12/2008 - 20:11 von Thomas Hübner | Report spam
Hi Newsgroup,

ich habe folgende Abfrage (Pivot) in einer MDB:

TRANSFORM Sum(user_log.sid_duration) AS totChannelDuration
SELECT Format(user_log.sid_start,'DD.MM.YYYY') AS [Day], user_log.user
FROM user_log INNER JOIN sid_ref ON user_log.sid=sid_ref.rsid
GROUP BY Format(user_log.sid_start,'DD.MM.YYYY'), user_log.user
PIVOT sid_ref.channel;

Ich würde gerne totChannelDuration (Sekunden) im Format hh:mm:ss in der
Ansicht erhalten. Habe ich eine Chance dies schon im Statement
hinzukriegen?
Das Resultat wird unter VB in einer Datatable->Datagridview dargestellt.
Plan B wàre die Datatable zu durchlaufen und mit einer VB Funktion eine
zweite Datatable zu füllen die die formatierten Werte enthàlt.

So würde ich es in VB machen

Public Function SecToTime(ByRef Seconds As Integer) As String
Dim rHour As Integer = (Seconds \ 3600)
Dim rMinute As Integer = (Seconds - (rHour * 3600)) \ 60
Dim rSecond As Integer = (Seconds - (rHour * 3600) - (rMinute *
60))
Dim rDay As Integer = rHour \ 24

If rHour < 24 Then
Return CStr(rHour).PadLeft(2, CChar("0")) & ":" & _
CStr(rMinute).PadLeft(2, CChar("0")) & ":" & _
CStr(rSecond).PadLeft(2, CChar("0"))
Else
rHour = (rHour Mod 24)
Return CStr(rDay) & "d " & _
CStr(rHour).PadLeft(2, CChar("0")) & ":" & _
CStr(rMinute).PadLeft(2, CChar("0")) & ":" & _
CStr(rSecond).PadLeft(2, CChar("0"))
End If

End Function

Gruß,
Thomas
 

Lesen sie die antworten

#1 Peter Götz
08/12/2008 - 09:18 | Warnen spam
Hallo Thomas,

ich habe folgende Abfrage (Pivot) in einer MDB:

TRANSFORM Sum(user_log.sid_duration) AS totChannelDuration
SELECT Format(user_log.sid_start,'DD.MM.YYYY') AS [Day],
user_log.user
FROM user_log INNER JOIN sid_ref ON user_log.sid=sid_ref.rsid
GROUP BY Format(user_log.sid_start,'DD.MM.YYYY'), user_log.user
PIVOT sid_ref.channel;

Ich würde gerne totChannelDuration (Sekunden) im Format
hh:mm:ss in der Ansicht erhalten. Habe ich eine Chance dies
schon im Statement hinzukriegen?



Warum willst Du das im SQL-Statement machen?
Damit wàren diese Daten erst mal nur noch lesbar.

Das Resultat wird unter VB in einer Datatable->Datagridview
dargestellt.



Dann kannst Du zum Formatieren DGV.DefaultCellStyle.Format
und/oder das DGV_CellFormatting-Ereignis nutzen, um Daten
in einem bestimmten Format im Grid anzuzeigen, ohne dabei
den ursprünglichen Datentyp zu veràndern.

Plan B wàre die Datatable zu durchlaufen und mit einer
VB Funktion eine zweite Datatable zu füllen die die
formatierten Werte enthàlt.



Du brauchst weder Deine DataTable zu durchlaufen, noch
brauchst Du eine zweite DataTable.

Schau Dir mal das nachfolgende Beispiel an.

' /// Code in einem leeren Form-Modul (Form1)
Public Class Form1
Private WithEvents DGV As DataGridView
Private mDT As DataTable
Private mDV As DataView

Private Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.Load

DGV = New DataGridView
DGV.Dock = DockStyle.Fill
Me.Controls.Add(DGV)

CreateData()
DGV.DataSource = mDV

With DGV
.DefaultCellStyle.Font = _
New Font("Arial", 12)
.ColumnHeadersDefaultCellStyle.Font = _
New Font("Arial", 8, FontStyle.Bold)

.Columns(0).DefaultCellStyle.Alignment = _
DataGridViewContentAlignment.MiddleRight

.Columns(1).DefaultCellStyle.Format = _
"dd. MMM yyyy"

.AutoResizeColumns()
End With
End Sub

Private Sub CreateData()
Dim i As Integer
Dim DR As DataRow
Dim Rnd As New Random(Now.Millisecond)

mDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("Datum", GetType(Date))
.Columns.Add("Sek", GetType(Integer))

For i = 1 To 15
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = _
New Date _
(Rnd.Next(1980, 2009), _
Rnd.Next(1, 12), _
Rnd.Next(1, 28))

DR.Item(2) = _
Rnd.Next(1, 86399)

.Rows.Add(DR)
Next
End With
mDV = New DataView(mDT)

End Sub

Private Sub DGV_CellFormatting _
(ByVal sender As Object, _
ByVal e As DataGridViewCellFormattingEventArgs _
) Handles DGV.CellFormatting

If e.ColumnIndex = 2 Then
If e.Value IsNot DBNull.Value Then
Dim Dt As Date = _
New Date(0).AddSeconds _
(CType(e.Value, Integer))

e.Value = Format(Dt, "HH:mm:ss")
e.FormattingApplied = True
End If
End If
End Sub

Private Sub DGV_CellMouseClick _
(ByVal sender As Object, _
ByVal e As DataGridViewCellMouseEventArgs _
) Handles DGV.CellMouseClick

Me.Text = DGV.CurrentCell.Value.ToString
End Sub
End Class
' \\\ E N T E

Die DataTable (mDT) enthàlt die Columns

"ID" (Typ Integer)
"Datum" (Typ Date)
"Sek" (Typ Integer)

ID wird mit einer fortlaufenden Nummer belegt.
Datum enthàlt ein zufàlliges Datum und
Sek enthàlt einen Wert vom Typ Integer, der eine
zufàllige Anzahl von Sekunden im Bereich von 1
bis 86399 enthàlt.

Die Werte in der Spalte "Datum" werden via
DGV.DefaultCellStyle.Format formatiert und
die Werte in der Spalte "Sek" werden im
DGV_CellFormatting-Ereignis zu HH:mm:ss
formatiert. In dieser Spalte ist die Eingabe einer
Anzahl von Sekunden möglich, die dann sofort
(beim Verlassen der Zelle) wieder zu HH:mm:ss
formatiert wird.

Bei dieser Gelegenheit solltest Du Dir auch noch
die Online-Hilfe zu

DGV_CellParsing
DGV_CellValidating

ansehen.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen