webForumDet fria alternativet

Kontrollera att artikeln finns i artikeldatabasen innan insert extended version...

ASP

14 svar · 467 visningar · startad av devotion

Medlem sedan jan. 20013 582 inlägg
Frågan#1

Hej!

Har följande kod som:

1. kontrollerar om det är ett giltigt artikelnummer
2. lägger till artikeln i tblMaterial

Är det inte giltigt så får man ett felmeddelande

Dim strSQL, objConn, objRS, strErr, sEnumber

Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = "DSN=uppdragNu"
objConn.Open 

strErr=""
For each item in Request.Form("cnt")
	
	TaskId = SQLSafe(Request.form("TaskId"))
	sEnumber = Request.Form("eNumber" & item)

	if not objConn.Execute("SELECT 1 FROM tblArticle WHERE ArtNr='" & sEnumber & "'").EOF then
		strSQL = "INSERT INTO tblMaterial(ArtNr) VALUES('" & sEnumber & "')"
		objConn.execute strSQL,,128
	else
		strErr=strErr & Request.form("Enumber" & item) & " lades inte till sörru...<br>"
	end if

Next

if strErr<>"" then
	Response.Write strErr
end if

Jag skulle behöva "bygga ut" denna koden lite.
Det enda jag skriver i formuläret är ju Enumret. Men det finns ju mer info som benämning, pris, enhet mm kopplat till Enumret.

Denna info finns i tbArticle och tblPrice

SELECT tblArticle.eNumber, tblArticle.articleName, tblArticle.articleUnit, tblPrice.articlePrice
FROM tblArticle INNER JOIN tblPrice ON tblArticle.eNumber = tblPrice.eNumber;
WHERE eNumber = sEnumber

Varje post som läggs till i tblMaterial ska få ett id. Denna info hämtas från tblNext Id enligt:

strSQL = "SELECT nextId " &_
	"FROM tblNextId " &_
	"WHERE table = 'tblMaterial'"

iNextId = Cint(objRS("NextId")) 	

'här kommer koden för att lägga till artikeln till tblMaterial

iNextId = iNextId + 1 'öka id´t med 1

'uppdatera id´ts värde 	
strSQL = "UPDATE tblNextId SET nextId = " & iNextId & " " &_
	"WHERE Table = 'tblMaterial'"
objConn.Execute strSQL,, 128

oj det blev mycket...

Frågan är iaf hur man gör för att göra alt detta i For each item....-loopen

Mvh
Henrik

Medlem sedan dec. 200012 464 inlägg
#2

Du skall inte kontrollera om det är ett giltigt enummer. Låt databashanteraren sköta detta genom att definiera lämpliga foreign key constraint. Din metod för att skapa nya id är osäker. Återigen, låt databashanteraren sköta detta.

Frågan i mitten förstår jag inte om det nu är en fråga.

Medlem sedan jan. 20013 582 inlägg
#3

:) Hej!

Du skall inte kontrollera om det är ett giltigt enummer. Låt databashanteraren sköta detta genom att definiera lämpliga foreign key constraint.

Hehe, har ingen aning om vad foreign key constraint är... Du får gärna förklara!
Varför tycker du inte att jag ska göra kontrollen på det sättet? Alla E-numrena finns ju med i tbArticle?

Din metod för att skapa nya id är osäker. Återigen, låt databashanteraren sköta detta.

Håller helt med dig! Men jag bygger ett webgränssnitt till en befintlig windowsapplikation där dom valt att göra på det sättet... En konsyig lösning kan tyckas

Frågan i mitten förstår jag inte om det nu är en fråga.

Det är svårt att formulera sig kort och tydligt i skrift... men:

Jag har ett formulär där man ska kunna lägga till artiklar. genom att bara skriva e-nummer och antal. Artiklarna läggs till i tblMaterial. Eftersom strukturern i tblMaterial är sådan att den innehåller; id, artikelnummer, artikelbenämning, enhet, antal, pris, notering måste jag ju hämta den informationen som inte kommer från formuläret någon annanstans ifrån. dvs tblArticle och tblPrice. Det enda som kommer från formuläret är ju antal och e-nummer.

Det hade givetvis också gått att göra på annat sätt genom att koppla tblMaterial med tblArticle och tblPrice.. Men nu är strukturen som den är och jag kan inte göra något åt den...

Hoppas det blev klarare....

Mvh
Henrik

Medlem sedan dec. 19996 721 inlägg
#4

En foreign key constraint gör att databasen inte tillåter att du lägger in rader i tblMaterial som inte har relaterade rader i tblArticle. Dessutom kan man se till att den raderar relaterade rader i tblMaterial när motsvarande rad i tblArticle tas bort. Helt klart en tajtare lösning, men det är tveksamt om du kan pilla på just denna databas.

Medlem sedan jan. 20013 582 inlägg
#5

okidoki... Som sagt det verkar vara en tajt lösning... Får lära mig mer om det... :birp
Ingen som vill hjälpa till med lite kod?

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#6

:)
Ingen som har lite tips om hur man kan lösa detta??

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#7

:e Hej!
Nu har jag filat vidare lite på koden....

