webForumDet fria alternativet

Jämföra priser i databas

ASP

25 svar · 821 visningar · startad av devotion

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

Hej svejs!

Har fått en idé att göra ett prisjämförelsesystem i ASP. Hade tänkt mig följande upplägg:

Vårt företag har 3 olika grossister; A, B och C. dessa grossister säljer i stort sett samma varor. Som det är nu är det svårt att få öveblick om skillnader i prislistor. Man får slå i kataloger etc.

Grossisterna ger ut prislistor med rabattavtal mm.

Tanken med systemet är att ha en söksida där man kan söka på artikelnummer eller fritext.

Nästa steg är att välja varan och mängd. ( 3 st, 4 m osv)

När man väljer en vara ska den sparas i en "kundkorg" (hoppas ni förstår jämförelsen)

När man valt de varor man är intresserad skall man klicka sig vidare till en jämförelsesida där varorna radas upp med de olika priserna för respektive leverantör. Även totalpriset för varje leverantör skall finnas med. På så sätt ser man lätt vilken leverantör som är billigast.

När jag tänker på det ser jag stora likheter med en weshop, där man väljer varor som läggas i en kundkorg och sedan presenteras i kassan.

Lagras "kundkorgen" i en databastabell, eller finns det andra lösningar.

Är det någon som har några ideer hur man skulle kunna göra detta på? Har inte gjort någon kod än, bara skissat på ideer.

Databasen skall bestå av 3 tabeller; tblA, tblB, tblC där de olika leverantörernas artiklar finns.

Tack på förhand!!

:)

Medlem sedan nov. 20021 222 inlägg
#2

När jag gör webshopar så använder jag databas och använder
global.asa i fall någon lämnar sidan utan att ha full följt köpet, så tar det bort det han har beställt Det går ju använda sessions och cookies i stället för databaser men det jag sa anser att databaser smidigast.

Medlem sedan jan. 20013 582 inlägg
#3

Hmmm...

Vad tycker ni andra? Är databaser det smidigaste eller skall jag använda mig av sessions/cookies??

I mitt fall skall man ju inte köpa något. Å andra sidan kanske det skulle vara smidigt att kunna spara jämförelserna.

Fler ideer!

Medlem sedan nov. 20021 222 inlägg
#4

Har en fråga....hur menar du med att man ska jämföra priser, ska det komma upp bredvid varandra så man ser vilken vara som är billigast, för stod inte riktigt vad du menade i texten...

Medlem sedan jan. 20013 582 inlägg
#5

Det är elfirma och vi har 3 stycken grossister som vi köper varor av. Artikelnummer = E-nummer och är samma för alla grossister. Ex E010110 är en viss typ av kabel som alla grosister har men priset kan vara olika.

Jag vill därför kunna söka efter olika e-nummer och placera dessa i en "varukorg".

När jag lagt till de artiklar med den mängd som jag behöver för ett visst jobb vill jag kunna visa en lista på dessa där de olika grossisternas priser visas. Jag vill även få en totalsumma för varje grossist. På så sätt kan jag på ett enkelt sätt se vilken grossist som är billigast.

Att göra sökfunktioner och listor är inga problem. Det jag funderar på är hur man skall "mellanlagra" artiklarna innan man visar jämförelsesidan.

Mvh

Medlem sedan nov. 20021 222 inlägg
#6

Då säger ja det samma som jag i mitt första inlägg, använd databas. Det är enkalst och smidigast. Så sparar du denna kod i filmnamnet global.asa så includar du den i kundvagn sidan..

<SCRIPT LANGUAGE=VBScript RUNAT=Server>

Sub Session_OnEnd()

Dim  DB, RecSet

 

Set DB = Server.CreateObject ("ADODB.Connection")                       
DB.Open "DSN=shop.mdb"
Set RecSet = Server.CreateObject ("ADODB.Recordset")                   
Tabort = "SELECT * FROM kundvagn WHERE knr = " & Session.sessionID & " " 
Recset.Open Tabort, DB, 3, 3

Do Until RecSet.EOF 

RecSet.Delete   
   
Loop                                     
RecSet.Close                                                                                        

DB.Close

End Sub
</SCRIPT>

När man lägg till någon i din s.ka "kundvagn" så ska det finnas en kolumm i databasen som heter t.ex knr. när man lägger till en produkt från någon grossist i "kundvagnen" så läggs det även till en knr som man får av

sesssion.sessionID

.
När man lämnar sidan så tar det bort alla grejjer i "kundvagen"
men det kundnr man får när man besöker sidan...

Medlem sedan feb. 200112 078 inlägg
#7

joel_joel88 skrev:

När jag gör webshopar så använder jag databas och använder global.asa i fall någon lämnar sidan utan att ha full följt köpet, så tar det bort det han har beställt Det går ju använda sessions och cookies i stället för databaser men det jag sa anser att databaser smidigast.

joel_joel88 » Din kod är ju jättefin (inte ur prestandasynpunkt dock), men kan du tala om för mig hur det hjälper trådskaparen att lösa sitt problem? Det är en ganska stor självklarhet att han skall använda en databas och hur kundkorgen töms vid sessions-timeouter, är nog det minsta av problemen, inte sant?

devotion » Jag skulle nog se till att skapa en databasstruktur som ser ut ungefär såhär;

tbl_Article
   ArticleId - PK
   ArticleArtNr
   ArticleName
   ArticleLongtext
   
tbl_Supplier
   SupplierId - PK
   SupplierName 

tbl_ArticleSupplier
   AS_ArticleId
   AS_SupplierId
   AS_ArticlePrice

Tabellen tbl_ArticleSupplier anger vilken produkt varje leverantör har samt priset för just dess relation. Det går att bygga mer avancerat, men jag hoppas du förstår min tanke.

Vidare, en 'kundkorg'?

tbl_Cart
   CartSessionId
   CartArticleId

För att sedan skapa din jämförelsesida, som ju går att utforma på lite olika sätt, så kan du väl ungefär göra såhär (finns säkert bättre sätt dock);
SQL (lite osäker på den första dock):

