|  Ahojte, potřeboval bych pomoci s uživatelskou funkcí pro SQL. (T-SQL) 
 
Popis: Mám dvě tabulky: 
 
První z nich obsahuje aktuální stav 
idzbozi | stav 
10000     7 
 
Druhá tabulka jednotlivé pohyby 
idzbozi | idpohybu | pohyb 
10000     1          -2 
10000     2          -4 
10000     3         +50 
10000     4         -20 
10000     5         -30 
10000     6         -15 
10000     7         +40 
10000     8         -24 
 
Mým cílem je vytvořit funkci, která vrátí idpohybu, při kterém dojde k poklesu stavu na zápornou hodnotu. Tzn. že od aktuálního stavu bude postupně odečítat (přičítat) jednotlivé pohyby. 
 
V uvedeném případě by tedy funkce vrátila idpohybu 6, protože 7 - 2 - 4 + 50 -20 -30 -15 = -14 
 
V současné době to řeším přes dočasnou tabulku, která je rozšířena o sloupec s mezivýsledkem, a kterou naplňuji řádek po řádku a dopočítávám stav. 
Nakonec pak z této tabulky vyberu první řádek se záporným mezivýsledkem. Při velkém množství dat, je ale tento způsob děsně pomalý a tak by mě zajímalo, jak byste tuto funkci řešili vy. 
 
Díky. 
 
---------- 
Teprve když vstáváte s hackingem a uléháte s myšlenkou na něj, máte šanci být hackerem. (odpovědět) |   |  
  |  
  | 
| re: Uživatelská funce v SQL | # |  
  |  Možná než funkce by byl lepší pohled, který by obsahoval dopočítaný sloupec s aktuálním stavem. Je to vůbec možné nějak reálně vytvořit? 
 
---------- 
Teprve když vstáváte s hackingem a uléháte s myšlenkou na něj, máte šanci být hackerem. (odpovědět) |   |  
  |  
  | 
| re: Uživatelská funce v SQL | # |  
  |  no a nemůžeš použít cyklus (for) v SQL? na MS SQL serveru by měl být.. a prostě loopovat dokud hodnota neni pod 0. Ale možná to chápu uplně blbě 
 
---------- 
chacha (odpovědět) |   |  
  |  
  | 
| re: Uživatelská funce v SQL | # |  
  |  gdi: jo slo, podobne to i delam. Kdyz to ale potrebujes udelat u tisice polozek, tak si na vysledek nejakou dobu pockas a to se mi nelibi :) Prave kvuli rychlosti bych se chtel cyklum vyhnout, ale nevim, jestli je to realne. 
 
---------- 
Teprve když vstáváte s hackingem a uléháte s myšlenkou na něj, máte šanci být hackerem. (odpovědět) |   |  
  |  
  | 
| re: Uživatelská funce v SQL | # |  
  |  no ale nepotrebujes pomocnou tabulku 
 
a jak casto se tabulka s pohyby mění? 
 
---------- 
chacha (odpovědět) |   |  
  |  
  | 
 | 
| re: Uživatelská funce v SQL | # |  
  |  když tam ale dáš tabulku jakou napsal cumin s 8 ruznými pohyby tak to už nepujde ne? 
 
---------- 
chacha (odpovědět) |   |  
  |  
  | 
| re: Uživatelská funce v SQL | # |  
  |  Pokud to funguje se šesti pohyby, proč by to nemělo fungovat se sedmi? Právě proto jsem tam hodil výpisy z tabulek, aby bylo vidět, že jsem si to nevycucal z prstu. Jednoduše, uděláš jeden SELECT abys získal sumu všech pohybů k danému produktu a výsledek přičteš k základu daného produktu. 
 
---------- 
Sec-Cave.cz - [link] (odpovědět) |   |  
  |  
  | 
| re: Uživatelská funce v SQL | # |  
  |  ale on chce vědět, který pohyb dostal zboží do záporných hodnot.. Pokud bys měl 9 pohybů a vyšlo ti -60, tak víš prd kterej byl ten rozhodující. 
 
---------- 
chacha (odpovědět) |   |  
  |  
  | 
| re: Uživatelská funce v SQL | # |  
  |  Ah! Sry. Špatně jsem četl. Tuhle informaci jsem nějak úplně vypustil. 
 
---------- 
Sec-Cave.cz - [link] (odpovědět) |   |  
  |  
  | 
| re: Uživatelská funce v SQL | # |  
  |  Ono by to šlo udělat heuristikou. Ale nevím, kolik času bys tímhle zachránil. Řekl bych že by to moc nebylo. Nakonec bude asi vážně nejlepší použít nějakou pomocnou tabulku s mezivýpočtem. 
 
---------- 
Sec-Cave.cz - [link] (odpovědět) |   |  
  |  
  | 
| re: Uživatelská funce v SQL | # |  
  |  OK, děkuji všem. 
 
---------- 
Teprve když vstáváte s hackingem a uléháte s myšlenkou na něj, máte šanci být hackerem. (odpovědět) |   |  
  |  
  | 
| re: Uživatelská funce v SQL | # |  
  |  Tak nakonec vyřešeno doplněním sloupce se součtem všech pohybů uvedených "před". Pokud se jakýkoliv pohyb změní, jednoduše tento sloupec přepočítám příkazem: 
 
update pohyby 
set mnspoctene=( 
  select isnull(sum(temp.mnpohyb),0) 
  from pohyby temp 
  where 
      temp.idpohybu <= pohyby.idpohybu and 
      temp.idzbozi = pohyby.idzbozi) 
 
Pokud pak chci získat id s mínusovým stavem, stačí jednouchej dotaz: 
 
select top 1 idpohybu 
from pohyby 
where stav-mnspoctene < 0 
order by idpohybu 
 
Je to mnohonásobně rychlejší než při postupném načítání. 
 
---------- 
Teprve když vstáváte s hackingem a uléháte s myšlenkou na něj, máte šanci být hackerem. (odpovědět) |   |  
  |  
  | 
| re: Uživatelská funce v SQL | # |  
  |  přesně toto mne napadlo a proto jsem se ptal jak často se pohyby mění.. :D 
 
---------- 
chacha (odpovědět) |   |  
  |  
  |