Record dupliceren vanuit een Formulier

Status
Niet open voor verdere reacties.

bikerron

Gebruiker
Lid geworden
9 mei 2009
Berichten
236
Hallo,
Ik zag dat hier al meerder posts over waren maar ik kan daar de oplossing voor mijn probleem niet uit halen.
Even een korte schets waar het over gaat:
Ik heb een relationele database t.b.v het registreren van schepen.
Om de schepen te registreren maak ik gebruik van een onderhoudsformulier met waarbij naast de tabel Schepen ook de tabellen Rederijen, Werven, Steden en Landen in worden gebruikt.Deze tabellen laten hun informatie zien vanuit dropdown lists.

Zodra er een "technische" wijziging aan het schip heeft plaatsgevonden, of een verandering van een Rederij dan is het handig dat er een nieuw record wordt aangemaakt, dit gaat dus via de dupliceer functie.
Alle gegevens, behalve een volgnummer, moeten 1 op 1 worden overgenomen naar het nieuwe record.
In de meeste gevallen gaat dit goed.
Nu het probleem:
Zodra er een Rederij / Werf MEERDERE plaatsen heeft dan wordt in het nieuwe record altijd de EERSTE plaats van bijbehorende Rederij / Werf in het nieuwe record gekoppeld.
Dit is nu niet de bedoeling, althans een van de beide velden zal wellicht gewijzicht moeten worden maar niet "automatisch" beide velden.

Ergens gaat er dus iets fout.
Ik hoop dat een van de helpers mij het licht kan laten zien!.
Al vast bedankt voor de te nemen moeite.

Ik probeerde 7 100K RAR files aan te bieden maar dat gaat niet helemaal goed, er komen er 5 van de 7 mee.
Ik zal een ander manier bedenken om deze gegevens alsnog gepost te krijgen.

Groeten,
Ron
 

Bijlagen

Nu het probleem:
Zodra er een Rederij / Werf MEERDERE plaatsen heeft dan wordt in het nieuwe record altijd de EERSTE plaats van bijbehorende Rederij / Werf in het nieuwe record gekoppeld.

Wat is dan WEL de bedoeling?

Tardis
 
Tardis,
Bedankt voor je reactie.
Wat de bedoeling is:
Na de dupliceer actie dienen ALLE gegevens, op het volgnummer na, identiek te zijn aan het record waarvandaan gedupliceerd wordt.
Dit gaat dus voor de Plaatsen van de Rederijen / Werven NIET goed.
Voor de overige gegevens werkt het prima.

Als er een Rederij / Werf in meerdere plaatsen voorkomt dan wordt altijd de eerste plaats getoond. (eerste= op Alfabetische volgorde)

Ron
 
Hoi Ron,

Ik heb er nog even een oude versie bijgehaald, en daar doet de knop het nog prima. Wat heb je veranderd in de tussentijd?
Overigens zou ik toch eens gaan denken over een andere opzet van de tabelhistorie, want ik vind deze aanpak niet helemaal de juiste. Je maakt namelijk voor (in beginsel) unieke items (de schepen) dubbele records aan in je hoofdtabel. En regel één van normaliseren is toch, dat je al je voorwerpen toch maar één keer opslaat... In de huidige opzet zie je als een boot drie keer wijzigt, drie records terug van die boot. Als je niet goed weet welk record de laatste is, loop je de kans dat je een verkeerd record muteert, en dat kan nooit de bedoeling zijn.
Wat je eigenlijk wil, is de historie bijhouden van een boot. En daarvoor zou ik een aparte tabel maken, [schepen_historie] waar je met een toevoegquery een record aan toevoegt op het moment dat er een record wijzigt. In je tabel schepen houd je dan per boot één record, en in de tabel historie kun je terugzien wat er wanneer is gewijzigd.
 
Halo Michel,

Over het evt. splitsen van de Schepentabel in een historie tabel ben ik nog niet uit, je hebt me wel aan het denken gezet maar ik wil eerst mijn aandacht even zetten op het verkeerd dupliceren

Ik weet niet wat er gebeurt is sinds jij, een nog werkend (07-2010), voorbeeld gestuurd heb.
In dat voorbeeld werkte de dupliceerfunctie nog goed.

De enige zaken die vanaf dat moment gedaan zijn betroffen o.a. het kunnen afhandelen bij een "Not inList" optie, zowel voor de Rederijen als voor de Werven. Dat werkt prima. Ik heb verder niet meer gecontroleerd of daarna de dupliceerfunctie de mist in ging.

Ik heb de gebruikte Queries vergeleken bij de tabel definities van Schepen, Rederijen en Werven, deze zijn identiek aan die van jouw voorbeeld, ik heb deze queries alsnog overgenomen maar geen verschil.
Ik heb de gebruikte Recordbron query uit jouw voorbeeld overgenomen, en het maakt geen verschil.
Het moet iets "kleins zijn" wat de handel verstoort.
Heb jij nog suggesties?
 
