Użycie znaku backslash w dyrektywach

0

mam proste zapytanie które ma działać na dwóch różnych baza danych
Do łączenia używam komponentów FireDac.
często używam dyrektyw, które automatycznie tłumaczą polecenia na język danego SQLa
Jednak napotkałem problem ze znakiem \

np {POSITION(`, p.NAZWA)}nie działa, ale np.{POSITION(., p.NAZWA)}` działa prawidłowo
podobnie inne polecenia z wykorzystaniem tego znaku kończą się błędem składni

Próbowałem ten znak wpisać podwójnie, czyli \\ to nie ma błędu ale w wyniku dostałem \\ zamiast \

Ktoś ma jakiś pomysł jak jeszcze ten znak mogę zapisać?

0
SELECT {POSITION('\', p.NAZWA)}

nie działa (missing [}], ale np.

SELECT {POSITION('.', p.NAZWA)}

działa prawidłowo

0

Ale co więcej? To wystarczy żeby wywołać błąd.
To dolne zapytanie zwraca liczbę a górne błąd

Ewentualnie spróbujcie uruchomić takie zapytanie

SELECT {POSITION('\','jakis tekst \ i jeszcze troche.')} AS INDEKS_ZNAKU
0

Nie no z Twojej wypowiedzi wnioskuję, że wstawiając to:

SELECT {POSITION('\', p.NAZWA)}  

do

TADQuery.SQL.Text

itp. poprzez ObjectInspectora lub z kodu dostajesz wyjątek tyle to zrozumiałem ale za choinkę nie mogę rozkminić po co Ci te {} ... nigdy nie używałem takiej konstrukcji czemu to ma służyć? Jak rozumiem chcesz zrobić filda z numerem znaku w stringu pobranym z tabeli ... ok ale to można zrobić używając składni SQL, natomiast to coś: {POSITION(...)} widzę pierwszy raz dlatego chcę abyś mi to wyjaśnił.

0

Przecież napisałem że używam FireDac a nie Ado
To są dyrektywy, które dynamicznie zmieniają komendy na odpowiednią składnię

Ponieważ używam bazy Firebird oraz MSSQL a tam często składnia jest nieco inna.

0

No nie dogadamy się ... rozumiem to ale nie rozumiem tej składni zamiast robić

TADQuery.SQL.Text := '{$IFDEF MSSQL} SELECT pos(''\'',p.nazwa) from tabela p {$ELSIF FIREBIRD} select ...

widzę jakieś {POSITION}, którego nie rozumiem stąd moje pytanie.

Ponadto nie wiem z jakiej wersji korzystasz ale po to wymyślono generyki w Delphi aby nie musieć pisać co linijkę dyrektyw warunkowych. Robiąc generyka możesz sobie zrobić uniwersalny mechanizm bez zbędnych ifów /ifdefów ...

0

No dobrze. Czy są dwa sposoby pisania takich zapytań (poprzez dyrektywy kompilatora w delphi lub dyrektywy FireDac)
Tylko, że używając dyrektyw Firedac moje zapytanie będzie działać na wielu bazach danych i nie muszę pisać kolejnych warunków w kodzie programu.
Poza tym mogę mieć zapytanie na stałe wklejone w query.

A przy okazji znalazłem sposób na zapis znaku
Wpisałem {POSITION({s '\'},p.NAZWA)} dostajemy dla MSSQL

CHARINDEX('\',p.NAZWA)

a dla FIREBIRD POSITION('',p.NAZWA)

0

Mimo iż ja bym to zrobił zupełnie inaczej (generyki + metody abstrakcyjne) to cieszę się, że udało Ci się znaleźć rozwiązanie swojego problemu.

0
woolfik napisał(a):

Mimo iż ja bym to zrobił zupełnie inaczej (generyki + metody abstrakcyjne) to cieszę się, że udało Ci się znaleźć rozwiązanie swojego problemu.

Się dokleję, bo zawsze mnie nurtuje dlaczego ktoś wymyśla koło na nowo.
A więc - dlaczego chcesz wymyślać koło na nowo, skoro to które jest idealnie nadaje się do konkretnego zastosowania?
Rozumiem, że nie rozumiesz jak to działa (a wystarczy: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Preprocessing_Command_Text_(FireDAC)).
Ale to nie znaczy, że Twoja propozycja ma jakikolwiek sens w tym konkretnym przypadku. Moim zdaniem, nie ma żadnego.

A dla pytacza; ten sam link i akapit "Escape Sequences".

I tak trochę OFF Topic - można sobie własne funkcje rejestrować w tym mechanizmie, które mogą robić cokolwiek co będzie Wam potrzebne.
Poza tym, ten mechanizm obsługuje również wyrażenia, które są wykorzystywane przy filtrowaniu, agregacjach, wartościach domyślnych dla pól, itd.

Np. ja potrzebuję, aby dla zadanego pola, system sam generował mi wartość numeru dokumentu przy dodawaniu nowego wiersza; zatem w Field.DefaultExpression piszę dGetNumber('SOP-ORDER', 1) i już. Oczywiście zarejestrowałem sobie funkcję w FireDAC o nazwie dGetNumber, która to robi.
To bardzo wygodny mechanizm - bez metod abstrakcyjnych, generyków i Bóg wie czego tam jeszcze...

1 użytkowników online, w tym zalogowanych: 0, gości: 1