mojaSymfonia FORUM https://forum.mix-soft.pl/ |
|
Procedura dok.sprzedaży. https://forum.mix-soft.pl/viewtopic.php?f=15&t=2904 |
Strona 1 z 1 |
Autor: | zz [ 2011-03-01, 12:44 ] |
Tytuł: | Procedura dok.sprzedaży. |
Witam. Przed wystawieniem f-ry sprawdzam kilka rzeczy i zauważyłem pewną (tak sądzę) nieścisłość. Ustawiam OnBeforeInsert=0 na początku i potem OnBeforeInsert=-6000 tylko wtedy, kiedy coś mi się nie zgadza. Mimo to system podkłada wartość zero jeśli któraś z funkcji nie zwróci -6000 i muszę sprawdzać ponownie wszystkie wartości. Czy jest na to jakaś metoda? Kod: int Sub OnBeforeInsertFVS(long lId) // faktura sprzedaży VAT OnBeforeInsertFVS = 0 OnBeforeInsertFVS = f1(lId) message "po f1" + using "%i", OnBeforeInsertFVS OnBeforeInsertFVS = f2(lId) message "po f2" + using "%i", OnBeforeInsertFVS OnBeforeInsertFVS = f3(lId) message "po f3" + using "%i", OnBeforeInsertFVS OnBeforeInsertFVS = f4(lId) message "po f4 " + using "%i", OnBeforeInsertFVS if f1(lId)==-6000 || f2(lId)==-6000 || f3(lId)==-6000 || f4(lId)==-6000 then OnBeforeInsertFVS=-6000 EndSub |
Autor: | sqza [ 2011-03-02, 11:44 ] |
Tytuł: | |
Przeglądając ten kod zauważyłem (mogę to stwierdzić z całą pewnością) jednoznaczny błąd w rozumowaniu. Twoje funkcje mogą dawać taki ciąg operacji: Kod: int zmienna zmienna = 0 zmienna = -6000 zmienna = 0 Na końcu tego ciągu operacji - zmienna ma wartość 0. Gdyby ciąg operacji wyglądał tak: Kod: int zmienna zmienna = 0 zmienna = 0 zmienna = -6000 Na końcu - zmienna ma wartość -6000. Ja nie widzę tu nic niewłaściwego - każdy język programowania (z tych które znam) tak działa ;P Rozwiązań tego zagadnienia jest wiele - jedno udało się Panu uzyskać - kod może wyglądać tak: Kod: int Sub OnBeforeInsertFVS(long lId) // faktura sprzedaży VAT OnBeforeInsertFVS = 0 if f1(lId)==-6000 || f2(lId)==-6000 || f3(lId)==-6000 || f4(lId)==-6000 then OnBeforeInsertFVS=-6000 EndSub Jak dla mnie bezsensem jest uruchamianie funkcji f1, f2, f3, f4 wielokrotnie - w wielu sytuacjach taka operacja może dać przy każdym uruchomieniu inny wynik (np jeżeli funkcja dokonuje jakiś modyfikacji w bazie to raz coś zmieni a następnym razem nie - i mamy klops ). |
Autor: | zz [ 2011-03-02, 12:21 ] |
Tytuł: | |
Witam panie A. :) Tak jak napisałem ustawiam zero na początku OnBeforeInsert i potem w poszczególnych procedurkach nie sprawdzam poprawności ale 'niepoprawność' i wtedy daję -6000. Więc skąd bierze się zero na wyjściu ? PS. Jak najbardziej wartość procedur może być inna za każdym razem (sprawdzam kilka niezależnych rzeczy np. datę wystawienia, opis, ...) i blokuję, jeśli coś jest nie OK. |
Autor: | rafal [ 2011-03-02, 22:25 ] |
Tytuł: | Re: Procedura dok.sprzedaży. |
zz pisze: [...] Kod: int Sub OnBeforeInsertFVS(long lId) // faktura sprzedaży VAT OnBeforeInsertFVS = 0 OnBeforeInsertFVS = f1(lId) message "po f1" + using "%i", OnBeforeInsertFVS OnBeforeInsertFVS = f2(lId) message "po f2" + using "%i", OnBeforeInsertFVS OnBeforeInsertFVS = f3(lId) message "po f3" + using "%i", OnBeforeInsertFVS OnBeforeInsertFVS = f4(lId) message "po f4 " + using "%i", OnBeforeInsertFVS if f1(lId)==-6000 || f2(lId)==-6000 || f3(lId)==-6000 || f4(lId)==-6000 then OnBeforeInsertFVS=-6000 EndSub Wykonujesz funkcje sprawdzające w kolejności f1...f4 Jeżeli f1 zwraca -6000 oznacza to, że możesz już przerwać sprawdzanie pozostałymi funkcjami bo masz już wystarczający powód aby nie kontynuować wystawiania dokumentu. A to dlatego, że jedna z kolejnych funkcji może zwrócić 0 i wcześniejsze przypisanie do OnBeforeInsertFVS wartości -6000 traci sens. może sprawdzaj te warunki w pętli if Kod: if OnBeforeInsertFVS = f1(lId) == -6000 then goto wyjdz if OnBeforeInsertFVS = f1(lId) == -6000 then goto wyjdz if OnBeforeInsertFVS = f1(lId) == -6000 then goto wyjdz if OnBeforeInsertFVS = f1(lId) == -6000 then goto wyjdz OnBeoreInsertFVS = 0 wyjdz: |
Autor: | zz [ 2011-03-03, 10:22 ] |
Tytuł: | |
Na pewno to zadziała, ale... .... ale chciałem, żeby komunikaty o wszystkich ew. błędach pojawiały się w jednym 'kroku' (czy użytk. je przeczyta, to już inna bajka). PS. Punkcik za podpowiedź stawiam :) |
Autor: | koronen [ 2011-03-03, 17:09 ] |
Tytuł: | |
Zamiast przypisywać wartość zwracanej funkcji do OnBeforeInsert możesz przypisywać ją do zmiennych trzecich, a potem sprawdzić czy którakolwiek ma wartość -6000. A najlepiej to upchaj wszystkie procedury do jednej, ładnie obsłuż wewnątrz i dopiero tą wrzuć do OnBeforeInsert |
Autor: | zz [ 2011-03-04, 08:49 ] |
Tytuł: | |
Fakt, to też niezły pomysł, ale... ...ale oprócz swoich mam też 'obce' procedurki i muszę je wywoływać oddzielnie. |
Autor: | koronen [ 2011-03-04, 11:08 ] |
Tytuł: | |
Obce procedurki przecież też możesz wrzucić do jednej swojej.... No albo pododawaj te zmienne |
Strona 1 z 1 | Strefa czasowa UTC+1godz. [letni] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |