Složitější výpis dat z databáze   zodpovězená otázka

ASP.NET WebForms

Dobrý den, jsem v ASP.NET začátečník, projel jsem už celé diskusní fórum o ASP.NET i články pro začátečníky - bohužel jsem odpověď nenašel a tak zakládám toto téma.

Rád bych vědel, jak vypsat data z databáze, pokud je mezi tabulkami vztah 1:N (případně M:N). Vysvětlím na jednoduchém příkladu: 1.tabulka: Vydavatel, 2.tabulka: Autor, 3.tabulka: Název CD, 4.tabulka Název Skladby.

Rád bych postupně (pomocí několika SELECTů) vypsal info o autorovi, vydavatelství, k tomu přiřadil všechna autorova alba s výpisem skladeb z alb.

Pokud však použiju komponentu DataList, DetailsView nebo GridView, vypíšou se mi nejdřív všichni autoři, pak všechna vydavatelství atd...

Mám aplikaci napsanou v ASP a tam jsem to řešil uložením vyselektovaných dat do proměnné a následným vypsáním přes

If IsArray(promennaA)= true Then
  for a=lBound(promennaA,2) to uBound(promennaA,2)
    If IsArray(promennaB)= true Then
      for b=lBound(promennaB,2) to uBound(promennaB,2)
       Response.Write promennaB(b,0)
      next
    End if
  next
End if

dá se nějak v ASP.NET dosáhnout něčeho podobného? Nebo jestli mě můžete nasměrovat na zdroj, jak se to dá řešit, budu velice rád.

Druhý, už tak nepodstatný, problém mám s designem, kde se mi zápatí s textem zápatí nezobrazí vespod obrazovky, ale tam, kde normálně končí obsah předchozího elementu, čili hned pod obsah a můžu používat styly CSS (height:100%) jak chci.

    <table style="height:100%">
      <tr><td>zahlavi</td></tr>
      <tr><td style="height:100%">obsah</td></tr>
      <tr><td>zapati</td></tr>
    </table>

Pokud by mi mohl někdo poradit, případně nasměrovat, budu velice rád. Už se s tím trápím několik dní... Děkuji

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

ad1) Tento požadavek se dá řešit určitě několika způsoby. Mě napadá si udělat např. v SQL Magement studiu pohled, ten odladit a potom se na něho odkazovat v Select commandu např. v GridView. Taky jde udělat složitější složený jeden Select command a ten použít v GridView pro výběr požadovaných informací - je to o tom, naučit se SQL dotazy.

ad2) Myslím si, že jsem někde četl, že tabulkově by se layout stránky dělat neměl. Já si myslím, že v seriálu od T.Hercega je popsáno velmi pěkně, jak vytvořit jednoduše hlavičku, tělo i patičku stránky. Z toho jsem např. vyšel i já a postupně metodou pokus omyl, jsem si jí přizpůsobil obrazu svému. Je třeba se toho nebát a zkoušet, až se to povede.

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

Nejdříve děkuji za Vaší reakci na můj příspěvek. Bohužel jsem v ní ale nenašel odpověď.

ad1)Nevím přesně, co máte na mysli tím "pohledem z SQL Management Studia", ale jestli je to sestavení si Selectu naklikáním, tak mi asi i něco podobného nabízí ve VWD 2008 EE Query Builder při konfiguraci Data Source. Je fakt, že zrovna takový select si můžu napsat i ručně (za použití spojení).

Ale to, co jsem uvedl v prvním příspěvku je pouze příklad. V realitě chci zobrazit záznamy z několika desítek nalinkovaných tabulek z databáze a jeden select mi přijde naprosto nepoužitelný. Nehledě na to, že GridView mi zobrazí data do sloupců a pokud bych chtěl zobrazit data z ostatních tabulek, kde je vztah 1:N, data z předchozích tabulek by se mi v GridView opakovala (např. Autor ke každé skladbě). Rád bych použil naprosto jiný layout, než jaký nabízí GridView. Z toho, co jsem měl zatím možnost vyzkoušet, se mi nejvíce zalíbila komponenta DataList anebo FormView.

Věřte mi, že SQL dotaz si sestavit umím, aplikaci už mám napsanou, ale je v ASP... Teď bych ji rád přepsal do ASP.NET.

ad2) Ano, taky jsem si něco četl o tabulkovém designu (viz např. http://www.jakpsatweb.cz/tabulky-design..... Ale i kdybych to udělal takto:

 <div>Zahlavi</div>
 <div style="height:100%">
    <span>Menu</span>
    <span>Obsah</span>
 </div>
 <div>Zapati</div>

tak je výsledek stejný.

Články jsem si samozřejmě pročetl a jde mi o to, aby jak je např. v článku "Píšeme webovou aplikaci v ASP.NET krok za krokem (část 4)" na prvním obrázku text "© 2008 Tomáš Herceg vbnet.cz" byl zarovnán naspod obrazovky a ne tam, kde končí poslední element nad tímto textem...

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

1]

Delat nekolik dotazu a pak to projizdet cyklama a skladat si to je naprosta zbytecnost a chyba zacatecniku. Vyhledejte si na netu nejaky tutorial s tvorbou SQL dotazu a ulozenych procedur. Bez techto zakladnich znalosti se neobejdete.

Tazge urcite udelat vystup z dotazu nebo lepe z ulozene procedury. Je zbytecnost posilat i jen blbych 5 dotazu kdyz to muze byt jeden a zatezovat (i minimalne) sit.

2] tabulkovy layout je nejhorsi reseni jake muze nekdo zvolit. tabulky by se meli pouzivat pouze na tabulkove data ke kterym jsou urcene.

Stim height je mensi problem ale da se resit.

V css nastavit min-height: 800px; (pro mozilla, firefox, opera, ie7) ale nefunguje to v ie6. tam pouze heigh.

priklad pro minimalni vysku tela stranky 800px:

date do css k layoutu.

_height: 800px; (hack pro ie)

min-height: 800px;

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

ad1) Použiju jednoduchý příklad na vysvětlení:

a) SELECT AutorID, Jmeno, Prijmeni, DatumNarozeni, MistoNarozeni, Pohlavi, Narodnost FROM Autor

b) SELECT SkladbaID, NazevSkladby, DelkaTrvani FROM Skladby WHERE AutorID= AutorID z ad a)

A takto bych si na stránce postupně vypsal všechny autory včetně info o nich a ke každému seznam skladeb, které kdy složili...

Chcete mi tedy říct, ze jsou tyto dva dotazy zbytečné a že je to chyba začátečníka? Jak byste to tedy řešil jinak?

ad2) Pokud nastavím pevnou minimální výšku, opět to není řešení... Pro uživatele s nižším rozlišením nebo zmenšeným oknem prohlížeče se zbytečně objeví

posuvník na rolování stránky a pro uživatele s větším to opět není naspod obrazovky. Je to chyba ASP.NET že nebere do úvahy parametr height:100%? Protože v jiných případech to bez problémů funguje...

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

Tak k ad2) jsem už zjistil, kde je zakopaný pes... Spočívá to v uvedení Doctype v dokumentu. Bez uvedení Doctype je atribut height povolen a brán v úvahu. V opačném případě však nikoliv.

Stále bych si však rád nechal někým vysvětlit možnosti řešení první části mého příspěvku.

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

ad1]

Nerikam ze jsou zbytecne. Neznam sechny vase podrobnosti co tam mate. Ztechto dotazu to chapu asi takto

SELECT AutorID, Jmeno, Prijmeni, DatumNarozeni, MistoNarozeni, Pohlavi, Narodnost FROM Autor

vrati se vam seznam autoru. Predpokladejme 300.

a projedete cyklem tento dotaz

SELECT SkladbaID, NazevSkladby, DelkaTrvani FROM Skladby WHERE AutorID= AutorID

cili 300x

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

Vlozim do ulzoene procedury

SELECT * FROM autor, SELECT * FROM Skladby


Dim dsSource As DataSet = New DataSet

'...
' spusteni ulozene procedury a nabindovani dat - vrati se 2 recordsety nebo si proste vratte 2 selecty a ulozte do dsSource.Tables(0) a druhy do dsSource.Tables(1)
'...

dsSource.Relations.Add("SkladbyAutora", dsSource.Tables(0).Columns("AutorID"), dsSource.Tables(1).Columns("AutorID")) ' priradi skladby k jednotlivym autorum

Dim rowSupp, rowProd As DataRow

For Each rowSupp In dsSource.Tables(0).Rows
    response.write(rowSupp("Autor")) ' vypis autora
    '...
    For Each rowProd In rowSupp.GetChildRows("SkladbyAutora")
       response.write(rowSupp("NazevSkladby"))  ' vypis autorovy skaldby
       '...
    Next
    response.write("<br>")
Next

Timhle zpusobem muzete dosahnout napriklad nasledujiciho:

http://static.asp.net/asp.net/images/dat...

kde byde autor a N-skladeb na jednom radku v gridview.

2] Bez doctype neidentifikuje prohlizec jeslty je stranka html nebo xhtml a jaka verze ... a bude zobrazovat stranku ve vlastnim rezimu (ano bude si delat co chce)... Cili kazdy prohlizec muze jinak ...

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

Díky za příspěvek, mám takový pocit, že už se pomalu blížíme k tomu, čeho chci dosáhnout :-)

Myslíte, že by bylo možné publikovat zde, nebo mi poslat na e-mail celý zdrojový kód stránky (http://static.asp.net/asp.net/images/dat..., kterou jste uvedl jako příklad? Včetně selectu, použití komponenty zřejmě GridView, prostě komplet kód? Zajímá mě, jak ta stránka vypadá napsaná v ASP.NET... Předem moc děkuji.

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

No, k tomuto účelu se hodí ASP.NET komponenta Table. Ta vygeneruje do stránky obyčejnou tabulku v HTML, ale můžete k řádkům a sloupcům přistupovat programově. GridView se na to moc nehodí, ten má rád pevný počet a význam sloupců, což tady asi nemáte (pokud ano, je lepší si v databázi napsat proceduru).

Co se týče SELECTů, musíte mít nejméně dva - v jednom si vyberete všechny autory a ve druhém všechna alba (nebo jak jste uváděl ten ukázkový příklad). V aplikaci pak záznamy projdete, uděláte si správnou velikost té tabulky a v cyklu si tabulku vyplníte.

Rozhodně není vhodné dělat pro každého autora jeden SELECT, autorů může být 100 a kdyby databáze měla nožičky, tak by vám nakopala.

Co se týče toho layoutu pomocí tabulek, principiálně je na něm špatného akorát to, že kdovíkdo mezi lidi roztroubil, že se to tak dělat nemá. Ano, má to mnoho nevýhod, na druhou stranu to má i své výhody. Výhodou tabulek je, že vypadají všude stejně, nevýhodou je, že mobilním zařízením to moc nesvědčí, mnohá tabulky zobrazují kvůli velikosti (resp. malosti) displeje tak, že každá buňka je na svém vlastním řádku atd. Obecně jsou divy lepší, ale je s nimi občas strašné vztekání. Navíc když napíšete layout tabulkou, tka vám každý rádobyodborník vynadá, protože se to tak prostě nedělá.

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