webForumDet fria alternativet

Fler värden i comboboxen kan väljas...

ASP

24 svar · 275 visningar · startad av maland

Medlem sedan nov. 200156 inlägg
Frågan#1

Happ! Då var det dags för en klurig fråga igen...
Jag har tre comboboxar där man kan välja fler värden.
Det blir ju krångel när jag ska insert i tabellen sedan...
Låt säga att jag i SELECT name="S" väljer två värden(person_id)...
I SELECT name="U" väljer ett värde(person_id)
och i SELECT name="P" väljer fyra värden(person_id)...Hur 17 får jag in det i tabellen sedan
------Tabell-------
*P_Id (int)
*Person_Id (int)

------------------
.: Malin :.

Medlem sedan dec. 200012 464 inlägg
#2
sql = "insert into t(person_id)values("

for i = 1 to request.form("S").count
connect.execute sql & request.form("S")(i) & ")",,128
next

------------------
essentitia preter non sans multiplicandum

Medlem sedan nov. 200156 inlägg
#3

Tackar!
Du är alltid lika snabb...
Jag ska prova det senare idag...annars återkommer jag =)

------------------
.: Malin :.

Medlem sedan nov. 200156 inlägg
#4

Men hur får jag med de två andra "U" och "P"? Skriver jag två likadana SQL till, eller kan jag lägga ihop hela paketet liksom?

------------------
.: Malin :.

Medlem sedan dec. 200012 464 inlägg
#5

Ja, du kan antingen skriva tre loopar eller så kan du göra något så här

sql = "insert into t(person_id)values("
for each element in request.form
  if element = "S" or element = "U" or element = "P" then
for i = 1 to request.form(element).count
connect.execute sql & request.form(element)(i) & ")",,128
next
next

------------------
essentitia preter non sans multiplicandum

Medlem sedan nov. 200156 inlägg
#6

Jag får unexpected next line :17 (den sista next)

------------------
.: Malin :.

Medlem sedan juni 200032 967 inlägg
#7

Jag tror att LarsG har missat ett End If mellan de båda next.

Mvh,

------------------
Don't panic!

Medlem sedan dec. 200012 464 inlägg
#8

En miss av mig

sql = "insert into t(person_id)values("
for each element in request.form
if element = "S" or element = "U" or element = "P" then
for i = 1 to request.form(element).count
connect.execute sql & request.form(element)(i) & ")",,128
next
[b]end if[/b]
next

------------------
essentitia preter non sans multiplicandum

Medlem sedan nov. 200156 inlägg
#9

Tackar så mycket!
Kan jag lägga in det i en SP som jag har?
Jag har nämligen gjort en SP som uppdaterar två tabeller och jag vill nu ha in den här tredje tabellen i samma.

------------------
.: Malin :.

Medlem sedan dec. 200012 464 inlägg
#10

Nu förstår jag inte riktigt hur du har tänkt.

du kan ju skriva en procedur

create procedure insertInto 
@personId int
as
  insert into personTabell(personId) values(@personid)

och som du sedan anropar

for each element in request.form
if element = "S" or element = "U" or element = "P" then
for i = 1 to request.form(element).count
connect.execute "execute insertInto " & request.form(element)(i) ,,128
next
end if
next

red:
eller hade du tänkt skicka det valda ur varje combobox som en parameter?
------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 07 dec 2001]

Medlem sedan nov. 200156 inlägg
#11

Jag har en SP:

CREATE PROCEDURE sp_insert 
@projektnamn varchar(50),
@foretagsnamn varchar (50),
@startdatum varchar(20),
@slutdatum varchar(20),
@status varchar(10)
AS
insert into projekt
(projektnamn, startdatum, slutdatum, status)
values
(@projektnamn, @startdatum, @slutdatum, @status)
insert into deltagande_foretag
(foretagsId, projektId)
values
(@foretagsnamn, @@IDENTITY)
GO

Som uppdaterar två tabeller. Nu vill jag att även den tredje tabellen ska uppdateras samtidigt och med samma @@IDENTITY som tabell deltagande_foretag.
TAbellen projektmedlemmar innehåller
projektId och person_id och projektId (samma som projektId i deltagande_foretag)
Nu vill jag ju uppdatera tabellen projektmedlemmar där person_id = det värde som jag får av de olika comboboxarna. Det kan ju vara ett eller flera värden till samma projekt....

Förstår du?

------------------
.: Malin :.

Medlem sedan nov. 200156 inlägg
#12

Just nu ser det ut såhär på ASP-sidan:

dbase.Execute("Exec sp_insert @projektnamn='"&Request.Form("txtProjNamn")&"', @foretagsnamn='"&Request.Form("sctForetagsnamn")&"', @startdatum='"&Request.Form("txtDatum")&"',@slutdatum='"&Request.Form("txtSlutdatum")&"', @status = '"&Request.Form("status")&"' ")

Men jag vet inte var jag ska få in det där som du har hjälpt mig med....allts det där som räknar hur många valda värden i comboboxarna.

------------------
.: Malin :.

Medlem sedan nov. 200156 inlägg
#13

Har provat detta "hop-plock" men det funkar inte...

for each element in request.form
if element = "S" or element = "U" or element = "P" then
for i = 1 to request.form(element).count
dbase.execute ("Exec sp_insert_2 @projektnamn='"&Request.Form("txtProjNamn")&"', @foretagsnamn='"&Request.Form("sctForetagsnamn")&"', @startdatum='"&Request.Form("txtDatum")&"',@slutdatum='"&Request.Form("txtSlutdatum")&"', @status = '"&Request.Form("status")&"', @roll ='"&request.form("element")&"' ") & request.form(element)(i) ,,128
next
end if
next

Sp_insert_2 ser ut såhär:


CREATE PROCEDURE sp_insert_2 
@projektnamn varchar(50),
@foretagsnamn varchar (50),
@startdatum varchar(20),
@slutdatum varchar(20),
@status varchar(10),
@roll int
AS
insert into projekt
(projektnamn, startdatum, slutdatum, status)
values
(@projektnamn, @startdatum, @slutdatum, @status)
insert into deltagande_foretag
(foretagsId, projektId)
values
(@foretagsnamn, @@IDENTITY)
insert into projekt_medlemmar
(projektId, personId)
values
(@@IDENTITY,@roll)
GO

Nåt bättre förslag ....?

------------------
.: Malin :.

Medlem sedan dec. 200012 464 inlägg
#14

du har parenteserna lite fel.

dbase.execute "Exec sp_insert_2 @projektnamn='"&Request.Form("txtProjNamn")&"', @foretagsnamn='"&Request.Form("sctForetagsnamn")&"', @startdatum='"&Request.Form("txtDatum")&"',@slutdatum='"&Request.Form("txtSlutdatum")&"', @status = '"&Request.Form("status")&"', @roll ='"&request.form("element")&"' " & request.form(element)(i) ,,128

Men det här blir väl inte riktigt bra då du kommer att lägga in samma projekt flera gånger så vitt jag förstår.

En möjlighet är att du har en extra parameter som innehåller värdet på @@identity. Vid första anropet är den null och då lägger du till projketet och sätter parametern till @@identity. Vid efterföljande anrop så hoppar du över den delen som lagrar projekt och gör enbart insert på projektmedlemmar.

Ett annat alternativ är att skicka alla personid som en kommaseparerad lista i en av parametrarna till proceduren. Du kan sedan traversera den i proceduren och plocka ut de enskilda värdena. Det är inte lika smidigt som i VB-script utan du måste leta reda på komma och plocka ut varje bit. Det finns funktioner som char_index och substring som är lämpliga för det.

Den andra lösningen är den som är effektivast ur prestandasynpunkt då du minimerar antalet databasanrop.

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 09 dec 2001]