set rssup = conn.execute("SELECT COUNT(SupplierId) As SupplierCount, * FROM tbl_Supplier
   WHERE SupplierId IN (
      SELECT DISTINCT AS_SupplierId FROM tbl_Cart 
         INNER JOIN tbl_ArticleSupplier ON CartArticleId = AS_ArticleId
         WHERE CartSessionId = " & session.sessionid & ")")

set rsart = conn.exeucte("SELECT * FROM tbl_ArticleSupplier
   INNER JOIN tbl_Article ON ArticleId = AS_ArticleId
   INNER JOIN tbl_Supplier ON SupplierId = AS_SupplierId
   WHERE ArticleId IN (
      SELECT CartArticleId FROM tbl_Cart 
      INNER JOIN tbl_Article ON ArticleId = CartArticleId
      WHERE CartSessionId = " & session.sessionId & ")")

Skapa matching-dictionary:

dim dic 'as scripting.dictionary
set dic = server.createobject("scripting.dictionary")
dic.comparemode = 1

while not rsart.eof 
   dic(rsart("Supplier" & rsart("SupplierId") & "Article" & rsart("ArticleId") & "ArticleName") = rsart("ArticleName")
   dic(rsart("Supplier" & rsart("SupplierId") & "Article" & rsart("ArticleId") & "ArticlePrice") = rsart("AS_ArticlePrice")
   rsart.movenext
wend

Skriv ut alla leverantörer (tabell-header först):

response.write "<table><tr>"
while not rssup.eof 
   response.write "<td>" & rssup("SupplierName") & "</td>"
   rssup.movenext
wend
response.write "</tr>"

rsart.movefirst: rssup.movefirst
while not rsart.eof 
   response.write "<tr>"
   while not rssup.eof 
      response.write "<td>"
      response.write dic("Supplier" & rssup("SupplierId") & "Article" & rsart("ArticleId") & "ArticleName")
      response.write "<br>"
      response.write dic("Supplier" & rssup("SupplierId") & "Article" & rsart("ArticleId") & "ArticlePrice")
      response.write "</td>"
      rsssup.movenext
   wend
   rssup.movefirst
   response.write "</tr>"
   rsart.movenext
wend

response.write "</table>"

Efter detta känner jag att en förklaring är på sin plats. ;)

Första SQL-frågan hämtar alla leverantörer, men bara de som berörs av det kunden har i kundkorgen. Andra SQL-frågan hämtar alla kombinationer av artiklar som kan finnas med de leverantörer som levererar artiklarna.

När vi sedan skapar vårt dictionary (mycket användbara objekt btw) så duplicerar vi alla dessa kombinationer, så att vi kan accessa dem i koden lättare. Vi döper varje recordset-post till t.ex. Supplier12Article45ArticleName, och denna post kan sedan innehålla t.ex. 455, som är priset på denna specifika artikel för denna specifika produkt. Leverantören med ID 12 har alltså en artikel med ID 45 som kostar 455 SEK (föreslagsvis). Lite krångligt kanske, men det är nog det enklaste sättet.

När vi sedan loopar igenom varje artikel, så på varje rad loopar vi även igenom alla leverantörer och hämtar genom att anropa ovanstående dic-poster, gneom att konkatenera ihop post-namnet. Finns inte denna specifika artikel i dictionaryt (leverantören har inte denna artikel) så spelar det ingen roll, för det blir bara en lucka i vårt diagram ändå.

Detta är under förutsättning att databasstrukturen ser ut som jag har ritat upp. Du får försöka att skriva något slags script som genererar värden in i 'mina' tabeller från de tre du har idagsläget. Det borde inte vara några problem dock, men du måste nog skapa tbl_Article först, för att sedan se till att binda upp datat i tbl_ArticleSupplier.

Hoppas du förstår, och håll ett öga öppet för buggar, koden är helt otestad (doh)! :D

Medlem sedan nov. 20021 222 inlägg
#8

ok OveRRidE. Jag skrev ju innan om databaser och han verkade lite tveksam, så jag skrev att man kan använda det och gav honom ett kod ex som jag bara skrev ihop snabbt hur man kan lösa i fall någon går ur sidan i fall han är orolig över det....

Medlem sedan feb. 200112 078 inlägg
#9

Jag förstod det och om du tillåter så ger jag dig gärna ett förslag på förbättring av den där koden, för den är verkligen ett exempel på hur man inte får göra.

<script language="VBScript" runat="Server">

Sub Session_OnEnd()

   Dim objConn 'As ADODB.Connection
   Set objConn = Server.Create("ADODB.Connection")
   objConn.Open "DSN=shop.mdb"
      objConn.Execute "DELETE FROM [kundvagn] WHERE [knr] = " & Session.SessionId
   Set objConn = nothing

End Sub
</script>

Alltså, du får verkligen inte öppna ett Recordset och loopa igenom det (speciellt inte med de konstanter du använde som var 3 och 3, vilket står för Read-Write och fri hoppning mellan raderna) för att sedan ta bort varje rad separat. Du måste dessutom alltid tänka på att sätta dina objekt till Nothing, om inte iallafall pga. att det ger kontinuitet och struktur. Sen funderade jag lite på vad kolumnen 'knr' står för i din databas. Är det Kundnummer? Isåfall skulle jag rekommendera dig att inte använda Session.SessionId eftersom det inte är ett garanterat unikt i om webbservern startas om, om du nu använder det på det sättet. Tänkte bara ifall du har några inbyggda specialinloggningsfunktioner som går på det ID't.

Men annars var det ju rätt, även om man faktiskt helst inte skall förlita sig på att kodi Session_OnEnd verkligen körs, för det brukar vara lite si och så med det.

Medlem sedan nov. 20021 222 inlägg
#10

jag tog koden från en webshop som jag gjorde för två år sedan som i sin tur hade tagit från något ställde. nu vet jag hur man kodar sådant, fast jag klistrade in den snabbt som jag nämde för att visa hur man KAN göra, ska jag vara ärlig så tänkte jag faktiskt inte på att det var en dålig kod när jag skickade i det...tog den bara för att jag var lat :r

Medlem sedan jan. 20013 582 inlägg
#11

Oj, oj, oj vad mycket att läsa :) tack för det!

Jag har inte läst in mig på allt, men i alla fall kommit fram till att jag skall använda mig av en databas för kundkorgen.

Sedan vet jag inte om jag ska tömma den när man lämnar sidan. Det kanske är så att det är bättre att kunna spara den om man behöver den i ett senare skede...??? Får fundera på det.

Strukturen på databaserna är inte så mycket att göra åt eftersom det är textfiler som grossisten levererar som jag sedan konverterar till *.mdb.

De har följande struktur: (exempel)

tblStorel
articleID (vet ej om jag ska använda mig av unikt ID)
e-number (E-nummer dvs artikelnummer)
articleName
articleUnit (m, st, par etc)
articleCategory (Artikelkategori används för att räkna ut rabatter. En viss kategori har en viss rabatt)
articlePrice

Tänkte använda mig av 3 stycken sådana tabeller samt 3 till för rabattavtal till varje leverantör (Rabattavtalen levereras också som textfiler av grossisten)

Rabattavtaltabellen ser ut såhär:

tblRabattStorel
articleCategory (kopplas till articleCategory i tblStorel)
rabatt (svengelska ja, ja Är i alla fall rabattsats i procent) :r

Varje tabell innehåller ca 60 000 poster... är detta ett problem??
Har tänkt använda mig av access *.mdb

Skall väl tillägga att aplikationen inte ska vara publik på internet utan på ett lokalt Intranät med 5 användare.

Även att E-numrena är gemensamma har varje grossist möjlighet att lägga till sina egna e-nummer. Därför kan följande problem uppstå när man gör en sökning. Finns e-numret i första tabellen kan sökningen avslutas där och läggas i "varukorgen". Om det inte finns måste sökningen fortsätta till nästa tabell och eventuellt nästa igen. Sökningen skall altså bara generera ETT e-nummer. Men det är väl inga problem??

Saknas ett e-nummer hos någon grossist skall det stå "artikel saknas" i jämförelsesidan.

Skall man utforma sidan som ett ramverk där tex "varukorgen" är i bottenramen? Denna måste ju updateras varje gång en ny artikel läggs i den.

Puhhh!!

Mycket text blir det...

Tack på förhand!

Medlem sedan jan. 20013 582 inlägg
#12

Finns det ingen som har fler ideer....

Medlem sedan juni 200032 967 inlägg
#13

Sedan vet jag inte om jag ska tömma den när man lämnar sidan. Det kanske är så att det är bättre att kunna spara den om man behöver den i ett senare skede...??? Får fundera på det.

Jag hade nog valt att spara, men vill du tömma den kan du lägga kod i Session_OnEnd i global.asa för detta. Den koden körs när sessionen når timeout.

Strukturen på databaserna är inte så mycket att göra åt eftersom det är textfiler som grossisten levererar som jag sedan konverterar till *.mdb.

Du kan ju alltid skriva ett script (asp eller likn.) som importerar datat i det formatet du vill ha det.

Tänkte använda mig av 3 stycken sådana tabeller samt 3 till för rabattavtal till varje leverantör (Rabattavtalen levereras också som textfiler av grossisten)

Om jag vore du skulle jag verkligen åtminstone försöka få ihop det till en tabell. Det är inte bra att lagra samma sorts data i flera likadana tabeller. Värre än så; det är fel. ;)

e-number (E-nummer dvs artikelnummer)

Akta dig för att ha bindestreck i fältnamn. I dina SQL-frågor kommer det att tolkas som fält e minus fält number, och det kommer att ge dig massor av läckra felmeddelanden.

Varje tabell innehåller ca 60 000 poster... är detta ett problem??
Har tänkt använda mig av access *.mdb

Det kan vara det, men det måste inte vara det. Om du kan göra som Override beskriver så borde det inte vara det.

Även att E-numrena är gemensamma har varje grossist möjlighet att lägga till sina egna e-nummer. Därför kan följande problem uppstå när man gör en sökning. Finns e-numret i första tabellen kan sökningen avslutas där och läggas i "varukorgen". Om det inte finns måste sökningen fortsätta till nästa tabell och eventuellt nästa igen. Sökningen skall altså bara generera ETT e-nummer. Men det är väl inga problem??

Jag har ingen aning, jag förstår inte riktigt vad du menar. =)

Skall man utforma sidan som ett ramverk där tex "varukorgen" är i bottenramen? Denna måste ju updateras varje gång en ny artikel läggs i den.

Så brukar jag göra. Inte nödvändigtvis bottenframen, vilken frame som helst går ju bra.

mvh

Medlem sedan jan. 20013 582 inlägg
#14

Hej igen!

Tack för svaren, det börjar klarna...

Även att E-numrena är gemensamma har varje grossist möjlighet att lägga till sina egna e-nummer. Därför kan följande problem uppstå när man gör en sökning. Finns e-numret i första tabellen kan sökningen avslutas där och läggas i "varukorgen". Om det inte finns måste sökningen fortsätta till nästa tabell och eventuellt nästa igen. Sökningen skall altså bara generera ETT e-nummer. Men det är väl inga problem??
--------------------------------------------------------------------------------

Jag har ingen aning, jag förstår inte riktigt vad du menar. =)

Ja, kanske lite förvirrat...
Ska försöka förklara lite bättre...

I elbranchen används ett gemensamt artikelnummersystem som kallas för E-nummer. Detta använder sig alla grosister av. T.ex är E-nummer: 00 001 15 en starkströmskabel 3x 2,5/2,5 mm2. Detta gäller således hos alla grossister. Däremot kan priset variera.

