webForumDet fria alternativet

Generera unikt ordernummer

ASP

23 svar · 605 visningar · startad av Janspeed

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

Hejsan!

Undrar om det är någon som vet ett bra sätt att generera ett unikt ordernummer som ska läggas till en beställning?

Jag sitter och spekulerar över mina alternativ. Tanken är att nummret ska skickas med i ett mail samt visas på sidan när beställningen bekräftats för kunden.

Än så länge har jag kommit fram till 3 st alternativ.

Det första är att lagra senaste ordernummret i en databas och sedan hämta det igen vid varje beställning. Jag är dock inte helt säker på att det är det resurssnålaste alternativet då det säkert tar en del kräm att öppna databasen vid varje beställning som skickas.

Det andra är att spara en räknare i en fil och precis som i första alternativet hämta räknaren vid varje beställning. Detta är dock ett litet problem då det kräver skrivrättigheter som jag inte har. Än så länge i alla fall.

Det sista alternativet jag kan komma på är att generera ett nummer utifrån datum och tidpunkt. Problemet med det alternativet är att jag bara lyckas få en nogrannhet på sekunder och det kan ju hända att två beställningar skickas iväg samtidigt. Funderade över att kompensera detta med några slumptal men det finns ju fortfarande en sannolikhet att numrena fortfarande kan bli identiska?

Är det någon som har något bra förslag? Vilket alternativ skulle ni själva ha valt och vilket alternativ är mest resurssparande?

Tacksam för svar. :)

/JANspeed

Medlem sedan dec. 19998 577 inlägg
#2

Varför inte låta databasen ta hand det unika?

------------------
Doesn't 'expecting the unexpected' make the unexpected expected?
webeye.nu

Medlem sedan dec. 19996 522 inlägg
#3

Kan du inte ha det i databasen? unique identifier om du har mssqlserver

Vide var visst snabbare än Ludmila ;)

------------------
Real mad hiphop flavaz kickin' it right from tha street without no FEAR, Yo !

[Redigerat av erka den 06 nov 2001]

Medlem sedan dec. 200012 464 inlägg
#4

Datum + en räknare i application.

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

Medlem sedan apr. 200171 inlägg
#5

du kan göra så att ordernummret heter ungefär samma som kundnummret.. Tex. om jag har kundnummer 232230 och gör en order så får jag ordernummer 232230-1
nästa order 232230-2

ett förslag... eller så kan du använda newid() funktionen i SQL-servern man jag tvivlar på att man vill ha ett så långt ordernummer ;)

------------------
- Rickard
http://cherub.deca-production.net
"You say I'm beautiful. Well, I can't help it! You say I'm empty. We all know I'm full of shit!"

Medlem sedan jan. 2001510 inlägg
#6

Drar inte det en hel del resurser då? Att öppna och spara en databas låter ju som lite overkill för att lagra ett nummer? Hur skulle man gå till väga? En helt ny tabell enbart för nummret eller använder man samma tabell där beställningarna lagras? Hur i så fall? :)

Medlem sedan jan. 2001510 inlägg
#7

Ok, om jag nu måste skapa en räknare, Vilket sätt är resurssnålast i så fall? FSO, DB, eller finns det något annat sätt? Hur skulle ni göra?

Finns det något sätt att få mer än en sekunds nogrannhet i tid?

Medlem sedan mars 20002 836 inlägg
#8

Det skulle väl vara att ha ta sessionid som kundnummer och "trycka" in det i db samtidigt som beställningen görs.

Det andra alternativet är att när kunden loggar in så tar man hans kund-nummer + yyyy-mm-dd hh:mm:ss som ordernummer

Tid mindre än Sekund: Millisekund = Timer()

cya,
PatrikB

------------------
'## -- second place is the first looser -- ##'

Medlem sedan dec. 19995 874 inlägg
#9

Vad skall du göra med ett unikt ordernummer, om det inte sammanbinds med ordern ändå? (förutom i mailet då)...

Fundersam :)

------------------
Mvh
Patrik aka Brimba
<A HREF="http://www.brimba.nu/default.asp?oPID=poll&PollID=20" TARGET=_blank>Har du husdjur hemma?
</A>Varför får man inte dricka saltvatten?

Medlem sedan feb. 20001 590 inlägg
#10

Ha alla ordrar i en separat tabell, med ett ordernummer som skapas automatiskt med en räknare. Ha också med ett id så att du kan koppla order->kund och tvärtom. Detta är det "normala" sättet att hantera beställningar.

