DataGrid a MSSQL

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
PytelCZ
Člen | 21
+
0
-

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
+
0
-

Hehe, takový upravený MSSQL driver mám. Vyžadovalo to ale i zásah do DataGridu.

Dám tomu pár fines a nahodím na github.

vlki
Člen | 218
+
0
-

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);
vlki
Člen | 218
+
0
-

Úprava se týká jen mssql, ne mssql2005. Na té jsem neměl možnost testovat.

Každopádně díky za upozornění.

PytelCZ
Člen | 21
+
0
-

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…

vlki
Člen | 218
+
0
-

To by mělo být dobře. Tenhle iconv překonvertovává vstupní SQL dotaz. Musí tedy být směrován z vstupně/výstupního do databázového kódování.

PytelCZ
Člen | 21
+
0
-

vlki napsal(a):

To by mělo být dobře. Tenhle iconv překonvertovává vstupní SQL dotaz. Musí tedy být směrován z vstupně/výstupního do databázového kódování.

Jasne, mas pravdu, jsem byl uz lehce prepracovan. Jeste jednou diky…

blacksun
Člen | 177
+
0
-

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
+
0
-

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.

blacksun
Člen | 177
+
0
-

Já si spíš myslím, že tvoje úprava pro mssql by mohla být v driveru nastálo, však pokud nechci používat v aplikace přímo offset, tak to nic jiného neovlivní, ne?

Jinak díky za tip, už to běží. A vlastně i za upravený driver a datasource, vytrhlo mi to trn z paty ;)

PytelCZ
Člen | 21
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
vlki
Člen | 218
+
0
-

Jen doplním řešení té možnosti „dotahování někde bokem“.

Dát si alias na primary key tabulky TabKontaktJednani a na ten sloupec dát filtr, který to podle id dotáhne, spojí do stringu. Nebude ale fungovat filtrování výběru.

PytelCZ
Člen | 21
+
0
-

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.