Michel,
Ik ben er toch nog niet uit. In de door jouw geleverde versie werkte het toch niet!.
(24-06-2010).
Als je svp nog even de moeite wilt nemen om dat te bekijken.
Het probleem doet zich dus voor als je een dupliceer actie doet van een record waarbij er van een Rederij en of Werf MEERDERE plaatsen heeft.
Stel een Werf komt voor in plaats1 en in plaats 2
Het "bron record" staat ingesteld voor de plaats 2
Na de dupliceer actie is voor de Werf PLAATS1 ingesteld.

Waar moet ik het nu zoeken?
Ron

In de bijlagen nog even de geleverde database
 

Bijlagen

Ik zal er nog eens naar kijken.... Heb je een voorbeeldje van een werf?
 
Michel,
Fijn dat je er tijd aan wilt besteden.
In de meegeleverde RAR-file, vorig bericht, zitten 2 Werven waarmee het duidelijk zal worden wat er aan de hand is.
Werf Fulton heeft een vestiging in Klein Willebroek en
in Ruisbroek

Werf Jos Boel & Zn heeft een vestiging in Boomen
in Temse
 
Kun je uitleggen waarom een aantal werven, waaronder Fulton en Jos Boel & Zn, meer records hebben in de tabel Werven? Als ik denk dat het is wat je gaat zeggen, klopt je db niet...
 
Michel,
De tabel werven bevat dus de naam van de werf, een ID naar de Tabel Steden.
De tabel Steden bevat de naam van een Stad en een ID naar de Tabel Landen

In de tabel werven is de combinatie Werfnaam + StedenID is uniek.
In de Tabel Steden is de combinatie Stad + LandenID uniek
In de Tabel Landen is Naam van een Land uniek.

Zit ik nu met een verkeerde opzet van relaties te werken, nee toch!

Ron
 
In de db die je tot nu toe steeds gebruikt zitten in de tabel Werven dubbele werven; elke werf zit met een eigen Bouwplaats in de tabel. Zo zit Fulton er dus twee keer in, met twee bouwplaatsen. En daar gaat het fout...
 
Bedoel je te zeggen dat de opbouw van deze tabel niet volgens de "regels" is?
Ik ben even blind.
1 werf kan in meerdere plaatsen voorkomen dus hoe zou ik dat dan moeten aanpakken.
De records zijn niet uniek, de combinatie werfnaam + plaats wel.
Het lijkt me toch vreemd als ik binnen de werven tabel bij een werf ALLE voorkomende plaatsen ga vastleggen. Dat wordt dan weer een hele klus om uit te zoeken welke plaats dan bij een schip moet komen.
 
Opbouw lijkt inderdaad niet volgens de regels.

Punt is dat een werf meerdere vestigingen kan hebben.
In de regel pak je dat aan door niet een samengestelde unieke sleutel te gebruiken maar door 2 tabellen te definieren die een 1 op veel relatie hebben:

- tblWerf, unieke sleutel is WerfID (autonummer kolom)
- tblWerfplaats, unieke sleutel is WefplaatsID (autonummer kolom)
verwijzende sleutel WerfID (numeriek)

Je relatie leg je dan over de kolom WerfID

Tardis
 
Je moet inderdaad een aparte tabel maken voor de combinaties van werven en bouwplaatsen. Hierin sla je (uiteraard) de werfID en de BouwplaatsID op. Deze combinatie van velden maak je dan uniek, dus de sleutel.
De werkwijze bestaat uit een paar stappen:
1. Je maakt met een tabelmaakquery een tabel op basis van de tabel Werven. Hierin groepeer je op werfNaam en (bijvoorbeeld) op Eerste(WerfID). Zodat je alle werven met hun unieke ID hebt. Noem die bijvoorbeeld tmpwerven
2. Op basis van de tijdelijke tabel maak je een query met de wizard <Niet-gerelateerde records>. Hiermee zoek je in de tabel Werven de records op die niet in de tijdelijke tabel zitten. Dit zijn de bouwplaatsen die met een duplicaat werf een eigen record hebben in Werven.
3. Op basis van de tab uit stap 2 maak je weer een tijdelijke tabel. Hierin staan dus de werven die je kunt verwijderen uit de tabel Werven.
4. Maak een kopie van de tabel Werven. Deze tabel tabel noem je dan bijvoorbeeld Werven_Bouwplaats. Noem deze tmpwerven2
5. Maak een verwijderquery op de tabel Werven. Geef die het criterium <In (select [BouwwervenId] from tmpwerven2)> op het veld BouwervenID. Nu worden alle dubbele werven uit de tabel Werven verwijderd.
6. De laatste stap is nu in de tabel Werven_Bouwplaats de juiste WerfID te koppelen aan de bouwplaatsen. Dat doe je door een bijwerkquery te maken waarin je de tabellen koppelt op basis van Werfnaam, niet op WerfID. Want die moeten nu juist worden bijgewerkt.

Alternatief is, dat je een kopie maakt zoals in stap 4 is beschreven, en alle werfID's met de hand bijwerkt. Bij een kleine tabel is dat net zo snel. Heb je een paar honderd werven/bouwplaatsen, dan zou ik het automatiseren.

