Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,311

    [delphi] query su campo calculated

    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

  2. #2
    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?


  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,311
    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

  5. #5
    Allora puoi seguire il consiglio di Alka!
    Ottiene i risultati voluti solo attraverso l'elaborazione del server.


  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,311
    grazie

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,311
    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

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,311
    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...

    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:
    codice:
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.