DIBI a Datagrid filtr – NN v Dotazu SELECT

woo
Člen | 9
+
0
-

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
+
+1
-
$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
+
+1
-

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

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)