Nieudokumentowane funkcje w Ninox
Niektórych funkcji nie ma w oficjalnej dokumentacji Ninox. Odkryliśmy je, badając kod i rozpoznając ich zachowanie.
TypeOf
Funkcja typeof zwraca typ wskazanego pola.
Przykład:
typeof(first(select Customer).'First Name');
Eval
Funkcja eval wykonuje skrypt przekazany jako parametr w kontekście wskazanego rekordu. Zwraca wartość albo tekst informujący o błędzie w skrypcie.
Przykład:
eval("---{this.'First Name'} {this.'Last Name'}---", first(select Customer));
Wynik:
Sofia Young
DebugValueInfo
Funkcja debugValueInfo zwraca tekst opisujący typ i wartość przekazanego parametru.
Jest to szczególnie przydatne przy testowaniu fragmentów kodu w konsoli Ninox.
Przykład:
debugValueInfo(eval("---{this.'First Name'} {this.'Last Name'}---", first(select Customer)));
Wynik:
any("Sofia Young")
Debug
Funkcja debug jest odpowiednikiem console.log w JavaScripcie.
Wysyła wartość przekazaną jako parametr do konsoli programistycznej przeglądarki. Pomaga to debugować kod formuł.
Przykład:
(select Customer where 'First Name' like "a").(
var 'firstName' := this.'First Name';
var lastName := this.'Last Name';
debug("Debug info: " + 'firstName' + " " + lastName);
)
Wynik pojawia się w konsoli programistycznej przeglądarki (dostępnej w narzędziach dla programistów).
Records
Funkcja records zwraca rekordy na podstawie podanej tablicy liczb.
Uwaga: tablica musi być wpisana na stałe, nie może być zmienną, co czyni tę funkcję mniej elastyczną. Przydaje się głównie wtedy, gdy trzeba za każdym razem pobierać te same rekordy.
Przykład:
records(Customer, [1, 3, 6]).'First Name';
Pobiera to imiona rekordów o identyfikatorach 1, 3 i 6.
nx-file
Funkcja http() w Ninox pozwala pobierać dane ze zdalnego serwera. Zwraca obiekt JSON złożony z dwóch kluczy: error i/lub result. Klucz result zawiera treść zwróconą przez serwer.
Jeśli ta treść ma postać tekstową (HTML, JavaScript, JSON lub inny plik tekstowy), wszystko działa dobrze. Jeśli jednak jest to plik binarny (obraz, PDF, dokument Word itp.) albo częściowo binarny, Ninox próbuje zapisać tę treść w zmiennej tekstowej. Powstaje wtedy problem, ponieważ niektóre wartości binarne są poprzedzane znakiem ucieczki (na przykład wartość 92, czyli 0x5C szesnastkowo, odpowiadająca znakowi ucieczki „\”).
Wynika to z tego, że Ninox nie potrafi obsługiwać tablic bajtów bezpośrednio. Aby obejść ten problem, można użyć kodowania Base64, które zamienia dane binarne na postać tekstową. Więcej informacji o Base64 znajdą Państwo tutaj:
https://www.freecodecamp.org/news/what-is-base64-encoding/?utm_source=chatgpt.com
Ninox udostępnia kilka funkcji do operowania na danych zakodowanych w Base64, takich jak loadFileAsBase64() czy loadFileAsBase64URL(). Pozwalają one pobrać plik (zapisany w rekordzie) w postaci Base64.
Wróćmy do naszego przypadku: musimy odczytać zdalny plik binarny i zapisać go w rekordzie Ninox. W funkcji http() można zdefiniować opcje nagłówka. Zwykle wystarczy wskazać format, który chcemy odczytać, za pomocą klucza content-type. Aby jednak obsłużyć dane binarne, trzeba dodać jeszcze jeden, nieudokumentowany klucz o nazwie nx-file, z wartością "base64url".
Po dodaniu klucza nx-file Ninox zmienia sposób przetwarzania treści zwróconej przez serwer. Zwykle Ninox zwraca treść „taką, jaka jest”. Z nx-file zamienia odpowiedź na Base64URL. Zamiast otrzymać coś takiego:
{"result":"�PNG\r\n\u001a\n\u0000\rIHDR\u0000\u0002�\u0000\u0002\u001f\b\u0006\u0000����\u0000\u0001DiCCPicc\u0000\u0018�c``<���[�$����WR\u0014��\u0010\u0011..."}
… otrzymują Państwo:
{"result":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqoAAAIfCAYAAAC4gv6sAAABRGlDQ1BpY2MAABiVY2BgPJGTnFvMJMDAkJtXUhTk7qQQERmlwP6IgZlBhIGTgY9BNjG5uM..."}
Ten nowy format (Base64URL) jest bezpośrednio zgodny z funkcją importFile() w Ninox, która odczytuje go jako lokalny adres Base64 i zapisuje do wskazanego rekordu.
Proszę pamiętać, że większość zdalnych serwerów przyjmuje żądania tylko od innych serwerów, a nie od klienta. Dlatego ważne jest, aby funkcję http() wykonywać w kontekście do as server.
Poniżej przykład globalnej funkcji Ninox pozwalającej odczytać dane binarne (obrazy, pliki PDF, dokumenty Word, arkusze Excel itp.) jako Base64URL:
function loadFileOnBase64FromUrl(URL : text) do
var fileName := extractx(URL, "\/([^\/?#]+)[^\/]*$", "$1");
{
fileName: fileName,
content: do as server
http("get", URL, {
'content-type': "application/octet-stream",
'nx-file': "base64url"
}, null).result
end
}
end;
A oto przykład użycia tej funkcji:
var base64UrlFile := loadFileOnBase64FromUrl(url);
importFile(this, text(base64UrlFile.content), text(base64UrlFile.fileName));
W ten sposób mogą Państwo pobrać zdalny plik binarny, przekształcić go w Base64URL i zaimportować bezpośrednio do rekordu Ninox.
