Just nu i M3-nätverket
Gå till innehåll

Skapa ett eget forum, inte ladda hem ett befintligt!


geezer

Rekommendera Poster

Jag tänkte alltså att du använder RootProjectID i din spGetProjects, så att den returnerar alla underprojekt till rootprojektet. ParentID används som den gör nu i koden.

 

spGetProjects RootProjectId, som då gör en SELECT * FROM Projects WHERE RootProjectId=@RootProjectId

 

spGetPersons vill jag ska returnera alla personer som är kopplade till något av projekten under huvudprojektet.

 

Länk till kommentar
Dela på andra webbplatser

Kom på en sak.

Det går att välja ett underprojekt i min listbox med projekt så då bör man inte använda sig utan rootprojektid, utan av parentprojectid, men det bör väl gå lika bra?

Alltså SELECT * FROM tblProject WHERE ParentProjectID = @ProjectID (det valda projektets id)

 

spGetPerson.. hur gör man en sån sql-sats som returnerar personer som är kopplade till antingen det valda projektet eller till något av alla underliggande? För att även om en person (eller om man valt en person från listboxen) finns med i huvudprojektet är det kanske inte säkert att han finns med i projekt10 2 nivåer ner och ska således inte visas under projekt10 men under huvudprojektet.

Rörigt :)

 

Länk till kommentar
Dela på andra webbplatser

Alltså, de frågor som läser in data i mina strukturer kan se likadana ut oavsett om du valt ett huvudprojekt eller något av dess underprojekt (det gör inget om strukturerna innehåller lite mer data än som behövs)

 

Det är i själva DoTree som du sen väljer vad trädet ska använda som rot, huvudprojektID eller underprojektsID (där kan du passera in vilket projektId som helst, detta projekt blir då rot i det trädet)

 

Din query: SELECT * FROM tblProject WHERE ParentProjectID = ProjectID funkar dock inte, den returnerar ju bara de underprojekt som ligger direkt under ProjektID. Den fråga som ligger i spGetProjects måste även returnera alla underprojekts underprojekt ner till botten. Det var därför jag föreslog att du i frågan plockar ut på RootProjectId som filter.

 

spGetPerson

--------------

SELECT * FROM Person WHERE ProjectId IN (SELECT ProjectId FROM tblProject WHERE RootProjectIt=@RootProjectId)

 

spGetProjects

--------------

SELECT ProjectId FROM tblProject WHERE RootProjectIt=@RootProjectId

 

 

Länk till kommentar
Dela på andra webbplatser

Ok, jag börjar förstå..

Men då måste jag ta reda på först vad RootProjectID är då för det vet man ju inte från början?

 

Din query: SELECT * FROM tblProject WHERE ParentProjectID = ProjectID funkar dock inte
Om man tar WHERE ParentProjectID = @ProjectID OR ProjectID = @ProjectID då?

 

Länk till kommentar
Dela på andra webbplatser

Dom viktiga är väl:

ProjectID, ParentProjectID, RootProjectID.

Ett huvudprojekt har alltså tex 10 som ProjectID, Null som ParentProjectID och 10 som RootProjectID.

 

Länk till kommentar
Dela på andra webbplatser

Om man tar WHERE ParentProjectID = ProjectID OR ProjectID = ProjectID då?

 

Då får du inte med alla poster nedåt.

 

Definiera din sp så här istället, så kan du anropa dem med aktuellt projektID istället för med ett rotID:

 

CREATE PROCEDURE spGetPersons
@ProjectId [color="#0000ff"]In[/color]t
AS
DECLARE @RootId [color="#0000ff"]In[/color]t
[color="#0000ff"]Select[/color] @RootId=RootProjectId FROM tblProjects WHERE ProjectId=@ProjectId

[color="#0000ff"]Select[/color] * FROM tblPersons WHERE ProjectId [color="#0000ff"]In[/color] ([color="#0000ff"]Select[/color] ProjectId FROM tblProjects WHERE RootProjectId=@RootId)

CREATE PROCEDURE spGetProjects 
@ProjectId [color="#0000ff"]In[/color]t
 AS
DECLARE @RootId [color="#0000ff"]In[/color]t
[color="#0000ff"]Select[/color] @RootId=RootProjectId FROM tblProjects WHERE ProjectId=@ProjectId
[color="#0000ff"]Select[/color] * FROM tblProjects WHERE RootProjectId=@RootId

 

Länk till kommentar
Dela på andra webbplatser

Ok, får testa det sen.. håller på och gör om en del saker så jag kommer nog inte att kunna testa det idag.

 

In (Select blablabla) - Är det vad dom kallar för sub-query eller?

Har inte använt det, brukar köra med joins istället.. måste köra det nu också eftersom jag använder mig av tabellen tblProject_Person som är kopplingstabell mellan projekt och person.

 

Men dina sp kommer säkert att funka. Jättetack. Ska testa detta imorgon och pula lite och om det inte fungerar så hör jag av mig ;)

 

Länk till kommentar
Dela på andra webbplatser

Är det vad dom kallar för sub-query eller?

 

Precis! På samma sätt som du kan skriva SELECT * FROM Tabell WHERE id IN (1,2,3,4,5,6) kan du använda en query i parentesen istället. Subqueries är inte optimala att använda, men i det här fallet så handlar det om en relativt liten mängd data så då är det ok.

 

Jättetack. Ska testa detta imorgon och pula lite och om det inte fungerar så hör jag av mig ;)

 

Sure thing. Lycka till!

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...