Och den ser ut så här och gör det jag vill att den ska göra!

<%
Dim strSQL, objConn, objRS, strErr, sEnumber, strAdd

Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = "DSN=uppdragNu"
objConn.Open 

strAdd = ""
strErr = ""
For each item in Request.Form("cnt")
	
	sAmount = SQLSafe(Request.form("amount" & item))
	sTaskId = SQLSafe(Request.form("TaskId"))
	sEnumber = Request.Form("eNumber" & item)

	if not objConn.Execute("SELECT 1 FROM tblExArticle WHERE eNumber='" & sEnumber & "'").EOF then
		
		strSQL = "SELECT tblExArticle.eNumber, tblExArticle.articleName, tblExArticle.articleUnit, tblExPrice.articlePrice " &_
				 "FROM tblExArticle " &_
				 "INNER JOIN tblExPrice ON tblExArticle.eNumber = tblExPrice.eNumber " &_
				 "WHERE tblExArticle.eNumber = '" & sEnumber & "'"
				  
		Set objRS = Server.CreateObject("ADODB.Recordset")
		objRS.Open strSQL, objConn, 3, 1
		
		sArticleName = objRS("articleName")
		sArticleUnit = objRS("articleUnit")
		curArticlePrice = objRS("articlePrice")
		
		objRS.Close
		Set objRS = Nothing		
		
		strSQL = "SELECT nextId " &_
			 	 "FROM tblNextId " &_
			 	 "WHERE table = 'tblMaterial'"
	
		Set objRS = Server.CreateObject("ADODB.Recordset")
		objRS.Open strSQL, objConn, 3, 1
	
		iNextId = Cint(objRS("NextId")) 	
		
		objRS.Close
		Set objRS = Nothing

		'testvärden
		sNote = "test"

		strSQL = "INSERT INTO tblMaterial(Id, Modified, TaskId, ArtNr, ArtName, Amount, Unit, Price, [Note]) " &_
				 "VALUES(" & iNextId & ", Now(), " & sTaskId & ", '" & sEnumber & "', '" & sArticleName & "', " & sAmount & ", '" & sArticleUnit & "', " &_
				 "" & curArticlePrice & ", '" & sNote & "')"
		objConn.execute strSQL,,128
		
		strAdd = Request.Form("Enumber" & item) & "<br>"
		
		iNextId = iNextId + 1
	
		strSQL = "UPDATE tblNextId SET nextId = " & iNextId & " " &_
			  	 "WHERE Table = 'tblMaterial'"
		objConn.Execute strSQL,, 128

	else
		strErr=strErr & Request.form("Enumber" & item) & "<br>"
	end if

Next

if strErr <> "" then
	Response.write "Följande E-nummer finns inte och lades inte till!: <br>"
	Response.Write strErr & "<br>"
	Response.Write "Följande artiklar lades till: <br>"
	Response.Write strAdd & "<br>"
Else
	Response.Write "Följande artiklar lades till: <br>"
	Response.Write strAdd & "<br>"
end if

objConn.Close
Set objConn = Nothing

function SQLSafe(sText)
	SQLSafe = replace(sText, "'", "''")
end function
%>

Ett problem kvarstår dock, jag får inte med mig

	sAmount = SQLSafe(Request.form("amount" & item))

Från formuläret....

Koden från formuläret ser ut så här

      <td width="65"><select name="amount<% =i %>" class="listmeny" id="amount<% =i %>">
      <% 
		for i2 = 1 to 100
			Response.Write "<option value=""" & i2 & """ "
			If cstr(i2) = request("amount") then Response.Write "selected=""selected"""
			Response.Write ">" & i2 & "</option>" & vbCrLf
		next	
	  %>
    </select></td>

eftersom i var upptaget valde jag i2... tycker inte det ser så snyggt ut men det kanske kvittar...

Någon som har någon bra idé varför inte amount kommer med? Gissar att det handlar om att det är listmenyn som gör det

Vad tycker ni annars om lösningen, kanske inte helt optimal LarsG men efter förutsättningarna som jag har att jobba efter. Några direkta felaktigheter eller säkerhetsmissar? Kommentarer mottages tacksamt...

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#8

Ändrade till ett vanligt textfält:

        <input name="amount<% =i %>" type="text" id="amount<% =i %>" size="10" maxlength="10" />

Och då funkar det fint...

Mvh

Medlem sedan juni 200032 967 inlägg
#9

annars:

If cstr(i2) = request("amount"[b] & i[/b]) then Response.Write "selected=""selected"""
Medlem sedan jan. 20013 582 inlägg
#10

hmmm....

Jaja, det funkar ju finfint det också.. då kan jag ju ha kvar min listmeny!

Vad tror du annars om koden?

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#11

Hej!

Nu har jag följande kod som fungerar så som jag vill ha det (i stora drag...).

Om någon ser några tokigheter i koden får ni gärna skriva det! Jag klarmarkerar dock denna tråden nu.... ;)

Mvh
Henrik

<%
Dim strSQL, objConn, objRS, strNoarticleError, sEnumber, strAddedArticles

Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = "DSN=uppdragNu"
objConn.Open 

strAddedArticles = ""
strNoarticleError = ""
strSupplierError = ""

For each item in Request.Form("cnt")
	
	sAmount = SQLSafe(Request.form("amount" & item))
	sTaskId = Cint(Request.form("TaskId"))
	sEnumber = Request.Form("eNumber" & item)
	sSupplierId = Request.form("supplier")
	
	Select Case iSupplierId
		Case "1"
		sNote = "Artikeln är köpt från Solar"
		
		Case "2"
		sNote = "Artikeln är köpt från Storel"
		
		Case "4"
		sNote = "Artikeln är köpt från Ahlsell"
	End Select

	if not objConn.Execute("SELECT 1 FROM tblExArticle WHERE eNumber='" & sEnumber & "'").EOF then
		
		strSQL = "SELECT tblExArticle.eNumber, tblExArticle.articleName, tblExArticle.articleUnit, tblExPrice.articlePrice, tblExSupplier.SupplierId " &_
				 "FROM tblExSupplier INNER JOIN (tblExArticle INNER JOIN tblExPrice ON tblExArticle.eNumber = tblExPrice.eNumber) " &_ 
				 "ON tblExSupplier.SupplierId = tblExPrice.articleSupplierId " &_
				 "WHERE tblExArticle.eNumber = '" & sEnumber & "' And tblExSupplier.supplierId = '" & sSupplierId & "'"

		Set objRS = Server.CreateObject("ADODB.Recordset")
		objRS.Open strSQL, objConn, 3, 1
		
		If not objRS.EOF then
			
			sArticleName = objRS("articleName")
			sArticleUnit = objRS("articleUnit")
			curArticlePrice = objRS("articlePrice")
			
			
			objRS.Close
			Set objRS = Nothing		
			
			strSQL = "SELECT nextId " &_
					 "FROM tblNextId " &_
					 "WHERE table = 'tblMaterial'"
		
			Set objRS = Server.CreateObject("ADODB.Recordset")
			objRS.Open strSQL, objConn, 3, 1
		
			iNextId = Cint(objRS("NextId")) 	
			
			objRS.Close
			Set objRS = Nothing
	
			strSQL = "INSERT INTO tblMaterial(Id, Modified, TaskId, ArtNr, ArtName, Amount, Unit, Price, [Note]) " &_
					 "VALUES(" & iNextId & ", Now(), " & sTaskId & ", '" & sEnumber & "', '" & sArticleName & "', " & sAmount & ", '" & sArticleUnit & "', " &_
					 "" & curArticlePrice & ", '" & sNote & "')"
			objConn.execute strSQL,,128
			
			strAddedArticles = strAddedArticles & Request.Form("Enumber" & item) & "<br>"
			
			iNextId = iNextId + 1
		
			strSQL = "UPDATE tblNextId SET nextId = " & iNextId & " " &_
					 "WHERE Table = 'tblMaterial'"
			objConn.Execute strSQL,, 128
		Else
		strSupplierError = strSupplierError & Request.form("Enumber" & item) & "<br>"
		End If
	else
		strNoarticleError=strNoarticleError & Request.form("Enumber" & item) & "<br>"
	end if

Next

if strNoarticleError <> "" then
	Response.write "Följande E-nummer finns inte i databasen och lades inte till!: <br>"
	Response.Write strNoarticleError & "<br>"
End If

if strSupplierError <> "" then
	Response.write "Följande E-nummer finns i databasen men inte hos vald leverantör! <br>"
	Response.Write strSupplierError & "<br>"
End If

If strAddedArticles <> "" then
	Response.Write "Följande artiklar lades till: <br>"
	Response.Write strAddedArticles & "<br>"
end if

objConn.Close
Set objConn = Nothing

function SQLSafe(sText)
	SQLSafe = replace(sText, "'", "''")
end function
%>
Medlem sedan dec. 19996 721 inlägg
#12

Det ser bra ut vid en snabb anblick. Lite synd att hårdkoda in Suppliers, när allt annat är så dynamiskt och fint. :)

Medlem sedan jan. 20013 582 inlägg
#13

Tack för det emission, det värmde i vinterkylan... :)

Jag har iofs supplier i en tabell som man kan använda. Frågan är väl bara då hur man gör en dynamisk select case....

Mvh
henrik

Medlem sedan jan. 20023 327 inlägg
#14

Du behöver inte ha någon case-sats om du använder dig av ett databasanrop istället.
Använd sSupplierId för att hämta namnet på leverantören i databasen.

Medlem sedan jan. 20013 582 inlägg
#15

:)

Ja, givetvis...

La till det här istället för den hårdkodade select case-satsen och det fungerar dynamiskt och fint! Tack compusa!

	strSQL = "SELECT supplierName " &_
			 "FROM tblExSupplier " &_
			 "WHERE supplierId = '" & sSupplierId & "'"

	Set objRS = Server.CreateObject("ADODB.Recordset")
	objRS.Open strSQL, objConn, 3, 1
	
	sSupplierName = objRS("supplierName")
	
	objRS.Close
	Set objRS = Nothing	
	
	sNote = "Artikeln är Köpt hos " & sSupplierName

Mvh
Henrik

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