Autor Téma: Názov tabuľky v SELECTE dynamicky  (Přečteno 862 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2611
  • Karma: 23
    • Verze Delphi: XE7 professional
Názov tabuľky v SELECTE dynamicky
« kdy: 21-09-2016, 12:23:07 »
Nasledujúca konštrukcia nefunguje
Kód: [Vybrat]
SELECT * FROM :MyTable
Teraz to riešim takto:
Kód: [Vybrat]
  while not FqryAnalIsUsedInTbl.Eof do
  begin
    FTableName := FfldTblNameAnal.AsString;
    FqryTblHaveAnal.SQL.Clear;
    FqryTblHaveAnal.SQL.Add('SELECT FIRST(1) FKCAANALYTIC FROM ' + FTableName + ' WHERE FKCAANALYTIC = :FKCAANALYTIC');
    FqryTblHaveAnal.ParamByName('FKCAANALYTIC').AsInteger := FK;
    FqryTblHaveAnal.Open();
    ...
    FqryAnalIsUsedInTbl.Next;
  end;
Rád by som to mal bez výmazu a znova dosadeniu SQL textu.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Plnoletý
  • ***
  • Příspěvků: 242
  • Karma: 1
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
Re:Názov tabuľky v SELECTE dynamicky
« Odpověď #1 kdy: 21-09-2016, 16:11:18 »
toto používam v procedúrach, možno pomôže

Kód: [Vybrat]
EXECUTE STATEMENT 'SELECT COUNT(*) AS POCET FROM PREKLUC WHERE '||:PRIKAZ||' 1=1)) ' ;

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2611
  • Karma: 23
    • Verze Delphi: XE7 professional
Re:Názov tabuľky v SELECTE dynamicky
« Odpověď #2 kdy: 21-09-2016, 16:36:31 »
A PREKLUC je čo?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1250
  • Karma: 28
    • Pepak.net
Re:Názov tabuľky v SELECTE dynamicky
« Odpověď #3 kdy: 21-09-2016, 17:04:29 »
toto používam v procedúrach, možno pomôže

Kód: [Vybrat]
EXECUTE STATEMENT 'SELECT COUNT(*) AS POCET FROM PREKLUC WHERE '||:PRIKAZ||' 1=1)) ' ;
Tak s tím hned přestaň. Je to extrémně nebezpečné (SQL injection).

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1250
  • Karma: 28
    • Pepak.net
Re:Názov tabuľky v SELECTE dynamicky
« Odpověď #4 kdy: 21-09-2016, 17:07:00 »
Rád by som to mal bez výmazu a znova dosadeniu SQL textu.
Proč? Jediné, čeho bys eventuálně mohl dosáhnout, je, že ti tu databázi někdo naboří (jako František). Pozitivní výsledek mě nenapadá žádný. Jen pěkně přepisuj to SQL, když už fakt potřebuješ dynamicky měnit tabulku.

Tu potřebu bys mimochodem mít neměl. Jsou případy, kdy se to fakt může hodit, ale daleko častější je případ, že máš strukturu databáze špatně navrženou a s lepší strukturou bys ty dynamické tabulky nepotřeboval. Co konkrétně řešíš?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2611
  • Karma: 23
    • Verze Delphi: XE7 professional
Re:Názov tabuľky v SELECTE dynamicky
« Odpověď #5 kdy: 21-09-2016, 17:32:52 »
V systémových tabuľkách si nájdem tabuľky ktoré obsahujú konkrétnu hodnotu FK. Dôvod je ten, že neviem čo v budúcnosti urobím. A na základe výsledku si zobrazujem/skrývam tlačidlá na navigátore.
Kód: [Vybrat]

function TNavBasic.AcnSyntIsUsed(const FK: Integer): Boolean;
begin
  try
    FqrySyntIsUsedInTbl.Open();
    FfldTblNameSynt := FqrySyntIsUsedInTbl.Fields.Fields[0];
    Result := True;

    while not FqrySyntIsUsedInTbl.Eof do
    begin
      FTableName := FfldTblNameSynt.AsString;

      if not ((FTableName = 'CASYNTHETICOPTIONS') or (FTableName = 'CAANALYTIC')) then  // Vylúčené tabuľky.
      begin
        FqryTblHaveSynt.SQL.Clear;
        FqryTblHaveSynt.SQL.Add('SELECT FIRST(1) FKCASYNTHETIC FROM ' + FTableName +
          ' WHERE FKCASYNTHETIC = :FKCASYNTHETIC');
        FqryTblHaveSynt.ParamByName('FKCASYNTHETIC').AsInteger := FK;
        FqryTblHaveSynt.Open();
        Result := FqryTblHaveSynt.IsEmpty;
        FqryTblHaveSynt.Close;

        if not Result then Exit;
      end;

      FqrySyntIsUsedInTbl.Next;
    end;
  finally
    FqrySyntIsUsedInTbl.Close;
  end;
end;
« Poslední změna: 21-09-2016, 17:35:09 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 558
  • Karma: 23
Re:Názov tabuľky v SELECTE dynamicky
« Odpověď #6 kdy: 21-09-2016, 19:49:35 »
Rád by som to mal bez výmazu a znova dosadeniu SQL textu.

Trochu OT, ale stačí to rovnou přiřadit. Řada lidí s oblibou používá konstrukce jako

SQL.Clear;
SQL.Add('....')

ale prakticky to je podobně smysluplné jako psát

i :=0;
i := i + 5;

Zajímavé je, že tohle nikdo nedělá :-).

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2611
  • Karma: 23
    • Verze Delphi: XE7 professional
Re:Názov tabuľky v SELECTE dynamicky
« Odpověď #7 kdy: 21-09-2016, 19:51:34 »
Myslíš SQL.Text := 'sss' ?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1250
  • Karma: 28
    • Pepak.net
Re:Názov tabuľky v SELECTE dynamicky
« Odpověď #8 kdy: 21-09-2016, 19:53:59 »
Myslíš SQL.Text := 'sss' ?
Ano.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1679
  • Karma: 70
    • Verze Delphi: D2007, XE3, DX10
Re:Názov tabuľky v SELECTE dynamicky
« Odpověď #9 kdy: 21-09-2016, 20:14:32 »
ale prakticky to je podobně smysluplné jako psát
i :=0;
i := i + 5;
To je pul bidy, ale SQL je u kazdeho datasetu nejaky potomek TStrings, u ktereho je nastavena event OnChange
viz constructory:
Kód: Delphi [Vybrat]
  1.   FSQL := TStringList.Create;
  2.   TStringList(SQL).OnChange := QueryChanged;
A to QueryChanged spousti po kazdem pridanem radku ParseSQL, ktere tak zcela zbytecne leze po neuplnem,
a tudiz casto syntakticky nespravnem prikazu a snazi se ho analyzovat

Kdyz uz nekdo sklada SQL prikazy za behu napr. jejich Where klauzule podle nastaveneho UI apod.,
tak by to mel delat nekde mimo property SQL a to pak priradit jednorazove jako Sql.Text
« Poslední změna: 21-09-2016, 20:16:27 od pf1957 »

Offline František

  • Plnoletý
  • ***
  • Příspěvků: 242
  • Karma: 1
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
Re:Názov tabuľky v SELECTE dynamicky
« Odpověď #10 kdy: 21-09-2016, 22:08:28 »
Citace

Kdyz uz nekdo sklada SQL prikazy za behu napr. jejich Where klauzule podle nastaveneho UI apod.,
tak by to mel delat nekde mimo property SQL a to pak priradit jednorazove jako Sql.Text
tak to robím odjakživa, ale cítil som sa za to previnile

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):