Overigens sluit dit probleem wel aan bij je historie probleem... Als ik de hele opzet bekijk, zou ik als ik jou was de hele db eerst eens grondig aanpakken. De problemen waar je nu tegenaanloopt worden straks alleen maar groter, en het oplossen wordt alleen maar lastiger als je het lang uitstelt.
 
Hallo Tardis en Michel,
Beiden bedankt voor jullie reacties.
Mij ledje gaat toch nog niet aan!.
Ik snap de stappen die ik zou kunnen nemen om naar een tabel te komen met unieke werven en de daarbij een tatbel met de voorkomende bouwplaatsen van de werven.
Maar....
Dat gaat dan volgens mij resulteren in 2 tabellen met Steden.
1 Voor de Rederijen en 1 voor de Bouwplaatsen, Ik kan zo dus dezelfde stad in 2 tabellen krijgen, dat lijkt mij nu ook weer niet handig.

Even los van dit probleem.
De gebruikte "Knop" met de gebeurtenis "Dupliceren" gooit volgens mij roet in het eten.
Waar ik aan denk bij een "dupliceer of kopieer actie" is:
Van het "voor staande record in het formulier" een IDENTIEK exemplaar maken en toevoegen in de tabel. Dat doet deze gebeurtenis dus niet goed.
Of is mijn ledje nu helemaal opgebrand?

Ron
 
Ron,

voer nu eerst eens de stappen uit die OctaFish (zeer terecht) adviseerde.
Daarna praten we verder.
Niet teveel denken dus maar gewoon doen ;)
Begrijpen komt later wel.

Je probleem zit 'm in je gegevensstructuur en die zul je eerst aan moeten passen.

Tardis
 
Uiteraard sluit ik mij bij de voorgaande sprekerd aan.... Jouw probleem wordt veroorzaakt doordat je een verkeerde werfselectie maakt. Omdat je een één-op-één hebt (a.h.w.) zal het kopiëren altijd een verkeerde bouwplaats meekopieëren. Er is namelijk geen relatie met de goede werf.
Je hebt straks, als het goed is. één tabel met werven, één tabel met steden (elk dus met unieke items) en één koppeltabel, waarin je per werf vastlegt welke bouwplaatsen je hebt. Daarbij kan het dus voorkomen dat een plaats meerdere keren gebruikt wordt, als meerdere werven in dezelfde plaats een bouwplaats hebben. Maar dat moet kunnen. Je kunt nog bedenken of één werf in één plaats meerdere werven bouwt; en of je die apart wilt registreren.
Door de zure appel heenbijten dus....
 
Laatst bewerkt:
Heren Giga en Mega,

Ik begin een vlammetje te ontwaren in mijn hoofd.
Zien is geloven, ik mag nog even niet denken :D.
Morgen begin ik met de zure appel.
Zodra ik e.e.a gerealiseerd heb meld ik me weer, met evt. nog vragen ter verduidelijking of..... met een afgesloten Post.

Ben jullie zeer erkentelijk voor de inzet

Ron
 
Michel,
Ben ik weer.
Ik heb de handel nu zover gereed dat ik de volgende situatie heb:
1 Tabel met Landen
2 Tabel met Steden met een relatie naar Landen
3 Tabel met Werven
4 Koppeltabel met Werven die in meerdere steden aanwezig zijn.
deze tabel heeft een relatie met de Tabellen Werven en Steden.
de combinatie Werf-Stad is samen uniek.
Met deze gegevens kan ik heel goed de gegevens onderhouden en is inderdaad een betere optie dan ik hiervoor had.

Maar.....

Als ik de Koppeltabel aan de Schepen tabel koppel dan blijft het aangegeven probleem bij het dupliceren van een scheepsrecord, nog steeds van kracht.
Het onderhouden van de Schepentabel doe ik met een "gegevensbron" Query waarbij all relevante tabellen aan elkaar gejoind worden.
Het dupliceren met de "standaard" gebeurtenis voor dupliceren.

(dat is dus niet zo vreemd want de Koppeltabel is in feite identiek aan zo als ik het probleem in ging: Werventabel met hierin de de werfnaam en een stad. En voor elke nieuwe stad van die werf weer een record.)
Ergo... wat doe ik (nog) steeds verkeerd!
-----
Misschien toch nog even uitleggen waarom ik een scheepsrecord zou willen dupliceren:
De eerste keer dat je een schip tegengekomen bent wordt dit als "nieuwschip" vastgelegd met o.a. de eigenschappen (registratienummer,lengte, breedte, vermogen, naam, werf, eigenaar etc).
De beslissing of er een nieuw record van dit schip gemaakt moet worden ligt in het feit dat één van de karakteristieken is gewijzigd.
Byv, de lengte / breedte / vermogen / eigenaar is veranderd t.o.v. de vorige signaleringen.
Het zou dus jammer zijn als je voor het vastleggen van een nieuw schip alles weer opnieuw moet inkloppen. De bedoeling is dus dat na de duplicering je alleen die zaken aanpast die gewijzigd zijn.
Na de duplicering is alles identiek gebleven behalve dat er een volgnummer verhoogd is t.o.v. van de "bron".

Kortom: is er nog iets wat ik kan ondernemen om mijn gewenste resultaat te krijgen?

Ron
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan