Hjälp! Ska returnera ett nytt dataset som jag fyllt med värde från lagrade procedurer. Tänkte mig något i stil med följande, men det verkar inte funka så bra än: Hej! <code> Så här hämtar jag data till dsTypesID, detta ds får bara ett id och ett namn från en lagrad procedur. Tanken är att hämta varje ID från dsTypesID och skicka med till funktioner som i sin tur returnerar värden, detta för att kunna presentera allt från ett dataset till GUI i en datagrid i en tre-skiktslösning. Angående lagrade procedurer så har jag en från varje funktion i loopen, där jag skickar med id't från dsTypesID - resultatet sedan från varje ID, är ju tänkt att lagras som en post på varje rad i datasetet.. Hej igen! Ja, procedurerna returnerar data och t ex dsTypesID har en tabell med data i sig för det har jag kollat. Varför jag måste ha olika procedurer är för att de är väldigt komplexa och går inte att sammansfoga i en enda. Inte nu iallafall. Jag har följande kod för att skapa tabell o rader att kopiera till: Okej, jag tror jag har kladdat till det mer än vad som behövs! Egentligen kan jag ju lägga till kolumner i mitt bef. dataset "dsTypesID" istället för att skapa ett nytt och kopiera till. Jag har ju id och namn på kolumn 0 och 1, sen ville jag ju hämta värden från procedurerna relaterat till varje id på kolumn 0. Jag borde kunna lägga till nya kolumner och poster till varje rad(id) i loopen istället, det som verkar vara problemet är att få till koden så att id't på varje rad(kolumn 0) ska skickas med till funktionen och vidare till proceduren för att sen samtidigt tilldelas datasetet och en ny kolumn. Knepigt förklarat kanske..men nått sånt! :) <code> Du vet väl att man kan lägga in SQL satser i ett Dataset?Kopiera rader till nytt dataset
Dim rows As DataRow
Dim dsResult As New DataSet()
Dim cnt As Integer = 0
For Each rows In dsTypesID.Tables(0).Rows ' krasch
dsResult.Tables(0).Rows(cnt).Item(0) = dsTypesID.Tables(0).Rows(cnt).Item(1)
dsResult.Tables(0).Rows(cnt).Item(1) = caseDebt(dsTypesID.Tables(0).Rows (cnt).Item(0), caseID)
dsResult.Tables(0).Rows(cnt).Item(2) = casePayed(dsTypesID.Tables(0).Rows (cnt).Item(0), caseID)
dsResult.Tables(0).Rows(cnt).Item(3) = balance(dsTypesID.Tables(0).Rows(cnt).Item(0), caseID)
dsResult.Tables(0).Rows(cnt).Item(4) = nextPaymentCalc(dsTypesID.Tables(0).Rows(cnt).Item(0), caseID, nextPayment)
cnt = cnt + 1 ' öka räknaren till nästa rad.
Next
Return dsResult ' nytt ds med resultatet från samtliga funktioner - procedurer
Måste jag skapa nya rows osv. innan jag kan fylla dem?
Tacksam för hjälp..Sv: Kopiera rader till nytt dataset
Har ditt dataset "dsTypesID" någon tabell över huvudtaget?
Om den inte har det blir det en krasch...
Kolla om dsTypesID.Tables.Count = 0, annars borde den kunna gå vidare därifrån...
Dessutom måste du lägga in en tabell och columner i tabellen i datasetet du vill fylla...
Hur hämtar du ut data från databasen?
Mvh,
ThomasSv: Kopiera rader till nytt dataset
Dim rows As DataRow
Dim dsResult As New DataSet()
For Each rows In dsTypesID.Tables(0).Rows ' krasch
dsResult.Tables(0).Rows(cnt).Item(0) = rows.Item(1)
dsResult.Tables(0).Rows(cnt).Item(1) = rows.Item(0), caseID)
dsResult.Tables(0).Rows(cnt).Item(2) = rows.Item(0), caseID)
dsResult.Tables(0).Rows(cnt).Item(3) = balance(rows.Item(0), caseID)
dsResult.Tables(0).Rows(cnt).Item(4) = nextPaymentCalc(rows.Item(0), caseID, nextPayment)
Next
Return dsResult ' nytt ds med resultatet från samtliga funktioner - procedurer
</code>
Denna kod borde fungera likadant som din ovan, lite enklare att läsa bara...
Men vad vill du åstadkomma? Har du flera procedurer i databasen du vill få in i ett dataset?
Mvh,
Thomas VanhaniemiSv: Kopiera rader till nytt dataset
conn = connectToEuropainkasso()
Dim cmd As SqlCommand = New SqlCommand("Ink_costTypesNameID", conn)
cmd.CommandType = CommandType.StoredProcedure
conn.Open()
Dim dap As SqlDataAdapter = New SqlDataAdapter(cmd)
Dim dsTypesID As New DataSet()
dap.Fill(dsTypesID, "TypesID") ' eller 0
conn.Close()
Ska försöka med din förenkling, är jag rätt på det?
/JonasSv: Kopiera rader till nytt dataset
/JonasSv: Kopiera rader till nytt dataset
Har du kontrollerat att din SP verkligen retunerar något och att det finns en tabell i datasetet?
Det är ju det mest väsentliga i första hand...
Andra saken du måste se till är ju att datasetet du sätter in sakerna i har rätt antal kolumner av rätt typ etc...
Dessutom, om du ska sätta in data i en tabell måste du ju lägga till nya rader för varje loop...
Men kan du inte skriva en SP som retunerar allt som du vill ha?
Man ska, vad jag har lärt mig, köra så mycket som möjligt i databasen för den är specialicerad på att hämta och hantera data...
Är nu ingen expert på SP men det borde gå...
Hur ser din kod ut nu?
Mvh,
ThomasSv: Kopiera rader till nytt dataset
Dim rows As DataRow
Dim dsResult As New DataSet()
Dim cnt As Integer = 0
Dim rowCount As Integer = dsTypesID.Tables(0).Rows.Count
Dim tbl As New DataTable()
dsResult.Tables.Add(tbl)
Dim counter As Integer = 0
For counter = 0 To rowCount
Dim newRow As DataRow
newRow = dsResult.Tables(0).NewRow
dsResult.Tables(0).Rows.Add(newRow)
Next counter
Detta borde kunna ske i samma loop men inte klar än..
Sen kommer kopieringen från funktionerna igen här:
For Each rows In dsTypesID.Tables("TypesID").Rows
' Hämtar ett namn från dsTypesID direkt tänkte jag!
dsResult.Tables(0).Rows(cnt).Item(0) = dsTypesID.Tables(0).Rows(cnt).Item(1)
dsResult.Tables("TypesID").Rows(cnt).Item(1) = caseDebt(dsTypesID.Tables(0).Rows (cnt).Item(0), caseID) ' Räkna ut tot. skulden på kost.typen skicka med kostnadstypID och ärendeID
dsResult.Tables("TypesID").Rows(cnt).Item(2) = casePayed(dsTypesID.Tables(0).Rows(cnt).Item(0), caseID) ' Räkna ut tot. inbetalningar på kost.typen skicka med kostnadstypID och ärendeID
dsResult.Tables("TypesID").Rows(cnt).Item(3) = balance(dsTypesID.Tables(0).Rows(cnt).Item(0), caseID) ' Räkna ut balansen på tot.skulder - tot.inbetalningar på kost.typen skicka med kostnadstypID och ärendeID
dsResult.Tables(0).Rows(cnt).Item(4) = nextPaymentCalc(dsTypesID.Tables(0).Rows(cnt).Item(0), caseID, nextPayment) ' Räkna ut vad resultatet blir med föreslagen inbetalning
cnt = cnt + 1 ' öka räknaren till nästa rad.
Next
Return dsResult ' nytt ds med resultatet från samtliga sp
Hmm, ja det ser lite rörigt ut.. Finns det inget sätt att infoga kod i ett medd på ett bättre sätt, din är gråmarkerad!? Sv: Kopiera rader till nytt dataset
Sv: Kopiera rader till nytt dataset
Dim Row As DataRow
Dim dsResult As DataSet = dsTypesID.Clone
For Each Row In dsTypesID.Tables("TypesID").Rows
Dim NewRow As DataRow = dsTypesID.Tables("TypesID").NewRow
NewRow.Item(0) = Row.Item(1)
NewRow.Item(1) = caseDebt(Row.Item(0), caseID) ' Räkna ut tot. skulden på kost.typen skicka med kostnadstypID och ärendeID
NewRow.Item(2) = casePayed(Row.Item(0), caseID) ' Räkna ut tot. inbetalningar på kost.typen skicka med kostnadstypID och ärendeID
NewRow.Item(3) = balance(Row.Item(0), caseID) ' Räkna ut balansen på tot.skulder - tot.inbetalningar på kost.typen skicka med kostnadstypID och ärendeID
NewRow.Item(4) = nextPaymentCalc(Row.Item(0), caseID, nextPayment) ' Räkna ut vad resultatet blir med föreslagen inbetalning
dsResult.Tables(0).Rows.Add(NewRow)
Next
Return dsResult ' nytt ds med resultatet från samtliga sp
</code>
Testa med ovanstående, ska vara bara att kopiera och testa...
Har försökt förenkla för att visa hur det kan se ut...
Mvh,
ThomasSv: Kopiera rader till nytt dataset
En bra funktion...
Mvh,
Thomas