Medlem sedan nov. 200156 inlägg
#15

Just i detta formulär kommer jag inte att lägga in samma projekt flera gånger...Här ska jag bara registrera projekt är det tänkt...På en annan sida sedan så lägger jag till ex.vis anteckningar, protokoll o.s.v till projektet..
Såhär ser koden ut nu:

<%
for each element in request.form
if element = "sctProjLedare" or element = "sctUtvecklare" or element = "sctSaljare" then
for i = 1 to request.form("element").count
dbase.execute "Exec sp_insert_2 @projektnamn='"&Request.Form("txtProjNamn")&"',@status = '"&Request.Form("status")&"', @startdatum='"&Request.Form("txtDatum")&"',@slutdatum='"&Request.Form("txtSlutdatum")&"',@foretagsnamn='"&Request.Form("sctForetagsnamn")&"', @roll ='"&request.form("element")&"' " & request.form("element")(i) ,,128
next
end if
next
%>

Men det fungerar inte...Jag får inget felmeddelande men det kommer inte in i databasen.
Tar jag bort dubbelfnuttarna på "element" före .count och före (i) så får jag fel: incorrect syntax near '3'

------------------
.: Malin :.

Medlem sedan dec. 200012 464 inlägg
#16

Det skall inte vara några " kring element. Sen så verkar du ha ett värde för mycket i slutet.

[red]
for each element in request.form
if element = "sctProjLedare" or element = "sctUtvecklare" or element = "sctSaljare" then
for i = 1 to request.form(element).count

dbase.execute "Exec sp_insert_2 " & _
" @projektnamn  = '" & Request.Form("txtProjNamn")     & "'," & _
" @status       = '" & Request.Form("status")          & "'," & _
" @startdatum   = '" & Request.Form("txtDatum")        & "'," & _
" @slutdatum    = '" & Request.Form("txtSlutdatum")    & "'," & _
" @foretagsnamn = '" & Request.Form("sctForetagsnamn") & "'," & _
" @roll         =  " & request.form(element)(i)
next
end if
next
[/red]

------------------
essentitia preter non sans multiplicandum

Medlem sedan nov. 200156 inlägg
#17

Nu blir det fel istället =(

Error Type:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]Cannot insert the value NULL into column 'projektId', table 'projekt.dbo.projekt_medlemmar'; column does not allow nulls. INSERT fails.

------------------
.: Malin :.

Medlem sedan nov. 200156 inlägg
#18

Jag får in värden i två av tabellerna ...i projekt och deltagande_foretag. Det är tabellen projekt_medlemmar som inte funkar....

------------------
.: Malin :.

Medlem sedan dec. 200012 464 inlägg
#19

I och med att du har flera insert i din procedur så måste du spara undan värdet på @@identity i en lokal variabel.

CREATE PROCEDURE sp_insert_2 
@projektnamn varchar(50),
@foretagsnamn varchar (50),
@startdatum varchar(20),
@slutdatum varchar(20),
@status varchar(10),
@roll int
AS
declare @newProjectID int
insert into projekt
(projektnamn, startdatum, slutdatum, status)
values
(@projektnamn, @startdatum, @slutdatum, @status)
set @newProjectID = @@identity
insert into deltagande_foretag
(foretagsId, projektId)
values
(@foretagsnamn, @newProjectID)
insert into projekt_medlemmar
(projektId, personId)
values
(@newProjectID,@roll)
GO

Om du har en räknare för tabellen deltagande_foretag så kommer @@identity att sättas till det räknarvärdet och om du inte har någon räknare så blir @@identity null.

------------------
essentitia preter non sans multiplicandum

Medlem sedan nov. 200156 inlägg
#20

Felmeddelande:

Error Type:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC SQL Server Driver][SQL Server]Error converting data type nvarchar to int.

Jag har ingen räknare på tabellen deltagande_foretag. Det id:t ska ju vara lika som foretagsid i en annan tabell....

------------------
.: Malin :.

263 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)