06. september 2004 - 21:17Der er
13 kommentarer og 1 løsning
Hjælp til sql statement (hvordan refereres) og pivot
Hej eksperter,
I mit asp script får jeg følgende værdier ind i recordsettet Rs1, med følgende kode:
Rs1 = conn.Execute(StrSQL)
Konsulentid Navn Status Antal NR NR 1 20 NR NR 3 212 MP MP 2 110 MP MP 4 2 MP MP 1 51
Nu vil jeg køre en ny sqlstatement, som bruger værdierne fra Rs1, men er i tvivl om, hvordan jeg referere og om jeg overhovedet kan dette.
Som en access forespørgsel ville det se således ud:
TRANSFORM Sum([rs1].Antal) AS SumOfAntal SELECT [rs1].Navn, Sum([ras1].Antal) AS [I alt l] FROM [rs1] GROUP BY [rs1].Navn PIVOT Konverteretstatus([status]);
Konverteretstatus er en funktion som findes på siden.
Hvordan referere jeg til rs1 recordsettet og hvordan referere jeg til funktionen inde i sql statementet?
Der er ikke noget problem i at lave det med et recodset. Du får så X antal kolonne som kommer fra funktionen.
men du kan udksrive alt fra recordset sådan her:
SQL = "SELECT * FROM tabelnavn" Set rs = Conn.Execute(SQL)
Response.Write "<table>" 'Udskriv kolonnenavne if not rs.EOF then Response.Write "<tr>" for each f in rs.Fields Response.Write "<td>" & f.name & "</td>" next Response.Write "</tr>" end if 'Udskriv indhold af kolonnerne Response.Write "<tr><td>" Response.Write rs.GetString (, -1, "</tr><td>", "</td></tr><tr><td>", NBSPACE) response.write "</table>"
Hej Eagleeye, Måske har jeg ikke formuleret mig klart nok og det beklager jeg!
Her er koden (komplet borset fra html tags)
Function Konverteretstatus(id) Dim Nystatus Nyststaus = "" Select Case Id Case 7: Nystatus = "Aktiv-skal aktiveres" Case 4,5,6: Nystatus = "Aktiv-ér aktiveret" Case 13: Nystatus = "I job" Case 14,15,16,17: Nystatus = "Afsluttet" Case 8,9,10: Nystatus = "Aktiv-20T/Suppl.dp" Case 1,2: Nystatus = "Ny henvist" Case 3: Nystatus = "Aktiv i rådgivning" End select Konverteretstatus = Nystatus End function
Dim rs1,rs2,StrSQL,X
Opendatabase Set rs1 = Server.CreateObject("ADODB.Recordset") Set rs2 = Server.CreateObject("ADODB.Recordset")
StrSQL = "SELECT [SKonsulenter].KonsulentId, [SKonsulenter].Navn, [Skandidater].Status, Count([Skandidater].Navn) AS Antal" StrSQL = StrSQL & " FROM ([SKonsulenter] LEFT JOIN [Skandidater] ON [SKonsulenter].KonsulentId = [Skandidater].Konsulent)" StrSQL = StrSQL & " GROUP BY [SKonsulenter].KonsulentId, [SKonsulenter].Navn, [Skandidater].Status" Set rs1 = Conn.Execute(strSQL)
response.write StrSql Set rs2 = Conn.Execute(StrSQL)
If Not Rs2.EOF and not Rs2.BOF Then Response.write "<Table border=1>" Response.Write "<Tr>" For X = 0 to Rs2.Fields.count - 1 Response.write "<Td>" & Rs2.Fields.Item(x).Name & "</td>" Next Response.write "</Tr>" Rs2.Movefirst While not Rs2.Eof Response.Write "<Tr>" For X = 0 To Rs2.Fields.Count - 1 Response.write "<Td>" & Rs2.Fields.Item(X).Value Next Rs2.Movenext Response.write "</Tr>" Wend Response.Write "</Table>" End if
Rs1 hentes fint og skrives fint ud. Mit problem er sqlstatement til rs2. Jeg er i tvivl om, hvordan jeg referere til rs1, som jo er den rs2 bygger på!
Jeg forstår ikke, hvad du mener! RS1 er Set rs1 = Conn.Execute(strSQL) (se koden ovenfor) så hvad skal jeg skrive i parantesen det er jo navnet på tabellen jeg skulle have brugt, hvis ellers det var en tabel fra databasen!?
men du kan ikke få data fra recordete rs1 ind i SQL'en til nr. 2. Den vil tage indholdet af en kolonne når man skriver rs("navn") det betyder ikke den overføre alle data fra kolonne rs("navn").
Jeg var selv nået frem til følgende nye sqlstatement:
StrSQL = "TRANSFORM Count(Skandidater.Navn) AS Antal" StrSQL = StrSQL & " SELECT SKonsulenter.KonsulentId, SKonsulenter.Navn" StrSQL = StrSQL & " FROM SKonsulenter LEFT JOIN Skandidater ON SKonsulenter.KonsulentId = Skandidater.Konsulent" StrSQL = StrSQL & " GROUP BY SKonsulenter.KonsulentId, SKonsulenter.Navn PIVOT Skandidater.Status"
Men den giver følgende fejl:
Microsoft JET Database Engine error '80004005' Operation is not supported for this type of object.
/crm/logistik1.asp, line 82
73 If Not Rs2.EOF and not Rs2.BOF Then 74 Response.write "<Table border=1>" 75 Response.Write "<Tr>" 76 For X = 0 to Rs2.Fields.count - 1 78 Response.write "<Td>" & Rs2.Fields.Item(x).Name & "</td>" 79 Next 80 Response.write "</Tr>" 81 Rs2.Movefirst 82 While not Rs2.Eof 83 Response.Write "<Tr>" 84 For X = 0 To Rs2.Fields.Count - 1 85 Response.write "<Td>" & Rs2.Fields.Item(X).Value 86 Next 87 Rs2.Movenext 88 Response.write "</Tr>" 89 Wend 90 Response.Write "</Table>" 91 End if
Ja - det er åbenbart rs2.movefirst, den fejler på! Ved at fjerne den, køre forespørgslen. Jeg ved ikke hvorfor. Du skal have point. tak endnu en gang for din hjælp. Send lige et svar.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.