PDA

Visualizza la versione completa : [delphi] query su campo calculated


123delphi321
26-10-2004, 22:06
Ciao,

questo il problema:

ho 2 Ibtabelle Mater e detail,
ho creato una StoredProcedure che mi restituisce il totale importo del dettaglio inserendo l'IDMaster.

in delphi eseguo una query e nell'evento OnCAlcFields della IbQuery mi calcolo anche il mio ield totale. OK

adesso dovrei fare un'altra query dove seleziono solo i record aventi il campo totale <> 0.

questa non riesco a farla, inquanto il Field totale non esiste... essendo un field di tipo calulated

ottengo errore: Colounm UNKNOW

mi sapete dire come fare?

grazie

AlbertoPicca
26-10-2004, 22:19
Non capisco perché devi fare una seconda query se hai già disponibili in locale tutti i risultato.

Non ti basterebbe filtrare i record che hanno il campo Totale > 0?

:ciauz:

alka
26-10-2004, 22:43
Alberto ha ragione.

Aggiungo un'altra cosa per ogni evenienza: la tabella che ottieni (quella con il campo calcolato) è suscettibile di modifiche da parte dell'utente?

In caso contrario, potresti sempre creare una stored procedure che ti esegua lato server l'elaborazione del valore totale.

Personalmente, cerco di spostare tutte queste elaborazioni sul server che, generalmente, è la macchina più adatta ad eseguire scansioni sui record e compiere calcoli, mentre mi accontento lato client di ottenere il semplice risultato. :)

I filtri "client side" sono molto inefficienti: perchè dovresti sovraccaricare la rete facendoti restituire dal server migliaia di record (per fare un esempio) se poi ne vuoi visualizzare solo poche centinaia? Tanto vale che sia il server ad eseguire il calcolo a a darti solo quelli. :)

Ciao! :ciauz:

123delphi321
26-10-2004, 22:45
come dovrei fare a filtrare solo quelli con totale 0????


ma poi non impiega piu tempo a fare prima una query che restituisce 1000 records...dal quale ne filtro solo 4?


grazie

AlbertoPicca
26-10-2004, 22:48
Allora puoi seguire il consiglio di Alka!
Ottiene i risultati voluti solo attraverso l'elaborazione del server.

:ciauz:

alka
26-10-2004, 22:49
Originariamente inviato da 123delphi321
come dovrei fare a filtrare solo quelli con totale 0????

Potresti riuscirci facendo due stored procedure, una che ti restituisce i record con i relativi totali calcolati lato server usando delle FOR SELECT, l'altra che - richiamando la prima - restituisca solamente i dati (sottoforma di campi in output) relativi alle sole righe che hanno il totale uguale a 0 (zero).


Originariamente inviato da 123delphi321
ma poi non impiega piu tempo a fare prima una query che restituisce 1000 records...dal quale ne filtro solo 4?

E' meglio che sia il server a limitare i risultati e restituire solamente 4 record all'applicazione; pensa anche solo al risparmio di memoria che sarebbe altrimenti sprecata per tenere in un buffer tanti record che non sono però accessibili per via del filtro. :)

Ciao! :ciauz:

123delphi321
26-10-2004, 22:50
grazie

123delphi321
27-10-2004, 08:03
Potresti riuscirci facendo due stored procedure, una che ti restituisce i record con i relativi totali calcolati lato server usando delle FOR SELECT, l'altra che - richiamando la prima - restituisca solamente i dati (sottoforma di campi in output) relativi alle sole righe che hanno il totale uguale a 0 (zero).

non ho capito come farla, potresti spiegarmela xfavore

grazie

alka
27-10-2004, 10:54
Non ho molto tempo per produrre esempi pratici, tuttavia - dal punto di vista teorico - potresti creare una prima stored procedure che esegua una FOR SELECT...INTO (per la sintassi, consulta la documentazione di InterBase) sui record di dettaglio per una determinata testata identificata da un parametro (ID?) passato alla stored procedure.

Ciclando su ciascun record, usi una variabile contatore e sommi in essa i singoli valori per costruire il totale che restituirai in seguito come campo di output della stored procedure.

In alternativa, potresti creare una stored procedure ancora più generica che esegua più FOR SELECT INTO nidificate, una per scandire tutti i record di testata e - per ciascuno di essi - ed una per ciascun record di testata (di cui viene memorizzato l'ID) per scandire i record del dettaglio e calcolare il totale da restituire.

In output fornisci due campi: l'ID di testata e il totale calcolato.

Una stored procedure può essere trattata come una semplice "query memorizzata" usando uno statement del tipo SELECT campi FROM storedprocedure; puoi benissimo creare una seconda procedure in grado di eseguire una FOR SELECT prelevando i record dalla prima stored procedure ma restituendo, ad esempio, solo gli ID delle testate per le quali risulta un totale pari a zero.

Spero che almeno a livello concettuale il meccanismo sia chiaro.

Per la sua implementazione, ti rimando alla documentazione di InterBase per la sintassi degli statement SQL disponibili e citati qui sopra.

Ciao! :ciauz:

123delphi321
29-10-2004, 21:16
In alternativa, potresti creare una stored procedure ancora più generica che esegua più FOR SELECT INTO nidificate, una per scandire tutti i record di testata e - per ciascuno di essi - ed una per ciascun record di testata (di cui viene memorizzato l'ID) per scandire i record del dettaglio e calcolare il totale da restituire.

In output fornisci due campi: l'ID di testata e il totale calcolato.

questa e' la strada che vorrei seguire, sto cercando di fare delle prove, ma mi riescono sempre male... :cry:

il mio obiettivo e' sempre quello di ottenere un dataset contenente solo il campo id delle anagrafiche che hanno come valore TOTALE 0. ricordo che il totale e' il risultato di una stored procedure.

quindi, ho pensato di creare una prima stored che mi restituisse un dataset contenente le N anagrafiche registrate tra 2 date:

CREATE PROCEDURE NEW_PROCEDURE (
DAL DATE,
AL DATE)
RETURNS (
IDSKEDA VARCHAR(20))
AS
begin
/* Procedure Text */
SELECT id FROM anagrafica where data>=:dal and data<=:al into :idskeda;
suspend;
end

ottengo questo errore:
multiple rows in singleton selection

ancora non mi e' chiaro come utilizzare queste stored, per cortesia mi aiutate?

grazie

Loading