Results 1 to 11 of 11

Thread: Iets doe ik fout...maar zie niet meer wat

  1. #1

    Iets doe ik fout...maar zie niet meer wat

    Hi

    Ik heb 3 tabellen (zie afbeelding)
    - Production (SQL statement = select * from production order by name)
    - Contact (SQL statement = select * from contact order by LastName)
    - ProductionContact (SQL statement = select * from ProductionContact, Contact where ProductionContact.ContactID=Contact.ContactID Order By Contact.LastName)


    Er ligt een masterdetail op basis van de TMSQL componenten tussen:
    - ProductionContact -> Production
    - Contact -> ProductionContact

    Op deze wijze heb ik alleen de contacten die gekoppeld zijn aan de betreffende productie, zie afbeelding 'production.jpg'
    Hier worden de gegevens uit de tabel ProductionContact weergegeven

    Na het invoeren van een productie kun je contact personen toevoegen. Het is de bedoeling dat de contatpersoon in de tabel CONTACT wordt opgeslagen
    en vervolgens wordt in de tabel PRODUCTIONCONTACT de waardes opgeslagen :
    - production.productionID
    - production.contactID

    Nu gebeuren er twee dingen die niet goed gaan en ik snap ff niet meer waarom.

    Ik heb een apart scherm om een contact toe te voegen, wanneer ik hier een record toevoeg ik krijg ik de melding : #23000Duplicate entry '6' for key PRIMARY
    Als ik de master/detail verwijder tussen Contact -> ProductionContact krijg i deze melding niet meer. Wat er dan wel mis gaat is dat wanneer
    ik een record in het overzicht selecteer ik niet bij dat record uit komt maar bij het eerste. Logisch omdat de master/detail weg is.

    Een idee hoe dit beter kan/moet...want ik zie het ff niet meer

    Greetz Peter
    Attached Thumbnails Attached Thumbnails Click image for larger version. 

Name:	data.jpg 
Views:	108 
Size:	53.6 KB 
ID:	7493   Click image for larger version. 

