Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: thcom 31. 10. 2016, 20:39:25
-
Ahoj, snazim se tu nacist sql dotazy ze souboru .dfm (textova definice formularu pro delphi)
format zjednodusene vypada takto
SQL = 'SELECT castka, pomer, typ'
'FROM tabulka_osoby WHERE cast'
'ka = 1 ORDER BY pomer DESC;'
pdle me je to navrzene nestastne, protoze kdyz sql slepite bez mezer muzete se dostat k chybne konstrukci typFROM a pokud s mezerami ziskate zase WHERE cast ka
asi neexistuje jina moznost nez to parsovat a kotnrolovat klicova slova SQL a platne fieldy z danych tabulek
nenapada nekoho jina finta
diky TH
-
Ty SQL dotazy jsou řetězcová hodnota nějaké položky na formuláři?
Přijde mi nejjednodušší to parsovat. Pokud víte, jaké možné dotazy se tam budou vyskytovat, bude navíc ta gramatika dosti jednoduchá.
-
Pochybuju, že jeto tam uložené opravdu takhle, protože to by to stejným způsobem musely parsovat i Delphi při běhu toho programu. Což navzdory svému názvu určitě nedělaly. Takže moje doporučení je podívat se na ten formát znovu a lépe.
-
Nemuzete predpokladat, ze pridate mezeru vzdy za prvni radek a za druhy nikoliv? Nebo nelze predpokladat, ze prihodite mezeru pred kazdy radek, pokud zacina slovem s velkymi pismeny, ovsem s vyjimkou prvniho?
Videl jste zdrojak algoritmu, ktery ta data takto podivne porizuje? Mozna by z toho slo neco vykoukat.
BTW, by me zajimalo, kdo a hlavne proc to vymyslel prave takto.
-
Vyjimecne souhlasim s Filipem Jirsakem. Takhle divne Delphi zase nejsou.
Je zvlastni, ze nejaky "robsoft" to tam ma s mezerama:
http://stackoverflow.com/questions/2513483/is-there-a-tool-which-can-extract-all-sql-command-strings-from-delphi-form-files
-
prikladam aktualni stav z meho projektu:
SQL zadane v IDE delphi primo v komponente Query
SELECT
objednavky_polozky.id,
TRIM(CONCAT(suroviny.nazev, " ", IF(ISNULL(suroviny_rozliseni.nazev), "", suroviny_rozliseni.nazev ))) AS nazev,
suroviny.mj_obj AS mj, pocet
FROM
objednavky_polozky LEFT JOIN
suroviny ON objednavky_polozky.suroviny_id = suroviny.id
LEFT JOIN
suroviny_rozliseni ON objednavky_polozky.suroviny_rozliseni_id = suroviny_rozliseni.id
WHERE
objednavky_id = :par_objednavky_id
AND
( suroviny.nazev LIKE :par_search OR suroviny_rozliseni.nazev LIKE :par_search)
ORDER BY
sortik
DESC;
sekce z DFM souboru prislusna k danemu Query
SQL.Strings = (
'SELECT'
' objednavky_polozky.id, '
' TRIM(CONCAT(suroviny.nazev, " ", IF(ISNULL(suroviny_rozliseni.n' +
'azev), "", suroviny_rozliseni.nazev ))) AS nazev, '
' suroviny.mj_obj AS mj, pocet'
'FROM'
' objednavky_polozky LEFT JOIN '
' suroviny ON objednavky_polozky.suroviny_id = suroviny.id '
' LEFT JOIN '
' suroviny_rozliseni ON objednavky_polozky.suroviny_rozliseni' +
'_id = suroviny_rozliseni.id'
'WHERE'
' objednavky_id = :par_objednavky_id'
'AND'
'( suroviny.nazev LIKE :par_search OR suroviny_rozliseni.nazev LI' +
'KE :par_search)'
'ORDER BY'
' sortik '
' DESC;')
Params = <
parametry jsem pro zkraceni vynechal
TH
-
Všimni si těch plusek na konci některých řádků. Znamenají "tohle slep bez mezer". Ostatní slepíš s mezerou.
-
Podle toho prikladu bych to formuloval trochu jinak: Kdyz tam je na konci radku plus, tak radek jeste neskoncil. Pokud na konci plus neni, tak dalsi radek je novy radek. (Ze si pak misto konce radku da mezeru, je dalsi vec.)
-
Jak píšou předřečníci, je to pole stringů, každá položka je jeden řádek (případně můžete konec řádku nahradit jiným bílým znakem), znak „+“ stringy spojí (tedy v poli je to výsledně jedna položka, tj. jeden řádek).
-
dekuji jsem kokes, ty plusy mi unikly
diky moc !!