Autor Téma: Zistenie najdlhšej hodnoty v poli Query  (Přečteno 366 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6856
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Zistenie najdlhšej hodnoty v poli Query
« kdy: 19-11-2022, 11:13:04 »

Mám DataSet TQuery naplnený údajmi.
Chcem pri zobrazení údajov nastaviť šírku stĺpca. Na to potrebujem text hlavičky a najdlhšiu hodnotu z poľa.
Viem to urobiť v cykle, kde prechádzam postupne jednotlivé riadky. Postupne porovnávam šírku textu a ukladá si tu väčšiu. To sa mi veľmi nepáči. Polí a riadkov môže byť veľa. Mám dva typy polí:
  • číslo - decimal (currency)
  • string
Rád by som pre 1. použil
Kód: Delphi [Vybrat]
  1. SELECT MAX(FIELDXY) AS FIELDXY FROM MYQUERY
Neviem, čo sa dá použiť pre 2.
Dôvody sú dva:
  • kratší, zrozumiteľnejší text a bez chýb
  • predpokladám, že to bude rýchlejšie
Dá sa niečo také urobiť?
DB: Firebird
Prístup k DB: DevArt - UniDAC - IBC
« Poslední změna: 19-11-2022, 11:15:44 od Stanislav Hruška »
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1435
  • Karma: 52
    • Verze Delphi: 10.3
Re:Zistenie najdlhšej hodnoty v poli Query
« Odpověď #1 kdy: 19-11-2022, 12:15:06 »
Najít text, který je nejdelší co se počtu znaků týče, se dá snadno, ale myslím, že to ničemu nepomůže, protože Firebird neví, jak široké to písmenko bude na monitoru (viz texty iiiii a www). MAX, CHAR_LENGTH.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6856
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Zistenie najdlhšej hodnoty v poli Query
« Odpověď #2 kdy: 19-11-2022, 12:47:06 »
Šírku textu si zisťujem v D. Potrebujem len najdlhšie slovo. Vyskúšam ten MAX.
Ale ako obísť ten cyklus?
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6856
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Zistenie najdlhšej hodnoty v poli Query
« Odpověď #3 kdy: 19-11-2022, 12:54:46 »
Kód: Delphi [Vybrat]
  1. SELECT MAX(CHAR_LENGTH(S.TITLESHORT)) AS Max_TITLESHORT, S.TITLESHORT
  2. FROM SERVICES S
  3. GROUP BY S.TITLESHORT
Dostávam takýto výsledok, s ktorým si už poradím
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6856
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Zistenie najdlhšej hodnoty v poli Query
« Odpověď #4 kdy: 19-11-2022, 14:12:31 »
Bude mi fungovať niečo také? Pseudo kód
Kód: Delphi [Vybrat]
  1. MyMemoryTable.DataSet := MyQuery;  // Vytvorenie štruktúry a naplnenie údajmi
  2. SELECT *
  3. FROM MYMEMORYTABLE
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6856
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Zistenie najdlhšej hodnoty v poli Query
« Odpověď #5 kdy: 19-11-2022, 15:19:19 »
Samozrejme, že to nejde. MemoryTable nie je DB objekt. Mal som to v sebe podvedome, ale...
Vyzerá to tak, že budem musieť ísť stĺpec po stĺpci a preň všetky riadky.
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1435
  • Karma: 52
    • Verze Delphi: 10.3
Re:Zistenie najdlhšej hodnoty v poli Query
« Odpověď #6 kdy: 19-11-2022, 17:17:41 »
Nějak takhle:

Kód: Delphi [Vybrat]
  1. SELECT
  2.  MAX(CHAR_LENGTH(a.Pobocka)) as Max_Pobocka,
  3.  MAX(CHAR_LENGTH(a.Zkratka)) as Max_Zkratka
  4. FROM Pobocky a

Ty texty jako takové bych vůbec nestahoval, spíš bych pak našel nějaké "průměrně široké písmeno" (třeba "n"?), udělal řetězec těch písmen a zjistil jeho šířku v pixelech.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6856
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Zistenie najdlhšej hodnoty v poli Query
« Odpověď #7 kdy: 19-11-2022, 19:52:24 »
Už to mám urobené stĺpec po stĺpci a všetky riadky. Ak zoberieme, že tam bude 50 stĺpcov a 10 riadkov na rok, tak to nie je také strašné. A to som hodnoty voči praxi poriadne nadsadil.
V každom prípade, ak niečo nepoužijem, tak som niečo naučil. Všetky veci čo mi píšete aj skúšam. Už som sa párkrát popálil, keď som to nerobil.
======================================
Ešte uvažujem nad jednou vecou
Mám riadkovú tabuľku predpisov, ktorú občas (2 x ? ) prevádzam na stĺpcovú. Pri bežnom stave ako tento
1 SVB - 100 bytov - 30 služieb - 12 mesiacov - 10 rokov = 360 000 záznamov ročne. Nič extra.
Teoreticky 3 000 bytov = 10 800 009 záznamov. Chcem si navodiť takýto stav a otestovať celú aplikáciu. Výkon som už čiastočne riešil, keď som tam mal skúšobne 3 500 000 záznamov.
.
Už som nad tým uvažoval, ale nemal som skúsenosti a vedomosti. Ido o vytvorenie samostatnej tabuľky pre každé SVB. Tým by som nemal problém s výkonom. Štatistiky sa robia podľa SVB. Takže sa nemiešajú dokopy. Aj to by som vedel.
Možno to ani nebude potrebné. To ešte len uvidím. Už mi tu písali, že majú podstatne väčšie tabuľky a nemajú problém s výkonom.
.
Dôležité je:
  • že už to viem urobiť
  • po programátorskej stránke to nie je ťažké
  • ale prácne to bude dosť
  • + zjednodušia sa mi SQL texty, lebo vo všetkých čo ich prepojím s tabuľkou predpisov, vypadne podmienka FKFOCS = :FKFOCS
Len sa neviem rozhodnúť či do toho ísť. Veď ani netuším, či o to bude mať niekto záujem  ??? :'( . Veľký správca to asi nebude ;D . Jeden je, ale tam sú len 4 byty. Už som si sľúbil, že mu to do týždňa pošlem. Mám už pre to vytvorené podmienky.
.
Kecám a kecám, len aby som nemusel riešiť aplikáciu :)
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Ján Masaryk

  • Plnoletý
  • ***
  • Příspěvků: 102
  • Karma: 5
    • Verze Delphi: 2010
Re:Zistenie najdlhšej hodnoty v poli Query
« Odpověď #8 kdy: 27-11-2022, 10:22:55 »
Nechápem, prečo nepoužiješ monotype font s konštantnou šírkou...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6856
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Zistenie najdlhšej hodnoty v poli Query
« Odpověď #9 kdy: 27-11-2022, 10:46:40 »
Prosím Ťa, používaš na formulári neproporcionálny druh písma? Lebo ja nie.
Názov témy nie je práve dobrý. V skutočnosti potrebujem hodnoty najdlhšieho "vykresleného" textu v pixeloch.
Myslím si, že moje riešenie je pre danú situáciu dostačujúce.
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Ján Masaryk

  • Plnoletý
  • ***
  • Příspěvků: 102
  • Karma: 5
    • Verze Delphi: 2010
Re:Zistenie najdlhšej hodnoty v poli Query
« Odpověď #10 kdy: 27-11-2022, 15:47:18 »
Na formulároch štandardne nie. Ale ak potrebujem zobraziť niečo napríklad cez Memo a má to mať konzistentný vzhľad - napríklad náhľad ekasa dokladu alebo nejakej uzávierky, tak ako.

Offline František

  • Guru
  • *****
  • Příspěvků: 829
  • Karma: 7
    • Verze Delphi: comunity 10.4.2, D2007, D11
Re:Zistenie najdlhšej hodnoty v poli Query
« Odpověď #11 kdy: 28-11-2022, 00:54:47 »
a co keby si pouzil OnDrawDataCell alebo nieco podobne (toto je pre TDBGrid) a tam si porovnas sirku textu s aktualnou sirkou stlpca a ked treba tak upravis

alebo pouzi na zobrazenie napr. TListView a tam sa nastavi sirka na tusim -1 a to znamena autowidth
« Poslední změna: 28-11-2022, 00:56:31 od František »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6856
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Zistenie najdlhšej hodnoty v poli Query
« Odpověď #12 kdy: 29-11-2022, 19:39:04 »
K tomu deleniu hlavnej tabuľky na viac tabuliek. Pre každé SVB samostatnú.
  • Mám vygenerovaných 16 740 000 záznamov
  • Zistil som, že ak správne definujem INNER, tak sa podstatne skráti doba dopytu. Vo všeobecnosti sa dostávam na 5-6 sek
  • Takže nič deliť nepotrebujem.
  • Pridal som nadbytočné prepojenie a bum! Opäť veľké zlepšenie
  • Veľmi pomáha aj vyhodenie zbytočných tabuliek. To je chyba návrhu, ale vtedy som to nevidel
Som rád. Mám čo robiť...
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.