1

Temat: Zmiana funkcji na postgresową

Witam
W bazie Accessa mam taką funkcję, chciałbym przenieść ja do postgresa ale nie wiem jak rozwiązać problem "strKryterium " i IF-ów po wykonaniu select-a, czy każde pole powinienem przekazywać do INTO zmienna i pozniej ja sprawdzać żeby sprawdzić stan akceptacji urlopu ??

z góry dzieki za pomoc
AdamP.

Function urlopAkceptacja(zm_pracownik_id, zm_nr_kolejny) As String

Dim recSet1 As ADODB.Recordset
Dim strSQL1, strKryterium As String
Set recSet1 = New ADODB.Recordset

    If zm_nr_kolejny = 1 Then
           strKryterium = "nr_pracownika=" & zm_pracownik_id
           strKryterium = strKryterium & " And nr_kolejny = 1"
     Else
        strKryterium = "nr_pracownika=" & zm_pracownik_id
        strKryterium = strKryterium & " And nr_kolejny = " & zm_nr_kolejny
    End If
     
     
            strSQL1 = " SELECT urlop_akceptacja,urlop_kiedy_zaakcept,urlop_kiedy_wpisano,urlop_anulowanie FROM tbl_urlopy where " & strKryterium
                        recSet1.Open strSQL1, PolPostgres, adOpenKeyset, adLockOptimistic
   
                       
                                     If recSet1!urlop_anulowanie = "Anulowanie" Then 
                                          urlopAkceptacja = "Anulowanie urlopu"
                                     ElseIf recSet1!urlop_akceptacja = "Anulowany" Then
                                          urlopAkceptacja = "Anulowany"
                                         
                                     ElseIf recSet1!urlop_akceptacja = "TAK" Then
                                          urlopAkceptacja = "Zaakceptowany"
                                     ElseIf recSet1!urlop_akceptacja = "NIE" Then
                                        urlopAkceptacja = "Nie zaakceptowany"
                                         
                                      ElseIf IsNull(recSet1!urlop_akceptacja) And Not IsNull(recSet1!urlop_kiedy_wpisano) Then
                                          urlopAkceptacja = "W trakcie rozpatrywania"
                                     
                                          Else
                                      urlopAkceptacja = "Brak wniosku na urlop"
                                      End If
                           
   
End Function

2

Odp: Zmiana funkcji na postgresową

Na czym polega Twój problem z strKryterium? Też chyba musisz kleić i wykonać dynamiczne zapytanie.
Ten select zwraca wiele wierszy czy jeden? Jak jeden to if i elseif można do niego przeniesiec i zrobic INTO z CASE'ami.

3

Odp: Zmiana funkcji na postgresową

Chciałbym określić kryterium zapytania wg parametrów przekazywanych do funkcji. Jezeli nie da się tego określić w funkcji to bedę musiał warunek przygotować przed wywołaniem funkcji i podać jako parametr.
Zapytanie zwraca jeden wiersz

4

Odp: Zmiana funkcji na postgresową

No to pewnie będzie coś takiego

create or replace function urlopAkceptacja(zm_pracownik_id, zm_nr_kolejny) returns text as
$$
v_nr_kolejny text;
v_urlopAkceptacja text;
begin

select case 
                when urlop_anulowanie = 'Anulowanie'  then 'Anulowanie urlopu'
                when urlop_anulowanie = 'Anulowany'  then 'Anulowany'   
                when urlop_akceptacja = 'TAK' then 'Zaakceptowany'
                when urlop_akceptacja = 'NIE' then 'Nie zaakceptowany'
                when urlop_akceptacja is null and urlop_kiedy_wpisane is not null  then 'W trakcie rozpatrywania'
                else 'Brak wniosku na urlop' into v_urlopAkceptacja
           end 
FROM tbl_urlopy where  nr_pracownika=zm_pracownik_id and nr_kolejny=zm_nr_kolejny;

return v_urlopAkceptacja;

end;
$$
language 'plpgsql';

Tylko póki co nie ma pod ręką postgresa żeby w sprawdzić poprawność składni.

Ostatnio edytowany przez rski (2010-05-07 19:58:35)

5

Odp: Zmiana funkcji na postgresową

Dzieki, zaraz sprawdze, na takie rozwiazanie bym nie wpadł.

A czy na tego IF-a z strkryterium coś sie poradzi czy musze go określić przed wywołaniem funkcji i podac w argumencie np:

zmienna = nr_pracownika=1and nr_kolejny=1;

..function urlopAkceptacja(funk_zmienna) return ...

.......where funk_zmienna

end function


i wywołuje ją
select urlopAkceptacja(zmienna)

Bo tak sobie pomyślałem, że może zrobic podobnie jak ten case z

when urlop_anulowanie = 'Anulowanie'  then 'Anulowanie urlopu'

to może

case when zm_nr_kolejny = 1 then nr_pracownika:= zm_pracownik_id And nr_kolejny := 1 into jakas_zmienna i wtedy

po where podać:  .. where jakas_zmienna

tylko czy to ma sens i czy moge zrobić into jakas_zmienna jezeli to nie jest w instrukcji select zapytania ??

Nie wiem tylko czy jasno przelałem swoje myśli :-)

6

Odp: Zmiana funkcji na postgresową

strKryterium = "nr_pracownika=" & zm_pracownik_id
strKryterium = strKryterium & " And nr_kolejny = "&zm_nr_kolejny

7

Odp: Zmiana funkcji na postgresową

Może nie jasno się wyraziłem ale warunek zależy od zmiennej   zm_nr_kolejny, jeżeli jest 1 to zm_nr_kolejny=1, a jeżeli zm_nr_kolejny <>1 to wtedy bierze to co mu podaje np:2

Ale dzięki za pomoc, poniżej mam to co chciałem, jeszcze tylko dopracuje i bedzie ok.
Jeszcze jedno pytanie czy jest możliwość wykonania krokowego funkcji, ( w Accessie F8 ) aby po kolei sprawdzał co funkcja robi, jeżeli tak to w jakim edytorze i w jaki sposób to zrobić?



create or replace function urlopAkceptacja2(zm_pracownik_id integer, zm_nr_kolejny integer) returns text as
$body$
   declare
v_nr_kolejny integer;
v_urlopAkceptacja text;
begin

select case
                when urlop_anulowanie = 'Anulowanie'  then 'Anulowanie urlopu'
                when urlop_anulowanie = 'Anulowany'  then 'Anulowany'   
                when urlop_akceptacja = 'TAK' then 'Zaakceptowany'
                when urlop_akceptacja = 'NIE' then 'Nie zaakceptowany'
                when urlop_akceptacja is null and urlop_kiedy_wpisano is not null  then 'W trakcie rozpatrywania'
                else 'Brak wniosku na urlop' into v_urlopAkceptacja
           end
FROM tbl_urlopy where

case  when zm_nr_kolejny=1 then nr_pracownika=zm_pracownik_id and nr_kolejny=1
      else nr_pracownika=zm_pracownik_id and nr_kolejny=zm_nr_kolejny
end;

return v_urlopAkceptacja;

end;
$body$
language 'plpgsql';

8

Odp: Zmiana funkcji na postgresową

 
nr_pracownika=zm_pracownik_id and nr_kolejny=zm_nr_kolejny

9

Odp: Zmiana funkcji na postgresową

masz racje,
juz widze, musze chyba zrobić urlop od komputera.

ten CASE jest bez sensu w tym miejscu czy dlatego że sam warunek jest bez sensu?

taki miałby sens ?

when zm_nr_kolejny=1 then nr_pracownika=zm_pracownik_id and nr_kolejny=2 ....

10

Odp: Zmiana funkcji na postgresową

Ta operacja CASE jest niepoprawna składniowo mi się wydaje. CASE to taki IF który możesz użyć w SELECT.

11

Odp: Zmiana funkcji na postgresową

Ok, to co bys proponował żeby zrobić ten warunek w zapytaniu (strkryterium) jaki on by nie był, ale żeby jakiś był dla przykładu, jeżeli CASE nie jest odpowiedni to jak to rozwiązać.
Wiem że truje, ale wole się czegos dowiedzieć niż tworzyć cos bez zrozumienia i na oslep.

12

Odp: Zmiana funkcji na postgresową

?!
Tylko że żaden warunek na strKryterium nie jest tu potrzebny.
Już napisaliśmy że zamiast CASE/IF wystarczy napisać

nr_pracownika=zm_pracownik_id and nr_kolejny=zm_nr_kolejny

i już się z tym zgodziłeś. A jak spojrzysz na funkcję którą zaproponowałem to zauważysz że ten warunek umieściłem w zapytaniu SELECT.
Więc funkcja którą Ci podałem powinna robić dokładnie to samo co twoja funkcja, bez żadnych dodatkowych if'ów i case'ów.
Czy przeanalizowałeś dokładnie funkcję, którą napisałem i to jak działa? Jeśli nie, to zrób to i napisz jeśli nie będzie działała poprawnie. Jeśli natomiast już sprawdziłeś jak działa i masz jakieś konkretne uwagi do jej działania to napisz te uwagi tu.

13

Odp: Zmiana funkcji na postgresową

Jeżeli chodzi o tę funkcje to jest wszystko ok i juz o niej nie mówimy.
Pytam na przyszłość gdyby w innej funkcji zaszła potrzeba zastosowania jakiegokolwiek warunku w zapytaniu. Jeżeli piszesz że IF byłby lepszy to zakładm, że tak było by dobrze.

........where
IF zm_nr_kolejny=111 then
       nr_pracownika=zm_pracownik_id and nr_kolejny=654
else
       nr_pracownika=zm_pracownik_id and nr_kolejny=zm_nr_kolejny
END IF

14

Odp: Zmiana funkcji na postgresową

IF zm_nr_kolejny=111 then
       nr_pracownika := zm_pracownik_id;
       nr_kolejny := 654
else
       nr_pracownika := zm_pracownik_id;
       nr_kolejny := zm_nr_kolejny
END IF

15

Odp: Zmiana funkcji na postgresową

Super, że sie rozumiemy i dzięki za wyrozumiałość

Jeszcze tylko powtórze swoje wcześniejsze pytanie czy jest możliwość wykonania krokowego funkcji, ( w Accessie F8 Step Into) aby po kolei zobaczyc co funkcja robi i jakie przyjmuje wartości, jeżeli tak to w jakim edytorze i w jaki sposób to zrobić?

16

Odp: Zmiana funkcji na postgresową

17

Odp: Zmiana funkcji na postgresową

Dzięki, potestuję.

Jeżeli mi coś z tego wyjdzie to się tym podzielę