Promotic

onItemBeforeWrite - zdarzenie obiektu PmaData

Opis:
Zdarzenie zostanie wywołane przed zapisem do (zmianą) wartości jednej zmiennej zdefiniowanej w karcie "Dane".
Parametry:
pMe(Object) Odniesienie do PmaData obiektu, w którym dane zdarzenie powstaje.
pEvent(Object) Odniesienie do obiektu zawierającego ściślejsze informacje o danym zdarzeniu.
pEvent.Item - (Object) [do odczytu] Obiekt PmVar zawierający informacje o zmiennej, w której dojdzie do zapisu (do zmiany)
pEvent.NewVal - (Variant) [do odczytu i zapisu] Nowa wartość zmiennej.
Taką wartość będzie mieć zmienna po zakończeniu tego zdarzenia.
pEvent.NewQuality - (Long) [do odczytu i zapisu] Nowa jakość zmiennej.
Taką jakość będzie mieć zmienna po zakończeniu tego zdarzenia.
Patrz właściwość PmVar.Quality.
Notatka:
Żeby doszło do wywołania tego zdarzenia dla określonej zmiennej jest konieczne:
- Wytwórz rozszerzenie danych ExtWriteAction w zmiennej.
- jawne zezwolenie wywołania tego zdarzenia (patrz konfigurator "ExtWriteAction > Rozszerzenie danych ExtWriteAction > Zdarzenie "onItemBeforeWrite"").
Tam również określa, czy zdarzenie zostanie wywołane przed każdym zapisem lub przed każdą zmianą wartości.
 
Jeżeli wywołanie zostanie dozwolone dla każdej zmiennej i dojdzie do zapisu do (zmiany) wszystkich zmiennych jednocześnie, wtedy zdarzenie zostanie wywołane dla każdej zmiennej osobno!
Zastosowanie tego zdarzenia jest stosowne na przykład do filtrowania zapisywanych wartości.
Właściwość pEvent.NewVal jest przeznaczona do odczytu i zapisu. Jeżeli do tego parametru zostanie zapisana nowa wartość, wtedy do zmiennej obiektu w rzeczywistości zostanie zapisana (po zakończeniu tego zdarzenia) wartość, która jest w tym parametrze.

Uwaga 1:
Jest zalecane stosowanie tego zdarzenia tylko dla specjalnych nieodzownie koniecznych przypadkach. Bowiem po zezwoleniu tego zdarzenia zapis wartości jest wewnętrznie wykonywany w bardziej skomplikowany sposób.
Jeżeli zapis został wywołany w wątku głównym, wtedy zdarzenie zostanie wywołane synchronicznie a zapis zostanie zakończony również synchronicznie.
Natomiast jeżeli zapis został wywołany z innego wątku (web, komunikacja, obiekt PmaSequencer), wtedy zdarzenie zostanie wywołane asynchronicznie, tzn. wywołanie tego zdarzenia oraz rzeczywisty zapis do zmiennej nie jest wykonywany bezpośrednio lecz dopiero po zakończeniu bieżącego skryptu. Opóźniony asynchroniczny zapisu spowoduje, że po zapisie do zmiennej wartość jeszcze nie znajduje się w zmiennej, czyli następny odczyt wartości (skrypt, trendy) zawiera poprzednią wartość.

Uwaga 2:
Zdarzenie zostanie wywołane tylko jeżeli zostanie wykonany rzeczywisty zapis (np. obiekt.Item(0).Value=3) do zmiennej - oznaczmy ją A.
Lecz jeżeli w zmiennej A jest zdefiniowane powiązanie danych (przy odczycie) do innej zmiennej B (w innym obiekcie) i zostanie wykonany zapis do zmiennej B, wtedy zmienna A nie dowie się o zmianie i dlatego zdarzenie nie zostanie wywołane (zmienna A dowie się o zmianie dopiero wtedy, aż ktoś będzie ją odczytywać - wtedy zostanie "wykonane" powiązanie danych - lecz ponownie zdarzenie nie zostanie wywołane !).
Patrz również:
Przykład:
Następujący skrypt w zdarzeniu onItemBeforeWrite wypisze informacje o zapisywanej wartości do pozycji Debug INFO systemu - wypisze nazwę zmiennej do której zostanie wykonany zapis, indeks zmiennej oraz starą i nową wartość zmiennej.
JavaScriptVBScriptWybierz oraz skopiuj do schowka

Pm.Debug("Name:" + pEvent.Item.Name);
Pm.Debug("Index:" + pEvent.Item.Index);
Pm.Debug("OldValue:" + pEvent.Item.Value);
Pm.Debug("NewValue:" + pEvent.NewVal);

Historia:
Pm9.00.18: Nowy parametr pEvent.NewQuality zawiera jakość zmiennej po zakończeniu tego zdarzenia.
Pm9.00.10: Jeżeli zapis został wywołany w wątku głównym wtedy skrypt jest wołany synchronicznie tak, żeby po zapisie ze skryptu do PmVar wartość się już w niej znajdowała i było możliwe ją odczytać.
© MICROSYS, spol. s r.o.