SDM: SQL Item_Item Abfrage in PQL?

Welcome to the POB User Group Online Community! Forums PUG DACH SDM: SQL Item_Item Abfrage in PQL?

Tagged: , , ,

  • This topic has 7 replies, 3 voices, and was last updated 5 years ago by ms.
Viewing 8 posts - 1 through 8 (of 8 total)
  • Author
    Posts
  • #3275

    Hoi Pugler,

    ich möchte mein Memo in einem Fall ergänzen um die Informationen aus ein Item-Auswahl im Web-Formular. Exemplarisch habe ich es mit SQL und einer definitiven Item ID programmiert.
    Das gibt mir das gewünschte Ergebnis! Wie so oft muss ich das jedoch in PQL-Form bringen – kann mir damit jemand helfen?

    Vielen Dank und schönes Wochenende!

    Marc

    Declare @Stelle as varchar(1000)
    
    set @Stelle='Stellenrolle_DSS_Produktionsleiter_Köln'
    
    select 
    it.id as Oberrolle, 
    ite.id as Unterobjekt,
    u.description as Administrator
    from Item_Item ii 
    inner join item it on it.item_pk = ii.base_item_pk
    inner join Item ite on ite.item_pk=ii.alternative_item_pk
    left join User_Table u on u.user_pk = ite.reponsible_user_pk
    where ii.base_item_pk=(
    select item_pk from Item i where i.id=@Stelle)
    union
    select 
    it.id as Recht1, 
    ite.id as Recht2,
    u.description as Administrator
    from Item_Item ii 
    inner join item it on it.item_pk = ii.base_item_pk
    inner join Item ite on ite.item_pk=ii.alternative_item_pk
    left join User_Table u on u.user_pk = ite.reponsible_user_pk
    where ii.base_item_pk in 
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk= 
    (select i.item_pk from Item i where i.id=@Stelle))
    union
    select 
    it.id as Recht2, 
    ite.id as Recht3,
    u.description as Administrator
    from Item_Item ii 
    inner join item it on it.item_pk = ii.base_item_pk
    inner join Item ite on ite.item_pk=ii.alternative_item_pk
    left join User_Table u on u.user_pk = ite.reponsible_user_pk
    where ii.base_item_pk in 
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk= 
    (select i.item_pk from Item i where i.id=@Stelle)))
    union
    select 
    it.id as Recht3, 
    ite.id as Recht4,
    u.description as Administrator
    from Item_Item ii 
    inner join item it on it.item_pk = ii.base_item_pk
    inner join Item ite on ite.item_pk=ii.alternative_item_pk
    left join User_Table u on u.user_pk = ite.reponsible_user_pk
    where ii.base_item_pk in 
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk= 
    (select i.item_pk from Item i where i.id=@Stelle))))
    union
    select 
    it.id as Recht4, 
    ite.id as Recht5,
    u.description as Administrator
    from Item_Item ii 
    inner join item it on it.item_pk = ii.base_item_pk
    inner join Item ite on ite.item_pk=ii.alternative_item_pk
    left join User_Table u on u.user_pk = ite.reponsible_user_pk
    where ii.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in 
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk= 
    (select i.item_pk from Item i where i.id=@Stelle)))))
    union
    select 
    it.id as Recht5, 
    ite.id as Recht6,
    u.description as Administrator
    from Item_Item ii 
    inner join item it on it.item_pk = ii.base_item_pk
    inner join Item ite on ite.item_pk=ii.alternative_item_pk
    left join User_Table u on u.user_pk = ite.reponsible_user_pk
    where ii.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in 
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in 
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk= 
    (select i.item_pk from Item i where i.id=@Stelle))))))
    union
    select 
    it.id as Recht6, 
    ite.id as Recht7,
    u.description as Administrator
    from Item_Item ii 
    inner join item it on it.item_pk = ii.base_item_pk
    inner join Item ite on ite.item_pk=ii.alternative_item_pk
    left join User_Table u on u.user_pk = ite.reponsible_user_pk
    where ii.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in 
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in 
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in 
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk= 
    (select i.item_pk from Item i where i.id=@Stelle)))))))
    union
    select 
    it.id as Recht7, 
    ite.id as Recht8,
    u.description as Administrator
    from Item_Item ii 
    inner join item it on it.item_pk = ii.base_item_pk
    inner join Item ite on ite.item_pk=ii.alternative_item_pk
    left join User_Table u on u.user_pk = ite.reponsible_user_pk
    where ii.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in 
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in 
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in 
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in 
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk in
    (select itit.alternative_item_pk from item_item itit where itit.base_item_pk= 
    (select i.item_pk from Item i where i.id=@Stelle))))))))
    order by Administrator
    
    #3276
    Stefan Reichelt
    Participant

    Puh, das sieht nach viel Arbeit aus. Aber warum willst du es in PQL umwandeln? Leg doch einfach eine View an, auf die du dann z.B. in berechneten virtuellen Spalten zugreifen kannst…

    Grüße,

    Stefan

    #3277

    Das sind die Inhalte von Berechtigungsanträgen, sprich in dem Memo sollen für die Admins die betroffenen Rechte eingefügt werden.
    Eine View ist eventuell eine Lösung, aber auch dort ist die Hürde, dass ich die Item_Item mehrmals auslesen muss respektive alternative_item_pk immer wieder auf die Ergebnis-base_item_pk setzen bis es keine mehr gibt und alles gesammelt anzeige …

    Ist das oben in PQL möglich … Irgendwie hört sich das ganze nach einem Loop an, doch so etwas habe ich in PQL noch nie probiert …

    #3278
    Stefan Reichelt
    Participant

    Mir sieht das zu komplex aus, um es mit PQL umzusetzen. Aber vielleicht liegt es auch daran, dass es jetzt ziemlich viel Zeit kosten würde, in ein derart umfangreiches Statement einzusteigen und alles noch einmal aufzudröseln. Ich würde es immer noch als SQL-View hinterlegen. Mit den neuen SQL-Abfragemöglichkeiten in v1.7 sollte es dann sogar möglich sein, die Ergebnisse direkt aus der View abzufragen und ins Memo zu übertragen.
    Eine SQL-View hat den großen Vorteil, dass sie sich viel leichter administrieren lässt, als ein riesiges PQL-Statement in einem dafür eigentlich nicht gedachten Feld.
    Selbst “Loops” sollten übrigens möglich sein, evtl. per Stored Procedure. Aber aus dem Kopf reichen meine SQL-Kenntnisse dafür nicht aus.

    #3280
    ms
    Keymaster

    Das ganze könnte auch in einer db stored procedure verpackt und als custom function dem PQL dialakt bekannt gemacht werden. Dann könnte die funtion inkl. dem parameter beliebig per PQL aufgerufen werden. Jedoch müsste die stored procedure dann die ergebnissmenge konkatenieren und nur einen Wert zurückgeben.

    Viele Grüße,
    Christian

    #3309

    Hört sich aufwändig an! Wie lernt man das? Gibt es zu den Proceduren Anleitungen?

    #3311
    Stefan Reichelt
    Participant

    Die MSDN erklärt eine Menge, aber vielleicht hast du ja einen SQL-Experten zur Hand, der dir das alles live erklären kann? Ich behaupte mal, dass der autodidaktische Weg bei solchen Themen sehr zeitraubend ist.

    https://msdn.microsoft.com/de-de/library/ms345415%28v=sql.120%29.aspx?f=255&MSPPError=-2147217396

    #3325
    ms
    Keymaster

    Sobald die gewünschte Abfrage dann in einer SQL Server Function oder Stored Procdure eingebettet ist…

    Erstellen von benutzerdefinierten Funktionen
    https://msdn.microsoft.com/de-de/library/ms191320%28v=sql.120%29.aspx

    … kannst Du diese dann dem PQL (NHibernate) Dialekt bekanntmachen.
    Das wäre dann ein passender Eintrag in der Wendia.POB.exe.custom.config.

    Beispiel

    <sqlDialectSettings>
        <dialects>
          <add database="mssql">
            <clear/>
            <add name="helloworld" sqlFunctionType="SQLFunctionTemplate" returnType="String" expression="dbo.helloworld(?1)"/>
          </add>
        </dialects>
      </sqlDialectSettings>

    Gruß aus MUC,
    Christian

Viewing 8 posts - 1 through 8 (of 8 total)
  • You must be logged in to reply to this topic.