/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Asp til database problem
Fra : Ragnarok1978


Dato : 08-10-02 09:17

Davs,

Jeg sidder for tiden og roder med en database til noget
personalekøb på arbejdet. Hver gang der oprettes et nyt
personalekøb, oprettes et individuelt rekvisitionsnummer, i det
øjeblik købet oprettes i databasen.

Intil forleden har det fungeret fint, men nu er det begyndt at
lave følgende fejl:

"Microsoft OLE DB Provider for ODBC Drivers error '80040e2f'

[Microsoft][ODBC Microsoft Access 97 Driver] 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.

indsat1.asp, line 50"

Koden ser således ud:

<%

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" &
server.MapPath("personalekob.mdb")

SQLstmt = "SELECT * From Personalekob"
'response.write SQLstmt
Conn.Execute (SQLstmt)

Set rs = Conn.Execute(SQLstmt)
DO WHILE NOT rs.EOF
Reknr = rs("Reknr")
rs.MoveNext
LOOP
%>

<%

Opretdato=Trim(request.querystring("Opretdato"))
Virksomhed=Trim(request.querystring("Virksomhed"))
Personalenr=Trim(request.querystring("Personalenr"))

Dim DataConn
Dim CmdAddRecord
Dim MYSQL
Dim Dato
Dato = "12-12-12"

Set DataConn = Server.CreateObject("ADODB.Connection")
Set CmdAddRecord = Server.CreateObject("ADODB.Recordset")
DataConn.Open "DBQ=" & Server.Mappath("personalekob.mdb") &
";Driver={Microsoft Access Driver (*.mdb)};"
MYSQL = "SELECT * FROM Personalekob"
CmdAddRecord.Open MYSQL, DataConn, 1, 3
CmdAddRecord.AddNew

CmdAddRecord.Fields("Opretdato") = Opretdato

CmdAddRecord.Fields("Reknr") = Reknr+1

CmdAddRecord.Fields("Virksomhed") = Virksomhed

CmdAddRecord.Fields("Personalenr") = Personalenr

CmdAddRecord.Fields("Ordredato") = Dato
CmdAddRecord.Fields("Folgedato") = Dato
CmdAddRecord.Fields("Fakturadato") = Dato

CmdAddRecord.Update

CmdAddRecord.Close

Set CmdAddRecord = Nothing
DataConn.Close
Set DataConn = Nothing
%>

<%
rs.Close
Conn.Close

Set Conn = nothing
%>
<%
Response.redirect ("indsat2.asp")
%>


Som I kan se burde den gå til den sidste intastede række, tage
rekvisitionsnummeret. Derefter laver den en ny række hvor de nye
data sættes ind, og derefter tager den den forrige rækkes rekv.
nr og lægger 1 til.

Umiddelbart vil jeg tro fejlen har at gøre med at den ikke tæller
rækkerne ordentligt op, eller at måden jeg forøger
rekvisitionsnummeret på ikke er god nok.

Nogle ideer?

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP ???
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Jens Gyldenkærne Cla~ (08-10-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 08-10-02 10:11

Ragnarok1978 skrev:

> Jeg sidder for tiden og roder med en database til noget
> personalekøb på arbejdet. Hver gang der oprettes et nyt
> personalekøb, oprettes et individuelt rekvisitionsnummer, i det
> øjeblik købet oprettes i databasen.

Hvis du kan leve med "huller" i din rekvisitionsnummerrække kan du
klare problemet nemt ved at definere rekvisitionsnummerfeltet som
autonummer. Så sørger Access selv for at det bliver unikt.
Almindeligvis sker det ved at vælge nummeret én over det sidst
indtastede, men hvis en indsættelse fx fejler kan du komme ud for
at et nummer bliver "sprunget over" når den næste post sættes ind.

Det er absolut den letteste måde at have unikke talværdier i et
felt.

Du får lige en kommenteret forklaring på hvorfor det går galt med
din nuværende kode:

> SQLstmt = "SELECT * From Personalekob"

Her mangler en sortering af postsættet (se mere nedenfor).
Derudover vil det både være pænere (lettere at afkode) og bedre
(hurtigere at udføre) hvis du kun havde feltet reknr med i SELECT-
sætningen (SELECT Reknr FROM Personalekob ORDER BY Reknr).

> 'response.write SQLstmt
> Conn.Execute (SQLstmt)

Hov - der er ingen grund til at køre SQLstmt to gange. Du kan nøjes
med nedenstående:

>
> Set rs = Conn.Execute(SQLstmt)
> DO WHILE NOT rs.EOF
> Reknr = rs("Reknr")
> rs.MoveNext
> LOOP
> %>

I dit nuværende system bruger du nogle forkerte forudsætninger.
Ovenstående kode løber alle poster igennem og sætter hver gang [1]
værdien af Reknr lig rs("reknr"). Når løkken er gennemløbet har du
således den sidste værdi af rs("reknr") placeret i reknr. Men... du
kan ikke være sikker på at den sidste værdi også er den højeste når
dit postsæt ikke er sorteret. Du kunne ændre din SQLstmt til "SELECT *
FROM Personalekob ORDER BY reknr" - så ville forudsætningen holde. Men
du kan klare det meget lettere:

"SELECT max(reknr) + 1 AS nytRekNr FROM Personalekob" - denne
sætning giver dig dit nye nummer i et hug (
   Set rs = Conn.execute(SQLstmt)
   If not rs.EOF Then
       Reknr = rs("nytRekNr")
   ELse
       Reknr = 1
   End if

)


> CmdAddRecord.Open MYSQL, DataConn, 1, 3
> CmdAddRecord.AddNew

Her kunne du lige så godt (bedre) anvende en INSERT-sætning.

SQLInsert = "INSERT INTO personaleKob (Opretdato, Reknr,
Virksomhed, Personalenr,....) VALUES (" & <værdiliste fra
variable>)

> CmdAddRecord.Fields("Opretdato") = Opretdato

Kan også skrives CmdAddRecord("Opretdato")

Noter:
======
[1] Det er lidt spild af energi når du sætter værdien af Reknr hver gang
du gennemløber løkken. Du kan nøjes med at sætte den når du er
nået til EOF. Du kan formentlig også gå til EOF med det samme med
rs.MoveLast - men ingen af disse metoder kan betale sig, som jeg
forklarer oppe i teksten
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Ragnarok1978 (08-10-2002)
Kommentar
Fra : Ragnarok1978


Dato : 08-10-02 12:24

Jeg siger tak for hjælpen Jens :)

Det hele er nu fikset og virker perfekt, takket være din hjælp.

Mit kendskab til asp er meget minimalt og alt er for det meste selvlært
ved at kigge på andre folks kode på vores webserver, ergo er det nok en
smule "gammeldags". F.eks. vil asp'en kun lege med office97 databaser og
ikke office2000 udgaver, go figure, hehe.

Anyways jeg takker for dine tips og rettelser og vil holde dem for øje
når jeg igen skal til at lege med nogle databaser.

Venlig Hilsen,
Søren Christensen

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP ???
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Peter Lykkegaard (08-10-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 08-10-02 13:05

Som svar på skriblerier nedfældet af Ragnarok1978 :

> ...F.eks. vil asp'en kun lege med
> office97 databaser og ikke office2000 udgaver, go figure, hehe.
>
Du skal have den seneste MDAC (Microsoft Access Data Components)
Hvis du bruger DSNLess så skal du bruge "Jet 4.0" og ikke "Jet 3.5"

Er du tvivl eller har spørgsmål til ovenstående så dunker du mig bare oven i
hovedet

mvh/Peter Lykkegaard



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste