Newsgroup: it.comp.appl.access
Titolo: VBA: query & stringhe SQL

Salve a tutti,
per trovare una scorciatoia dovrei fare
la seguente cosa:
1) copiare la stringa sql di una determinata query (querydef definita)
    la query è del tipo SELECT NPC FROM POLCLI WHERE ....
2) prendendo la stringa copiata  dovrei inserire nella stringa SQL select
POL ovvero la stringa
dovrebbe essere:  SELECT NPC , POL FROM POLCLI WHERE ....
3) creare una nuova query con la nuova stringa SQL (questo punto riesco a
risolverlo)
Qualcuno mi pou' dare una dritta?
Grazie!
ringo

 ha scritto nel messaggio
news:ao413b$ljv$1...@serv1.albacom.net...

Se la query di partenza di cui si deve modificare il codice SQL si chiama
Query1.
Se la nuova query da creare e salvare partendo da Query1 si chiama Query2.
Se per creare Query2 occorre aggiungere nella SELECT un campo chiamato POL.
In un modulo del tuo database registrati questa funzione:
Function ObjectExists(ObjectType As String, ObjectName As String) As Integer
     On Error Resume Next
     Dim Found_Object As Integer, Find_Object As String, ObjectNum As
Integer
     Dim db As DATABASE, T As TableDef
     Dim Q As QueryDef, C  As Container
     Dim msg As String
     Found_Object = False
     Set db = CurrentDb()
     Select Case ObjectType
       Case "Tables"
           Find_Object = db.TableDefs(ObjectName).Name
       Case "Queries"
           Find_Object = db.QueryDefs(ObjectName).Name
       Case Else
           If ObjectType = "Forms" Then
               ObjectNum = 1
           ElseIf ObjectType = "Modules" Then
               ObjectNum = 2
           ElseIf ObjectType = "Reports" Then
               ObjectNum = 4
           ElseIf ObjectType = "Macros" Then
               ObjectNum = 5
           Else
                msg = "Object Name """ & ObjectType & """ is an invalid"
                msg = msg & " argument to function ObjectExists!"
                MsgBox msg, 16, "ObjectExists20"
                Exit Function
           End If
           Set C = db.Containers(ObjectNum)
           Find_Object = C.Documents(ObjectName).Name
       End Select
       If Err = 3265 Or Find_Object = "" Then
           Found_Object = False
       Else
           Found_Object = True
       End If
       ObjectExists = Found_Object
   End Function
Invece per creare e salvare Query2, esegui questo codice VBA, che fa
riferimento alle librerie DAO:
Dim MyQueryDef As QueryDef
Dim SQL As String
Dim Conta As Integer
' Se già esiste, cancella Query2
If ObjectExists("Queries", "Query2") = True Then
    CurrentDb().QueryDefs.Delete "Query2"
    CurrentDb().QueryDefs.Refresh
End If
Set MyQueryDef = CurrentDb().QueryDefs("Query1")
SQL = MyQueryDef.SQL
For Conta = 1 To Len(SQL)
    If Mid(SQL, Conta, 4) = "FROM" Then
        Exit For
    End If
Next Conta
SQL = left(SQL, Conta - 1) & ", POL " & Mid(SQL, Conta)
MyQueryDef.Close
Set MyQueryDef = CurrentDb().CreateQueryDef("Query2", SQL)
MyQueryDef.Close
Set MyQueryDef = Nothing
Dovrebbe funzionare.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 ha scritto nel messaggio
news:fwmp9.14741$%M1.3...@twister2.libero.it...

caccccccccchio!!!
scusa del termine ma X me sei
un mito....
non riesciro mai io ad usare il
codice come lo usi te!!!
ho fatto come hai detto e funziona tutto
alla meraviglia!
grazie!
P.S.: grazie per la scorciatoia!
ringo!

 ha scritto nel messaggio
news:fwmp9.14741$%M1.3...@twister2.libero.it...

scusa la tua soluzione è ottima solo che
mi son dimenticato che il campo POL
andrebbe aggiunto anche nella proposizione GRUOP BY...
infatti il tuo metodo lo dovrei utrilizzare su
circa una 15 query che hanno la strutture:
SELCT NPC
FROM POLCLI
WHERE.............
GROUP BY NPC
non è che potresti fare un strappo
alla regola dicendomi come modificare
il codice per aggiungere il compo POL
al GROUP BY??
.... che aproffittatore che sono.....
bye

 ha scritto nel messaggio
news:fwmp9.14741$%M1.3...@twister2.libero.it...

Roberto ci sono riuscito ad inserire POL nel group by....
grazie ancora!!!
ringo
'**************************************************************************
'***   Costruzione query2 copiando query1 aggiungendo campo pol     *
'**************************************************************************
Dim MyQueryDef As QueryDef
Dim SQL As String
Dim Conta As Integer
' Se già esiste, cancella Query2
If ObjectExists("Queries", "query2") = True Then
    CurrentDb().QueryDefs.Delete "query2"
    CurrentDb().QueryDefs.Refresh
End If
Set MyQueryDef = CurrentDb().QueryDefs("query1")
SQL = MyQueryDef.SQL
For Conta = 1 To Len(SQL)
    If Mid(SQL, Conta, 4) = "FROM" Then
        Exit For
    End If
Next Conta
SQL = Left(SQL, Conta - 1) & ", POL " & Mid(SQL, Conta)
MyQueryDef.Close
Set MyQueryDef = CurrentDb().CreateQueryDef("query2", SQL)
MyQueryDef.Close
Set MyQueryDef = Nothing
'Inserimento POL nel GROUP BY
Set MyQueryDef = CurrentDb().QueryDefs("query2")
SQL = MyQueryDef.SQL
For Conta = 1 To Len(SQL)
    If Mid(SQL, Conta, 1) = ";" Then
        Exit For
    End If
Next Conta
Debug.Print SQL
SQL = Left(SQL, Conta - 1) & ", POL " & Mid(SQL, Conta)
Debug.Print SQL
MyQueryDef.Close
Set loqd = CurrentDb.QueryDefs("query2")
loqd.SQL = SQL
loqd.Close


[CUT]
Molto bene; potevi risparmiare qualche istruzione; visto che il carattere da
ricercare era solo ";":  bastava usare la funzione InStr.
Ad ottimizzare c'è sempre tempo: la cosa importante è trovare soluzioni
funzionanti. :-)
Solo al fine di farti capire la tecnica QBF, ti posto qui di seguito la mia
soluzione: io sarei intervenuto aggiungendo una sola riga di codice VBA,
ovvero il tutto sarebbe diventato:
Dim MyQueryDef As QueryDef
Dim SQL As String
Dim Conta As Integer
' Se già esiste, cancella Query2
If ObjectExists("Queries", "Query2") = True Then
    CurrentDb().QueryDefs.Delete "Query2"
    CurrentDb().QueryDefs.Refresh
End If
Set MyQueryDef = CurrentDb().QueryDefs("Query1")
SQL = MyQueryDef.SQL
For Conta = 1 To Len(SQL)
    If Mid(SQL, Conta, 4) = "FROM" Then
        Exit For
    End If
Next Conta
SQL = Left(SQL, Conta - 1) & ", POL " & Mid(SQL, Conta)
'**** NUOVA RIGA PER MODIFICARE GROUP BY ***
SQL = Left(SQL, InStr(SQL, ";")-1) & ", POL;"
'***********************************************


 ringo!
--



[CUT]
Mi ero dimenticato di dirti che la spiegazione dettagliata di come č stato
realizzato l'esempio la trovi al link:
http://support.microsoft.com/support/kb/articles/q136/0/62.asp
