jag försöker plussa ihop värden ifrån en databas
I fältet mal_min sparas tex 2+5+20
jag har en funktion som inte fungerar.
Någon som vet hur jag kan lösa det här eller något bätre sätt att göra det på
Dim strSQL As String = String.Format("select mf.mal_min from matchfakta mf,s_matcher s where mf.m_ID = s.ID and s.Serie_ID={0} and mf.Spelar_ID={1} and mf.vilken ='penalty'", serie, spelare)
Dim pim As integer
Dim objcmd1 As New OdbcCommand(strSQL, objconn)
Dim dr As OdbcDataReader
objconn.Open()
dr = objcmd1.ExecuteReader
While dr.Read
pim = pim + cint(dr("mal_min"))
End While
Return pim
dr.Close()
objconn.Close()
Jag får det här felet
Exception Details: System.FormatException: Input string was not in a correct format.
Source Error:
Line 282: dr = objcmd1.ExecuteReader
Line 283: While dr.Read
Line 284: pim = pim + CInt(dr("mal_min"))
Line 285: End While
Line 286: Return pim
Source File: d:\inetpub\wwwroot\tibroik.net\admin2\vStatistik.aspx.vb Line: 284
Det är utvisningar i hockeymatcher
Om jag skulle spara det som 27 tycker jag att det blir jobbigt att hämta det från databasen.
Den enda gången jag vill skriva ut 27 är när jag visar statistiken för spelarna
När jag skriver ut matchfakta från matcherna vill jag att det ska stå 2+5+20
Värdet i fältet kan vara tex 2+10 eller bara 2 eller 2+10+20
Det är därför jag sparar det så.
Kan man verkligen få 20 minuters utvisning i hockey, eller är det totala antalet minuter för en match som är 20 och 5 minuter är totala antalet i en annan match?
I vilket fall som helst så kan alla dessa tider räknas fram om du lägger in det i egen tabell, och det görs med hjälp av SUM() i SQL språket. Hurvida det är "jobbigt" eller ej, är rätt så orelevant så länge du gör RÄTT. Att göra så som du gör strider mot hur en databas skall vara uppbyggd.
Varje post i en databas skall innehålla så "smallt" dataområde som möjligt, alltså om du har ett telefon nummer som består av riktnummer och lokalnummer (08 - 111 11 11) så skall detta egentligen vara två kolumner i en databas, en för riktnummer och en för lokalnummret, nu brukar man slå ihop dessa två kolumner till en, lika så som man oftas gör med namn, för och efternamn slås ihop till en kolumn som heter namn. Detta är egentligen fel och innebär att man har minskat sina möjligheter att finfördela och sorterar sin data.
Ta telefonnummret, om jag delar upp det i 2 kolumner så kan jag enkelt visa alla personer som till hör stockholms området (alla med riktnummer 08) om jag slår ihop det till 1 kolumn så måste jag ta informationen och sedan läsa ut de 2 första siffrorna och se om de är lika med 08 så fall skall jag ta med posten, detta tar kraft och är omständigt att göra.
Så i ditt fall, så får du problem (vilket du också fått) när du vill lägga ihop det totala antalet utvisnings minuter på en match, ännu svårare blir det för dig när du skall lägga ihop det totala antel minuter för en säsong, det verkar (har inte sett din databasdesign så jag vet inte) som att du inte heller kan visa utvsiningsminuter för respspelar, vilket du kan med min variant.
Ett tips är att så mycket beräkningar som möjligt skall skötas av databasen och med en korrekt design så blir det betydligt lättare.
Ja man kan få 5 + 20.
Tex för tackling i ryggen. 5 är för själva tacklingen och 20 är matchstraffet.Om jag lägger in det som 25. Då skulle jag behöva räkna om det när jag skriver ut matchfaktan.
Nej, du ska inte lägga in det som 25 utan som Gladh skriver så ska du aldrig lägga ihop och blanda olika data i samma tabell/cell utan hålla isär dessa. Med hjälp av ID_Match och ID_Team vet du precis var dina data kommer ifrån utan att behöva slå samman dem (det gör du sedan när du ska plocka fram värdena). Annars blir det till slut helt omöjligt att använda siffrorna på ett vettigt sätt utan att göra en massa speciallösningar.
Nu är jag ingen expert på tabelluppbyggnad precis men eftersom matchstraff väl skiljer sig från vanliga utvisningsminuter så egentligen kanske även dessa borde ligga i en egen tabell, eller som sagt åtminstone på en egen rad i din utvisningstabell. Här kan du ju även lägga till en nuffra som du kopplar mot en tabell med olika typer av utvisningar så kan du även enkelt få fram varför han blev utvisad!
Som sagt det är inget problem med min lösning, du skriver bara in 5 resp 20 minuter istället för 2. En annan lösning (som är ännu bätter) är att man gör om det lite, du har nu 2 extra tabeller.
tblUtvisningar
ID|NrMinut|Name
----------------------
_1|_____2|Vanlig utvisning
_2|_____5|Tackling i rygg
_3|____20|MatchStraff
Ur den sista tabellen kan vi utläsa, att spelare med ID:1 har i match med ID:1 fått 3 utvisningar, det är 1 vanlig, 1 tackling i ryggen och ett match straff, tillsammans med tblUtvisningar kan du sedan räkna fram den totala antal minuter som det blir: 27.
Detta är det mest korrekta sätt att bygga upp din databas på, men är du nöjd med din design så ha kvar den, hoppas bara att du inte byggt in dig i något som du inte kan utveckla eller förbättra utan att behöva bygga om designen, för det är inte lätt i efterhand.
Exemplet ovan kan jag enkelt lägga till mot vilken spelar man gjorde sin dumhet, bara lägga till en kolumn: ID_Player2 och lägga in idet på den berörda spelaren. Jag kan även lägga till vilken tid varje utvinsning hände genom att lägga till kolumnen: Time och skriva in tiden där. Det är denna utbyggnad som gör att det är viktigt att man får en korrekt databasdesign från början. Skall du aldrig ändra/uppdatera/bygga ut din databas så spelar det inte så stor roll, men om du tänker bygga på med mer funktioner så är det viktigt att det är rätt från början.
jag ska försöka göra så som du skrivit.
Jag har redan en tabell där jag sparat alla utvisningar som finns.
Nu när jag skriver ut det skrever jag ut det så här
Minuter --tid ----- period lag utvisning spelare
5+20-----12:00-- 1------- A--Board-----Nisse Nilsson
Om jag nu lägger in utvisningarna i en egen tabell. Hur gör jag då för att få alla utvusningar utsrkivna på samma rad?
Om jag nu lägger in utvisningarna i en egen tabell. Hur gör jag då för att få alla utvusningar utsrkivna på samma rad?
Det ska du inte, varje enkild utvisning i sig är en egen rad i din tabell tblUtvisningar_Player (för att mig av använda Gladhs utmärkta exempel). En händelse, en rad. Det finns aldrig någon anledning att avvika från den principen, faktiskt. :)
Du hämtar utvisningarna för sig själv. OM du har en datagrid/repeater som du visar all information i, så har du ett event som heter onItemDataBound() i det eventet så hämtar du ut alla utvisningar för just denna person. Och presenterar dem på en rad.
Aha, sorry. Det kan du göra i din sql-sats där du får joina ihop tabellerna (istället ett fritt skrivet säkert illa fungerande skräckexempel på hur det skulle kunna se ut så får du en länk på hur det fungerar):