Avatar billede loukas Mester
04. august 2002 - 13:19 Der er 14 kommentarer og
1 løsning

SQL - flere tabeller

Jeg har fire tabeller der hænger sammen(relationer) i en access-db.
Og jeg må hellere sige at det er første gang jeg prøver det med relationer ;-)

Tabel1: Kunder
Tabel2: Ordrer
Tabel3: Orderlinie
Tabel4: varer

Når en kunde har afgivet en ordre skal vedkommenes navn-adresse osv gemmes i 'Kunder' det kan jeg godt, men....
Tabellen 'Ordrer skal ligeledes indeholde Kundeid(som er auto-genneret i tabellen kunder)

Jeg har prøvet at oprette en forespørgsel i access, men den bliver totalt uoverskuelig for mig ???
Avatar billede eagleeye Praktikant
04. august 2002 - 13:27 #1
Du skal hvade det ID nummer som lige er ligt i ud. Prøv med denne metode:



Conn.Open "Provider=MICROSOFT.JET.OLEDB.4.0; " _
    & "DATA SOURCE=" & Server.MapPath("somedir\somedb.mdb"
'Indsæt en kunde som i dag
SQL = "INSERT INTO someTable (fld1, fld2) VALUES(123,'xyz');"
conn.Execute SQL ' do the insert, and then...

'Her er det nye hendt det ID som er lagt i sidst.
Set RS = Conn.Execute( "SELECT @@IDENTITY" )
idOfNewlyAddedRecord = RS(0)
RS.Close
Response.write idOfNewlyAddedRecord
Avatar billede eagleeye Praktikant
04. august 2002 - 13:28 #2
Det skal lige siges det kan være den giver 0 tilbage så virker det ikke, så findes der andre metoder, men den som jeg har vist er at fortrække.
Avatar billede eagleeye Praktikant
04. august 2002 - 13:29 #3
Du kan så bruger idOfNewlyAddedRecord til at lige i Ordrer tabellen samme med de forskellige vare man har bestilt


"INSERT INTO Ordrer (KundeID, vareID) VALUES (" & idOfNewlyAddedRecord & ", " & valgtvareID & ")"
Avatar billede loukas Mester
04. august 2002 - 13:35 #4
ok tak, jeg prøver lige at rode lidt med det :-)
Avatar billede eagleeye Praktikant
04. august 2002 - 13:44 #5
Ok der er nogle flere eks på at hendte ID ud:
http://www.aspfaqs.com/aspfaqs/ShowFAQ.asp?FAQID=79
Avatar billede loukas Mester
04. august 2002 - 13:58 #6
OK, den skriver 'idOfNewlyAddedRecord' fint ud :-)
Så skal jeg se at få den ind i Order !!!
Avatar billede eagleeye Praktikant
04. august 2002 - 14:22 #7
Ja det kommer så an på hvodan din ordrer table ser ud. Eks som det jeg viste føt hvor jeg antager du har en kolonnen KundeID som bliver sat til det ID som kunden lige har fået.

"INSERT INTO Ordrer (KundeID, KolonneXX, KolonneYY) VALUES (" & idOfNewlyAddedRecord & ", " & KolonneXXData & ", '" & KolonneYYData & "')"
Avatar billede loukas Mester
04. august 2002 - 16:17 #8
Kan du fortælle mig hvad problemet er her :????
Det er noget med den date

SQL = "INSERT INTO Ordrer (KundeID, Ordredato)"
SQL = SQL & " VALUES (" & idOfNewlyAddedRecord & ", '" & date & "')"
Avatar billede eagleeye Praktikant
04. august 2002 - 16:20 #9
Hvis Ordredato er defineret som Dato type i databsen skal der # omkring når det er Access sådan her:

SQL = "INSERT INTO Ordrer (KundeID, Ordredato)"
SQL = SQL & " VALUES (" & idOfNewlyAddedRecord & ", #" & date & "#)"
Avatar billede loukas Mester
04. august 2002 - 20:28 #10
OK, jeg kan få den til at lægge data i tabellen 'Kunder' og i tabellen 'Ordrer' :-)
Nu skal Det autogenererede id fra Ordrer' over i 'Ordrelinier'
Jeg har prøvet ved at lave samme "nummer" som fra 'Kunder' til 'Ordrer'

Set RS = Conn.Execute( "SELECT @@IDENTITY" )
idOfNewlyAddedRecords = RS(0)
RS.Close


Set objRS = Server.CreateObject("ADODB.Recordset")
Set objRS.ActiveConnection = objconn
    SQL1 = "INSERT INTO Ordrelinie (Ordrenr)"
    SQL1 = SQL1 & " VALUES ('" & idOfNewlyAddedRecords & "')"
    objRS.Open SQL1



Fejlen jeg får:
Microsoft JET Database Engine error '80004005'

The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship. Change the data in the field or fields that contain duplicate data, remove the index, or redefine the index to permit duplicate entries and try again.

/ny/webshop/confirm1.asp, line 193
Avatar billede eagleeye Praktikant
05. august 2002 - 00:02 #11
Det kan være fordi  Ordrenr  i tabellen Ordrelinie er sat til den ikke må indeholde dubellet.
Avatar billede loukas Mester
05. august 2002 - 19:43 #12
Jo, den er god nok.
Det er derfor.
Jeg har prøvet med en enkelt post og det virker fint.
Men når jeg går ind i '¨design' for 'Ordrelinie' er det så ikke Feltet: Indekseret der skal stå på: |Ja - dubletter tillades|
?????
Der er desuden en nøgle ud for 'Ordrenr.
Avatar billede loukas Mester
05. august 2002 - 20:08 #13
Nu kan jeg godt få det til at virke, ,,..næsten
Den sætter varen ind i ordrelinie som den skal, den gør det bare 20 gange ????

Du får lige noget kode her:

strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & Server.Mappath("db/webshop.mdb") & ";"

Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strConnection

Set objRS = Server.CreateObject("ADODB.Recordset")
Set objRS.ActiveConnection = objconn

strSQL = "INSERT INTO Kunder ( Navn, Efternavn, Adresse, Postnr, City, Email ) "   
strSQL = strSQL & " VALUES('" & strNavn & "','" & strEfternavn & "','" & strAdresse & "','" & strPostnr & "','" & strCity & "','" & strEmail & "')"

objconn.Execute(StrSQL)
'************************************************************************************

'************ INDSÆT ORDRER *********************************************************
Set RS = objConn.Execute( "SELECT @@IDENTITY" )
idOfNewlyAddedRecord = RS(0)
RS.Close

SQL = "INSERT INTO Ordrer (KundeID, Ordredato)"
SQL = SQL & " VALUES (" & idOfNewlyAddedRecord & ", #" & date & "#)"

objconn.Execute(SQL)






Set RS = objConn.Execute( "SELECT @@IDENTITY" )
idOfNewlyAddedRecords = RS(0)
RS.Close

Response.Write idOfNewlyAddedRecords


If IsArray(Session("vare")) = false Then
  Dim vare2(19,4)   
  vare2(1,0) = Request.QueryString("item")  'Vare nr eller anden ID
  vare2(1,1) = Request.Querystring("size")  'Størrelse
  vare2(1,2) = Request.QueryString("color") 'Farven
  vare2(1,3) = Request.QueryString("count") 'Antalet af varen man vil købe
  vare2(1,4) = Request.QueryString("pris")  'Varens pris
  Session("vare") = vare2
else
  vare2=session("vare")
  incart=false
  for i=lbound(vare2) to ubound(vare2)
    if vare2(i,0) = Request.QueryString("item") AND vare2(i,1) = Request.Querystring("size") AND vare2(i,2) = Request.Querystring("color") and not(incart) then
      'Opdater Countet
      vare2(i,3) = vare2(i,3) + CInt(Request.QueryString("count")) 'Antalet af varen man vil købe
      incart=true
    end if
    if vare2(i,0)="" and vare2(i,1)="" and not(incart) then
      'Ligger nu vare i kurven
      vare2(i,0) = Request.QueryString("item")  'Vare nr eller anden ID
      vare2(i,1) = Request.Querystring("size")  'Størrelse
      vare2(i,2) = Request.QueryString("color") 'Farven
      vare2(i,3) = Request.QueryString("count") 'Antalet af varen man vil købe
      vare2(i,4) = Request.QueryString("pris")  'Varens pris
      incart=true
    end if
  next
End if


Session("vare") = vare2



strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & Server.Mappath("db/webshop.mdb") & ";"

Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strConnection


for i=lbound(vare2) to ubound(vare2)

Varenr = vare2(i,0)
Size = vare2(i,1)
color = vare2(i,2)
antal = vare2(i,3)
pris = vare2(i,4)


Set objRS = Server.CreateObject("ADODB.Recordset")
Set objRS.ActiveConnection = objconn
    SQL1 = "INSERT INTO Ordrelinie (Ordrenr)"
    SQL1 = SQL1 & " VALUES ('" & idOfNewlyAddedRecords & "')"
    objRS.Open SQL1





next
Response.write "</table>"


%>
Avatar billede eagleeye Praktikant
05. august 2002 - 23:37 #14
denne del ligger 20 stk vare i databasen..:

for i=lbound(vare2) to ubound(vare2)
  Varenr = vare2(i,0)
  Size = vare2(i,1)
  color = vare2(i,2)
  antal = vare2(i,3)
  pris = vare2(i,4)

  Set objRS = Server.CreateObject("ADODB.Recordset")
  Set objRS.ActiveConnection = objconn
  SQL1 = "INSERT INTO Ordrelinie (Ordrenr)"
  SQL1 = SQL1 & " VALUES ('" & idOfNewlyAddedRecords & "')"
  objRS.Open SQL1
next

Du skal tjekke hver array index om det indeholder en vare. Hvis den ikke indeholder en vare er den sikkert tom eller "" Så for sætnignen skal udvides i stil med:


for i=lbound(vare2) to ubound(vare2)
  Varenr = vare2(i,0)
  Size = vare2(i,1)
  color = vare2(i,2)
  antal = vare2(i,3)
  pris = vare2(i,4)

  if (Varenr <> "") AND (Size <> "") AND (color <> "") AND (antal <> "") AND (pris <> "") then
    Set objRS = Server.CreateObject("ADODB.Recordset")
    Set objRS.ActiveConnection = objconn
    SQL1 = "INSERT INTO Ordrelinie (Ordrenr)"
    SQL1 = SQL1 & " VALUES ('" & idOfNewlyAddedRecords & "')"
    objRS.Open SQL1
  end if
next
Avatar billede loukas Mester
07. august 2002 - 12:58 #15
OK, tusind tak, nu virker det....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester