Uložení a edotace hodnot času   zodpovězená otázka

VB.NET

Používám VB 2005 a MSSQL 2005 EE.

V desktopové aplikaci potřebuju uživateli umožnit v Datagridview zadat hodnotu, reprezentující čas (nikoli denní - jedná se o dobu trvání události) s přesností na tisíciny sekundy a uložit jej do DB. Rozsah zadávaných hodnot je od nuly do deseti hodin. Prosím o doporučení, jaký datový typ zvolit (možná TIME - aspoň bych se dokopal přejít na MSSQL 2008) a jak zařídit, aby uživatel mohl zadat hodnoty co nejjednodušším způsobem (tedy např 1,536 sekundy bez nutnosti zadávat nuly a dvojtečku, které reprezentují hodiny a minuty). Podle sloupce v databázi by mělo jít korektně třídit (proto jsem zamítl varchar).

Databinding a vše okolo mám vyřešené, jde mi jen o vhodný datový typ a jak pořešit to vlastní vkládání do buňky v mřížce.

Díky za případné rady.

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

Pokud chcete jen sekundy s desetinnou přesností, použijte buď DATETIME a zůstaňte u SQL 2005 (snad má takovou přesnost, i když milisekundy asi ano) nebo DOUBLE, pokud sekund bude málo a nebudete to nikdy potřebovat formátovat jako 0:00:01.537. Anebo ten TIME ze SQL 2008, ale přecházet jen kvůli tomu se myslím moc nevyplatí.

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

Dobrý den,

asi jsme si nerozuměli. Potřebuji zadávat a uchovávat hodnoty s přesností na milisekundy a DateTime má přesnost kolem tří milisekund, což je málo.

Pak mi šlo hlavně o to, jak co nejelegantněji zařídit (kombinací vhodného datového typu v podkladové databázi a asi nějakých parsovacích a formátovacích funkcí), aby uživatel mohl časové intervaly zadávat co nejjednodušeji. Uvedu příklady zadávaých hodnot:

1.546 - 1 sekunda a 546 milisekund

12 - 12 sekund

1.5 - 1 sekunda a 500 milisekund

21:12 - 21 minut a 12 sekund

1:12.45 - 1 minuta 12 sekund a 450 milisekund

Pokud přímo takovéto hodnoty zadávám do buňky v Datagridview, kterou mám přes datatable a bindingsource napojenou na podkladovou databázi a konkrétní sloupec je typu DateTime, pak z výše uvedených neprojde skoro nic.

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

Dobrý den, co se týká toho editování dat tak v dataGridViewu můžete nastavit masku jak se mají hodnoty zobrazovat.

např.:

 Me.DataGridView1.Columns(0).DefaultCellStyle.Format = "HH:mm:ss" 'zobrazí pouze čas

Určitě tam půjdou dát i milisekundy. Bohužel jsem nastavení formátu nikdy nezkoušel u sloupců, kde je požadována editace dat, takže nevím jak se formátování zachová při změně hodnot. Ale můžete to vyzkoušet třebo to bude ono.

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

Bohužel DateTime použít nemohu, protože má přesnost tři tisíciny sekundy. Formátovací maska sice pro prezentaci vyhoví, ale běda, jak člověk chce začít editovat. Tam se musí asi někam navěsit nějaká parsovací funkce, která ošetří všechny potenciální možnosti zadání, ale zatím nevím přesně kam a na slepé uličky už mi nezbývá čas...:-)

Budu asi muset použít char a důsledně při ukládání všechno zleva dorovnávat nulami a dvojtečkami, aby se to dobře třídilo (toto řešení se mi ale moc nelíbí, skoro bych je nazval "prasárnou"), nebo přejít na MS SQL 2008, kde je typ TIME s přesností asi 6 míst za tečkou, ale parsování na vstupu se asi nevyhnu...

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

Určitě číslo neukládejte jako char, když už tak jako počet tisícin sekundy. Podle toho se třídit taky dá.

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

To mě taky napadlo, ale nějak jsem nebyl rychle schopen zařídit, aby se v buňce datagridview takovéto číslo zobrazovalo ve formátu "hh:mm:ss.ttt" resp. aby uživatel mohl zadat všechny typy formátů uvedených v mém předchozím příspěvku a vždy se to mlčky převedlo a správně uložilo do DB.

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

Tak pak asi bude potřeba napsat nějákou jednoduchou funkci která v editované buňce zkontroluje, zda je vše zadáno správně a popřípadě doplní potřebné údaje. Myslím si že to nebude nic složitého. A řekl bych že událost CellEndEdit v datagridViewu by mohla být ta pravá.

Jinak opravdu silně nedoporučuju ukládat datum a čas jako string. Jednou jsem upravoval aplikaci kde to bylo takto řešeno a jsou s tím jenom problémy. Na serveru bylo několik procedur které dělaly s těmito daty nějáké operace a vždycky na začátku musela být hromada konverzí a ošetření možných vyjímek (kdyby v databázi bylo zadané něco neočekávaného) než bylo možné vůbec přistoupit k samotným početním operacím.

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