webForumDet fria alternativet

Plussa ihop värden

.NET

23 svar · 678 visningar · startad av andreas_lindh

Medlem sedan jan. 20011 140 inlägg
Frågan#1

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
Medlem sedan dec. 19996 522 inlägg
#2

Behöver du inte konvertera det till integer

Convert.ToInt32(dr("mal_min"))

Medlem sedan jan. 20012 204 inlägg
#3

alltås "2+5+20" kan du inte få till en int. Eller?

Kanske dela upp den med string.split() så kommer den i en array sen loopar du genom och gör varje string till en int.

Medlem sedan jan. 20011 140 inlägg
#4

Tack. Det fungerar när jag delar upp den.

Hur användr man string.split()?

Nu använde jag

Split(dr("mal_min"), "+")
Medlem sedan jan. 20012 204 inlägg
#5

Så här brukar fungera:

Dim strName() As String = strName.Split(".")
strName(0)
strName(1)
strName(2)
etc
Medlem sedan jan. 20011 140 inlägg
#6

Var ska jag stoppa in dr("mal_min") i den koden?

Medlem sedan jan. 20012 204 inlägg
#7

Fungerar det med Split behöver du väl inte ändra något?

Medlem sedan maj 20012 812 inlägg
#8

Varför i hela världen spara du en sträng som "2+5+20" i din databas? Är det inte bättre att spara 27 direkt om det är just det du vill få ut.

Låter lite som din databasdesign är felaktigt, och det kommer att ge dig värre problem framöver.

- M

Medlem sedan jan. 20011 140 inlägg
#9

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å.

Medlem sedan maj 20012 812 inlägg
#10

Då skall du istället skappa en ny tabell som heter tblUtvisningar och där i lagra varje utvisning som en egen rad. Typ så här.

tblUtvisningar
ID|ID_Match|ID_Team|Minuter
-----------------------------------------
_1|______1|______1|2
_2|______1|______1|2
_3|______1|______2|2

Här har vi nu 3 utvisningar i match nr 1. 4 minuter för lag ID:1 och 2 minuter för lag ID:2.

- M

Medlem sedan jan. 20011 140 inlägg
#11

Jag måste ju ända spara tex 5+20 i minuter.
Annars blir det väl jobbigare att ta ut det ur databasen.

Eller har du någon ide om hur jag kan göra det?

Medlem sedan maj 20012 812 inlägg
#12

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.

- M

Medlem sedan jan. 20011 140 inlägg
#13

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.
Och jag vet inte riktigt hur jag skulle göra det.

Det jag har nu fungerar, även fast det kanske inte är det bästa sättet. Jag får ut det totala antalet utvisningsminuter för varje spelare.

Medlem sedan juni 20011 732 inlägg
#14

andreas_lindh skrev:

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!

Medlem sedan maj 20012 812 inlägg
#15

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

tblUtvisningar_Player
ID|ID_Game|ID_Player|ID_Penalty
-------------------------------------------
_1|______1|_______1|_______1
_2|______1|_______1|_______2
_3|______1|_______1|_______3

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.

- M

Medlem sedan jan. 20011 140 inlägg
#16

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?

Medlem sedan juni 20011 732 inlägg
#17

andreas_lindh skrev:

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. :)

Medlem sedan jan. 20011 140 inlägg
#18

Kanske var lite otydlig.

Det är alltså när jag skriver ut datan från databasen som jag vill ha allt på en rad, inte i databasen

Medlem sedan maj 20012 812 inlägg
#19

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.

- M

Medlem sedan juni 20011 732 inlägg
#20

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):

http://www.idg.se/webstudio/pub/article.asp?id=75

431 ms totalt · 3 externa anrop · v20260731065814-full.767b4345
291 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)