Comandi query parametrizzati

di Robert59 il
5 risposte

Buongiorno a tutti,
posso parametrizzare comandi query?

mi spiego meglio, allegando righe di codice

in alternativa a alle righe esposte sotto, potrei pensare di avere una tabella, dove all'interno di un campo avere:
SELECT m.cd_tag, m.id_doc, m.cd_itm, m.dta_mvt, t.stock, t.cd_loc, l.erp

ed invece che scriverlo, passarglielo come parametro?

così anche per il comando FROM, INNER JOIN, WHERE ecc… 

UniDoc.Close;
     UniDoc.SQL.Clear;
     UniDoc.SQL.Add('     SELECT m.cd_tag, m.id_doc, m.cd_itm, m.dta_mvt, t.stock, t.cd_loc, l.erp ');
     UniDoc.SQL.Add('       FROM x2qtr.x9doc AS m                                                  ');
     UniDoc.SQL.Add(' INNER JOIN x2qtr.x9tag AS t ON (m.cd_tag = t.cd_tag)                         ');
     UniDoc.SQL.Add(' INNER JOIN x2qtr.x9loc AS l ON (l.cd_loc = t.cd_loc)                         ');
     UniDoc.SQL.Add('      WHERE m.cd_itm=:Articolo                                                ');
     UniDoc.SQL.Add('        AND m.cd_mvt= ''S.CLI''                                               '); 
     UniDoc.SQL.Add('        AND t.stock > 0                                                       '); 
     UniDoc.SQL.Add('        AND l.erp = ''01''                                                    '); 
     UniDoc.SQL.Add('   ORDER BY m.dta_mvt DESC LIMIT 1                                          '); 
     UniDoc.ParamByName('Articolo').AsString := ('CodArt');
     UniDoc.Open;

5 Risposte

  • Non ho capito dove vuoi arrivare ma in un DB (tabella/campo) puoi avere quello che vuoi.

    Lo leggi con una apposita query e lo passi come stringa per formare un'altra query.

    Ma mi sembra un “accrocchio” strano e senza senso.

    (P.S. Se tu avessi avuto veramente chiara la differenza tra stringa variabile e costante, non avresti fatto questa domanda)

  • Tipo:

    tabQuery.sql.clear

    Tabquery.sql.loadfromfile(…)

    Così?

  • 05/04/2023 - Robert59 ha scritto:


    in alternativa a alle righe esposte sotto, potrei pensare di avere una tabella, dove all'interno di un campo avere:
    SELECT m.cd_tag, m.id_doc, m.cd_itm, m.dta_mvt, t.stock, t.cd_loc, l.erp

    Ignoro completamente i motivi di una simile scelta, che richiederebbe letteralmente di eseguire una query per poter ottenere la query da eseguire, e posso dire per esperienza che non abbia alcun senso, ma se questo è l'obiettivo si può fare tranquillamente: così come ora stai facendo la SELECT dei campi che ti servono dalla tabella finale, indirizza la tua SELECT alla tabella che contiene la query da eseguire per ottenere il suo testo, salvalo in una variabile (es. QueryText) e poi impostalo come statement SQL della query finale che ottiene i dati.

    Ad esempio,

    UniDoc.Close();
    UniDoc.SQL.Text := QueryText; // qui lo statement SQL precedentemente caricato
    UniDoc.Active();

    Potrebbe invece avere più senso definire le query come risorse, almeno parziali, con poco codice e usando poi TResourceStream per recuperare lo script SQL incorporato nell'eseguibile.

    Ciao! :)

  • Grazie

    risposte molto interessanti

    prometto di approfondire la proposta di Alka

  • Sono d'accordo con alka sul “non senso”

Devi accedere o registrarti per scrivere nel forum
5 risposte