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 | Access | 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

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-19T10:56:03+00:00

    Ciao franco,

    il punto e virgola indica la fine della query, il fatto che Access accetti più di un terminatore di query nelle query di unione, secondo me è un BUG anche se poco rilevante.

    Infatti su motori di database più evoluti la seguente query


    SELECT ID FROM Tabella;

    UNION

    SELECT ID FROM Tabella;


    rende l'errore "Sintassi non corretta in prossimità della parola chiave 'UNION'."

    Menre quella corretta è


    SELECT ID FROM Tabella

    UNION

    SELECT ID FROM Tabella;


    Per quanto riguarda l'alias puoi dare il nome che vuoi,


    SELECT Fat.Numero,Fat.Data

    FROM Fatture AS Fat INNER JOIN Clienti AS CLi ON Fat.Id_Cli = Cli.Id

    WHERE Cli.Regione = 'Lombardia'


    l'alias serve a questo, io ho usato X perchè nel resto della query tu usavi X,

    Ciao

    Giorgio Rancati

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2013-02-19T10:31:47+00:00

    Ciao Giorgio!

    Grazie per il tuo intervento: problema risolto!

    Sono anni che utilizzo query di unione ma mai avrei pensato che fosse inutile il separatore punto e virgola tra le singole query!

    Il tutto quindi funziona grazie al tuo intervento!

    Solo una domanda ancora: l'alias "x" che hai introdotto deve necessariamente essere "x" o può essere un qualunque carattere?

    A me ora proseguire con tutto il resto del programma sulla base di quanto mi hai insegnato, pensando che si possano annidare più di una query-stringa soprattutto se sarà possibile assegnare alias differenti per ogni FROM.

    Cordiali saluti e grazie ancora per la collaborazione

    franco

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2013-02-18T23:20:44+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

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2013-02-18T19:35:28+00:00

    Ciao Franco,

    ok, ora è chiaro, puoi risolvere con una tabella derivata modificando il tuo codice così:


    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