Vinnaren i pepparkakshustävlingen!
2009-09-30, 14:11
  #1
Medlem
Hej,

sitter fast och måste använda access. Har en tabell A och en tabell B. Tabell A har ett "ett-till-ett/många" förhållande till B, för varje rad i B finns en rad i A, men inte nödvändigtvis tvärtom. När folk lägger till något i B måste en rad i A med samma id som B's column A_ID finnas. A's id column är en counter, dvs den räknar upp hela tiden, så man inte själv behöver lägga till ett värde. Kan B's integer column A_ID referera till A's counter?

Om man tar bort några rader ur A, tilldelas de kvarvarande nya ID'n, eller räknar countern vidare uppåt?

Hur är bästa sättet? De som ska sköta det här är inte direkt datakunniga, så vill ge dom så lite möjligheter att förstöra något som möjligt, t.ex som att välja ID själva..

Kod:
CREATE TABLE A
(ID counter PRIMARY KEY);

CREATE TABLE B
(ID counter PRIMARY KEY,
A_ID integer REFERENCES A(ID)); 
Citera
2009-09-30, 14:29
  #2
Medlem
Kaustis avatar
Vad exakt är det du försöker göra? Det kan ju vara så att det finns bättre sätt än det du gör. Handlar det om ett beställningssystem eller nåt annat?
Citera
2009-09-30, 14:43
  #3
Medlem
Citat:
Ursprungligen postat av cyberrascal
Kan B's integer column A_ID referera till A's counter?
Japp, men hur man löser det beror väl lite på vad du använder för front-end. Är det Access egna? Eller är det en webb-app du bygger? I så fall vilket språk?
Citat:
Ursprungligen postat av cyberrascal
Om man tar bort några rader ur A, tilldelas de kvarvarande nya ID'n, eller räknar countern vidare uppåt?
Nej, ID:n ändras inte, utan räknaren fortsätter uppåt.
Citera
2009-09-30, 15:03
  #4
Medlem
Dom använder Access egna front-end för att lägga in i databasen. Faktum är att jag tror dom skapar en databasfil för varje prov dom utför, så det blir inte mycket av en databas, men jag vill ju ändå ha hyffsat bra ordning, om inte annat så för att dom nån gång ska kunna gå över till SQL eller något.

Jag har utvecklat ett system för att testa de produkter som ett visst företag utvecklar. Accessdatabasen/erna fungerar som indata till systemet.

Det jag vill åstadkomma är ett databassystem som kräver så lite insats från användaren som möjligt, eftersom de använder access mot en databasmall där de har fullständiga rättigheter. Har lärt mig att inte lita på användare. Helst skulle jag skriva en egen front-end som är anpassat för det dom vill göra, men men.

Det jag tänkt mig är att dom lägger in en record i A, kollar vilken ID den fick, och lägger då till en record i B med det ID't som foreign key.. Ett alternativ är ju att skita i counter, och då får de själva fylla i ID för varje record i A, och sen skriva in samma för B, men känns väldigt otryggt att de själva väljer ID på det sättet, eftersom ID't endast används internt för mitt system, och inte har någonting med produkten att göra.

Låter det vettigt?

/edit: En snabb fråga! Jag skapar alla mina databaser genom mitt program genom en liten enkel modul som tar en SQL query och ställer den på en blank databas. Om jag bara skapar alla tables, och i det ovanstående exemplet med A och B tar bort ett record ur A där det finns ett motsvarande i B så klagar den på "Cannot delete, related records exists in table B", eller liknande.

Lyckades via access grafiska interface att ändra så att det blir "cascading changes" eller något, så att databasen istället för att klaga tar bort alla relaterade records.. Hur gör jag detta med SQL queries?
__________________
Senast redigerad av cyberrascal 2009-09-30 kl. 15:06.
Citera
2009-09-30, 19:10
  #5
Medlem
Det går ju att bygga formulär i Access, då kan man bygga ett formulär där man matar in uppgifter i tabell A, och sen har man tabell B som ett underformulär i samma vy, då får man en automatisk koppling mellan den aktuella posten i A och underposterna i B.

Sen har du detta för att skapa cascades via query: http://msdn.microsoft.com/en-us/library/bb177889.aspx. Borde bli nåt åt det här hållet då:
Kod:
CREATE TABLE A
(ID counter PRIMARY KEY ON UPDATE CASCADE ON DELETE CASCADE); 
Citera
2009-09-30, 22:21
  #6
Medlem
Tack mannen, fattar inte varför jag inte hittade det där själv.. Visste inte riktigt vad jag skulle söka på antar jag.

Har nu en fråga till dock.. Skulle behöva ha en primary keys av två fält, dvs typ:

Kod:
CREATE TABLE A
(ID integer PRIMARY KEY,
Revision integer PRIMARY KEY); 

Detta funkar såklart inte, eftersom man inte kan ha två primära nycklar. Hur gå till väga? Alla säger att man ska köra

Kod:
ALTER TABLE A ADD CONSTRAINT PK PrimaryKey (IDRevision

men vill helst göra det från början, med create?

Ledsen att jag stället mycket dumma frågor, men verkar inte lätt att hitta någon som använder queries istället för access frontend..

/edit: Lyckades fixa det med denna query:

Kod:
CREATE TABLE A
(ID integer,
Revision integer,
CONSTRAINT PrimaryKey PRIMARY KEY (IDRevision)); 

Tack grabbar!
__________________
Senast redigerad av cyberrascal 2009-09-30 kl. 22:31.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback