30. oktober 2002 - 22:19Der er
19 kommentarer og 1 løsning
Kunsten at oprette et korrekt id i db
Jeg har en database(access) med 2 tabeller maerke og model.
Dertil har jeg et script der gør at jeg kan vise mærkerne og modellerne dynamisk i 2 dropdownboxe.
Så vidt, så godt. Men, er id'erne i maerke tabellen ikke fortløbende, virker skidtet ikke. :(
Da systemet er afleveret, synes jeg det ville være hurtigst at lave en lille funktion, der sikre at numrene er fortløbende. Jeg tænkte på om der var nogen her der ville være villige til at hjælpe mig med at lave den funktion.
Problemet er bare at jeg er ikke SÅ stærk i ASP, så jeg uden videre kan lave det selv.
Jeg havde forstillet mig at noget ala:
Tæl id'erne i maerke tabellen, hvis der er i hul i rækken af tal(f.eks. 1,2,4) ryk id'erne op så hullet lukkes(f.eks. 1,2,3). søg for at maerke id'et i model tabellen bliver opdateret med det/de nye id'er.
istedet for at skrive IDét ud kunne du i løkken inkludere en tæller der tællede automatisk op.. så fik du dine tal forløbende..
Databasen gør nemlig det (hvis id er primær) at den tilegner ID den først ledige værdi... Hvis du har haft en record med ID 5 engang, men slettet det igen, er det næste id altså 6 og ikke 5..
"istedet for at skrive IDét ud kunne du i løkken inkludere en tæller der tællede automatisk op.. så fik du dine tal forløbende.."
øhh, jeg kan ikke lige gennemskue det. Kan du lave et simpelt eksempel?
"Databasen gør nemlig det (hvis id er primær) at den tilegner ID den først ledige værdi... Hvis du har haft en record med ID 5 engang, men slettet det igen, er det næste id altså 6 og ikke 5.."
...hvilket netop er mit problem. Scriptet kan ikke finde ud af det, hvis ikke id er fortløbende.
<script> <% sqltest = "select count(maerkeid) as antal from maerke" Set rstest = Conne.Execute(SQLtest) antallet = rstest("antal") + 1 response.write "afdelinger = new Array(" & antallet & ");" %> //Antallet af afdelinger + 1 for (i = 0; i < afdelinger.length; i++) afdelinger[i] = new Array(); afdelinger[0][0] = "Vælg Modeller"; <% sqltal1 = "select count(maerkeid) as antal from maerke" Set rstal = Conne.Execute(SQLtal1) antal = rstal("antal") for i=1 to antal
sqltal2 = "select count(modelid) as antal2 from model where maerkeid=" & i Set rstal2 = Conne.Execute(SQLtal2) antal2 = rstal2("antal2")
sql = "select model,modelid from model where maerkeid=" & i Set rs = Conne.Execute(SQL)
for t=0 to antal2 if not rs.eof then response.write "afdelinger["& i &"]["& t &"] = '" & rs("model") &"';" & vbCrLf rs.movenext end if 'rs.movefirst next rs.close 't = 0 next %>
function skift(frm) { ind = frm.maerke.selectedIndex; frm.model.length = afdelinger[ind].length; for (n = 0; n < afdelinger[ind].length; n++) { frm.model.options[n].text = afdelinger[ind][n]; frm.model.options[n].value = afdelinger[ind][n]; } } </script>
Hmmm på mange områder bedre ikraft af at den kører med reallokerende nøgleid, dog kan den være lidt tricky at arbejde med miljøer hvor den skal tilgåes fra flere forskellige applicationer (via BDE). Men hvis den blov skal bruges som en simpelt webdatabase....og du gerne vil have det til at køre som du beskriver lyder det som en fin løsning.
sqltest = "select * from maerke" Set rs = Conne.Execute(SQLtest) %>
<form action="denneside" method ="post"> <select name="bil" onchange="this.submit()"> <% DO UNTIL RS.EOF response.write "<option value="&rs("maerkeid")&">"&RS("maerke")&"</option>" RS.MOVENEXT LOOP %> </select>
<select> <%
ID = Request.form("bil")
SQL = "SELECT * FROM model WHERE maerkeid ="&ID&"" Set rsSUB = Conne.Execute(SQL)
DO UNTIL RSSUB.EOF response.write "<option value="&RSSUB("modelid")&">"&RSSUB("model")&"</option>" RSSUB.MOVENEXT LOOP %> </select> Men der kommer bare en fejl når jeg kører din kode:
Et objekt er obligatorisk: '' /bilside/www/boxtest.asp, line 35
linie 35: DO UNTIL RSSUB.EOF
Sætter jeg denne linie ind: Set rsSUB = Conne.Execute(SQL)
kommer denne fejl: Der er en syntaksfejl, fordi der mangler en operator. i forespørgselsudtrykket "maerkeid =". /bilside/www/boxtest.asp, line 33
linie 33: Set rsSUB = Conne.Execute(SQL)
Og jeg kan ærligtalt ikke se hvordan det skulle kunne virke. Så vidt jeg ved, kan man kun hente noget fra en form EFTER brugeren har trykket på submit knappen. Men det er måske ikke tilfældet?
Ja det kan du osse.. men du kan godt gøre sådan at du har 2 forskellige actions på din form...
select sætningen ved den anden selecet box vil ikke virke først da der jo ingen id er før der er valgt noget i den første select box.. Så sæt en if then ind.. omkring udtrækket
IF NOR RSSUB.EOF THEN DO UNTIL RSSUB.EOF response.write "<option value="&RSSUB("modelid")&">"&RSSUB("model")&"</option>" RSSUB.MOVENEXT LOOP END IF %>
Man kan selvfølgelig kun hente fra en form, ved submit.... Men du kan vel sagtens have begge select boxse i samme form.. skulle ikke være et problem. Man kan nemlig bare lave en submit knap som følg.
<script language="javascript"> function setAction() { document.navnetpådinform.action = 'Denside du ønsker at poste til'; document.navnetpådinform.submit(); } </script>
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.