Name:	production.png 
Views:	130 
Size:	27.4 KB 
ID:	7494  
    Last edited by mierlp; 19-Feb-17 at 17:40.

  2. #2
    Wat gebeurt er als je dit doet via SQL direct in de database?

    Ik zou me voor kunnen stellen dat de definitie in je database (je relaties) niet goed is, waardoor je een exception krijgt op die relatie. Een ander probleem wat ik me voor kan stellen is de tandwiellogica die je lijkt te gebruiken in je datasets in delphi.

    Is het hier misschien een optie (uitgaande dat het probleem niet ziet in de database definitie) om een losse query (of eigenlijk 2) te gebruiken voor je inserts en dan je view te refreshen?

    Doe je nog iets met transacties die je in de weg kunnen zitten? Welke databse gebruik je?

  3. #3
    Krijg je altijd "#23000Duplicate entry '6' for key PRIMARY" ? Oftewel wordt er altijd een 6 als primary key value weggeschreven?

  4. #4
    @Benno:
    Eigenlijk gaat alles goed, de relaties lijken me goed. Een bestaand record kan ik wijzigen en
    een nieuw record geeft de foutmelding

    @Miep:
    Heb net nog even in de database gekeken en ik kan de 6 niet terug herleiden, want in :
    - Production bevatten 2 records en de autoinc waarde staat goed
    - Contact bevat 9 records en de autoinc waarde staat goed
    - ProductionContact bevat 11 records

    Wanneer ik in ProductionContact 2 recors verwijder, het opnieuw probeer krijg ik : "#23000Duplicate entry '9' for key PRIMARY

  5. #5
    Quote Originally Posted by mierlp View Post
    Heb net nog even in de database gekeken en ik kan de 6 niet terug herleiden, want in :
    - Production bevatten 2 records en de autoinc waarde staat goed
    - Contact bevat 9 records en de autoinc waarde staat goed
    - ProductionContact bevat 11 records ..... (???????????????)
    En wat mis ik dan bij die derde regel van jou !!!!
    "en de autoinc waarde staat goed" mis ik.
    Je hebt ook voor ProductionContact een ProductionContactID dat een autoinc zou moeten zijn.
    Daar lees ik dus niets over en zou je foutmelding kunnen veroorzaken.

  6. #6
    Hi,

    3e regel : ProductionContact bevat 11 records en ook daar staat autoinc waarde goed.
    Alle tabellen hebben een autoinc en dat is :
    Production -> veld ProductionID
    Contact -> veld ContactID
    ProductionContact -> veld ProductionContactID

    De fout ontstaat alleen wanneer er een master/detail bestaat bij Contact, deze verwijst naar ProductionContact naar de velden ContactID->ContactID
    Dit om alleen de contacten te tonen die bij deze productie horen. (zie 2e afbeelding)

    Het grid in de 2e afbeelding is gekoppeld aan ProductionContact om paar gegevens weer te geven.
    Wanneer ik dubbel klik op een regel in het grid krijg ik het scherm waar ik de contacten toe kan voegen/verwijderne en kom ik bij het juiste record
    Dit gaat alleen goed wanneer de M/D bestaat.

    Verwijder ik de M/D dan krijg ik bij dubbel klik het 1e record uit de tabel Contact ipv het aangeklikte record

  7. #7
    Misschien begrijp ik je probleem niet helemaal maar zoals ik het lees kan bij ieder contact meerdere producties horen en bij iedere productie meerdere contacten. Dit kun je volgens mij niet met een master detail regelen. Ieder contact (detail) kan bij meerdere master records horen, dat gaat natuurlijk niet goed. Je kunt denk ik wel ProductionContact Joinen met Contact en deze als detail gebruiken van Production

    Misschien dat je in de logfiles van de DB kunt zien bij welke insert het verkeerd gaat.

  8. #8
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Zet de primary field van contacten in je programma eens op required := false. Het kan zijn dat dat veld al is ingevoerd met een nummer, die op een of andere manier is gegenereerd of toegevoegd.
    Laat dan je database bepalen wat je nieuwe 'id' wordt. Of haal deze eerst op voordat je de nieuwe contact opslaat.
    Delphi is great. Lazarus is more powerfull

  9. #9
    Hi

    @JKuiper : geprobeerd maar heeft geen effect

    @Luigi : Je begrijpt het goed zoals je het beschrijft. Een contact en ene productie worden één keer vastgelegd en kunnen
    meerdere keren gekoppeld worden. Ik ga eens uitzoeken hoe dit met een join kan werken en mogelijk dat daar
    de oplossing zit

  10. #10
    HELP...ik kom er niet aan uit wat ik fout doe

    Wat ik wil is het volgende (zie afbeelding 2 van de 1e post)
    - in het scherm production een nieuw contact toevoegen
    - hiervoor heb ik een apart scherm waar je nieuwe records toe kunt voegen en wijzigen. Dit is gelinkt aan de tabel CONTACT
    - ik gebruik een koppel tabel ProductionContact omdat een productie meerdere contacten kan hebben en een contact meerdere producties kan doen
    - hiervoor moet ik dus in ProductionContact het laatste toegevoegde recordID,-oftewel het AUTOINC veld ContactID opslaan
    - wanneer ik een contact wijzig gebeurd dit in hetzelfde scherm

    Ik heb een join geprobeerd zoals Luigi aangaf maar ik krijg het niet voor elkaar

    Code:
    SELECT * FROM Productioncontact 
    Join Contact on Contact.ContactID = productioncontact.ContactID
    Join Production on Production.ProductionID = productioncontact.ProductionID
    GROUP BY Contact.ContactID
    Order BY Contact.LastName
    Dit moet toch mogelijk zijn inclusief een masterdetail tussen :
    - Production -> ProductionContact
    - Contact -> ProductionContact

    Greetz PEter

  11. #11
    Je joint denk ik één keer teveel. Volgens mij kun je het op de volgende manier oplossen:

    Production tabel/query is je master dataset en je Joint ProductionContact met Contact op contactID dit wordt dan je detail dataset.

    Het nadeel van deze methode is dat je waarschijnlijk de dataset met de join erin niet zonder meer kunt inserten/updaten/deleten. Er zijn data-access componenten zoals unidac van devart die dat volgens mij wel kunnen. Zelf gebruik ik kbmMW en daar kan het ook mee.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •