DIBI a Datagrid filtr – NN v Dotazu SELECT
- woo
- Člen | 9
Ahoj.
Prosím o pomoc. Nevím v čem bych mohl dělat chybu. V datagridu pomocí
dibi načítám data z MSSQL dtb a při pokusu o filtraci dojde k chybě, kde
jde vidět vygenerovaný dotaz selectu tímto způsobem…
SELECT idSpinMeas, idEquip,spinNr,valA,valB,valC,ntuser,date, DATEADD(day,2,date) as nr,
OZNACENI_TECH_VYBAVENI, STATUS
FROM [spinMeas]
LEFT JOIN [MACH] ON idEquip = eqv
WHERE ([idEquip] LIKE NN'%B%')
ORDER BY [idSpinMeas]
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY
Nemůžu přijít na to, kde se tam berou ty NN před LIKE… bez nich by bylo vše OK.
Přidávám kód filtru…
protected function applyFilterText(FilterText $filter): void
{
$condition = $filter->getCondition();
$driver = $this->dataSource->getConnection()->getDriver();
$or = [];
foreach ($condition as $column => $value) {
$column = Dibi\Helpers::escape($driver, $column, \dibi::IDENTIFIER);
if ($filter->isExactSearch()) {
$this->dataSource->where("$column = %s", $value);
continue;
}
$or[] = "$column LIKE \"%$value%\"";
}
if (sizeof($or) > 1) {
$this->dataSource->where('(%or)', $or);
} else {
$this->dataSource->where($or);
}
}
- Šaman
- Člen | 2659
$or[] = ["[$column] LIKE %~like~", $value];
$or[] = ["[$column] LIKE %~like~ COLLATE [utf8_general_ci]", $value]; # tenhle trik mi docela trval (mySQL)
Vůbec nevím, kde se tam vzalo NN
, ale přímý zápis
proměnné do stringu neni dobrý. A Dibi jako univerzální uvozování hodnot
používá hranaté závorky. Pak si to už konkrétní databázový driver
upraví podle svého, takže
[value]
může být 'value'
nebo "value"
,
nemusíš to řešit.
Edit: Není náhodou NN
konstanta pro NOT NULL
?
Právě protože ve where
chybí hodnota, tak si to mohlo dosadit
not null. MSSQL moc neznám.
Editoval Šaman (29. 10. 2020 16:58)
- woo
- Člen | 9
Ahoj, děkuji moc Šamane za nápovědu… jedná se v datagridu o soubor
DibiFluentMssqlDataSource.php
Opravil jsem nakonec takto (pouze jsem z tvého návrhu odstranil u sloupce
hranaté závorky):
//$or[] = "$column LIKE \"%$value%\"";
$or[] = ["$column LIKE %~like~",$value];
Takto mi to funguje.
Po zapsaní hodnoty do filtru již chybu nehodí a automaticky správně
filtruje. Co tam generovalo NN vůbec netuším.
Děkuji. Kdybych později zjistil závadičku, dám vědět, ale vypadá to OK.
Zkusil jsem to jen narychlo…
Pěkný den.
Editoval woo (29. 10. 2020 19:52)
- woo
- Člen | 9
Tak pro zajímavost. Kde se bere a co znamená N?
Znak N se používá jako prefix z důvodu kódování. V MSSQL databázi
používám nvarcharé pro idEquipment. Z důvodu kódování je nutné zadat N
prefix při filtraci – příklad: WHERE idEquipment=N'foo' nebo WHERE
idEquipment LIKE N'%foo%‚. To zamezí chybám.
Teď už je jasné, proč se 'N‘ generovalo v sql dotazu.
Problém ovšem byl, že se zde objevilo z nějakého důvodu N dvakrát a to
už na dotaz zahlásilo chybu. To vyřešila změna kódu výše.
Pěkný den.
Editoval woo (30. 10. 2020 10:26)