webForumDet fria alternativet

tbl relationer spökar

8 svar · 271 visningar · startad av plelkes

plelkesMedlem sedan mars 2002823 inlägg
#1

när jag skall lägga till data till databasen

<%
Session.LCID = 1053
Set vatskeb = Server.CreateObject( "Adodb.Connection" )
vatskeb.Provider = "Microsoft.Jet.OLEDB.4.0"
MdbFilePath = Server.MapPath("\vatskebalans\db\vbalans.mdb")
vatskeb.ConnectionString = "Data Source='" & MdbFilePath & "'"
vatskeb.open

pnr= Request.Form("personnr")
d = FormatDateTime(Date, 2)
For each formObj in Request.Form
     If left(formObj,9) = "leggatill" Then
            lngFluidID = Replace(Request.Form(formObj), "leggatill", "")
            strSQL = "INSERT INTO tblVetskebalans(Dag, FluidID, Volym, PatID) VALUES(#" & d & "#," & lngFluidID & "," & Request.Form("volym" & lngFluidID) & ", " & pnr & ")"
 Response.Write strSQL
vatskeb.Execute strSQL, , 128
   
     End if
Next
            
vatskeb.close
Set vatskeb = Nothing

Response.Redirect "lista_databas1.asp"
%>

Får jag följande felutskrift:

INSERT INTO tblVetskebalans(Dag, FluidID, Volym, PatID) VALUES(#2003-11-23#,6,123, 1212121212)
Microsoft JET Database Engine error '80004005'

You cannot add or change a record because a related record is required in table 'tblPersonuppgifter'.

  1. måste jag göra om alla relationer?
  2. Eller räcker det med att ändra i strSQL?
  3. i fallet 2:an - hur då?
@ndersMedlem sedan juni 200032 969 inlägg
#2

Du får se till att det finns en post att relatera till i tblPersonuppgifter innan du gör insert i tblVetskebalans.

  1. Gör INSERT till tblPersonuppgifter.
  2. Hämta ut ID som tillhör den post du precis lade till.
  3. Använd detta ID i din INSERT till tblVetskebalans.

(Jag har för mig att det är räknarvärdet du definierat din relation på.)

Men, vill du inte ha den tvingande relationen så kan du ju alltid ta bort den. ;)

Mvh

plelkesMedlem sedan mars 2002823 inlägg
#3

@nders skrev:

Men, vill du inte ha den tvingande relationen så kan du ju alltid ta bort den.

Vilka för-/nackdelar xkulle medföra om jag tog bort?

Du får se till att det finns en post att relatera till i tblPersonuppgifter innan du gör insert i tblVetskebalans.

  1. Gör INSERT till tblPersonuppgifter.
  2. Hämta ut ID som tillhör den post du precis lade till.
  3. Använd detta ID i din INSERT till tblVetskebalans.
  1. skulle man kunna få ett enkelt exempel på detta?
  2. skall detta förfarande användas alltid när jag har tvingande relationer?

Förestän - är det skillnad mellan relationer och tvingande relationer?

@ndersMedlem sedan juni 200032 969 inlägg
#4

Vilka för-/nackdelar xkulle medföra om jag tog bort?

Inga egentliga fördelar, egentligen, förutom att du skulle slippa att göra insert i tblPersonuppgifter om du nu skulle vilja det.

skulle man kunna få ett enkelt exempel på detta?

Snabbt exempel:

strSQL = "INSERT INTO tblPersonuppgifter ....."
dittConnectionObjekt.Execute strSQL, , 128
strSQL = "SELECT @@IDENTITY" ' hämtar räknarvärdet som ovanstående INSERT genererade
set objRS = dittConnectionObjekt.Execute(strSQL)
lngPersonID = objRS(0)

Ovanstående kodstycke kör du en gång, dvs ovanför for each-loopen i din kod. Sedan använder du lngPersonID i SQL-frågorna när du gör INSERT till tblVetskebalans.

skall detta förfarande användas alltid när jag har tvingande relationer?

Ja, om det inte redan finns en post i den relaterade tabellen, som du kan knyta till.

Förestän - är det skillnad mellan relationer och tvingande relationer?

Relationer i sig behöver inte finnas definierade i databasen på något sätt, utan kan ju styras med dina SQL-frågor. Vill du relatera tabeller till varandra, då hämtar du ut data från de tabeller du tycker hänger ihop. När du definierar relationerna i databasen kommer du att bli tvingad att för varje post i den ena tabellen, måste du se till att det finns en post att relatera till i den andra tabellen. Det är alltså ett sätt att kontrollera integriteten i den data du lagrar i dina tabeller. Sök gärna på referential integrity på Google för mer information om detta. (Jag hittade ganska mycket skoj när jag googlade på +"referential integrity" +"microsoft access").

Kom nu bara ihåg att jag inte har någon som helst utbildning i sånt här, utan allt är bara självuppfångade uppfattningar. Kan alltså vara hur fel som helst. ;)

Mvh

plelkesMedlem sedan mars 2002823 inlägg
#5

@nders skrev:

Relationer i sig behöver inte finnas definierade i databasen på något sätt, utan kan ju styras med dina SQL-frågor

så du menar att jag hellt kan strunta i relationer?
Coolt :h Kanske enklare och mera lätt jobbat?
Kanske ett litet exempel?

Kan du förklara lite mera

strSQL = "SELECT @@IDENTITY" ' hämtar räknarvärdet som ovanstående INSERT genererade

och

lngPersonID = objRS(0)

@ndersMedlem sedan juni 200032 969 inlägg
#6

plelkes skrev:

så du menar att jag hellt kan strunta i relationer?
Coolt :h Kanske enklare och mera lätt jobbat?

Du kan strunta i relationer om du vill. Ja, det blir nog enklare och mer lättjobbat.

Kanske ett litet exempel?

Om du droppar relationerna mellan tblPersonuppgifter och tblVetskebalans kommer den kod du postade i huvudinlägget att fungera fint. Jag vet inte riktigt vad det är för exempel du är ute efter?

Kan du förklara lite mera

@@IDENTITY är en variabel som innehåller räknarvärdet (ID:t alltså) till den post du senast lade till i en tabell (vilken som helst) med samma connection som denna fråga ställs. Även om flera nya poster hunnit läggas in i tabellen efter det att du gjorde insert, innehåller variabeln ändå det räknarvärde som tillhör den posten du precis lade in. Det är alltså inte samma sak som det högsta räknarvärdet.

lngPersonID = objRS(0)

Eftersom jag inte har något namn på @@IDENTITY i min SQL-fråga, kan jag inte referera till objRS("någonting"), utan måste ange fältets index. 0 alltså, eftersom det är det första (och enda) fältet. Man kan dock istället göra på detta sätt om man vill det:

strSQL = "SELECT @@IDENTITY [b]AS LastID[/b]" ' hämtar räknarvärdet som ovanstående INSERT genererade
set objRS = dittConnectionObjekt.Execute(strSQL)
lngPersonID = objRS([b]"LastID"[/b])

Mvh

plelkesMedlem sedan mars 2002823 inlägg
#7

@nders skrev:

Om du droppar relationerna mellan tblPersonuppgifter och tblVetskebalans kommer den kod du postade i huvudinlägget att fungera fint. Jag vet inte riktigt vad det är för exempel du är ute efter?

Om jag tar bort relationer helt, blir det då strul när jag ur databasen ta fram en patients namn, efternamn mha av patID i tblVetskebalans och tblPersonuppgifter?
Eller om jag vill hämta från tblFluids namnet på FluiID =22 i tblVetskebalans? Kanske ett litet ex §e

Även om flera nya poster hunnit läggas in i tabellen efter det att du gjorde insert, innehåller variabeln ändå det räknarvärde som tillhör den posten du precis lade in.

Då är alltso objRS(1) den näst sista posten jag lade in?

Men skippar jag relationerna idatabasen så behöver jag inte anv mig av dessa genvägar( @@IDENTITY och lngPersonID = objRS(0))

@ndersMedlem sedan juni 200032 969 inlägg
#8

Om jag tar bort relationer helt, blir det då strul när jag ur databasen ta fram en patients namn, efternamn mha av patID i tblVetskebalans och tblPersonuppgifter?

Så länge du ser till att ha rätt data i tabellerna ser jag inte vad det skulle bli för strul?

Eller om jag vill hämta från tblFluids namnet på FluiID =22 i tblVetskebalans?

Snabbt exempel som jag inte vet om det fungerar tankemässigt:

SELECT FluidName FROM tblFluids, tblVetskebalans WHERE tblFluids.FluidID = tblVetskebalans.FluidIDEllerVilketFältDetNuÄr AND tblVetskebalans.ID=22

Då är alltso objRS(1) den näst sista posten jag lade in?

Nej. När du kör frågan SELECT @@IDENTITY så returneras ett recordset med en post med ett enda fält. Detta fält innehåller räknarvärdet på den post du senast gjorde insert på.

Men skippar jag relationerna idatabasen så behöver jag inte anv mig av dessa genvägar( @@IDENTITY och lngPersonID = objRS(0))

Relationerna du har satt upp i databasen har ingenting att göra med hur du lagrar data, utan ser endast till att tvinga dig att se till att en post i en tabell har något att relatera till i det andra. Relationerna hjälper dig inte att lagra data, utan du måste ändå göra det själv. Så: skippar du relationerna så visst, då kan du skippa att skapa relaterade poster, men då saknar du ju ändå datat. Vill du inte lagra något i tblPersonuppgifter när du ska lagra i tblVetskebalans, då slipper du det, men å andra sidan så har du ju heller inte någon information i tblPersonuppgifter heller.

Så: oberoende av om du satt upp relationer eller inte i databasen så är det du, mha dina SQL-frågor, som bestämmer vilken data som skall läggas in, uppdateras eller hämtas ut.

Mvh

plelkesMedlem sedan mars 2002823 inlägg
#9

@nders skrev:

Så: skippar du relationerna så visst, då kan du skippa att skapa relaterade poster, men då saknar du ju ändå datat. Vill du inte lagra något i tblPersonuppgifter när du ska lagra i tblVetskebalans, då slipper du det, men å andra sidan så har du ju heller inte någon information i tblPersonuppgifter heller.

Då bestämmer jag mig för att ta bort alla relationer.
info i tblPersonuppgifter tänker jag ändå lägga in via en separat formulär

Dessutom insr jag att jag måste jobba hårdare på SQL-satserna

271 ms totalt · 3 externa anrop · v20260731065814-full.30151723
126 ms — hämta forumlista (db)
132 ms — hämta statistik (db)
138 ms — hämta tråd, inlägg och bilagor (db)