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 :oops: :oops: ).

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/