WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Dynamiska rapporter med rapportmotor (https://www.wn.se/forum/showthread.php?t=1042070)

qson 2010-05-16 18:19

Dynamiska rapporter med rapportmotor
 
Hej!
Håller på med ett "statistik"-verktyg (webbapplikation) som kommer generera dynamiska rapporter (t.ex. mha. BIRT eller Crystal Reports). Har dock ett tankeproblem vad gäller detta:
Den mesta av informationen finns i en databas så där är det ju inga problem med koppling till rapporterna, men viss data genereras/beräknas av PHP.

Exempel:
Har en tabell med bokningar (något förenklat):
PHP-kod:

Bokn.nr         Namn                Ankomst         Avresa          Antal personer
12345           Anders Andersson    2010
-06-20      2010-06-25      2
12347           Bertil Bertilsson   2010
-06-18      2010-06-22      3
12349           Cecilia Caesarson   2010
-06-23      2010-06-28      1 

Den statistik jag vill ha fram är antal personer "dag för dag", vilket utifrån ovanstående skall bli följande:
PHP-kod:

Datum           Antal bokningar     Antal personer      (Kommentar)
2010-06-18      1                   3                   (12347)
2010-06-19      1                   3                   (12347)
2010-06-20      2                   5                   (12347+12345)
2010-06-21      2                   5                   (12347+12345)
2010-06-22      2                   5                   (12347+12345)
2010-06-23      1                   2                   (12345)
2010-06-24      2                   3                   (12345+12349)
2010-06-25      2                   3                   (12345+12349)
2010-06-26      1                   1                   (12349

Denna data skall ligga till grund för rapporten.

Frågan är hur denna data skall lagras för att vara tillgänglig i rapporten?
Skall jag skapa en ny tabell (Temp) i databasen och lagra infon där?
Hur länge skall den då ligga där? Dessutom ändrar sig dessa siffror efter hand så de måste räknas om vid varje visning.

Tänker jag fel?

KarlRoos 2010-05-16 18:35

1. Hämta alla rader mellan de datumen du vill få en rapport för och sortera dem i datumordning.
2. Loopa igenom dessa och spara dem i en array:

Kod:

$array = array();
while($item = mysql_fetch_assoc()){

  if(isset($array[$item['date']]){
    $array[$item['date']]['num_bookings']++;
    $array[$item['date']]['num_people'] = $array[$item['date']]['num_people'] + $item['num_people'];
    $array[$item['date']]['comment'][] = $item['booking_no'];
  }
  else{
    $array[$item['date']] = array(
    'num_bookings' => 1,
    'num_people' => $item['num_people'],
    'comment' => array($item['booking_no'])
  );
  }
}

3. Dra en print_r() på $array så skall du se att du har all data som du behöver.

OBS. ingen aning om koden fungerar, skrev den här direkt i fältet. Hoppas att den är någorlunda självförklarande ändå.

qson 2010-05-17 09:28

Jo, den koden har jag och den fungerar.
Mitt PHP-skript hämtar och behandlar datan som jag beskriver ovan. Min fråga är hur jag skickar detta till rapporten (som normalt läser ur databas/tabell).

För tillfället genererar PHP en HTML-tabell som presenterar detta, men jag skall gå över till att använda en rapportgenerator (t.ex. BIRT eller Crystal Reports) och behöver då veta hur jag får datan dit.

Conny Westh 2010-05-19 14:29

Du bör lösa detta med "GROUP BY" i SQL

Jag vet inte hur din tabell är organiserad men en gissning skulle bli

Kod:

SELECT *
FROM
(
    SELECT [Datum],Sum([Antal bokningar]) AS [Antal bokningar],Sum([Antal personer]) AS [Antal personer]
    FROM Tab2
    GROUP BY [Datum],[Antal bokningar],[Antal personer]
) AS Tab1

Ungefär något sånt....

qson 2010-05-19 16:11

Ja, det hade varit fint att lösa det så. Tror dock inte att SQL klarar det. I mitt första inlägg visas hur min tabell ser ut, och hur jag vill omvandla den:

PHP-kod:

Bokn.nr         Namn                Ankomst         Avresa          Antal personer
12345           Anders Andersson    2010
-06-20      2010-06-25      2
12347           Bertil Bertilsson   2010
-06-18      2010-06-22      3
12349           Cecilia Caesarson   2010
-06-23      2010-06-28      1 

Resultatet jag vill åt:
PHP-kod:

Datum           Antal bokningar     Antal personer      (Kommentar)
2010-06-18      1                   3                   (12347)
2010-06-19      1                   3                   (12347)
2010-06-20      2                   5                   (12347+12345)
2010-06-21      2                   5                   (12347+12345)
2010-06-22      2                   5                   (12347+12345)
2010-06-23      1                   2                   (12345)
2010-06-24      2                   3                   (12345+12349)
2010-06-25      2                   3                   (12345+12349)
2010-06-26      1                   1                   (12349

Alltså:
Jag har exempelvis en rad i min tabell:
PHP-kod:

12345           Anders Andersson    2010-06-20      2010-06-25      2 

Denna (enstaka bokning) omvandlas till:
PHP-kod:

Datum                        Antal personer
2010
-06-20                         2
2010
-06-21                         2
2010
-06-22                         2
2010
-06-23                         2
2010
-06-24                         2
2010
-06-25                         2 

Samma sak görs för varje bokning. Sedan summeras datumen för sig (antal personer, antal bokningar osv). Nu har jag istället en lista med datum istället för en lista med bokningar.


Alla tider är GMT +2. Klockan är nu 01:41.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson