Avatar billede sykofanten Nybegynder
07. december 2006 - 16:41 Der er 14 kommentarer og
1 løsning

Delete Cascate i en SQL tabel oprettet af JDO!

Hej, har stillet mit spm inde på jpox forummet også, men da det er ekstremt vigtigt at jeg finde en løsninge i løbet af de næste par timer, prøver jeg da også lige her. Linket kommer her:

http://www.jpox.org/servlet/forum/viewthread?thread=3999&lastpage=yes
Avatar billede sykofanten Nybegynder
07. december 2006 - 16:42 #1
flot jeg skrive cascate ... mener naturligvis cascade... ups :D
Avatar billede winners79 Nybegynder
07. december 2006 - 19:12 #2
Århus Erhversakademi? Kreditstyring for jyske bank? hehe

Her er hvordan vi løste den i CAOS, det er bare med lån...

create procedure DeleteGamleLån

@dato1 varchar(10)
AS
DECLARE @Get_Lån_Id int

DECLARE Get_Lån_Id_iterator CURSOR FOR
select    lån.lån_id
from    lån
where    oprettelses_dato < convert(datetime,@dato1,103)
and    lån.lån_id = (select afvistlån.lån_id from afvistlån where afvistlån.lån_id = lån.lån_id)

begin /* procedure */

OPEN Get_Lån_Id_iterator
FETCH NEXT FROM Get_Lån_Id_iterator INTO @Get_Lån_Id
print '@@FETCH_STATUS :'
print @@FETCH_STATUS

WHILE (@@FETCH_STATUS = 0) /* @@FETCH_STATUS : 0 hvis fetch lykkedes, -1 hvis der er fejl, -2 hvis der ikke returneres flere */
BEGIN  /* WHILE*/
print 'ID :'
print @Get_Lån_Id
Begin transaction
    DELETE FROM AfvistLån WHERE AfvistLån.Lån_Id = @Get_Lån_Id
    DELETE FROM Lån WHERE Lån.Lån_Id = @Get_Lån_Id
commit transaction
    FETCH NEXT FROM Get_Lån_Id_iterator INTO @Get_Lån_Id
END  /* WHILE*/

CLOSE Get_Lån_Id_iterator
deallocate Get_Lån_Id_iterator /* cursor fjernes fra RAM */

end /* procedure */



Skulle nok give dig en ide til hvordan det kan laves
Avatar billede sykofanten Nybegynder
07. december 2006 - 19:23 #3
Ja aabc og ja kreditstyring for jyske bank.
Jeg er dog ikke noget nær så skrap til programmering du er, så det kode der ved jeg ik helt om jeg når at få omskrevet så det passer til min situation. Har 20 siders SK og CAOS rapport der skal skrives i løbet af natten, og skal rette nogle små ting i udlånssystemet, men kigger på det :)
Avatar billede sykofanten Nybegynder
07. december 2006 - 19:48 #4
Øv, ku ik få det til at virke. Måske har det noget af gøre med at kunde er abstrakt superklasse til privat og firmakunde, dunno :/ Hvis du har et bud så hold dig endelig ikke tilbage :)

create procedure DeleteGamleLån

@aar datetime
AS
DECLARE @Get_kunde_Id bigint

DECLARE Get_kunde_Id_iterator CURSOR FOR
select    kunde.kunde_id
from    kunde
where    kunde_oprettelses_dato < @aar
and    kunde.kunde_id = (select privatkunde.privatkunde_id from privatkunde where privatkunde.privatkunde_id = kunde.kunde_id)

begin /* procedure */

OPEN Get_kunde_Id_iterator
FETCH NEXT FROM Get_kunde_Id_iterator INTO @Get_kunde_Id
print '@@FETCH_STATUS :'
print @@FETCH_STATUS

WHILE (@@FETCH_STATUS = 0) /* @@FETCH_STATUS : 0 hvis fetch lykkedes, -1 hvis der er fejl, -2 hvis der ikke returneres flere */
BEGIN  /* WHILE*/
print 'ID :'
print @Get_kunde_Id
Begin transaction
    DELETE FROM privatkunde WHERE privatkunde.privatkunde_Id = @Get_kunde_Id
    DELETE FROM kunde WHERE kunde.kunde_Id = @Get_kunde_Id
commit transaction
    FETCH NEXT FROM Get_kunde_Id_iterator INTO @Get_kunde_Id
END  /* WHILE*/

CLOSE Get_kunde_Id_iterator
deallocate Get_kunde_Id_iterator /* cursor fjernes fra RAM */

end /* procedure */

execute DeleteGamleLån 2008

@@FETCH_STATUS :
-1
Avatar billede sykofanten Nybegynder
07. december 2006 - 20:04 #5
drop proc sp_test

CREATE PROCEDURE sp_test
(@aar datetime) AS
WHERE year(kunde_oprettelses_dato) < @aar
DELETE FROM Laaneansoegning
WHERE year(laaneansoegning_oprettelses_dato) < @aar
go
execute sp_test 2008

select * from kunde
select * from laaneansoegning


create procedure DeleteGamleLån

@aar datetime
AS
DECLARE @Get_kunde_Id bigint

DECLARE Get_kunde_Id_iterator CURSOR FOR
select    kunde.kunde_id
from    kunde
where    kunde_oprettelses_dato < @aar
and    kunde.kunde_id = (select privatkunde.privatkunde_id from privatkunde where privatkunde.privatkunde_id = kunde.kunde_id)

begin /* procedure */

OPEN Get_kunde_Id_iterator
FETCH NEXT FROM Get_kunde_Id_iterator INTO @Get_kunde_Id
print '@@FETCH_STATUS :'
print @@FETCH_STATUS

WHILE (@@FETCH_STATUS = 0) /* @@FETCH_STATUS : 0 hvis fetch lykkedes, -1 hvis der er fejl, -2 hvis der ikke returneres flere */
BEGIN  /* WHILE*/
print 'ID :'
print @Get_kunde_Id
Begin transaction
    DELETE FROM privatkunde WHERE privatkunde.privatkunde_Id = @Get_Lån_Id
    DELETE FROM kunde WHERE kunde.kunde_Id = @Get_Lån_Id
commit transaction
    FETCH NEXT FROM Get_kunde_Id_iterator INTO @Get_kunde_Id
END  /* WHILE*/

CLOSE Get_kunde_Id_iterator
deallocate Get_kunde_Id_iterator /* cursor fjernes fra RAM */

end /* procedure */

Sådan har jeg den til at se ud nu, men altså... det virker ikke :/

Databasen ser sådan her ud: http://img46.imageshack.us/img46/5699/dbbj1.jpg
Avatar billede sykofanten Nybegynder
07. december 2006 - 20:09 #6
haha forkert c/p, men lige for at bombardere denne tråd endnu mere kommer her, hvad jeg ville havet pastet istedet :D

create procedure deletegamlekunder

@aar datetime
AS
DECLARE @Get_kunde_Id bigint

DECLARE Get_kunde_Id_iterator CURSOR FOR
select    kunde.kunde_id
from    kunde
where    kunde_oprettelses_dato < @aar
and    kunde.kunde_id = (select privatkunde.privatkunde_id from privatkunde where privatkunde.privatkunde_id = kunde.kunde_id)
and    kunde.kunde_id = (select foreningskunde_id from foreningskunde where foreningskunde.foreningskunde_id = kunde.kunde_id)

begin /* procedure */

OPEN Get_kunde_Id_iterator
FETCH NEXT FROM Get_kunde_Id_iterator INTO @Get_kunde_Id
print '@@FETCH_STATUS :'
print @@FETCH_STATUS

WHILE (@@FETCH_STATUS = 0) /* @@FETCH_STATUS : 0 hvis fetch lykkedes, -1 hvis der er fejl, -2 hvis der ikke returneres flere */
BEGIN  /* WHILE*/
print 'ID :'
print @Get_kunde_Id
Begin transaction
    DELETE FROM privatkunde WHERE privatkunde.privatkunde_Id = @Get_kunde_Id
    DELETE FROM kunde WHERE kunde.kunde_Id = @Get_kunde_Id
commit transaction
    FETCH NEXT FROM Get_kunde_Id_iterator INTO @Get_kunde_Id
END  /* WHILE*/

CLOSE Get_kunde_Id_iterator
deallocate Get_kunde_Id_iterator /* cursor fjernes fra RAM */

end /* procedure */

execute deletegamlekunder 2008

Databasen ser sådan her ud: http://img46.imageshack.us/img46/5699/dbbj1.jpg

Så nu skal jeg nok stoppe spam :D
Avatar billede winners79 Nybegynder
07. december 2006 - 22:28 #7
får du en fejl?
Avatar billede sykofanten Nybegynder
07. december 2006 - 22:51 #8
ja, den kan simpelthen ik fjerner subklassen privatkunde

create procedure deleteGamlekunder

@aar datetime
AS
DECLARE @Get_kunde_Id bigint

DECLARE Get_kunde_Id_iterator CURSOR FOR
select    kunde.kunde_id
from    kunde
where    year(kunde_oprettelses_dato) < @aar
and    kunde.kunde_id = (select privatkunde.privatkunde_id from privatkunde where privatkunde.privatkunde_id = kunde.kunde_id)
or    kunde.kunde_id = (select foreningskunde_id from foreningskunde where foreningskunde.foreningskunde_id = kunde.kunde_id)

begin /* procedure */

OPEN Get_kunde_Id_iterator
FETCH NEXT FROM Get_kunde_Id_iterator INTO @Get_kunde_Id
print '@@FETCH_STATUS :'
print @@FETCH_STATUS

WHILE (@@FETCH_STATUS = 0) /* @@FETCH_STATUS : 0 hvis fetch lykkedes, -1 hvis der er fejl, -2 hvis der ikke returneres flere */
BEGIN  /* WHILE*/
print 'ID :'
print @Get_kunde_Id
Begin transaction
    DELETE FROM privatkunde WHERE privatkunde.privatkunde_Id = @get_kunde_id
    DELETE FROM foreningskunde WHERE foreningskunde.foreningskunde_id = @get_kunde_id
    DELETE FROM aktiv where aktiv.kunde_kunde_id_oid = @get_kunde_id
    DELETE FROM laaneansoegning where laaneansoegning.kunde_kunde_id_oid = @get_kunde_id
    DELETE FROM kunde WHERE year(kunde_oprettelses_dato) < @aar
commit transaction
    FETCH NEXT FROM Get_kunde_Id_iterator INTO @Get_kunde_Id
END  /* WHILE*/

CLOSE Get_kunde_Id_iterator
deallocate Get_kunde_Id_iterator /* cursor fjernes fra RAM */

end /* procedure */

execute deletegamlekunder 2008
Avatar billede sykofanten Nybegynder
07. december 2006 - 22:56 #9
@@FETCH_STATUS :
0
ID :
4076

(1 row(s) affected)


(0 row(s) affected)


(3 row(s) affected)


(0 row(s) affected)

Server: Msg 547, Level 16, State 1, Procedure deleteGamlekunder, Line 30
DELETE statement conflicted with COLUMN REFERENCE constraint 'PRIVATKUNDE_FK1'. The conflict occurred in database 'master', table 'PRIVATKUNDE', column 'PRIVATKUNDE_ID'.
The statement has been terminated.
ID :
4077

(1 row(s) affected)


(0 row(s) affected)


(0 row(s) affected)


(1 row(s) affected)

Server: Msg 547, Level 16, State 1, Procedure deleteGamlekunder, Line 30
DELETE statement conflicted with COLUMN REFERENCE constraint 'FORENINGSKUNDE_FK1'. The conflict occurred in database 'master', table 'FORENINGSKUNDE', column 'FORENINGSKUNDE_ID'.
The statement has been terminated.
ID :
4078

(0 row(s) affected)


(1 row(s) affected)


(0 row(s) affected)


(1 row(s) affected)


(3 row(s) affected)
Avatar billede sykofanten Nybegynder
07. december 2006 - 23:07 #10
hmm kiggede lige efter i tabellerne alligevel, og den har faktisk fjernet privatkunde og foreningskunde også

http://sykofanten.5u.com/db2.JPG

men hvorfor skriver den så den fejl? :D og kan jeg få den til at lade være med det? :D:D
Avatar billede sykofanten Nybegynder
07. december 2006 - 23:08 #11
og ja linket virker... man skal bare markere urllen i browseren og trykker enter :D
Avatar billede winners79 Nybegynder
07. december 2006 - 23:17 #12
ved faktisk ikke hvorfor fejlen kommer, kan det have noget med din cascade at gøre? tror ikke du har brug for den mere
Avatar billede sykofanten Nybegynder
07. december 2006 - 23:19 #13
fjerner den, men du skal ha pointsne da :D

TAK for hjælpen :D

smid et svar så accepterer jeg
Avatar billede sykofanten Nybegynder
07. december 2006 - 23:20 #14
du ka faktisk få 2x 200 points hvis du smider et svar i Database - msql også :D
Avatar billede winners79 Nybegynder
07. december 2006 - 23:49 #15
behold dine database point :)

Hvis du får brug for hjælp igen så går jeg et semester over dig;)
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
Kurser inden for grundlæggende programmering

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