[SQL/VB6] DELETE bij 'Left Outer Join' probleem

Pagina: 1
Acties:
  • 100 views sinds 30-01-2008
  • Reageer

  • MrDry
  • Registratie: December 2001
  • Laatst online: 08:52

MrDry

Desperados!

Topicstarter
Als ik een record verwijder uit ons adressenbestand wordt het record wat via de LEFT OUTER JOIN gekoppeld is ook verwijderd....waaarom? Misschien is het zo ontworpen maar ik vind het iig niet logisch....

Wat heb ik gedaan:
Ik heb 2 tabellen in een (oud) .MDB bestand. Er zit een join tussen die 2 tabellen. De ene bevat NAW gegevens de andere de aanhef gegevens en deze zijn via ID’s aan elkaar gekoppeld.

Ik praat met mn tabellen via SQL. Het is een outer join omdat nog niet voor alle adressen een aanhef is gekozen in de tabel en dan krijg je niet alle records terug als je een inner join gebruikt.

Ik gebruik deze connectie om met de tabellen te praten:
code:
1
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=\\server-1\AdressenBestand\adressen.mdb;Mode=Read|Write"


Ik open een recordset (rsAdres) mbv van dit sql commando:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SQLStatement = "SELECT  A.ID as AdresID," _
                            & "A.Bedrijf," _
                            & "A.Voornaam," _
                            & "A.Achternaam," _
                            & "A.Postadres," _
                            & "A.Postcode," _
                            & "A.Plaats," _
                            & "A.Telefoon," _
                            & "A.Fax," _
                            & "A.Kenmerk," _
                            & "A.Mailing," _
                            & "A.Gewijzigd," _
                            & "A.Mobiel," _
                            & "A.SignAsJan," _
                            & "A.Voorvoegsel," _
                            & "A.Afdeling," _
                            & "A.AddTelToCentrale," _
                            & "A.AddGSMToCentrale," _
                            & "A.email," _
                            & "A.OpeningMiddag," _
                            & "A.OpeningAvond," _
                            & "S.Aanhef as Aanhef, " _
                            & "A.Aanhef as AanhefID " _
                            & "FROM Adressen A " _
                            & "LEFT OUTER JOIN Aanhef S On A.Aanhef = S.ID "


Vervolgens open ik een recordset met het vogende commando:
(cmd is een samengestelde string waarin o.a. de bovenstaande sqlstatement voorkomt en hoe e.e.a. gesorteerd moet worden)

code:
1
2
3
4
5
6
  With rsAdres
        .CursorType = adOpenDynamic
        .CursorLocation = adUseClient
        .LockType = adLockOptimistic
        .Open cmd <================= sql commado
    End With


Ik heb al geprobeerd om een computed collumn in het statement toe te voegen maar dit geeft een foutmelding. Ik heb het gevoel dat ado dat niet snapt:

code:
1
2
3
4
5
...
& "A.OpeningAvond," _
& "(Select Aanhef from Aanhef S WHERE S.ID = A.AanhefID) as Aanhef, " _
& "A.Aanhef as AanhefID " _
 & "FROM Adressen A "


Nu kan ik natuurlijk wel een tweede parelelle recordset aanmaken welke de join niet bevat en hier dan de delete op loslaten maar dat vind ik eigenlijk een k*t oplossing. Het moet toch wel netter kunnen?

Wat doe ik fout?

Quod licet lovi, non licet bovi


  • bazkar
  • Registratie: Juni 2001
  • Laatst online: 05-02 12:59
Het is me niet erg duidelijk wat je probeert te doen.

Ik begrijp dat je 2 access tabellen hebt die je met een ADO recordset probeert te benaderen.
Dat ze met een left join aan elkaar zitten omdat niet ieder Adres een aanhef heeft snap ik ook.

Tot zover het verhaal, maar het stuk over records deleten is mij nogal onduidelijk.
Ik denk dat je met ADO een record uit die recordset wilt deleten (een aanhef of een adres?) en dat daarbij de gejoinede record ook verdwijnt.

Op zich is dat logisch, als je een ADO recordset op meerdere tabellen opent en daaruit records gaat deleten, gaan de records uit beide tabellen weg.

Welke van de twee probeer je te deleten? De aanhef of het adres?

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

Je gebruikt dan waarschijnlijk een "rsAdres.Delete" ? Ik zou gewoon een "DELETE FROM" query gebruiken, dan weet je tenminste ook zeker dat je niet per ongeluk een record uit een verkeerde tabel verwijderd (b.v. bij het toevoegen van een extra JOIN aan je query). Ik wist niet eens dat een .Delete werkte bij een (uit meerdere tabellen) samengestelde query :+

'Political Correctness is fascism pretending to be good manners.' - George Carlin


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 13-01 07:19
In de MDBs kan ook een relatie staan die automatisch de gerelateerde records verwijderd. Kijk eens met MS Access of dat toevallig aan staat.

  • MrDry
  • Registratie: December 2001
  • Laatst online: 08:52

MrDry

Desperados!

Topicstarter
bazkar schreef op vrijdag 13 oktober 2006 @ 17:06:
Het is me niet erg duidelijk wat je probeert te doen.

Ik begrijp dat je 2 access tabellen hebt die je met een ADO recordset probeert te benaderen.
Dat ze met een left join aan elkaar zitten omdat niet ieder Adres een aanhef heeft snap ik ook.

Tot zover het verhaal, maar het stuk over records deleten is mij nogal onduidelijk.
Ik denk dat je met ADO een record uit die recordset wilt deleten (een aanhef of een adres?) en dat daarbij de gejoinede record ook verdwijnt.

Op zich is dat logisch, als je een ADO recordset op meerdere tabellen opent en daaruit records gaat deleten, gaan de records uit beide tabellen weg.

Welke van de twee probeer je te deleten? De aanhef of het adres?
Ik wil een record verwijderen uit het adressenbestand. Als dit dan een 'heer' is dan verwijderd ado ook het record 'heer' uit de tabel met aanheffen (is dat nederlands?).

@_js_
Ik heb geen acces. De tabel is gewoon in VB gemaakt. Is dat ook in VB te controleren?

Quod licet lovi, non licet bovi


  • Redshark
  • Registratie: Mei 2002
  • Laatst online: 12:46
_js_ schreef op vrijdag 13 oktober 2006 @ 17:24:
In de MDBs kan ook een relatie staan die automatisch de gerelateerde records verwijderd. Kijk eens met MS Access of dat toevallig aan staat.
Heb je hier nog naar gekeken?

Verwijderen van records kun je idd gewoon het beste doen met een delete-query op een tabel zodat je meer controle over je data hebt.

In VB zul je je query dus iets moeten aanpassen.

  • bazkar
  • Registratie: Juni 2001
  • Laatst online: 05-02 12:59
Inderdaad een .execute op de database connectie met een DELETE FROM commando lijkt me hier de beste oplossing.

Als je alleen een adres wilt verwijderen mag je dus geen record uit de gejoinde recordset weggooien.
Ik vind het trouwens wel raar dat dit uberhaupt kan, ik neem aan dat als er nog andere adres records aan de aanhef heer gelinked zijn dat deze dan niet weggegooid mag worden (of zijn de relaties in je database niet enforced?)

  • MrDry
  • Registratie: December 2001
  • Laatst online: 08:52

MrDry

Desperados!

Topicstarter
Ik heb rsAdres.Delete vervangen door een DELETE FROM . Dat werkt inderdaad zonder die rare bijwekingen....

Bedankt allemaal _/-\o_

Quod licet lovi, non licet bovi

Pagina: 1