Timer w React Component

Wywoływanie rekurencyjne funkcji w React-cie z wykorzystaniem „setTimeout” i odwoływanie się w nich do stanów jest dość problematyczne. Taka funkcja „widzi zamrożony stan” pomimo tego, że może go zmieniać.

Poniżej sposób na timer (wykonywanie akcji z opóźnieniem) z możliwością dostępu do stanów w komponencie Reacta.

const [timerCounter, setTimerCounter] = useState(0);

useEffect(() => {
    const id = setTimeout(
        () => setTimerCounter(timerCounter + 1),
        1000
    );
    console.log("TIK", timerCounter);
    return () => clearTimeout(id);
}, [timerCounter]);

Przykład heartbeat-a odpytującego API

const [doReloadTime, setDoReloadTime] = useState(1000);
const [fetchState, setFetchState] = 
    useState<string>("waiting");

// aktualizacja danych
const onData = useCallback((data: any) => {
    // ...
}, []);

// pobieranie danych z API
const reloadData = useCallback(() => {

    setFetchState("waiting");

    fetch(...)
        .then(res => {
            onData(res);
            setFetchState("done");
            setDoReloadTime(1000);

        })
        .catch(err => {
            onData(null);
            setFetchState("error");
            setDoReloadTime(5000);
        });
}, [onData]);

// heartbeat
useEffect(() => {
    if (!reloadData || doReloadTime <= 0)
        return;

    setTimeout(() => {
        reloadData();
    }, doReloadTime);

    setDoReloadTime(0);
}, [doReloadTime, reloadData]);

Alternatywa dla STRING_SPLIT w MSSQL

Poniżej przykład podzielenia tekstu i wprowadzenie go do tabeli. Ciąg znaków odseparowany od siebie np. przecinkiem. Dane w tabeli można dalej przetwarzać w SQL.

Poniższy przykład również pomaga obejść błąd
’STRING_SPLIT’ is not a recognized built-in function name.

Przykładowo mamy ciąg znaków odseparowany przecinkiem:
declare @str2arr as varchar(200);
set @str2arr = '5, 10, 12';

Aby podzielić ciąg znaków (String) i wprowadzić dane do tymczasowej tabeli należy wykonać:
declare @Str2ArrTable as table(p int);

insert into @Str2ArrTable
select trim(split.a.value('.', 'VARCHAR(100)'))
from (select Cast ('' + Replace(@str2arr, ',', '') + '' as XML) as Data) as A
cross apply data.nodes ('/M') AS Split(a);

Dane znajdują się w tabeli. Aby je podejrzeć:
select * from @Str2ArrTable;

Dane z tabeli można wykorzystań np. w innym zapytaniu SQL jako warunek:
select * from Dokumenty where typDok in (
select p from @Str2ArrTable
);

Ograniczenie dostępu do magazynu w Subiekcie

Na chwilę obecną za pomocą interfejsu w systemie Subiekt GT istnieje możliwość udostępnienia tylko jednego lub wszystkich magazynów. Czasami zachodzi konieczność nadania dostępu do więcej niż jednego, ale nie do wszystkich magazynów. W bazie Subiekta znajduje się tabela sl_MagazynProfil, w której są wpisy odpowiedzialne za wykluczenie użytkownika z magazynów.

Poniżej skrypt SQL, który umożliwia wykluczenie z magazynu wszystkich użytkowników z wyjątkiem wskazanych (Kowalski Jan, Lewandowski Marcin, ID 1, ID 2

/* Definicja Magazynu */
declare @magId INT;
set @magId = 10;

/* Usunięcie poprzedniej konfiguracji */
delete from sl_MagazynProfil where pf_IdObiektu = @magId;

/* Nowa konfiguracja */
insert into sl_MagazynProfil
select @magId, uz_Id
from pd_Uzytkownik
where uz_Status = 1
and not (uz_Nazwisko = 'Kowalski' and uz_Imie = 'Jan')
and not (uz_Nazwisko = 'Lewandowski' and uz_Imie = 'Marcin')
and uz_Id not in (1, 2);

/* Podgląd konfiguracji */
select mag_Symbol, uz_Nazwisko, uz_Imie
from sl_MagazynProfil, pd_Uzytkownik, sl_Magazyn
where pf_idUzytkownika = uz_Id and mag_Id = sl_MagazynProfil.pf_IdObiektu and pf_IdObiektu = @magId;

Definicja magazynu ID 10
set @magId = 10;
(...)

Użytkownicy, którzy mają mieć dostęp
(...)
and not (uz_Nazwisko = 'Kowalski' and uz_Imie = 'Jan')
and not (uz_Nazwisko = 'Lewandowski' and uz_Imie = 'Marcin')
and uz_Id not in (1, 2)
(...)

Skrytobójca w Ghost of Tsushima

Gameplay z jednej z misji fabularnych. Zadanie polega na przedostaniu się do Twierdzy Yarikawa ukrytym za wodospadem przejściem. Twierdza jest oblężona przez Mongołów, a podczas wykonywania misji gracz nie może zostać wykryty. Poziom trudności: Śmiertelny (Lethal).