[PHP]petla w petli i petla i wszystko sie zapetla

0

Witam,

od jakiegos czasu nie moge sobie poradzic z pewna rzecza. Na papierze to jest sprawa banalna do obliczenia ale napisac to tak by program rozwazal rozne ewentualnosci to nie jest taka prosta sprawa mimo ze operuje na liczbach od 0-10 i dzialniach dodawanie i odejmowanie.

Wszystko jest banalne jak sobie rozrysowywuej algorytm ale jak zaczynam pisac to dochodze do momentu ze juz sie gubie a skutek jest taki ze zle mi sie wykonuja te obliczenia.

Prosze o pomoc.

Sprawa jest taka:

mam tabele z fakturami ktore sklep wystawia klientom nazywa sie ona 1_faktura_szczegol

i mam tabele z magazynem gdzie zapisywane sa przyjecia towaru nazywa sie ona magazyn

mam zrobic tak zeby po wybraniu ktoregos z przyjec wyswietlily mi sie wszystkie sprzedaze ktore przynaleza do tego przyjecia.
tzn.

w magazynie mam np
dokument | nr_dokumentu | idksiazka | ilosc przyjetych

wz 0004 1353 2
wz 0004 543 6
wz 5444 7895 3

a w fakturach mam
nr_faktury | id ksiazka | sprzedano

238 1353 5
3433 1353 1
544 543 3
455 543 3
35345 7895 1
555 7895 1

i teraz ma mi sie wyswietlic tak

dla dokumentu 0004
idksiazka | przyjeto | sprzedano | nr_faktury | data

 1353        -              -3                 06 czerwca
 1353        2              2                  01 czerwca
 543          6              3                  20 maja
 543          6              3                  15 maja

czyli ma brac nr dokumentu patrzec idksiazki i wyszukac wszystkie z takim id z tabeli faktur i wtedy ma przyporzadkowac liczbe sprzedanych ksiazek z faktury do danej dostawy.
Z tym ze, dostawy moze nie byc a ksiazki moga byc sprzedane, dostawa moze nie wystarczyc na sprzedane ksiazki, poza tym jedna faktura sprzeedazyu moze obejmowac 2 lub wiecej dostaw jednoczesnie. Np gdy ktos by kupil 30 ksiazek a dostaw bylo kilka w takich ilosciach 10, 15, 2,3 tyo wtedy wszystkie te dostawy obejmuja tylko jedna spzedaz

Wymyslilam wiec dodatkowa tabele ktora przy sprzedazy i przy dostawie bedzie sie na biezaco uzupelniac. Jednak wykonanie wlasnie takich petli gdy zostaje reszta , gdy przyjecie nie wystarcza na sprzedaz, badz sprzedaz obejmuje kilka dostaw calkowicie wybija mnie w momencie gdy petle nalezy wykonac od nowa.
Moze na to jest jakis sposob??

Nie wiem ale prosze o pomoc.
wklejam tu moje ostatnie wypociny, a wersji bylo mnostwo. To tez nie =dziala jak nalezy ale od czegos trzeba zaczac zeby przeanalizowac problem.

Niech sie ktos nade mna zlituje i mi pomoze :)

////zapisanie do tabeli przyjeto-sprzedano
        $query = "select * from 1_faktura_szczegol where nr_zamowienia='".$_GET['zamowienie']."' "; echo $query;
        $result = mysql_query($query);
        while($row = mysql_fetch_array($result)) //wyswietlamy wszystkie sprzedane ksiazki
        {
             $sprzedano_teraz    = $row['ilosc'];
             $idksiazka          = $row['idksiazka'];
             $id_sprzedazy       = $row['nr_zamowienia'];
             echo $idksiazka ;

             $query1 = "select * from magazyn_przyjeto_sprzedano where idksiazka='".$idksiazka."' order by id DESC ";  echo  $query1 ;
             $result1 = mysql_query($query1);
             $rows = mysql_num_rows($result1);


             if($rows>0)
             {
                  $row1 = mysql_fetch_array($result1);
                  //dane ostatniego dopisanego rekordu do magazyn_przyjeto_sprzedano
                  $id_dostawy1   = $row1['id_dostawy'];
                  $przyjeto1     = $row1['przyjeto'];
                  $sprzedano1    = $row1['sprzedano'];
                  $id_sprzedazy1 = $row1['id_sprzedazy'];

                  $id_dostawy_ostatni   = $row1['id_dostawy'];
                  //tu petla po tablicy z przyjeciami
                  $query3       = "select * from magazyn where idksiazka='".$idksiazka."' order by data ASC";     echo  $query3 ;
                  $result3      = mysql_query($query3);
                  $rows         = mysql_num_rows($result1);

                  while($row3   = mysql_fetch_array($result3))
                  {
                       echo $row3['idmagazyn'].'<br />';
                       echo $id_dostawy_ostatni.'<br />';
                       if($row3['idmagazyn'] >= $id_dostawy_ostatni  )
                       {

                            while($reszta != '')
                            {
                                    if($reszta != '')
                                    {
                                         $sprzedano_teraz = $reszta;
                                         $id_dostawy1     = $row3['idmagazyn'];
                                         $przyjeto1       = $row3['ile_przyjete'];
                                         $id_sprzedazy1   = $row['nr_zamowienia'];
                                    }

                                    $sprzedano = $sprzedano1+$sprzedano_teraz;
        
                                    if( $rows == 1)
                                    {
                                        $query22  = "insert into magazyn_przyjeto_sprzedano values ('', '".$idksiazka."', '".$id_dostawy1."', '".$przyjeto1."', '".$sprzedano."', '".$id_sprzedazy1."', '".$data."')"; echo  $query22.'-----1<br />';
                                        $result22 = mysql_query($query22);
                                        $reszta   = '';
                                    }
                                    elseif($sprzedano > $przyjeto1)
                                    {
                                        $sprzedano = $przyjeto1;
                                        $reszta    = $przyjeto1 - $sprzedano;
                                        $query22   = "insert into magazyn_przyjeto_sprzedano values ('', '".$idksiazka."', '".$id_dostawy1."', '".$przyjeto1."', '".$sprzedano."', '".$id_sprzedazy1."', '".$data."')"; echo $query22.'-----2<br />';
                                        $result22  = mysql_query($query22);
                                    }
                                    elseif($sprzedano <= $przyjeto1)
                                    {
                                        $query22  = "insert into magazyn_przyjeto_sprzedano values ('', '".$idksiazka."', '".$id_dostawy1."', '".$przyjeto1."', '".$sprzedano."', '".$id_sprzedazy1."', '".$data."')"; echo $query22.'-----4<br />';
                                        $result22 = mysql_query($query22);
                                        $reszta   = '';
                                    }

                            }
                            
                       }

                       $rows--;
                  }



             }
             else
             {
                $query3       = "select * from magazyn where idksiazka='".$idksiazka."' order by data DESC";     echo  $query3 ;
                $result3      = mysql_query($query3);
                $row3         = mysql_fetch_array($result3);


                $przyjeto1    = $row3['ile_przyjete'];
                $id_dostawy1  = $row3['idmagazyn'];
                $id_sprzedazy1= $row['nr_zamowienia'];
                
                if($przyjeto1 == '') { $przyjeto1 = 0; }
                
                $sprzedano    = $sprzedano_teraz;

                $query22 = "insert into magazyn_przyjeto_sprzedano values ('', '".$idksiazka."', '".$id_dostawy1."', '".$przyjeto1."', '".$sprzedano."', '".$id_sprzedazy1."', '".$data."')"; echo $query22.'------3<br />';
                $result22 = mysql_query($query22);
             }

        }



0

jakoś nie mogę zrozumieć skąd się biorą przedstawione przez Ciebie przykładowe wyniki
nie wiem skąd biorą się wspomniane dostawy bo w podanych tabelach (chyba?) nie ma o nich mowy
wg mnie musisz dokładniej opisać strukturę danych i operacji, które oczekujesz od programu, aby ktoś był w stanie Ci pomóc

0

Tak, opisze to dokladniej.

tabela magazyn:
CREATE TABLE magazyn (
idmagazyn int(11) NOT NULL auto_increment,
idksiazka int(11) NOT NULL default '0',
stan int(11) NOT NULL default '0',
dokument varchar(250) NOT NULL default '',
nr_dokumentu varchar(250) NOT NULL default '',
rodzaj_platnosci varchar(25) default NULL,
data_rozliczenia date default NULL,
kto_przyjal varchar(250) NOT NULL default '',
ile_przyjete int(11) NOT NULL default '0',
ile_sprzedane int(11) NOT NULL default '0',
data datetime NOT NULL default '0000-00-00 0000',
naklad_wyczerpany int(11) NOT NULL default '0',
KEY idmagazyn (idmagazyn)
) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=1692 ;

tabela 1_faktura_szczegol
CREATE TABLE 1_faktura_szczegol (
id int(10) unsigned NOT NULL auto_increment,
nr_zamowienia int(11) NOT NULL default '0',
nr_faktury text NOT NULL,
idksiazka int(11) NOT NULL default '0',
PKWiU text NOT NULL,
ilosc int(11) NOT NULL default '0',
jm text NOT NULL,
cena_netto float NOT NULL default '0',
rabat float NOT NULL default '0',
cena_netto_rabat float NOT NULL default '0',
cena_netto_ilosc float NOT NULL default '0',
procent int(11) NOT NULL default '0',
kwota_podatku float NOT NULL default '0',
cena_brutto float NOT NULL default '0',
data date NOT NULL default '0000-00-00',
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=201941 ;

tabela wiazaca sprzedaz z dostawami
CREATE TABLE magazyn_przyjeto_sprzedano (
id int(10) unsigned NOT NULL auto_increment,
idksiazka int(11) NOT NULL default '0',
id_dostawy int(11) NOT NULL default '0',
przyjeto int(11) NOT NULL default '0',
sprzedano int(11) NOT NULL default '0',
id_sprzedazy int(11) NOT NULL default '0',
data datetime NOT NULL default '0000-00-00 0000',
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=1 ;

na tych trzech tabelach mam operowac. Tzn moze ktos bedzie mial jakis inny lepszy pomysl w kazdym razie w tabeli magazyn sa dostawy a w tabeli faktury jest sprzedaz towaru.

informacja od ktorej zaczyna sie cala sprawa jest nr dokumentu na jaki przyjeto towar.
Mam zrobic tak zeby przyporzadkowac sprzedaz do przyjecia. Tzn,

01 czerwca dostawa na faktura nr 0001
ilosc 2 idksiazka 10,
ilosc 5 idksiazka 20,
ilosc 6 idksizaka 30,
ilosc 8 idksiazka 40
02 czerwca dostawa na faktura nr 0002
ilosc 8 idksiazka 10,
03 czerwca dostawa na faktura nr 0003
ilosc 1 idksiazka 10,

natomiast sprzedaz wygladala nastepujaco
01 czerwca faktura nr 0020 ilosc 1 idksiazka 10
02 czerwca faktura nr 0021 ilosc 3 idksiazka 10
03 czerwca faktura nr 0022 ilosc 1 idksiazka 20
03 czerwca faktura nr 0023 ilosc 1 idksiazka 20
03 czerwca faktura nr 0024 ilosc 1 idksiazka 20
03 czerwca faktura nr 0025 ilosc 1 idksiazka 20
03 czerwca faktura nr 0026 ilosc 1 idksiazka 20

inne ksiazki zalozmy ze sie nie sprzedaly
to byl przyklad dostawy zapisanej w tabeli magazyn (niektore pola ominelam bo nie sa istotne)
i sprzedazy w tabeli faktura_szczegol

a teraz pokazuje jak to jest w panelu w zakladce magazyn

  1. wysietlamy wybrane ksiazki np wg wydawcy zeby zobaczyc stan w magazynie, np

tytul | sztuk
Potop 3
Pan Tadeusz 2
Lalka 1

  1. jak juz sie wyswietla te ksiazki ktore chcemy zobaczyc to mozemy sobie na wybrana ksiazke kliknac i wtedy pokazuje nam sie cala historai dostaw i sprzedazy tzn, np
    (zakladam ze Potop w moim przykladzie ma id=10-do tych przykladowych tabel powyzej)

tytul:.Potop, autr.Henryk Sienkiewicz , ISBN.......... sztuk 3

data przyjecia | dokument | nr dokumentu | ile przyjeto | kto przyjal | sprzedaz
03 czerwca faktura 0003 1 asia
02 czerwca faktura 0002 8 asia
01 czerwca faktura 0001 2 asia

no i to banal ok, ale teraz sie zaczyna jazda. Trzeba teraz obliczyc sprzedaz.
Brac najbardziej dawna dostawe porownac z najbardziej dawna faktura sprzedazowa czyli

dostawa
01 czerwca faktura 0001 2
spzredaz
01 czerwca faktura nr 0020 ilosc 1 idksiazka 10

tu juz widzimy na piewszy rzut oka ze zostala jedna, ale program tego nie wie wiec pierwsze warunki treba zasosowac. Trzeba zalozyc ze
po1 moze nie byc zadnej dostawy jeszcze,
po2 sprzedaz moze byc wyzsza niz dostawa wtedy reszta ma isc do nastepnej dostawy zeby odjac sie od nie ale takiej dostawy nie musi byc

dobra wracam do przykladu, za pierwszym przebiegiem petli powinno stac sie tak:

tytul:.Potop, autr.Henryk Sienkiewicz , ISBN.......... sztuk 3

data przyjecia | dokument | nr dokumentu | ile przyjeto | kto przyjal | sprzedaz
03 czerwca faktura 0003 1 asia
02 czerwca faktura 0002 8 asia
01 czerwca faktura 0001 2 asia faktura nr 0020-szt1

teraz bierzemy nastepna sprzedaz
ale dostawe ta sama bo zostala 1 ksiazka (2 z dostaway - 1 ze sprzedazy), zatem za drugim przebiegiem powinno byc:

tytul:.Potop, autr.Henryk Sienkiewicz , ISBN.......... sztuk 3

data przyjecia | dokument | nr dokumentu | ile przyjeto | kto przyjal | sprzedaz
03 czerwca faktura 0003 1 asia
02 czerwca faktura 0002 8 asia
01 czerwca faktura 0001 2 asia faktura nr 0021 - szt1
faktura nr 0020 - szt1

na fakture 0021 sprzedaly sie 3 ksiazki Potop ale na tej sdostawie byly tylko 2 a w dodatku jedna juz poszla wczesniej czyli zostala 1 wiec z tej dostawy zeszla tylko 1 ksiazka a 2 pozostale poszly na kolejna dostawe (ktorej wcale mogloby nie byc wtedy ksiazki bylyby na minisie 2) ale dostawa jest wiec za trzecim obiegiem petli powinno byc tak:

tytul:.Potop, autr.Henryk Sienkiewicz , ISBN.......... sztuk 3

data przyjecia | dokument | nr dokumentu | ile przyjeto | kto przyjal | sprzedaz
03 czerwca faktura 0003 1 asia
02 czerwca faktura 0002 8 asia faktura nr 0021 - szt2
01 czerwca faktura 0001 2 asia faktura nr 0021 - szt1
faktura nr 0020 - szt1

Wiecej sprzedazy w moim przykladzie nie ma, w kazdym razie stota zostala przedstawiona.

To jest jakby pierwszy wariant, nazwalam go "wariant 1 po idksiazka"
Drugi wariant ma dzialac po nr faktury dostawy, a ma to wygladac tak:

wyswietlamy wszytkie dokumenty dostaw, ktore chcemy zobaczyc np w jakims przedziale czasowym i uzyskujemy np:

01 czerwca dostawa na faktura nr 0001
02 czerwca dostawa na faktura nr 0002
03 czerwca dostawa na faktura nr 0003

wybieramy jakas fakture np 0001 i wtedy wyswietla sie nam:

ilosc 2 idksiazka 10,
ilosc 5 idksiazka 20,
ilosc 6 idksizaka 30,
ilosc 8 idksiazka 40,

yyyyyyyyyyyyy musze wyjsc dokoncze jak wroce :))

0

Z mojej strony (naprawdę bez złośliwości) proponuję kurs sql z naciskiem na JOIN(y). Ułatwi Ci to sprawę - nie będziesz się bawiła w pętle, a i w DBMS szybciej niż w php wszystko się wykona.

Powodzenia

0

Rozumiem, moze sie by i dalo w taki sposob wyszukac odpowiednie dane. Jednak ja stosowalam joiny i to nic nie dalo. To akurt podejrzewam wymaga innego podejscia. W kazdym razie poradzilam sobie. Stworzylam tabele do ktorej zapisuje w locie pozniej to ksauje. No nie wazne. Nie ma sensu tlumaczyc. W kazdym razie dalam sobie rade :))

Dziekuje ze chec pomocy :)) Pozdrawiam

0

W kazdym razie dalam sobie rade
Można by powiedzieć, że o to właśnie chodzi ;)
Ale też jest tak, że trzeba umieć zadawać pytania. Myślę, że jak ludzie zobaczyli Twój post (spagetti code), to po prostu go olali. Ja nie miałem ochoty zagłębiać się gdy zobaczyłem selecta w pętli while, który mógłby być zastąpiony z powodzeniem joinami. Wydaje mi się, że gdybyś zastosowała joiny kod, który wkleiłaś miał ze 2 pętle mniej i chętnych na przeanalizowanie go byłoby więcej. A tak musiałaś sobie dać radę sama.

0

masz racje tylko ze wlasnie braklo mi pomyslu jak zrobic to inaczej. Niektore problemy ciezko opisac w paru zdaniach.

Ale podzielam Twoj punkt widzenia i nie dziwie sie ze oddzew byl maly. Liczylam jednak, ze jednak ktos.... ale nie mam zalu ze sama musialam sobie dac rade

Pozdrawiam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1