Condividi tramite

Utilizzo query temporanea in query temporanea

Anonimo
2013-02-18T00:44:53+00:00

Buongiorno a tutti!

Vorrei sapere se e come si possono utilizzare query temporanee in altre query temporanee con Access 2003 in W7

Esempio:

............

Set qryRs = Db.CreateQueryDef("", "SELECT ............;")

      e di seguito

Set qryTemp = Db.CreateQueryDef("", "INSERT INTO XXX usando la query temporanea qryRs;")

qryTemp.Execute dbFailOnError

.............

Ovviamente grazie della collaborazione a chi mi dedicherà un attimo di tempo.

A disposizione per ulteriori indicazioni se utili

franco

Microsoft 365 e Office | Accesso | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2013-02-19T08:02:45+00:00

    Ciao Giorgio

    Grazie per l'interessamento, ma la soluzione che mi proponi non funziona in quanto la definizione dei campi da cui prelevare i dati si riferisce ad una query non esistente: la "x" (es. SELECT x.Codice ecc.).

    Nel mio esempio si riferiva alla querydef che avevo creato, e la stringa della query che mi hai suggerito non sembrerebbe utilizzabile nella seconda query.

    Lasciando il tutto come tu suggerisci, da "Errore di sintassi nella proposizione FROM", mentre sostituendo ad ogni "x" dei campi il richiamo stringa, da "Operazione non consentita nelle sottoquery."

    Non vorrei aver compiuto un errore di interpretazione puerile nell'utilizzo del tuo suggerimento, ma proprio utilizzato tal quale non sembrerebbe funzionare.

    Hai qualche altra soluzione? o suggerirmi dove ho sbagliato?

     

    Grazie per la collaborazione e cordiali saluti

    franco

    Ciao Franco,

    il concetto è esatto, è possibile inserire una SELECT nella clausola FROM, si chiama Tabella Derivata, l'alias X che ho messo rende il resto del codice compatibile qon quello da te postato.

    La causa dell'errore è da ricercare nel codice SQL di qryX, c'è un punto e virgola di chiusura prima della UNION che mi era sfuggito e che va tolto.

    questo è il codice corretto:


    Dim AnRif As Integer

    Dim AzAt As Byte

    Dim qryX AS String

    AzAt = 1 'Convenzionale per l'esempio

    AnRif = 2012 'Convenzionale per l'esempio

      qryX = "SELECT SpCant.Codice, Year([DataRap]) AS Anno, Month([DataRap]) AS Mese, SpCant.CodCentro, SpCant.CodLav, " & _

    "Sum(SpCant.Quant) AS Quant, Sum((1+Cantieri!RicMat/100)*SpCant!Quant*SpCant!CostUnit) AS SAP FROM Cantieri INNER JOIN SpCant " & _

    "ON (Cantieri.CodCant = SpCant.Codice) AND (Cantieri.Az = SpCant.Az) IN 'L:\Dati.mdb' WHERE (((Cantieri.Az)=" & AzAt & ") " & _

    "AND ((Year([DataRap]))=" & AnRif & ")) GROUP BY SpCant.Codice, Year([DataRap]), Month([DataRap]), SpCant.CodCentro, SpCant.CodLav " & _

    "UNION SELECT SpCantAPSaldi.Codice, SpCantAPSaldi.Anno, SpCantAPSaldi.Mese, SpCantAPSaldi.CodCentro, SpCantAPSaldi.CodLav, " & _

    "Sum(SpCantAPSaldi.Quant) AS Quant, Sum((1+Cantieri!RicMat/100)*SpCantAPSaldi!Importo) AS SAP FROM Cantieri INNER JOIN SpCantAPSaldi " & _

    "ON (Cantieri.CodCant = SpCantAPSaldi.Codice) AND (Cantieri.Az = SpCantAPSaldi.Az) IN 'L:\Dati..mdb' WHERE (((Cantieri.Az)=" & AzAt & ") " & _

    "AND ((SpCantAPSaldi.Anno)<" & AnRif & ")) GROUP BY SpCantAPSaldi.Codice, SpCantAPSaldi.Anno, SpCantAPSaldi.Mese, " & _

    "SpCantAPSaldi.CodCentro, SpCantAPSaldi.CodLav"

    DoCmd.RunSQL ("INSERT INTO SpCant ( Codice, Anno, Mese, CodCentro, CodLav, Quant, SAP ) SELECT x.Codice, x.Anno, x.Mese, x.CodCentro, x.CodLav, " & _

    "Sum(x.Quant) AS Quant, Sum(x.SAP) AS SAP FROM (" & qryX & ") AS x INNER JOIN CantRif ON x.Codice = CantRif.Codice GROUP BY x.Codice, x.Anno, x.Mese, " & _

    "x.CodCentro, x.CodLav;")


    Ciao

    Giorgio Rancati

    La risposta è stata utile?

    0 commenti Nessun commento

11 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2013-02-18T18:40:42+00:00

    Ciao Giorgio e grazie ancora!

    Ecco un esempio semplificato di una delle esigenze che ho! Quanto sotto ovviamente si riferisce ad una query creata provvisoriamente con il nome "x" (che è quello che vorrei evitare, e che recupera, in unione, una serie di dati da due tabelle (SpCant ed SpCantAPSaldi) che si trovano nel file L:\Dati.mdb.

    La variabile qryTemp, qui sotto dichiarata, è quella che vorrei poter utilizzare quale query di comando con

    qryTemp.Execute dbFailOnError

    anzichè

    DoCmd.RunSQL (" ecc.

    richiamando la precedente qryRs che per ora assume il nome di "x" che viene associata ad una tabella (CantRif) esistente nel database di lavoro in quanto creata in precedenza e che alla fine viene eliminata,

    Dim Db As DatabaseDim Rs As RecordsetDim qryRs, qryTemp As QueryDefDim AnRif As IntegerDim AzAt As Byte

    Set Db = CurrentDbAzAt = 1 'Convenzionale per l'esempio

    AnRif = 2012 'Convenzionale per l'esempio

    Set qryRs = Db.CreateQueryDef("x", "SELECT SpCant.Codice, Year([DataRap]) AS Anno, Month([DataRap]) AS Mese, SpCant.CodCentro, SpCant.CodLav, " & _"Sum(SpCant.Quant) AS Quant, Sum((1+Cantieri!RicMat/100)*SpCant!Quant*SpCant!CostUnit) AS SAP FROM Cantieri INNER JOIN SpCant " & _"ON (Cantieri.CodCant = SpCant.Codice) AND (Cantieri.Az = SpCant.Az) IN 'L:\Dati.mdb' WHERE (((Cantieri.Az)=" & AzAt & ") " & _"AND ((Year([DataRap]))=" & AnRif & ")) GROUP BY SpCant.Codice, Year([DataRap]), Month([DataRap]), SpCant.CodCentro, SpCant.CodLav; " & _"UNION SELECT SpCantAPSaldi.Codice, SpCantAPSaldi.Anno, SpCantAPSaldi.Mese, SpCantAPSaldi.CodCentro, SpCantAPSaldi.CodLav, " & _"Sum(SpCantAPSaldi.Quant) AS Quant, Sum((1+Cantieri!RicMat/100)*SpCantAPSaldi!Importo) AS SAP FROM Cantieri INNER JOIN SpCantAPSaldi " & _"ON (Cantieri.CodCant = SpCantAPSaldi.Codice) AND (Cantieri.Az = SpCantAPSaldi.Az) IN 'L:\Dati..mdb' WHERE (((Cantieri.Az)=" & AzAt & ") " & _"AND ((SpCantAPSaldi.Anno)<" & AnRif & ")) GROUP BY SpCantAPSaldi.Codice, SpCantAPSaldi.Anno, SpCantAPSaldi.Mese, " & _"SpCantAPSaldi.CodCentro, SpCantAPSaldi.CodLav;")

    DoCmd.RunSQL ("INSERT INTO SpCant ( Codice, Anno, Mese, CodCentro, CodLav, Quant, SAP ) SELECT x.Codice, x.Anno, x.Mese, x.CodCentro, x.CodLav, " & _"Sum(x.Quant) AS Quant, Sum(x.SAP) AS SAP FROM x INNER JOIN CantRif ON x.Codice = CantRif.Codice GROUP BY x.Codice, x.Anno, x.Mese, " & _"x.CodCentro, x.CodLav;")

    DoCmd.DeleteObject acQuery, "x"

    Db.Close

    Con tale operazione ho circa una decina di tabelle da aggiornare e per tutte, al momento, passo attraverso la query "x" che ogni volta cancello.

    Ovvio che sono a completa disposizione per permetterti di capire meglio se non fossi stato sufficientemente esplicito.

    Grazie per la collaborazione e cordiali saluti

    franco

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2013-02-18T09:47:28+00:00

    Ciao Franco,

    quello che mi manca per capire la tua esigenza è un esempio pratico con nomi di tabelle e campi.

    ad esempio il tuo codice

    ----

    Set qryRs = Db.CreateQueryDef("", "SELECT ............;")

    Set qryTemp = Db.CreateQueryDef("", "INSERT INTO XXX usando la query temporanea qryRs;")

    qryTemp.Execute dbFailOnError

    ----

    come deve essere interpretato ?

    XXX sarebbe un qualcosa di volatile definito da qryRS ?

    Ma qryRS è una SELECT che preleva i dati da una tabella ben definita No? Quindi la Insert basta farla sulla stessa tabella da cui pesca qryRS.

    In ogni caso i dati devono essere inseriti in una Tabella fisica del database.

    Ciao

    Giorgio Rancati

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2013-02-18T09:13:16+00:00

    Ciao Giorgio e grazie per la tua solita tempestività.

    All'apertura di un database, dopo aver cancellato tutti i contenuti di tabelle esistenti, devo importare da database esterno, il nuovo contenuto delle stesse: ovviamente il tutto serve per elaborare statistiche su dati non modificabili e su base di dati che rispetto gli originali ne risultano, già in fase di acquisizione, degli elaborati.

    L'esigenza primaria è quella di non lasciare traccie di query nel database e di mantenere le dimensioni dello stesso a livello di accettabilità, oltre alla possibilità di inserire nelle tabelle in ricostruzione, dati già acquisiti.

    Inoltre esiste una "ragnatela" di relazioni che vorrei evitare di toccare, ma, proprio attraverso le stesse (sono tutte ad integrità referenziale), controllare, mediante analisi dei possibili errori, la correttezza delle imputazioni nel database principale.

    Quanto richiedevo era per evitare di scrivere su disco delle querydef e poi doverle cancellare, appesantendo la gestione degli errori (e le relative cancellazioni in caso di errore)

    Credo che, a seguito della tua risposta, si renda necessario procedere in quest'ultima direzione, anche se pensavo che tali query temporanee potessero sempre venire in qualche modo utilizzate come quella di comando che si può pacilmente creare in forma temporanea però utilizzando una query esistente nel database.

    Temo che la terza soluzione, cioè di creare tabelle temporanee, utilizzarle ed abbandonarle successivamente, possa risultare un  po troppo lenta!

    Attendo tuoi lumi, grazie ancora per la collaborazione

    franco

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2013-02-18T07:34:12+00:00

    Ciao Franco,

    le query si basano su oggetti del database mentre qryRsè un oggetto VBA, va da se che il tuo approccio è inapplicabile.

    Tu cosa devi fare ?

    Ciao

    Giorgio Rancati

    La risposta è stata utile?

    0 commenti Nessun commento