Varje grossist har dock ett antal E-nummer som är unika för dom som ingen annan har.

Om sökningen börjar i Storel´s tabell och hittar numret kan sökningen avslutas där. Om däremot e-numret inte finns med där måste sökningen fortsätta i Elektroskandias tabell och sedan i Solars tabell där numret hittas. Jag tänker så eftersom det räcker att E-numret lagras i "kundvagnen" När sedan jämförelsesidan skapas görs en förnyad sökning i alla 3 tabellerna....

Jag vet inte om detta blir tydligare... Men ni har fått mig på lite andra tankar....

Eftersom alla 3 prislistorna/tabellerna är uppbygda på samma sätt är det nog smartare att skapa en gemensam som innehåller alla E-nummer från samtliga grossister. Sedan finns det kolumner för priser för alla grossister.

Följande tabellstruktur kanske kan användas

tblPricelist
-----------
eNumber
articleName
articleCategory
articleUnit
storelPrice
solarPrice
elektroskandiaPrice

Om en grossist saknar artikeln blir prisfältet tomt och det betraktas som grossisten saknar artikeln.

Hur får jag ihop dessa tabeller på ett smidigt sätt???

De levereras i txt-format

Kan jag göra detta i Access??

//Mvh

Medlem sedan jan. 20013 582 inlägg
#15

Hej igen.

Hur skulle jag kunna få ihop dessa 3 prislistor som levereras som textfiler till en accessdatabas på smidigaste sätt.

Prislistorna uppdatreas ju ibland så det allra bästa vore ju att kunna "ladda upp nya" när det behövs.

Mvh

Medlem sedan jan. 20013 582 inlägg
#16

Hej svejs igen....

Försöker göra denna tråd aktuell igen...

Mvh

Medlem sedan juni 200032 967 inlägg
#17

Hur ser textfilerna ut?

Medlem sedan jan. 20013 582 inlägg
#18

Hej!

Här kommer en bit av grossist 1 prislista

Kolumnerna är följande:

E-nummer
Benämning
Kategori
Enhet
Pris (i öre)

Medlem sedan juni 200032 967 inlägg
#19

Om alla filerna ser likadana ut så är det ju bara att börja med att skriva ett litet importscript. Det tar kanske en liten stund, men det är nog ganska roligt.

Med ett litet importscript så är det ju bara för dig att lägga upp de nya filerna när du får dem, köra scriptet, och woomp så är datat uppdaterat. =)

Mvh

Medlem sedan jan. 20013 582 inlägg
#20

Ja, det lät ju lätt och smidigt " Ett litet importscript" :)

Har begränsade kunskaper om script...

Några ideer??

Javascript??

ASP??

Eller går det att använda sig av access??

Mvh

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