Avatar billede frida Nybegynder
23. maj 2001 - 18:08 Der er 23 kommentarer og
1 løsning

PRIMÆRNØGLE VÆRDI TIL FREMMEDNØGLE

Mit problem er: jeg har en Landtabel med en primærnøgle landenr som er en autonummerering.
Landenr er fremmednøgle i tabellen Gruppe. Meget simpelt og enkelt! Hvorfor er det så, at
landenr fra Landtabel ikke lægger sig over i Gruppetabel? Hvad er det jeg skal gøre?
Avatar billede peter_m Nybegynder
23. maj 2001 - 18:35 #1
Jeg tror du skal oprettet et numerisk(ikke auto) felt du kan kalde landnr som refere til landenr i land table, det burde virke.
Avatar billede frida Nybegynder
23. maj 2001 - 20:01 #2
Jamen så vil jeg bare gerne vide: Hvordan foregår det at primærnøgles værdi \"smutter\" over i den tagel, som har fremmednøglen - og vi taler stadig autonummerering. Jeg har nemlig tabeller med cprnr - primær/fremmednøgle, som virker perfekt. Så igen - hvordan får jeg værdien sat ind i den tabel der har fremmednøglen, når vi taler om autonummering??
Avatar billede terry Ekspert
23. maj 2001 - 20:41 #3
Not sure that I understand you 100 % frida, but I would take a look at the \"fremmennøgle\" in the Gruppe tabel and make sure that it has a lookup into the \"Landtabel\". Use the lookup wizard for this.
Avatar billede terry Ekspert
23. maj 2001 - 20:43 #4
In design mode select the landenr field in the Gruppe tabel, and then choose lookup wizard as the data type. Then follow the instructions.
Avatar billede frida Nybegynder
23. maj 2001 - 20:57 #5
Ok det kan godt være at jeg er dum!! Men så er jeg så det! Jeg har en Ejertabel, hvor primærnøglen er cprnr. Jeg har en Pladetabel, hvor fremmednøglen er cprnr. Når jeg indtaster i textfeltet lægger cprnr. sig i begge tabeller - hvilket de jo skal.
Så har jeg altså de hersens to tabeller, Land og Gruppe, som hænger sammen med autonummerering.
Jeg vedlægger kode - det er måske nemmere:

\'-----------------------------------Registrer gruppe------------------