Att öppna databasen för att hämta ett ordernummer tar ingen "kräm", och är inget att oroa sig för. Dessutom så skickas det inte så många beställningar per sekund, eller?

/T

------------------
Jensen Ambassadör, mitt bästa köp! www.jensen.no

Medlem sedan jan. 2001510 inlägg
#11

PatrikB
Kunderna loggar inte in när de ska beställa så jag har inte tillgång till något kundnummer. Hade jag haft det så hade jag delvis inte haft något problem. :)

Timer() är det en funktion som finns i VBscript eller har du gjort den själv?

Brimba
Ordern går via mail som ska innehålla ett ordernummer som kunden sedan referera till. Nummret visas på hemsidan efter att beställningen är gjord i samband bekräftelsen på att ordern gått igenom.

Toonster
Det jag funderar på är att lägga alla beställningar i en databas (SQL Server) vid beställning och innan själva lagringen hämtar jag det senaste ordernummret och ökar det med 1. ex:

Dim Conn, rs, SQL, ordernummer

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open

SQL = "SELECT MAX(ordernummer) FROM tblOrder ORDER BY ordernummer DESC"

Response.Write SQL & "<br>"

Set rs = Conn.Execute(SQL)

Tror ni att antalet beställningar påverkar resurserna det tar att hämta det senaste ordernummret? Finns det något sätt som är bättre?

Medlem sedan mars 20002 836 inlägg
#12

Timer() är en funktion som finns i VBScript.

Att använda sig av funktionen max() är inte speciellt bra, den kan ge fel "order-nummer" under specifika omständigheter (många användare samtidigt).
Det du i sådanafall ska göra är att när kunden lägger till sin första vara så kör du en sql fråga direkt efter det "inlägget":

strSQLoid = "SELECT @@IDENTITY"
Set objRSoid = Conn.Execute(strSQL)
varOrderID = objRSoid(0)
Set objRSoid = Nothing

cya,
PatrikB

------------------
'## -- second place is the first looser -- ##'

Medlem sedan feb. 20001 590 inlägg
#13

Om alla ordrar finns i en separat tabell (vilket det ska göra i en korrekt utformad databas) så behöver man aldrig tänka på att öka ordernummer osv. man kan låta databasen ta hand om det.

/T

------------------
Jensen Ambassadör, mitt bästa köp! www.jensen.no

Medlem sedan jan. 2001510 inlägg
#14

Teoretiskt borde det väl gå snabbare att söka i databasen innan man lägger in den nya beställningen istället för att lägga till beställningen och sedan söka efter senaste ordernummer? För då är det ju ytterligare en beställning i högen?

Eller tar det längre tid att addera 1 till ett tal?

Det jag är rädd för är att alla databas hantering ska slöa ner servrarna då dessa är så slöa redan. :)

Så här långt har jag kommit:

Conn.Open

SQL = "SELECT TOP 1 RefNr FROM tblOrder ORDER BY RefNr DESC"

Response.Write SQL & "<br>"

Set rs = Conn.Execute(SQL)

Dim RefNr, Kampanjkod, OrderText, Datum, Produkt, Epost

If rs.EOF Then
RefNr = 1
Else
RefNr = rs("RefNr") + 1
End If

Kampanjkod = Request("kampanjkod")
OrderText = body
Datum = Date()
Produkt = Produkter
Epost = Request("epost")

Response.Write RefNr & "<br>"

SQL = "INSERT tblOrder (RefNr, Kampanjkod, OrderText, Datum, Produkt, Epost) VALUES (" & RefNr & ", '" & kampanjkod & "', '" & OrderText & "', " & Datum & ", '" & Produkt & "', '" & Epost & "')"

Response.Write SQL & "<br>"

Set rs = Conn.Execute(SQL)

Några förslag? :)

Medlem sedan feb. 20001 590 inlägg
#15

Mitt förslag är att göra som jag nämnde. Att öppna databasen för att ta reda på ett ordernummer är inget som helst betyngande. Det är inte ens säkert att man behöver göra en extra öppning, allt beror på hur du lägger upp tabellerna med kund/artiklar/order

/T

------------------
Jensen Ambassadör, mitt bästa köp! www.jensen.no

Medlem sedan jan. 2001510 inlägg
#16

Efter lite klurande bestämde jag mig för att genomföra ett litet test. Nu är ju inte jag världens bästa på att göra test så har ni synpunkter så känn er fria att kommentera hur mycket ni vill.

Totalt blev det 4 tester:
add_to_tblorder.asp
add_to_tblorder2.asp
add_to_tblorder3.asp
add_to_tblorder4.asp

add_to_tblorder.asp hämtar senaste RefNr (ordernummer) i databasen lägger till 1 och sparar sedan beställningen i databasen.

add_to_tblorder2.asp sparar beställningen i databasen, låter databasen skapa ett RefNr och hämtar sedan detta.

add_to_tblorder3.asp hämtar senaste RefNr från en textfil lägger till 1 och sparar om filen med det nya värdet och sparar sedan beställningen i databasen.

add_to_tblorder4.asp genererar ett RefNr av datum, tid och millisekunder och sparar sparar sedan beställningen i databasen.

Tanken är att alla i slutet ska ha ordernumret lagrat i variabeln RefNr. Från ett genomsnitt av 8 försök och avrundat till 5 decimaler fick jag fram detta:

add_to_tblorder.asp 0,3583975
add_to_tblorder2.asp: 0,33593625
add_to_tblorder3.asp: 0,12597375
add_to_tblorder4.asp: 0,120115

Verkar det rimligt?

Testerna:

add_to_tblorder.asp

<%

Session.LCID = 1053
Response.Expires = -1500

Dim RefNr, Kampanjkod, OrderText, Datum, Produkt, Epost

Kampanjkod = "Test001"
OrderText = "Detta är texten för att testa mailet med"
Datum = Date()
Produkt = "Produkt1, Produkt2, Produkt3"
Epost = "JANspeed@telia.com"

'------------------------------------------------------------
'Timer start
'------------------------------------------------------------

Dim StartTime, EndTime, TimeIt
StartTime = Timer

'------------------------------------------------------------
'Execute
'------------------------------------------------------------

Dim Conn, rs, SQL

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.ConnectionString = 
Conn.Open

SQL = "SELECT TOP 1 RefNr FROM tblOrder ORDER BY RefNr DESC"

Set rs = Conn.Execute(SQL)

If rs.EOF Then
RefNr = 1
Else
RefNr = rs("RefNr") + 1
End If

SQL = "INSERT tblOrder (RefNr, Kampanjkod, OrderText, Datum, Produkt, Epost) VALUES (" & RefNr & ", '" & kampanjkod & "', '" & OrderText & "', " & Datum & ", '" & Produkt & "', '" & Epost & "')"

Set rs = Conn.Execute(SQL)

'------------------------------------------------------------
'Close
'------------------------------------------------------------

'rs.Close
Set rs = Nothing

Conn.Close
Set Conn = Nothing

'------------------------------------------------------------
'Timer ends
'------------------------------------------------------------

EndTime = Timer
TimeIt = EndTime - StartTime

Response.Write "Tiden: " & Round(TimeIt, 5) & "<br>"

%>

Reslutat:
0,59766
0,30859
0,30078
0,3125
0,32031
0,38281
0,3125
0,33203
0,3583975

add_to_tblorder2.asp

<%

Session.LCID = 1053
Response.Expires = -1500

Dim RefNr, Kampanjkod, OrderText, Datum, Produkt, Epost

Kampanjkod = "Test002"
OrderText = "Detta är texten för att testa mailet med"
Datum = Date()
Produkt = "Produkt1, Produkt2, Produkt3"
Epost = "JANspeed@telia.com"

'------------------------------------------------------------
'Timer start
'------------------------------------------------------------

Dim StartTime, EndTime, TimeIt
StartTime = Timer

'------------------------------------------------------------
'Execute
'------------------------------------------------------------

Dim Conn, rs, SQL

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.ConnectionString = 
Conn.Open

SQL = "INSERT tblOrder2 (Kampanjkod, OrderText, Datum, Produkt, Epost) VALUES ('" & kampanjkod & "', '" & OrderText & "', " & Datum & ", '" & Produkt & "', '" & Epost & "')"

Set rs = Conn.Execute(SQL)

SQL = "SELECT TOP 1 RefNr FROM tblOrder2 ORDER BY RefNr DESC"

Set rs = Conn.Execute(SQL)

RefNr = rs("RefNr")

'------------------------------------------------------------
'Close
'------------------------------------------------------------

'rs.Close
Set rs = Nothing

Conn.Close
Set Conn = Nothing

'------------------------------------------------------------
'Timer ends
'------------------------------------------------------------

EndTime = Timer
TimeIt = EndTime - StartTime

Response.Write "Tiden: " & Round(TimeIt, 5) & "<br>"

%>

Resultat:
0,58984
0,30078
0,26953
0,3125
0,32031
0,30078
0,29297
0,30078
0,33593625

add_to_tblorder3.asp

<%

Session.LCID = 1053
Response.Expires = -1500

Dim RefNr, Kampanjkod, OrderText, Datum, Produkt, Epost

Kampanjkod = "Test003"
OrderText = "Detta är texten för att testa mailet med"
Datum = Date()
Produkt = "Produkt1, Produkt2, Produkt3"
Epost = "JANspeed@telia.com"

'------------------------------------------------------------
'Timer start
'------------------------------------------------------------

Dim StartTime, EndTime, TimeIt
StartTime = Timer

'------------------------------------------------------------
'Open textfile
'------------------------------------------------------------

Dim fileFSO, filePath, R
Set fileFSO = Server.CreateObject("Scripting.FileSystemObject")
Set R = fileFSO.OpenTextFile(Server.MapPath("/utveckling/test/AddToDB/counter.txt"), 1)
RefNr = R.ReadLine + 1
R.Close
Set R = fileFSO.OpenTextFile(Server.MapPath("/utveckling/test/AddToDB/counter.txt"), 2)
R.WriteLine RefNr
R.Close
Set R = Nothing
Set fileFSO = Nothing

'------------------------------------------------------------
'Execute
'------------------------------------------------------------

Dim Conn, rs, SQL

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.ConnectionString = 
Conn.Open

SQL = "INSERT tblOrder (RefNr, Kampanjkod, OrderText, Datum, Produkt, Epost) VALUES (" & RefNr & ", '" & kampanjkod & "', '" & OrderText & "', " & Datum & ", '" & Produkt & "', '" & Epost & "')"

Set rs = Conn.Execute(SQL)

'------------------------------------------------------------
'Close
'------------------------------------------------------------

'rs.Close
Set rs = Nothing

Conn.Close
Set Conn = Nothing

'------------------------------------------------------------
'Timer ends
'------------------------------------------------------------

EndTime = Timer
TimeIt = EndTime - StartTime

Response.Write "Tiden: " & Round(TimeIt, 5) & "<br>"

%>

Resultat:
0,38281
0,12109
0,10156
0,08203
0,07031
0,08984
0,07031
0,08984
0,12597375

add_to_tblorder4.asp

<%

Session.LCID = 1053
Response.Expires = -1500

Dim RefNr, Kampanjkod, OrderText, Datum, Produkt, Epost

Kampanjkod = "Test004"
OrderText = "Detta är texten för att testa mailet med"
Datum = Date()
Produkt = "Produkt1, Produkt2, Produkt3"
Epost = "JANspeed@telia.com"

'------------------------------------------------------------
'Timer start
'------------------------------------------------------------

Dim StartTime, EndTime, TimeIt
StartTime = Timer

'------------------------------------------------------------
'Generate RefNr
'------------------------------------------------------------

RefNr = Right(Year(Datum), 2) & Month(Datum) & Day(Datum) & Hour(Time) & Minute(Time) & Second(Time) & Right(Timer, 4)
RefNr = Replace(RefNr, ",", "")

'------------------------------------------------------------
'Execute
'------------------------------------------------------------

Dim Conn, rs, SQL

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.ConnectionString = 
Conn.Open

SQL = "INSERT tblOrder (RefNr, Kampanjkod, OrderText, Datum, Produkt, Epost) VALUES (" & RefNr & ", '" & kampanjkod & "', '" & OrderText & "', " & Datum & ", '" & Produkt & "', '" & Epost & "')"

Set rs = Conn.Execute(SQL)

'------------------------------------------------------------
'Close
'------------------------------------------------------------

'rs.Close
Set rs = Nothing

Conn.Close
Set Conn = Nothing

'------------------------------------------------------------
'Timer ends
'------------------------------------------------------------

EndTime = Timer
TimeIt = EndTime - StartTime

Response.Write "Tiden: " & Round(TimeIt, 5) & "<br>"

%>

Resultat:
0,35156
0,07812
0,09766
0,07812
0,08984
0,08203
0,08203
0,10156
0,120115

