Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Sumowanie po każdych dwóch rekordach wyciągniętych z bazy

wazi 23 Mar 2010 22:03 1626 9
  • #1
    wazi
    Level 12  
    Witam

    Przygotowuję aplikację do tworzenia dokumentacji pielęgniarskiej. Jednym z formularzy jest bilans dobowy płynów. Pielęgniarka na zmianie nocnej oraz zmianie dziennej wprowadza dane. Czyli dziennie dodają dwa wpisy. Dnia następnego sytuacja się powtarza, aż do momentu wypisania pacjenta.
    Na raporcie pobierane są wszystkie rekordy dot. bilansu płynów z danego pobytu. Chodzi o to, żeby po każdych dwóch rekordach (czyli zmianie dziennej i nocnej) wstawić dodatkowy wiersz, w którym znajdzie się podsumowanie dwóch wierszy powyżej. Mniej więcej jak na zrzucie poniżej (z ręki dodałem ten wiersz dla zobrazowania problemu, żółty kolor).
    Dodatkowo zrobiłem jeszcze łamanie strony po określonej przez użytkownika liczbie rekordów żeby nie łamało mi w połowie wiersza.



    Z góry dziękuję za wszelkie podpowiedzi.

    Code:

          echo "<table cellpadding=5 cellspacing=0 border=1 align=center width=1000>".
          "<tr><td colspan=3><strong>Oddział:</strong> ".$oddzial['nazwa_oddzialu']."</td><td colspan=4><strong>Nazwisko i imię: </strong>".$pacjent['nazwisko']." ".$pacjent['imie']."<br />
          <strong>Nr Ks. Gł.: </strong>".$pobyt['nr_ksiegi_gl']."</td></tr>".
          "<tr><th>Data</th>".
          "<th>Dyzur</th>".
          "<th>Il.przyj. plynów dozylnie</th>".
          "<th>Il.przyj. plynów doustnie</th>".
          "<th>Razem</th>".
          "<th>Il.wydalonego moczu</th>".
          "<th>Uwagi</th></tr>";
           
          for($i=0;$i<mysql_num_rows($result);$i++)
          {
            $row=mysql_fetch_array($result);
             
            if ($i != 0 && $i % $_SESSION['druk_il_rek_bilans_dobowy_plynow']== 0)
            {
               echo "</table>";
               echo "<div style='page-break-before:always; padding-bottom:40px;' align=center><img src=img/logo.jpg></div>";
               echo "<table cellpadding=5 cellspacing=0 border=1 align=center width=1000>".
               "<tr height=0><th>Data</th>".
               "<th>Dyzur</th>".
               "<th>Il.przyj. plynów dozylnie</th>".
               "<th>Il.przyj. plynów doustnie</th>".
               "<th>Razem</th>".
               "<th>Il.wydalonego moczu</th>".
               "<th>Uwagi</th></tr>";
            }

            echo "<tr align=center><td>".puste_pole($row['data'],'-')."</td>".
            "<td>".puste_pole($row['dyzur'],'-')."</td>".
            "<td>".puste_pole($row['il_przyjetych_plynow_dozylnie'],'-')."</td>".
            "<td>".puste_pole($row['il_przyjetych_plynow_doustnie'],'-')."</td>".
            "<td>".puste_pole($row['razem'],'-')."</td>".
            "<td>".puste_pole($row['il_wydalonego_moczu'],'-')."</td>".
            "<td>".puste_pole($row['uwagi'],'-')."</td>".
            "</tr>";
          }
           
          echo "</table>";


    Sumowanie po każdych dwóch rekordach wyciągniętych z bazy
  • #3
    wazi
    Level 12  
    licznik ustawiłem, co 3 wiersz wstawia mi pusty wiersz, tylko nie mam pojęcia jak te sumy zrobić. Jakie zapytanie żeby pobrał z dwóch poprzednich sumę.
  • Helpful post
    #5
    arnoldziq
    Moderator of Programming
    Skoro pokazujesz sumę elementów z jednego dnia, to zrób automatyczną suma na podstawie daty.

    --EDIT--

    Możesz użyć czegoś takiego, tylko dostosuj nazwy tabel i pól.
    Code:
    SELECT DISTINCT (`data`)as data1, (SELECT sum(wartosc) as SUMA FROM `test` WHERE data=data1) FROM `test` WHERE 1
  • #6
    wazi
    Level 12  
    Dzięki serdeczne, obydwa sposoby dobre :)
    A ja się męczę z tym od paru dni.

    Nie ma jak to elektroda, na innych forach nikt nie potrafił pomóc.

    Pozdrawiam serdecznie :)
  • #7
    Dżyszla
    Level 42  
    Arnoldziq - fajne rozwiązanie z tym SQLem, sprytne, choć troszkę przedobrzone :) Jednak jeśli jednym zapytaniem wyciąga się tabelę i w pętli PHP ją tworzy, to to raczej mało przydatne będzie. Choć teoretycznie można tak robić (zapytanie w środku przetwarzania wyników jednego), to jednak bardzo mało wydajne w porównaniu do sumowania zmiennych w PHP.

    Jeśli jednak już chcemy coś takiego zapytaniem, to myślę, że bardziej optymalne będzie:
    Code:
    SQL `data`,SUM(`wartosc1`),SUM(`wartosc2`) FROM `tabela` GROUP BY `data`
  • #8
    arnoldziq
    Moderator of Programming
    Dżyszla wrote:
    Arnoldziq - fajne rozwiązanie z tym SQLem, sprytne, choć troszkę przedobrzone :) Jednak jeśli jednym zapytaniem wyciąga się tabelę i w pętli PHP ją tworzy, to to raczej mało przydatne będzie.


    To miał być tylko przykład metody którą można użyć, a nie gotowe rozwiązanie. W tym konkretnym przypadku i tak trzeba wywoływać skrypt liczący sumę elementów dla konkretnej daty i, zgaduję, ograniczony do jednej osoby/pacjenta.
  • #9
    wazi
    Level 12  
    zrobiłem to w taki sposób, za pomocą zmiennych pomocniczych.
    do zmiennej wstawiam sumę aktualnego rekordu w pętli oraz poprzedniego
    i po każdych dwóch iteracjach nowy wiersz.
    jak narazie się sprawdza:)
    raz jeszcze dziękuję za pomoc.

    Code:

    $razem[$i]=$row_select_poprzednie['razem'];
    $suma=$razem[$i]+$razem[$i-1];

    if ($i != 0 && $i % 2== 0) {
        echo "<tr style='font-weight:bold'><td colspan=2 align=right><strong>RAZEM: </strong></td><td colspan=4 align=center>".$suma."</td></tr>";
    }
  • #10
    arnoldziq
    Moderator of Programming
    wazi wrote:
    zrobiłem to w taki sposób, za pomocą zmiennych pomocniczych.
    do zmiennej wstawiam sumę aktualnego rekordu w pętli oraz poprzedniego
    i po każdych dwóch iteracjach nowy wiersz.
    jak narazie się sprawdza:)


    Proszę pamiętać o możliwości, że dane nie będą wprowadzane w kolejności chronologicznej. W takim przypadku, bez dodatkowego sortowania, w/w metoda może dać niepoprawne wyniki.