Posiadamy w firmie dość nietypowy program klasy ERP.
Działa na niespotkanej dotąd przeze mnie bazie danych - DataFlex. (jeśli to w ogóle nazwa bazy?? na dysku wygląda to tak,że są pliki *.dat, które odpowiadają za poszczególne tabele bazy danych)
Próbuje wygenerować zestawienia w PHP korzystając oczywiście z danych zawartych w bazie danych. Podłączyć do tej bazy udało mi się tylko
za pomocą ODBC. Połączyłem sie z php za pomocą ADODB.
Mój problem polega na tym, że:
W skrypcie PHP wykonuje 3 zapytania SQL:
1. Wyciągam dane dotyczące zlecenia produkcyjnego
2. Dla danego zlecenia produkcyjnego sumuję wartości wykorzystanego materiału, chcąc uzyskać ogólny koszt.
3. Dla danego zlecenia produkcyjnego sumuję wartości robocizny, chcąc uzyskać wartość, którą musimy zapłacić pracownikom.
a teraz konkretnie:
<?php $sql="SELECT NR,ROK,NAZWA,ILOSC,ILOSC_ZRE FROM zb061 WHERE STATUS='P' AND DATAZ <= {d ".$_POST['rok']."-".$_POST['miesiac']."-".$_POST['dzien']."'}"; $rs=$db->Execute($sql); while(!$rs->EOF) { $sql="SELECT SUM(WART_Z) FROM zb034 WHERE ROK=".$rs->fields[1]." AND W_NR=".$rs->fields[0]." AND DATA <= {d '".$_POST['rok']."-".$_POST['miesiac']."-".$_POST['dzien']."'}"; $KosztMat=$db->GetOne($sql); $sql="SELECT SUM(WARTOSC) FROM zb166 WHERE NR_ZLEC=".$rs->fields[0]." AND ROK=".$rs->fields[1]." AND DATA <= {d '".$_POST['rok']."-".$_POST['miesiac']."-".$_POST['dzien']."'}"; $Robocizna=$db->GetOne($sql); $tabela->addRow($rs->fields); $rs->MoveNext(); } ?>
Z pól formularza wprowadzam datę do jakiego dnia w roku chce policzyć koszty zleceń. I tu sie pojawia mój problem.
O ile dla danych ze stycznia, lutego, marca jeszcze jakieś wyniki otrzymuję, to dla wyników np. z lipca (obecnie) nie mogę uzyskać żadnych wyników.
Uważam, że problem tkwi w wydajności. Wcześniej dostawałem komunikat :""Maximum execution time of 30 seconds exceeded" no to za pomocą funkcji set_time_limit(0); ustawiłem, żeby wykonywał sie do końca. Zmieniałem również ten parametr w php.ini
W ogóle problemy zaczęły sie kiedy pojawiło się drugie zapytanie w tym skrypcie. Zapytanie to sumuje wartość robocizny.. - ilość kasy, którą mamy zapłacić pracownikom za wykonanie czeogś tam (nieistotne) no i przypuszczam, że to tu gdzieś problem leży, bo tam jest strasznie dużo rekordów, które musi zsumować. (duża firma - dużo danych ) No i powtórze jeszcze raz, jeśli mam policzyć zlecenia na przykład do końca lutego to jest okej, trwa to chwile ale wynik uzyskuje, natomiast jeśli wybiore na przykład, że chce dostać wynik na dzień dzisiejszy to sie po minucie z haczykiem pojawia czysta strona w przeglądarce i nic...
Czy istnieje jakieś sensowne rozwiązanie, żeby jakoś to policzyć? Męczę się z tym od dwóch dni i szlag mnie trafia ;]
Zmieniałem pętle, kombinowałem w php.ini ( zwiększyłem co sie dało ), przeglądałem logi, i efekt ostatecznie mam taki, że liczy mi coś.. liczy liczy.. liczy..
trwa to minute z kawałkiem... i pokazuje mi się czysta biała strona w przeglądarce (Firefox) a na pasku stanu na dole pokazuje, że niby Zakończono.
Tyle, że nic nie pokazuje. Wyników brak. O pomoc więc uprzejmie proszę ;]
Tak dla uzupełnienia wiadomości na temat tego problemu:
Okazuje się, że skrypt, gdy ma ustawiony set_time_limit(0); wykonuje się do końca.
U mnie problem polegał na tym, że po około minucie przeglądarka przestała reagować na skrypt.
Zauważyłem natomiast, że w procesach proces httpd bardzo intensywnie używa procesora ( nawet po zatrzymaniu działania przeglądarki )
I rzeczywiście, wyniki obliczeń zapisywałem do pliku, nie wyświetlałem ich na ekran. I gdy przeglądarka przestała działać plik dalej rósł - skrypt
dalej liczył co trzeba.