Kan det här stämma? Vore väldigt kul att höra vad ni tycker? :)

/JANspeed

[Redigerat av Janspeed den 08 nov 2001]

Medlem sedan feb. 20001 590 inlägg
#17

Mycket konstigt test. För mig verkar det otroligt att du orkar... :)

Hur tänker du med ordern, den borde väl bestå av många artiklar, dvs flera poster?

Att låta databasen skapa ett unikt ordernummer är det normala sättet, och är det sättet man gör.

Tänk på att en kund kan göra flera beställningar, och att dessa ska kunna hanteras.

Genom att låta databasen hantera ordenumret, så får du alltid rätt nummer, eftersom dubletter inte kan skapas. Att det sen tar någon millisikund mer eller mindre spelar ingen roll, eftersom du får betydligt mindre kod att köra och underhålla, dessutom skapas inte flera hundra ordernummer per sekund.

Att låta databasen fixa numret är även det enklaste sättet. Du kommer att spara flera timmar på det, jag lovar!!
Att blanda in en annan textfil är totalt onödigt då man kan spara data i databasen.

Eftersom orderbekräftelsen ska gå till en kund, så utgå från kundnumret, och den oskickade orderbekräftelsen, så kommer ordernumret automatiskt, dvs. du behöver inte öppna databasen för att få reda på det.

Nu beror det iof. på hur databasen är modulerad, men jag antar/utgår från att du har minst 3 tabeller:
artikel
kund
order

plus ev. en relationstabell för främmande nycklar

/T

------------------
Jensen Ambassadör, mitt bästa köp! www.jensen.no

[Redigerat av Toonster den 08 nov 2001]

Medlem sedan jan. 2001510 inlägg
#18

Hmm... Att testet är konstigt var ju inte riktigt den konstruktiva kritik jag letade efter. Helt ok att tycka så men motivera gärna på vilket sätt det är konstigt så jag kan göra något åt det? :)

add_to_tblorder2.asp är hur jag tolkade att du menade. Kan inte komma på något annat sätt?

Som jag sa till PatrikB så har jag ingen tillgång till kundnummer. Kunderna loggar inte in sig när de beställer. Inga av kunddatabaserna är tillgängliga för hemsidan då denna ligger på ett externt webhotell.

Beställningarna skickas till företaget via mail likaså bekräftelsen.

Det enda sättet databasen är modulerat på är en tabell med kolumnerna RefNr, Kampanjkod, OrderText, Datum, Produkt och Epost.

Då databasen enbart används för referenssyfte och statistik och inte har någon särskild nytta så är det speciellt viktigt att den drar så lite resurser som möjligt.

Om nu mitt test stämmer så är det ju åtminstone dubbelt så snabbt att hämta nummret från en fil istället för att pyssla omkring i databasen. Å andra sidan så finns det säkert bättre sätt att lösa det på än i mina test. Vet bara inte hur. :l

/JANspeed

Medlem sedan feb. 20001 590 inlägg
#19

Se det som "positiv" kritik, jag hade aldrig orkat testat så många olika script... :)

Hursomhelst ska prestandan komma i andra hand, det viktigaste är ett system som fungerar. Om allt är i databasen så är all viktig och kritisk data på ett ställe. Det är ju ganska lätt att lägga till någon tabell eller fält i en befintlig databas för att få ett "riktigt" system med en gång.

Prestandaproblem i databaser uppstår nästan endast vid många samtidiga databasförfrågningar med stora urval.

Om jag skulle fixa till ett enkelt ordernummer utan databas, så hade jag tagit sessionsid, och kanske eventuellt lagt till dagens datum. Detta kan skickas både till kunden och företaget, och behöver ju inte sparas.

/T

------------------
Jensen Ambassadör, mitt bästa köp! www.jensen.no

[Redigerat av Toonster den 08 nov 2001]

Medlem sedan jan. 2001510 inlägg
#20

Det tog ju inte så särskilt lång tid att göra de små ändringarna i scripten. De ser ju nästan likadana ut bara att de använder olika metoder och jag måste ju lära mig. :)

Hur gör jag för att få tag på SessionID då? Lagras det på servern eller ska jag generera det själv för varje kund.

Hur skulle du skriva koden om du bara hade en tabell där du skulle lagra datat och sedan returnera ordernumret? Eftersom jag inte har gjort någon beställningsdatabas förut så har jag ingen aning om hur koden är tänkt att den ska se ut?

274 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
143 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)