function indsaetLand()

    set Command = server.CreateObject(\"ADODB.Command\")
    Command.ActiveConnection = ConnectionString
    Command.CommandText =\"Land\"
    Command.CommandType = adCmdTable

    set recordSet = Command.Execute

response.write(\"før indsæt i Land<br>\")

    Command.CommandText = \"insert into Land(landenavn) values (\'\"& Request.Form(\"land\") &\"\')\"
    Command.CommandType = adCmdText
    Command.Execute



response.write(\"efter indsæt i land<br>\")
end function

\'-----------------------------------indsaet i gruppeSolist----------------



function indsaetGruppe()


    \'SQL = \"SELECT [Land].[landenr], [GruppeSolist].[landenr] FROM Land INNER JOIN GruppeSolist ON [Land].[landenr]=[GruppeSolist].[landenr];\"


    set Command = server.CreateObject(\"ADODB.Command\")
        Command.ActiveConnection = ConnectionString
        Command.CommandText =\"GruppeSolist\"
        Command.CommandType = adCmdTable

        set recordSet = Command.Execute

response.write(\"før indsæt i GruppeSolist<br>\")

        Command.CommandText = \"insert into GruppeSolist(gruppenavn) values (\'\"& Request.Form(\"gruppenavn\") &\"\' )\"
        Command.CommandType = adCmdText
        Command.Execute

response.write(\"Efter indsæt i GruppeSolist <br>\")

    end function




function registrerGruppe()
    y = 0
    if not (request(\"land\") = \"\") then
      SQL = \"select landenavn from Land l where l.landenavn LIKE \'%\"&request(\"land\")&\"%\'\"
      Set GRUPPE = forbindelse.Execute(SQL)    \'\' rekordset
        Do While Not GRUPPE.EOF
        y = y+1
        GRUPPE.MoveNext
      loop
      if Not (y = 0) then

        indsaetGruppe()
          else
          indsaetLand()
            indsaetGruppe()
      end if
    end if
end function




Og mine små sætninger ind imellem er selvfølgelig bare tjek!!

land/gruppe er en en til mange relation og
spørgsmålet er igen igen - hvad er det jeg skal gøre for at værdien på landenr i Land(primærnøgle)
skrives i landenr i Gruppe (fremmednøgle)
HJÆLP!!
frida
Avatar billede terry Ekspert
23. maj 2001 - 22:20 #6
Frida
Der er ingen der siger at du er dum!

Kan du ikke send mig din database, så vil jeg meget gerne kikke på det?

tbs@io.dk
Avatar billede frida Nybegynder
23. maj 2001 - 23:43 #7
Terry
- Det er hermed gjort !
Avatar billede frida Nybegynder
24. maj 2001 - 20:29 #8
Nu har jeg prøvet forskelligt. Jeg indsætter via ASP fra mine tekstfelter
på html-siden fx. navn, cprnr, osv osv. Og det ryger ned i ALLE de tabeller det skal-
undtagen de tabeller der er oprettet imellem en m-m relation. Jeg har en
primærnøgle (autonumm.) - og denne værdi skal ned i en
tabel, hvor dens fremmednøgle er. Jeg har ens datatyper (langt heltal). Hvad mere kan
man ønske sig? Jeg vil gerne vide om jeg skal gøre noget særligt for at få værdien fra primærnøglen
ind i fremmednøgleværdien  - eller om drillenissen er sluppet løs. Jeg har en anden tabel, hvor alt
virker som det skal, men der indtaster jeg direkte i tabellen. MEN det skulle jo ikke gøre nogen forskel
- altså om det kommer fra en html-side eller om det indtastes direkte. Før dette problem er løst, kan
jeg ikke komme videre, da jeg jo ikke kan lave forespørgsler, hvor jeg sammenligner et nummer i den
ene tabel med et nummer i den anden - da tabellerne jo er tomme. Hvad f..... er der galt???
frida
Avatar billede ianm Nybegynder
25. maj 2001 - 05:38 #9
Frida har du kikket på hvordan du har sat dine tabeler sammen, en til mange, eller mange til mange, det jeg mener er relasionen mellen tabelerne, det er nok det du skal kikke på.
Avatar billede peter_m Nybegynder
25. maj 2001 - 08:36 #10
Lige janm ord. Du skal have nogle (constraints) som skal være tilstede..ellers skal du holde styr på din base i applikationen det er ik\' så smart.
Avatar billede terry Ekspert
25. maj 2001 - 12:45 #11
Hej Frida

I have looked at your database and the code lines above, and have sent you a mail with a couple of comments, hope they help!

terry
Avatar billede terry Ekspert
31. maj 2001 - 11:31 #12
Hi Frida

How\'s it going with your problem?
Avatar billede ianm Nybegynder
31. maj 2001 - 17:36 #13
prøv at lave en mange til mange relation, og kryds af med fluebenet i tvungen relationer.
Avatar billede frida Nybegynder
03. juni 2001 - 14:56 #14
Hej Terry og også i andre!
Først Tak til dig Terry, fordi du gad og kigge på min database. Jeg har haft vældig
travlt - men har dog indimellem foretaget mig lidt med mit \"problembarn\".
Jeg har altså et \'en til mange\' forhold mellem to tabeller: Gruppe og Land.
Et land kan indeholde flere grupper og en gruppe kan komme fra et land.
Når man normaliserer gælder følgende regel for et til mange forhold: Primærnøgle
fra Land bliver fremmednøgle i Gruppe. Hvad angår constraints så skal der ikke
slettes eller opdateres kaskadevis. Hvis jeg sletter fx. Beatles, må England jo ikke ryge med og
omvendt, jeg må selvfølgelig ikke slette England og gøre Beatles hjemløse.
Alt er altså i skønnest orden - sådan set. Når jeg opretter Beatles - skrives i Gruppetabellen
Beatles og i LandeTabellen England. Når jeg opretter Stones skrives i Gruppetabellen Stones - og
i Landtabellen står England jo allerede - og har et landenr 1. Dette landenr skal så lægge sig over
i Gruppetabellen således at Beatles og Stones begge hører til landenr. 1. Og det er det der er
problemet - det gør det nemlig ikke. Du Terry er inde på, at jeg skal fortælle i en insertsætning,
at landennr. skal sættes ind. Men fidusen er, at når jeg trækker nøgler og opretter en til mange forhold
så burde tabellen selv finde ud af at opfange fremmednøglen. I Interbase skrives man, i hvilke tabeller
man vil have primær- og fremmednøgle når man creater en tabel - og i Access er det lettere
fordi man her kan trække relationerne mellem tabellerne og på den måde få skabt sammenhæng. Når
jeg læser i min Accessbog, gøres tingene på samme måde - men
jeg har hørt lidt om, at der kan være problemer med Access og relationer. Jeg kan bare ikke
forstå, hvorfor det ikke virker! Du janm foreslår at jeg laver et mange til mange forhold.
Men en Gruppe tilhører ikke mange lande - og desuden, når man normaliserer mange til mange
forhold, opretter man en tabel imellem dvs at mellem \'Land\' og \'Gruppe\' ville komme en tabel
\'Tilhørsforhold\' og så ville jeg igen have et et til mange forhold mellem Land og Tilhørsforhold og
et et til mangeforhold mellem Gruppe og Tilhørsforhold - hvilket ville give lige præcis det
problem jeg har!
Så - hvad gør en klog??
frida
Avatar billede terry Ekspert
04. juni 2001 - 09:38 #15
Frida I understand all that about normalizing and yours looks fine, but as I mentioned in my mail, how does a group say Aqua know it comes from Denmark? Your one to many relationship only means that there can be many groups to on land but its doesnt say which land, which there can also be many of! So forget all your relationships you have in Access and do it in your code. Thats the only way as far as I know.
Avatar billede ianm Nybegynder
05. juni 2001 - 02:04 #16
hej frida det jeg foreslår er at du genemtvinger dine relationer med flugebenet nederst til venster i dialoboksen, således at de bliver nød til at arbejed sammen.
Avatar billede terry Ekspert
05. juni 2001 - 10:29 #17
ianm
Frida is trying to create a group from a WEB application. No matter how your relationships are, how do you know which land (foreign key) the group comes? In access you would probably have a combo box with all lands which would be bound to the foreign key field of the group. But if you didnt select a land then it wouldnt just choose any old land, it would inform you have the fact that the field must NOT contain a NULL value!!!!
So what I am saying still goes, if frida want to add a group then some way or other she had to say which land the group comes from. Or she too will get ann error, even in her web app.

terry



Avatar billede frida Nybegynder
07. juni 2001 - 07:20 #18
Hej Terry
Som jeg forstår dig, siger du at jeg skal indsætte
fremmednøgleværdien med kode - altså insert into
Gruppe(landenr) værdien fra Land(landenr). Er det
det du siger?? Det har jeg nemlig forsøgt på 1000
forskellige måder, men får syntaksfejl - og hvis ikke - indsættes der alligevel ikke noget.
Jeg har - for at forstå hvorfor pokker osv osv...- lavet Land og Gruppetabellerne i en lille ny database - og derefter lavet formular til med et felt til at indtaste land og et felt til at indtaste gruppenavn. Og der går det jo fint med at Land(landenr)-primær- lægger sig over i Gruppe(landenr)-fremmed. Og der har jeg lavet præcis de samme relationer, som i min \"problemdatabase\". Jeg kan jo stadig ikke forstå, hvorfor det skal gøre en forskel om jeg indtaster data via webside eller via en formular.
Øv -
frida
Avatar billede terry Ekspert
07. juni 2001 - 08:15 #19
Hej frida
You say that in your new database that you have a form with a field to enter land and gruppenavn. Do you use SQL for inserting the record or are the fields bound to the forms recordset? There is obviously a difference. In your webside can you not write the SQL statement to the screen so that you can verify that it is EXACTLY the same as you expect.
Avatar billede terry Ekspert
07. juni 2001 - 08:20 #20
You also say that you have tried 1000 ways. Do I understand you to say that you can create a new groupnavn with the foreign key being empty? I assume that the land already exists before you attemt to add a groupnavn from that land!
Avatar billede frida Nybegynder
07. juni 2001 - 20:48 #21
Hej Terry

Det er sådan at ALT indskrives i min database - bortset fra de fremmednøgler,
som hænger sammen med en primærnøgle med autonummerering.
Hvis Land ikke eksisterer indskrives det først - og derefter Gruppen. Hvis Land findes indskrives Gruppen.
Hvis Gruppen ikke eksisterer indskrives den før Medvirkende indskrives. Findes Gruppen indskrives de Medvirkende.
Hvis Medvirkende ikke eksisterer indskrives de før diverse numre, der findes på lp/cd. Findes de Medvirkende derimod indskrives diverse numre.
Og sådan fremdeles. Alt fungerer perfekt - bortset fra de fremmednøgler, der er afhængige af primærnøglens autonummerering.
Her er en stump kode - og det virker altså!!
Jeg starter med at kalde function registrerGruppe(), når jeg har indskrevet Ejer og Plade.

\'-----------------------------------Registrer gruppe------------------





function indsaetLand()

    set Command = server.CreateObject(\"ADODB.Command\")
    Command.ActiveConnection = ConnectionString
    Command.CommandText =\"Land\"
    Command.CommandType = adCmdTable

    set recordSet = Command.Execute

response.write(\"før indsæt i Land<br>\")

    Command.CommandText = \"insert into Land(landenavn) values (\'\"& Request.Form(\"land\") &\"\')\"
    Command.CommandType = adCmdText
    Command.Execute



response.write(\"efter indsæt i land<br>\")

   
end function

\'-----------------------------------indsaet i gruppeSolist----------------



function indsaetGruppe()


        set Command = server.CreateObject(\"ADODB.Command\")
        Command.ActiveConnection = ConnectionString
        Command.CommandText =\"GruppeSolist\"
        Command.CommandType = adCmdTable

        set recordSet = Command.Execute

        response.write(\"før indsæt i GruppeSolist<br>\")

        Command.CommandText = \"insert into GruppeSolist(gruppenavn) values (\'\"& Request.Form(\"gruppenavn\") &\"\' )\"
        Command.CommandType = adCmdText
        Command.Execute


response.write(\"Efter indsæt i GruppeSolist <br>\")

   

    end function



    function indsaetGruppeSolist()  //tjekker om gruppen eksisterer i databasen. Hvis den gør kaldes registrerMedvirkende() ellers indskrives gruppen og derefter kaldes registrerMedvirkende()


        k= 0
            if not (request(\"gruppenavn\") = \"\") then
              SQL = \"select gruppenavn from GruppeSolist g where g.gruppenavn LIKE \'%\"&request(\"gruppenavn\")&\"%\'\"
              Set GRUPPESOLIST = forbindelse.Execute(SQL)    \'\' rekordset
                Do While Not GRUPPESOLIST.EOF
              k= k+1
                GRUPPESOLIST.MoveNext
              loop
              if Not (k = 0) then

                registrerMedvirkende()
                  else

                      indsaetGruppe()
                    registrerMedvirkende()
              end if
            end if
        end function








function registrerGruppe() //tjekker om Landet eksisterer. Hvis det gør kaldes indsaetGruppeSolist() Hvis landet ikke er i databasen indskrives Land og derefter kaldes indsaetGruppeSolist()
    y = 0
    if not (request(\"land\") = \"\") then
      SQL = \"select landenavn from Land l where l.landenavn LIKE \'%\"&request(\"land\")&\"%\'\"
      Set LAND = forbindelse.Execute(SQL)    \'\' rekordset
        Do While Not LAND.EOF
        y = y+1
        LAND.MoveNext
      loop
      if Not (y = 0) then

        indsaetGruppeSolist()
          else
          indsaetLand()
          indsaetGruppeSolist()

      end if
    end if
end function


Så - jeg forstår stadig ikke, hvorfor fremmednøglekolonnen ikke får dens værdi -
Og - det er jeg ganske træt af!! :-)
frida

Avatar billede terry Ekspert
08. juni 2001 - 08:35 #22
Hi frida
Are you saying that you can insert a GruppeSolist WITHOUT having to give a value to the foreign key, IE you can insert a record and value of the foreign key after the INSERT is NULL?

Now I cant rememember the names of the fields but try thes two lines in Access, you may need to alter the field names. I havent tried this on your database!

The first is without the LandID (foreign key) which fails because it requires a value in the foreign key field. The second doesnt fail!

DoCmd.RunSQL \"INSERT INTO GruppeSolist(GruppeNavn) VALUES (\'Test2\')\"
DoCmd.RunSQL \"INSERT INTO GruppeSolist(GruppeNavn, LandID) VALUES (\'Test2\', 1)\"

In the function indsaetGruppe I say that you MUST insert the land ID.
Frida, and I would like you to answer this question, how does the INSERT know which landID to use if you dont tell it? Just because you have found a land in function registrerGruppe doesnt mean that its taht land it uses, thats just code!
Avatar billede terry Ekspert
08. juni 2001 - 09:31 #23
I am also assuming that a land with ID = 1 already exists.
Avatar billede frida Nybegynder
13. juni 2001 - 16:40 #24
Hej Terry
Jeg har nu tjekket hele databasen igennem. Sørget for at alle fremmednøglerne er obligatoriske - er indexerede og ikke har en defaultværdi. Og det virker altsammen logisk og korrekt nu. Så må jeg se om jeg kan få syntaksen til min insertsætning korrekt. Tak for hjælpen - håber du bliver tilfreds med de 150. Også tak til I andre for forslag.
Mvh Frida
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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