DataGrid a MSSQL
- PytelCZ
- Člen | 21
Pokousim se rozchodit datagrid s MSSQL databazi, ale bohuzel v dibi nejsou
implementovany zasadni funkce pro praci s touto DB. Takze mi nefunguje
strankovani, ani razeni sloupcu. Nezkousel to nekdo a nema reseni??
Taky mam problem s kodovanim kdy DB je v latin2 a pak mi vyhazuje funkce
iconv_strlen v String.php chybu, protoze rezetec ma necitelne znaky :-( Nikde
jsem nenasel, kde nastavit kodovani, tak jako se to dela u mysql…
Diky..
- vlki
- Člen | 218
Udělal jsem na githubu větev develop, do které jsem podporu pro DataGrid pushnul. https://github.com/…tree/develop
Pro plnou podporu to ještě potřebuje lehce upravený
TextColumn
z datagridu. V metodě applyFilter
se
používají regexpy do databáze, které MSSQL neumí. Ve filtrech ti tedy
použití hvězdičky jako wildcard nebude fungovat. Bez tohoto zásahu by to
ale mělo jet i s neupraveným datagridem.
A použití v praxi?
dibi::connect(array(
'driver' => 'mssql',
'host' => 'example.com',
'username' => 'user',
'password' => 'pass',
'database' => 'mydb',
));
$query = dibi::select('*')->from('table');
$datasource = $query->toDataSource();
$datasource->setDefaultSorting(array('ID' => 'a')); // je nutné definovat výchozí řazení
$dg = new DataGrid;
$dg->bindDataTable($datasource);
- PytelCZ
- Člen | 21
vlki napsal(a):
Udělal jsem na githubu větev develop, do které jsem podporu pro DataGrid pushnul. https://github.com/…tree/develop
Pro plnou podporu to ještě potřebuje lehce upravený
TextColumn
z datagridu. V metoděapplyFilter
se používají regexpy do databáze, které MSSQL neumí. Ve filtrech ti tedy použití hvězdičky jako wildcard nebude fungovat. Bez tohoto zásahu by to ale mělo jet i s neupraveným datagridem.A použití v praxi?
dibi::connect(array( 'driver' => 'mssql', 'host' => 'example.com', 'username' => 'user', 'password' => 'pass', 'database' => 'mydb', )); $query = dibi::select('*')->from('table'); $datasource = $query->toDataSource(); $datasource->setDefaultSorting(array('ID' => 'a')); // je nutné definovat výchozí řazení $dg = new DataGrid; $dg->bindDataTable($datasource);
Funguje uplne nadherne, diky moc. Jenom jednu chybku jsem jeste nasel, ve funkci iconv, radek 118 v mssql.php mas prehozene charset a dbcharset promenne…
- blacksun
- Člen | 177
Je potřeba ještě něco měnit než jen nahrát upravené dibi? Stále se mi to snaží používat původní DibiDataSource místo DibiMssqlDataSource..
Po připojení k db používám v DataGridu přímo
<?php
$grid->bindDataTable($this->connection->dataSource('SELECT * FROM table'));
?>
Možná už mi to jen nemyslí po práci..
- vlki
- Člen | 218
Implicitní výběr mezi DibiDataSource a DibiMssqlDataSource jsem dal jen do DibiFluent. V connection to teď není.
Teď by sis měl vystačit s něčím jako…
$grid->bindDataTable(new DibiMssqlDataSource('SELECT * FROM table', $this->connection));
Uvidím, jestli to tam dám. A jestli to neodstraním z DibiFluent, protože to je něchtěná závislost na driveru. Možná by se vyplatilo mít na data source továrničku, která by podle driveru data source vybrala.
- PytelCZ
- Člen | 21
Jeste jsem narazil na jeden problemek a to, ze mam tenhle dotaz:
$this->connection->select('
PoradoveCislo, Predmet, MistoKonani, CisloZakazky, DatumJednaniOd, TabCisOrg.Nazev + ", " + TabCisOrg.Ulice + ", " + TabCisOrg.Misto AS nazev,
TabCisKOs.Prijmeni + " " + TabCisKOs.Jmeno + "##" + TabKontakty.Spojeni AS jmeno, TabSvSKarta.Nazev + " " + TabSvSKarta.IdentCislo AS zarizeni')
->from('TabKontaktJednani')
->leftJoin('TabCisOrg') -> on('TabKontaktJednani.CisloOrg = TabCisOrg.CisloOrg')
->leftJoin('TabCisKOs') -> on('TabKontaktJednani.CisloKontOsoba = TabCisKOs.Cislo')
->leftJoin('TabKontakty') -> on('TabCisKOs.Cislo = TabKontakty.IDCisKOs')
->leftJoin('TabSvSKarta') -> on('TabKontaktJednani.NakladovyOkruh = TabSvSKarta.CisloNO');
ale v tabulce TabKontakty je vice radku se stejnym IDCisKOs (jedna osoba, ale vice spojeni na ni) a tudiz mi to potom vyplivne treba 2 radky, ktere jsou uplne shodne, jen maji jine tel. cislo. A ja bych potreboval aby to bylo jen jako jeden radek a ty kontakty byly v jednom sloupci zapsane za sebou… Vubec netusim jak to zapsat, aby cely datagrid pracoval spravne…
- vlki
- Člen | 218
Pokud by šlo o MySQL, tak tohle řeší agregační funkce GROUP_CONCAT
.
Nevím, zda MSSQL má nějakou podobnou funkci. Google jako první odkaz vyhodil menší diskuzi na StackOverflow, můžeš zkusit…
- PytelCZ
- Člen | 21
vlki napsal(a):
Pokud by šlo o MySQL, tak tohle řeší agregační funkce
GROUP_CONCAT
.Nevím, zda MSSQL má nějakou podobnou funkci. Google jako první odkaz vyhodil menší diskuzi na StackOverflow, můžeš zkusit…
No prave, ze MSSQL nic takoveho nema a resi se to nejakou ochcavkou, ale nedokazu to zakomponovat tak, aby s tim fungoval datagrid :(
- marek.dusek
- Člen | 99
To preci vubec neni o datagridu, ale o SQL
Bud pridej distinct, nebo group by (nebo nejoinuj tabkontakty vubec a dotahuj si to nekde bokem).
- cesky nazvy jsou evil
- neni od veci davat tabulkam aliasy a ve vyctu sloupcu pouzivat alias.sloupec, aby bylo hned jasne, z ktere konkretne tabulky ten sloupec je
- osobne bych takovy dotaz rozhodne prepsal do pohledu, ale to je vec vkusu
- PytelCZ
- Člen | 21
marek.dusek napsal(a):
To preci vubec neni o datagridu, ale o SQL
Bud pridej distinct, nebo group by (nebo nejoinuj tabkontakty vubec a dotahuj si to nekde bokem).
- cesky nazvy jsou evil
- neni od veci davat tabulkam aliasy a ve vyctu sloupcu pouzivat alias.sloupec, aby bylo hned jasne, z ktere konkretne tabulky ten sloupec je
- osobne bych takovy dotaz rozhodne prepsal do pohledu, ale to je vec vkusu
db jsem nenavrhoval a mam pristup jen do nejakych tabulek na cteni, takze co
se tyce nazvu a pod, s tim nic neudelam.
Nakonec jsem dostal pravo si udelat pohled, ale nic jsem tim nevyresil :(
Proste jsem uvaznul na tom, ze v jedne tabulce mam ID, jmeno, prijmeni a v druhe mam k tomu ID z prvni tabulky vice zaznamu (kontaktu k dane osobe – mobil,pevna,email) a ja potrebuju aby spojenim tech tabulek byl pro kazdou osobu jen jeden radek a ty kontakty na ni byly v jednom sloupci vsechny.