Spouštění externích akcí nad označenými řádky

PříspěvekNapsal: 23.03.2007 12:39
od jiri.dolezal
Spouští-li se externí akce (typu procedura) nad označenými řádky, spouští se pro každý označený řádek jednotlivě – vezme se ID prvního řádku, spustí se procedura, pak se vezme ID druhého řádku, spustí se procedura, atd. (což např. znamená, že nelze použít dočasných – #temporary - tabulek pro uchování informací pro označené řádky a následně spouštět akci pro všechny označené řádky najednou – řešení tohoto problému viz. níže).

Řádky jsou zpracovávány vzestupně dle svého aktuálního třídění v přehledu. Na pořadí označení řádků nezáleží.

Má-li akce Návaznou akci, nejdříve proběhne akce pro všechny označené řádky a až poté proběhne návazná akce (pro všechny označené řádky).

--------------

JE-LI POTŘEBA DÁVKOVĚ ZPRACOVAT VŠECHNY OZNAČENÉ ŘÁDKY (ne jednotlivě, ale naráz), LZE VYUŽÍT NÁSLEDUJÍCÍHO:

Práce s označenými řádky

Počet označených řádků a aktuálně zpracovávaný řádek lze zjistit následovně:

Počet označených řádků pro zpracování:
Kód: Vybrat vše
SELECT Cislo FROM #TabExtKomPar WHERE Popis='CELKEM'


Číslo zpracovávaného řádku:
Kód: Vybrat vše
SELECT MAX(Cislo) FROM #TabExtKomPar WHERE Popis='PRECHOD'


Spuštění akce pro označené řádky

Řešení spočívá v uložení potřebných atributů (min. ID) do vlastní tabulky (ne temporary) při každém průchodu a samotnou funkční část procedury spustit až při průchodu posledním řádkem.

Kód: Vybrat vše
DECLARE @Oznacenych SMALLINT, @Aktualni SMALLINT

-- Počet řádků a aktuálně zpracovávaný řádek načteme do proměnných
SELECT @Oznacenych = Cislo FROM #TabExtKomPar WHERE Popis = 'CELKEM'
SELECT @Aktualni = MAX(Cislo) FROM #TabExtKomPar WHERE Popis = 'PRECHOD'

-- Smažeme při prvním průchodu možná existující původní vybrané záznamy
IF @Aktualni = 1 OR (@Aktualni IS NULL AND @Oznacenych IS NULL)
   DELETE FROM OznaceneRadky WHERE Ident = @@SPID

-- Při každém průchodu vložíme do tabulky pro označené řádky potřebné atributy
INSERT INTO OznaceneRadky(ID,Ident) VALUES(@ID,@@SPID)

-- Samotné tělo procedury při průchodu posledním záznamem
IF @Aktualni = @Oznacenych OR (@Aktualni IS NULL AND @Oznacenych IS NULL)
BEGIN
...
END


Poznámka: Sloupec Ident plněný @@SPID (identifkátor procesu) je nutné použít pro ošetření spouštění akce vícero uživateli najednou.

Dodatek: Označení jednoho řádku

PříspěvekNapsal: 19.02.2008 12:26
od jiri.dolezal
Spouští-li se externí akce nad jedním řádkem, plní se tabulka #TabExtKomPar následovně:

a) na řádku je pouze kurzor (není označen) - hodnoty o počtu označených řádků a aktuálně zpracovávaném řádku se do tabulky #TabExtKomPar NEZAPISUJÍ > proměnné @Oznacenych a @Aktualni budou mít hodnotu NULL

b) řádek je označen (pomocí CTRL) - hodnoty se do #TabExtKomPar ZAPISUJÍ > proměnné @Oznacenych a @Aktualni budou mít hodnotu = 1