Fragensteller
Programm soll um Funktionalität erweitern werden

Frage
-
Hallo Stefan,
Dein Angebot nehme ich gerna an. Ich bastel hier wirklich rum.
Es handelt sich um eine bestehende DB (Ursprünglich Access jetzt SQL Server).
Das Programm soll ich um Funktionalität erweitern, wie, die Gesammtkosten die auf das Projekt anfallen.
Die Tabellen tabKostenProjektBenutzerGruppe und tabBenutzerGruppe habe ich eingefügt.
TABLE [dbo].[tabProjekte](
[Projektname] [nvarchar](255)
[Projektbezeichnung] [nvarchar](255)
[Verantwortlicher] [nvarchar](50)
[Termin] [datetime] NULL,
[DefaultVerrechenbarkeit] [bit]
[ProjektInaktiv] [bit]
[upsize_ts] [timestamp] NULL,
[idProjekte] [uniqueidentifier] , IDENTITY
[idKunden] [uniqueidentifier] , FK auf Projekt.idKunden
[ZeitDachMinuten] [int] NULL,
[idKostenProjektBenutzerGruppe] [uniqueidentifier]
FK auf tabKostenProjektBenutzerGruppe.idKostenProjektBenutzerGruppe
[KostenDach] [int] NULL,
---------------TABLE [dbo].[tabKunden](
[Firma] [nvarchar](50)
[Anrede] [nvarchar](50)
[SupportKunde] [bit]
[AnreiseVerrechenbarBis] [float]
[KundeInaktiv] [bit]
[upsize_ts] [timestamp]
[idKunden] [uniqueidentifier] , IDENTITY
---------------TABLE [dbo].[tabKostenProjektBenutzerGruppe](
[idKostenProjektBenutzerGruppe] [uniqueidentifier] , IDENTITY
[idBenutzerGruppe] [uniqueidentifier] NULL,
FK auf tabBenutzerGruppe.idBenutzerGruppe
[idProjekt] [uniqueidentifier] FK auf tabProjekte.idProjekte
[Stundensatz] [decimal](18, 2)
?? [SummeMinuten] [int] NULL,
?? [SummeBetrag] [decimal](18, 2)Die Sicht der Tabelle würde etwa so aussehen. Im Grid soll der Stundensatz z.B. für einen Techniker bezogen auf dieses Projekt eingegeben werden.
id...,Name_Gruppe , Stundensatz
,Techniker , 11
,Auszubildernder, 22
, ... , ...
Für jedes Projekt einen Stundensatz je BenutzerGruppe
------------TABLE [dbo].[tabBenutzerGruppe](
[idBenutzerGruppe] [uniqueidentifier] , IDENTITY
[GruppeName] [nvarchar](50) z.B. Techniker, Auszubildender, ...--------------
TABLE [dbo].[tabPersonal](
[Initialen] [nvarchar](6)
[Name] [nvarchar](20)
[Vorname] [nvarchar](20)
[idPersonal] [uniqueidentifier] , IDENTITY
[idBenutzerGruppe] [uniqueidentifier]
,FK auf tabBenutzerGruppe.idBenutzerGruppe-------------
TABLE [dbo].[tabZeit](
[Datum] [datetime]
[verrechenbar] [bit]
[verrechnet] [bit]
[KontoNr] [nvarchar](10)
[MWSTKuerzel] [nvarchar](8)
[Beschreibung] [ntext]
[upsize_ts] [timestamp]
[Verrechnungsjahr] [smallint]
[idZeit] [uniqueidentifier] , IDENTITY
[idProjekte] [uniqueidentifier] , FK auf tabProjekte.idProjekt
[idPersonal] [uniqueidentifier] , FK auf tabpersonal.idPersonal
[AnfangZeit] [int]
[EndeZeit] [int]
[PauseZeit] [int]
[ArbeitsZeit] [int]
[Erfassungsdatum] [datetime]
Beim anlegen oder Ändern eines Datensatzes, soll zum Projekt die Summe
aus ArbeitsZeit * Stundensatz abgelegt werden.
Zu erhalten idPersonal -> tabPersonal.idBenutzerGruppe ->
tabKostenProjektBenutzerGruppe.(idPersonal & idBenutzerGruppe).Stundensatz
Meine Idee war, im Record tabKostenProjektBenutzerGruppe.(idPersonal & idBenutzerGruppe)
die Kostensumme pro Projekt und Benutzergruppe festzuhalten.Ich hoffe es ist zu verstehen, was ich da machen möchte.
Dei DB Struktur würde ich soweit als möglich umstellen, und bin sehr froh um die Hilfe beim Design!
Gruss Peter
Peter- Geteilt Robert BreitenhoferModerator Mittwoch, 23. März 2011 14:33 Neue Frage, Neuer Thread
Alle Antworten
-
Zur Info: Dieser Thread ist eine Weiterführung aus:
@Peter: Ich hab die Aufteilung des Threads in die Wege geleitet, da sich im SQL Server Forum doch mehr SQL Spezialisten rumtreiben als im VB Forum.
Ich schau mir die Struktur nachher noch genauer an und melde mich dann nochmal dazu.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Beim anlegen oder Ändern eines Datensatzes, soll zum Projekt die Summe
aus ArbeitsZeit * Stundensatz abgelegt werden.
Zu erhalten idPersonal -> tabPersonal.idBenutzerGruppe ->
tabKostenProjektBenutzerGruppe.(idPersonal & idBenutzerGruppe).Stundensatz
Meine Idee war, im Record tabKostenProjektBenutzerGruppe.(idPersonal & idBenutzerGruppe)
die Kostensumme pro Projekt und Benutzergruppe festzuhalten.Hallo Peter,
ich hatte den vorherigen Thread schon etwas beobachtet.
"Arbeitszeit" kommt aus "tabZeit" und "Stundensatz" kommt aus "tabKostenProjektBenutzerGruppe", richtig? (Wieso man Prefix wie tab oder tbl verwendet, habe ich noch nie verstanden, es ist eine Entity, man benennt es auch so und damit ist eigentlich alles klar).
Was ist, wenn sich im Laufe der Zeit der Stundensatz eines Projekte ändert? Die Deadline ist überschritten, alle weiteren Arbeiten werden nur zu 70% abgerechnet. Es gibt Extraarbeiten am Wochenenden, die zu erhöhten Satz abgerechnet werden. Es wird nachträglich ein Datensatz geändert, weil z.B. die Zeiten nicht stimmen, und der geplante Triger macht dann ... was?
Und erzähle mir bitte nicht, das käme nie vor. Es wird vorkommen!
Im Nachhinein wirst Du so nie mehr nachvollziehen können, welche Arbeitszeit mit welchem Stundensatz in die Summe eingeflossen war; der Stundensatz für die Zeit gehört zu der Zeit.Die vorherige Lösung hatte MS Acces verwendet und ich schätze mal, es gibt da entsprechende Erfahrungswerte, was Performanz betrifft. Schiebe diese bitte bei den Überlegung recht weit in den Hintergrund, den der SQL Server arbeitet anders, genauer gesagt: Besser.
Und da es MS Acess war, schätze ich mal, das die Datenmengen nicht so wirklich groß waren?
Von daher wirst Du besser fahren, wenn das Adhoc Reporting immer auf die Detaildaten geht, und nicht extra Statistikwerte per Trigger erzeugt.
Du wirst für die Auswertung und deren Filter eh einen Index benötigen und seit SQL Server 2005 gibt es die "Covering Indexes"; zu den eigentlichen Index Feldern nimmst Du noch Arbeitszeit+Stundensatz (wenn sie in einer Tabelle sind) als Included Column mit auf; dann ist kein Loopup mehr nötig und die Berechung wird sehr schnell erfolgen.Nur mal so aus meinem Bereich berichtet: Ich habe eine Tabelle mit 150 Mio Buchungssätzen, die per Adhoc Reporting von Usern auch ohne Filter über alles abgerufen werden können, sprich ohne WHERE Klausel, und selbst in dem Extremfall braucht der Report nur ~35 sec. Und wer keinen Filter setzt, der darf auch gerne mal 35 sek lang warten; eigene Selbstschuld.
Für komplexe Analyse-Szenarien im relational DB Bereich verwende ich durchaus auch Statistik-Tabellen die per Trigger gefüllt werden; aber nur in sehr wenigen Fällen, wenn es wirklich von der Analyse her aufwendig wird, dann kommen eh nur eine OLAP Lösungen in Frage.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog -
Hallo Olaf,
vielen Dank für Deine Antwort, Ich bin um Input wirklich sehr froh!>Was ist, wenn sich im Laufe der Zeit der Stundensatz eines Projekte ändert?
Der Stundensatz kann in "tabKostenProjektBenutzerGruppe" geändert werden.>der Stundensatz für die Zeit gehört zu der Zeit
Ist angekommen!Deine Meinung ist, ich soll besser auf diese Art und weise die Summe aus der Tabelle Zeit bilden.
SELECT SUM( Zeit.Betrag) AS SummeBetrag FROM Zeit WHERE idProjekt=....Wie das SummeBetrag Ergenbnis zum entsprechenden Projekt, im Grid anzuzueigen?
Durch die Farbe der Zeile im Grid soll dargestellt werden, wie weit das Projekt am Kostendach ist.
Dazu eine ungebundene Spalte erstellen, um den mit "SELECT SUM()" gebildeten Wert abzulegen?Ich möchte lokale Reports (rdlc) verwenden, mit einem DataView als DataSource, damit die Daten die im Grid
sichtbar (und evtl. gefiltert) sind, auch für den Report verwendet werden.Ich habe leider noch nicht wirklich den Faden, wie die Lösung aussehen könnte.
Ich freu mich über weitere Hinweise.Dank und Grüsse
Peter
Peter