Announcement

Collapse
No announcement yet.

Urlaubsplaner erstellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Urlaubsplaner erstellen

    Hallo Ich habe folgende Aufgabenstellung.

    Ich soll eine Urlaubsmatrix erstellen , wann welche Mitabeiter im Urlaub sind. Dazu habe ich pro Mitarbeiter einen Datensatz in dem steht z.B
    Meier Urlaub von 25.06.2010 bis 06.07.10
    Bauer Urlaub vom 3.07..2010 bis 02.08.2010 usw.

    Nun soll ich eine Matrix erstellen die folgender maßen aussieht.

    Name 1.7 2.7 3.7 4.7 5.7 6.7 ...2.8
    Meier U U U U U U
    Bauer U U U usw.

    Meine jetzige Matrix sieht aber so aus.

    Monat 3.7 6.7 2.8
    Meier U
    Bauer U U

    Wie kann ich es ralisieren dass ich die erste Matrix erstellen kann. Ich brauche irgendwelche Dummy informationen .
    Vielen Dank
    Zuletzt editiert von hpr; 18.06.2010, 12:47.

  • #2
    100%ig bin ich aus der Frage nicht schlau geworden, warum geht z.B. die Matrix erst am 1.7. los, wenn Meier schon am 25.6. Urlaub hat?
    Vermutlich suchst Du einen Generator, der die Kalendertage eines Bereiches generiert. Falls in der Tabelle Datumswerte (hoffentlich!) abgelegt sind, kann dazu ein einfacher Ansatz benutz werden :
    Code:
    WITH datumsbereich AS
      (SELECT to_date('01.07.2010','DD.MM.YYYY') startdat, to_date('02.08.2010','DD.MM.YYYY') enddat FROM dual)
    SELECT startdat+level-1 FROM datumsbereich, dual CONNECT BY level<=(enddat-startdat)+1; 
    
    DAT
    --------------
    01.07.2010
    02.07.2010
    03.07.2010
    ...
    27.07.2010
    28.07.2010
    29.07.2010
    30.07.2010
    31.07.2010
    01.08.2010
    02.08.2010
    Verknüpft man diese Liste mit den tatsächlichen Urlaubstagen der Mitarbeiter (BETWEEN), hat man schon fast die Matrix.

    Comment


    • #3
      so sieht mein SQl bisher aus. Leider bin ich kein Experte in Sachen SQL

      Wo müßte ich denn deinen Vorschlag einbauen ?

      Danke

      SELECT exzeitpaare.mandant, exzeitpaare.persnr, to_date(exzeitpaare.datum,'yyyy-mm-dd' ) datum,
      exzeitpaare.kartennr, to_date(exzeitpaare.datumbis, 'yyyy-mm-dd' ) datumbis,
      exzeitpaare.verarbkzp, exzeitpaare.verarbkzz, exzeitpaare.sperrkz,
      zes32_personen.familienname, zes32_personen.vorname,
      zes32_personen.kostenst,
      zes32_personen.abteilung, zes32_personen.saldo1, zes32_personen.saldo2,
      zes32_personen.saldo3, exzeitpaare.zeitart
      FROM exzeitpaare, zes32_personen
      WHERE ( (exzeitpaare.mandant = zes32_personen.mandant)
      AND (exzeitpaare.persnr = zes32_personen.persnr)
      AND ((exzeitpaare.datumbis >= '2010-06-20'))
      AND ((exzeitpaare.mandant = '80'))
      AND ((exzeitpaare.zeitart = '512'))
      AND ((exzeitpaare.verarbkzz= 'OK'))
      )

      intersect
      SELECT exzeitpaare.mandant, exzeitpaare.persnr, to_date(exzeitpaare.datum,'yyyy-mm-dd' ) datum,
      exzeitpaare.kartennr, to_date(exzeitpaare.datumbis, 'yyyy-mm-dd' ) datumbis,
      exzeitpaare.verarbkzp, exzeitpaare.verarbkzz, exzeitpaare.sperrkz,
      zes32_personen.familienname, zes32_personen.vorname,
      zes32_personen.kostenst,
      zes32_personen.abteilung, zes32_personen.saldo1, zes32_personen.saldo2,
      zes32_personen.saldo3, exzeitpaare.zeitart
      FROM exzeitpaare, zes32_personen
      WHERE ( (exzeitpaare.mandant = zes32_personen.mandant)
      AND (exzeitpaare.persnr = zes32_personen.persnr)
      AND ((exzeitpaare.datum <= '2010-06-30'))
      AND ((exzeitpaare.mandant = '80'))
      AND ((exzeitpaare.zeitart = '512'))
      AND ((exzeitpaare.verarbkzz= 'OK'))
      )

      Comment


      • #4
        Ich persönlich denke dass pures SQL hier nicht zielführend ist. Du brauchst eine flexible Anzahl an Spalten und das lässt sich mit purem SQL nicht umsetzen.
        Ich würde so etwas eher in PL/SQL machen und das ganze dann als Text ausgeben bzw. die Daten gleich in einer vernünftigen Anwendung in die gewünschte Form transformieren.

        Comment


        • #5
          Ich denke, das INTERSECT kann zugunsten eines AND entfallen, einige Klammern sind überflüssig (Code-Tags machen das Lesen wesentlich einfacher).
          Code:
          SELECT exzeitpaare.mandant, exzeitpaare.persnr, 
                 to_date(exzeitpaare.datum,'yyyy-mm-dd' ) datum,
                 exzeitpaare.kartennr, 
                 to_date(exzeitpaare.datumbis, 'yyyy-mm-dd' ) datumbis,
                 exzeitpaare.verarbkzp, exzeitpaare.verarbkzz, exzeitpaare.sperrkz,
                 zes32_personen.familienname, zes32_personen.vorname,
                 zes32_personen.kostenst,
                 zes32_personen.abteilung, zes32_personen.saldo1, zes32_personen.saldo2,
                 zes32_personen.saldo3, exzeitpaare.zeitart
            FROM exzeitpaare, zes32_personen
           WHERE
             (      (exzeitpaare.mandant   = zes32_personen.mandant)
               AND  (exzeitpaare.persnr    = zes32_personen.persnr)
               AND ((exzeitpaare.datumbis >= '2010-06-20') AND (exzeitpaare.datum <= '2010-06-30'))
               AND ((exzeitpaare.mandant   = '80'))
               AND ((exzeitpaare.zeitart   = '512'))
               AND ((exzeitpaare.verarbkzz = 'OK'))
             );
          So in etwa könnte es gehen:
          Code:
          WITH buchungen AS
            (SELECT 'Meyer' name, to_date('2010-06-20','yyyy-mm-dd' ) datum, to_date('2010-06-30','yyyy-mm-dd' ) datumbis FROM dual UNION ALL
             SELECT 'Schulz'    , to_date('2010-06-10','yyyy-mm-dd' )      , to_date('2010-06-26','yyyy-mm-dd' )          FROM dual UNION ALL 
             SELECT 'Lehmann'   , to_date('2010-06-23','yyyy-mm-dd' )      , to_date('2010-07-05','yyyy-mm-dd' )          FROM dual),
             datumsbereich AS
            (SELECT min(datum) startdat, max(datumbis) enddat FROM buchungen)
           SELECT name, dat,
            CASE WHEN (dat between datum and datumbis) THEN 'U' ELSE '-' END urlaub 
             FROM BUCHUNGEN, (SELECT startdat+level-1 dat, level lv  FROM datumsbereich CONNECT BY level<=(enddat-startdat)+1)
            ORDER BY dat, name;
          
          NAME      DAT         URLAUB
          ------------------------------------------
          Lehmann	10.06.2010	-
          Meyer	10.06.2010	-
          Schulz	10.06.2010	U
          Lehmann	11.06.2010	-
          Meyer	11.06.2010	-
          Schulz	11.06.2010	U
          Lehmann	12.06.2010	-
          Meyer	12.06.2010	-
          ...
          Schulz	03.07.2010	-
          Lehmann	04.07.2010	U
          Meyer	04.07.2010	-
          Schulz	04.07.2010	-
          Lehmann	05.07.2010	U
          Meyer	05.07.2010	-
          Schulz	05.07.2010	-
          [code]

          Comment


          • #6
            Das

            Code:
            Name 1.7 2.7 3.7 4.7 5.7 6.7 ...2.8
            Meier U U U U U U
            Bauer U U U usw.
            ist nicht

            Code:
            NAME      DAT         URLAUB
            ------------------------------------------
            Lehmann	10.06.2010	-
            Meyer	10.06.2010	-
            Schulz	10.06.2010	U
            Lehmann	11.06.2010	-
            Meyer	11.06.2010	-
            Schulz	11.06.2010	U
            Lehmann	12.06.2010	-
            Meyer	12.06.2010	-
            ...
            Schulz	03.07.2010	-
            Lehmann	04.07.2010	U
            Meyer	04.07.2010	-
            Schulz	04.07.2010	-
            Lehmann	05.07.2010	U
            Meyer	05.07.2010	-
            Schulz	05.07.2010	-
            Wenn die Formatierung auch anders sein darf gehts natürlich schon. Aber die untere Version ist denke ich nicht mehr einfach so lesbar. Die obere schon.

            Comment


            • #7
              Urlaubsplaner

              fanderlf hat auf der der einen Seite schon recht, aber ich würde das SQL mit den Reporting Services 2008 ausführen und wenn ich dann einen matrix Report machen würde, könnte es schon so aussehen wie ich will , aber ...

              Ich habe noch ein ganz anderes Problem, ich weiß nicht genau an welche Stelle ich die Lösung einbauen muss .

              Ich habe den ersten Vorschlag vum JUM verstanden mit der Verknüpfung AND statt zwei Abfragen, aber wo kommt die Tabelle exzeitpaare ins Spiel

              WITH buchungen AS
              (SELECT 'Meyer' name, to_date('2010-06-20','yyyy-mm-dd' ) datum, to_date('2010-06-30','yyyy-mm-dd' ) datumbis FROM dual UNION ALL
              SELECT 'Schulz' , to_date('2010-06-10','yyyy-mm-dd' ) , to_date('2010-06-26','yyyy-mm-dd' ) FROM dual UNION ALL
              SELECT 'Lehmann' , to_date('2010-06-23','yyyy-mm-dd' ) , to_date('2010-07-05','yyyy-mm-dd' ) FROM dual),
              datumsbereich AS


              Was bedeutet "WITH Buchungen AS" ist statt buchung die exzeitpaare gemeint.

              Es tut mir leid, dass ich so einfache Fragen stelle, aber ich kann's nicht ändern. Sorry

              JUM hat sich schon sehr viel Mühe gegeben.

              Hrüße hpr

              Comment


              • #8
                Jupp, da ich Deine Tabelle nicht habe, musste ich sie durch das
                Code:
                 WITH buchungen
                simulieren, ich habe einfach ein paar sinnvolle Werte eingetragen...
                Besser ist, wenn zu einer Frage gleich ein Testbeispiel "mitgeliefert" wird...

                Also mein
                BUCHUNGEN
                steht für Dein
                SELECT ... FROM exzeitpaare, zes32_personen WHERE ...

                Wenn Du das Prinzip verstanden hast, kannst Du den Row-Generator exakt so an Dein SELECT anbauen, wie ich an die BUCHUNGEN.

                Comment

                Working...
                X