GridView obráceně   zodpovězená otázka

VB.NET, WinForms

Dobrý den,

stojím před takovým problémem zobrazovat data z tabulky, která má strukturu:

Zaměstnanec

Datum

Směna

Potřebuji ale zadat nějaký WHERE na datum např. (od 1.1. do 31.1.) a zobrazit tabulku, kde bude tolik sloupečků, kolik je dní, čili:

Zaměstnanec

1.1.

2.1.

3.1.

...

31.1.

a v řádku bude informace o směně. Jedná se v podstatě o kontingenční tabulku. Je rozumné použít gridview a ty sloupečky nějak dynamicky generovat? Vlastně si ani nedovedu představit jak ty data načíst, asi bych musel poskládat dlouhý dotaz přes union...

Nebo jakou by jste zvolili cestu? Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Na tohle není GridView určen, budete si muset asi pomocí kódu naplnit komponentu Table - prostě dovnitř vygenerovat řádky a do nich jednotlivé buňky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte pravdu, DataGridView na tohle určený není. Ale jde to i když to asi není ideální. Poměr pracnost a výkon / užitečnost jsou diskutabilní. Pokud tabulka bude pouze prezentovat data a sloužit jen na koukání tak to jde, horší by bylo pokud by tazatel k těm datům pak potřeboval ještě něják rozumně přistupovat a dělat nad tabulkou další selecty.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji, omlouvám se, že se ptám tak hloupě:

Co myslíte komponentou Table? Myslíte DataTable? To je nevizuelní komponenta, čili "pouze" třída? Čili výsledek bude stejně zobrazen přes GridView?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano myslím dataTable, řeším to vždy tak, že si vytvořím dataTable udělám vše co v ní potřebuji a nakonec ji napojím na datagridView. Například takto:

Dim dtVysledek as DataTable=new DataTable

'
'zde bude kód kde si vytvoříte potřebné sloupce 
'a doplníte data do dataTable

Me.DataGridView1.DataSource = dtVysledek 
'zde napojíte dataTable na dataGridView a tím zobrazíte výsledek

Tím docílíte toho, že se dataGirdView vykreslí pouze jednou, tzn, nepřekresluje se při každé změně dat což je velice pomalé (překreslování trvá déle naž plnění daty).

A ke druhému dotazu, MS SQL server 2005 a novější by měl podporovat příkaz PIVOT. Zkuste na googlu vyhledat tento příkaz a určitě vám vyjede spoustu návodů. Tímto příkazem by mělo jít tvořit kont. tabulky na úrovni SQL serveru. Více Vám bohužel neporadím, protože archaická verze SQL serveru se kterou musím pracovat tento příkaz nepodporuje a proto jsem neměl důvod ho podrobněji prozkoumávat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Komponentou Table myslím komponentu Table. DataTable je něco jiného, to je pouze paměťová struktura.

Obecně jsou možnosti 2 - buď na straně SQL Serveru uděláte stored proceduru, která vám vygeneruje přímo celou tabulku a tu pak zobrazíte v GridView, ale s tím bude docela dost práce.

Mnou navrhovaným řešením je přidat do stránky komponentu Table (najdete ji v Toolboxu) a programově do ní vygenerovat požadovanou tabulku. V nejbližších dnech o tom zkusím napsat článek, protože je to poměrně zajímavé téma.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dle diskuzního fóra (Visual Basic .NET (2005, 2008) ) jsem se domníval, že uživatel řeší winForm aplikaci a ne webovou stránku. Komponenta table je myslím pouze v ASP .NET nebo se mýlím?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Aha pardon, mě zmátlo to, že v názvu tématu je GridView, což je ASP.NET komponenta. Ve WinForms se ta komponenta jmenuje tuším DataGridView.

V takovém případě je nejlepší prostě sloupečky a buňky v této komponentě vygenerovat ručně.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Určitě by to něják šlo. Napadá mě třeba zjistit si počet dnů v daném odbobí, vytvořit si dataTable a podle počtu dnů v cyklu generovat sloupce a přidávat je do dataTable. Tu pak zobrazit v dataGridView. Takovou zjednodušenou náhražku kontingenční tabulky jsem taky jednou dělal a je s tím celkem dost práce (teda podle toho co tam budete zadávat za data, já počítal různé průměry na základě několika kriterií). Použil jsem to pouze proto, že aplikace jede na SQL serveru 2000 který neumí kontingenční tabulky. 2005 a novější už to umí. Opravdu ten výstup nejde jinak? Myslím si, že pokud tam budete mít hodně záznamů (sloupce i řádky) práce s takovou tabulkou bude pomalá a neohrabaná (už jen to její vytváření a plnění v cyklu).

Jeden můj postřeh na závěr: pokud opravdu zvolíte cestu dynamického vytváření tabulky, vytvořte nejprve dataTable a až bude complete napojte ji na DGW. Já ve své začátečnické nerozvážnosti generoval sloupce a pak je plnil datama přímo v dataGridView a divil jsem se jak to je pomalé. Rozdíl v rychlosti je propastný (tabulka se nepřekresluje při přidání jednotlivých záznamů) ;)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ta tabulka bude mít v podstatě dvě varianty. Jedna bude plán směn, čili pod sebou mám lidi a ve sloupečcích dny a buňkách typ směny. Tato varianta bude víceméně na prohlížení.

Druhá varianta ovšem bude výkaz práce, kde bude uživatel v bunkách vyplňovat informace o nepřítomnosti dovolené apod.

Data jsou v SQL2005 - píšete o podpoře kontingenčních tabulek, mohl byste prosím nastínit, co tím máte na mysli? Zatím jsem nad SQL serverm s kont. tabulkami nepracoval. Děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ja by som to neriešil tak komplikovane.

Predpokladám, že v DB je to riešené dvomi tabuľkami

relačne prepojenými. Takže by som to riešil

takým istým spôsobom aj vizuálne. T.j. dva gridy, každý

z nich napojený na DataTable. Do jednej DataTable načítať

záznamy zamestnancov, do druhej DataTable načítať záznamy

o smenách. Takže jednotlivé dni nebudú vedľa seba,

ale pod sebou. Pre načítanie do DataTable použiť

DataAdapter a jeho Fill. Je najrýchlejší. A pri prechádzaní

záznamami zamestnancov prestavovať RowFilter v tabuľke smien.

Takéto riešenie umožní pohodlne pracovať so smenami za mesiac,

alebo aj za rok, podľa Where podmienky pri načítavaní smien.

Okrem toho ku každej smene je možné v pohode evidovať a zobraziť

aj viac informácií, ako jednu. Napr. poznámku k niektorej smene

niektorého zamestnanca a pod.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback