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
24 svar · 273 visningar · startad av maland
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 :.
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
Tackar!
Du är alltid lika snabb...
Jag ska prova det senare idag...annars återkommer jag =)
------------------
.: Malin :.
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 :.
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
Jag tror att LarsG har missat ett End If mellan de båda next.
Mvh,
------------------
Don't panic!
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
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 :.
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]
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 :.
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 :.
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 :.
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]
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 :.
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
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 :.
Jag får in värden i två av tabellerna ...i projekt och deltagande_foretag. Det är tabellen projekt_medlemmar som inte funkar....
------------------
.: Malin :.
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
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 :.