Newsgroup: it.comp.appl.access
Titolo: Aiuto Funzioni Query

Innanzitutto auguro Buon Ferragosto a tutti  spero in un Vostro aiuto con 
le query.
Quello che non riesco a capire e' come si fa ad assegnare piu valori tramite
una funzione  nel campo criteri di una query.:
nel campo NumeroDDT inserisco manualmente 13 or 5 or 7
mi fa vedere tutti i DDT 13, 5 , 7 e fin qui tutto bene.
Se pero' assegno questi valori tamite un concatenamento di stringhe ad una
variabile globale
che poi passo ad una funzione da utilizzare nella query non mi da nessun
risultato.
eppure se io visualizzo il valore della funzione con msgbox ad esempio vedo
che compaiono i valori
13 or 5 or 7 quindi la funzione ha il valore corretto.
per contro se alla stessa variabile assegno un solo valore me lo visualizza
correttamente.
Sembra come se non mi riconosca gli operatori perche li concateno con i
numeri dei ddt.
In pratica se volessi tramite una funzione assegnare piu' valori come devo 
fare?
Grazie in anticipo.
Nicola


Vincenzo Turturro
Certificato Eucip Core Level
ITA 0000-002299 del 14/05/2007
---------------------------------------------
il sito comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------
risorse Access:
http://www.accessgroup.it
---------------------------------------------
Il sito comune di it.comp.as400
http://www.faq400.com
---------------------------------------------

 ha scritto nel messaggio 
news:3a46c35cmqusqablk...@4ax.com...


Nicola
E' buona regola scrivere *dopo* la risposta e non prima.
Per le regole di comportamento di questo NG guarda qui:
www.sitocomune.com
sez. ICAA
Veniamo al tuo problema.
Crea un modulo e copia il codice che trovi oltre.
Si tratta di due funzioni, una (SQL_Parse) che scompone un'istruzione SQL nelle sue clausole componenti, un'altra
(SQL_Build) che ricompone l'istruzione SQL a partire dalle sue clausole. 
Se la tua query si chiama QueryDDT, la funzione SQL_Parse puoi richiamarla cosě:
Dim T_SQL as SQL_Clause
T_SQL=SQL_Parse(currentdb.querydefs("QueryDDT").SQL)
A questo punto nella struttura T_SQL hai memorizzate le singole clausole che compongono l'istruzione SQL della tua query
e puoi alterarne alcune o tutte secondo le tue esigenze.
Per esempio, per selezionare solo i DDT con numero 5, 12 o 22 puoi scrivere
T_SQL.SQL_Where="WHERE Numero_DDT IN(5,12,22)"
Quindi puoi ricomporre l'istruzione SQL ed assegnarla alla query semplicemente scrivendo:
currentdb.querydefs("QueryDDT").SQL=SQL_Build(T_SQL)
Qui di seguito il codice da copiare cosě com'č:
Public Type SQL_Clause
  SQL_Select  As String
  SQL_From    As String
  SQL_Where   As String
  SQL_OrderBy As String
  SQL_GroupBy As String
  SQL_Having  As String
End Type
Function SQL_Parse(pSQL As String) As SQL_Clause
Dim nSelect As Integer, nFrom As Integer, nWhere As Integer, nOrderBy As Integer, nGroupBy As Integer, nHaving As
Integer
Dim stSQL As String
  SQL_Parse.SQL_Select = ""
  SQL_Parse.SQL_From = ""
  SQL_Parse.SQL_Where = ""
  SQL_Parse.SQL_OrderBy = ""
  SQL_Parse.SQL_GroupBy = ""
  SQL_Parse.SQL_Having = ""
 
  stSQL = UCase$(pSQL)
  nSelect = InStr(1, stSQL, "SELECT")
  nFrom = InStr(1, stSQL, "FROM")
  nWhere = InStr(1, stSQL, "WHERE")
  nOrderBy = InStr(1, stSQL, "ORDER BY")
  nGroupBy = InStr(1, stSQL, "GROUP BY")
  nHaving = InStr(1, stSQL, "HAVING")
 
  SQL_Parse.SQL_Select = Trim$(Left$(pSQL, nFrom - 1))
  If nWhere > 0 Then
     SQL_Parse.SQL_From = Trim$(Mid$(pSQL, nFrom, nWhere - nFrom))
  Else
     If nOrderBy > 0 Then
        SQL_Parse.SQL_From = Trim$(Mid$(pSQL, nFrom, nOrderBy - nFrom))
     Else
        If nGroupBy > 0 Then
           SQL_Parse.SQL_From = Trim$(Mid$(pSQL, nFrom, nGroupBy - nFrom))
        Else
           SQL_Parse.SQL_From = Trim$(Mid$(pSQL, nFrom))
        End If
     End If
  End If
  If nWhere > 0 Then
     If nOrderBy > 0 Then
        SQL_Parse.SQL_Where = Trim$(Mid$(pSQL, nWhere, nOrderBy - nWhere))
     Else
        If nGroupBy > 0 Then
           SQL_Parse.SQL_Where = Trim$(Mid$(pSQL, nWhere, nGroupBy - nWhere))
        Else
           SQL_Parse.SQL_Where = Trim$(Mid$(pSQL, nWhere))
        End If
     End If
  End If
  If nOrderBy > 0 Then
     If nGroupBy > 0 Then
        SQL_Parse.SQL_OrderBy = Trim$(Mid$(pSQL, nOrderBy, nGroupBy - nOrderBy))
     Else
        SQL_Parse.SQL_OrderBy = Trim$(Mid$(pSQL, nOrderBy))
     End If
  End If
  If nGroupBy > 0 Then
     If nHaving > 0 Then
        SQL_Parse.SQL_GroupBy = Trim$(Mid$(pSQL, nGroupBy, nHaving - nGroupBy))
     Else
        SQL_Parse.SQL_GroupBy = Trim$(Mid$(pSQL, nGroupBy))
     End If
  End If
  If nHaving > 0 Then SQL_Parse.SQL_Having = Trim$(Mid$(pSQL, nHaving))
 
  SQL_Parse.SQL_Select = Left$(SQL_Parse.SQL_Select, inStrLast(Len(SQL_Parse.SQL_Select), SQL_Parse.SQL_Select, ";") -
1)
  SQL_Parse.SQL_From = Left$(SQL_Parse.SQL_From, inStrLast(Len(SQL_Parse.SQL_From), SQL_Parse.SQL_From, ";") - 1)
  SQL_Parse.SQL_Where = Left$(SQL_Parse.SQL_Where, inStrLast(Len(SQL_Parse.SQL_Where), SQL_Parse.SQL_Where, ";") - 1)
  SQL_Parse.SQL_OrderBy = Left$(SQL_Parse.SQL_OrderBy, inStrLast(Len(SQL_Parse.SQL_OrderBy), SQL_Parse.SQL_OrderBy, ";")
- 1)
  SQL_Parse.SQL_GroupBy = Left$(SQL_Parse.SQL_GroupBy, inStrLast(Len(SQL_Parse.SQL_GroupBy), SQL_Parse.SQL_GroupBy, ";")
- 1)
  SQL_Parse.SQL_Having = Left$(SQL_Parse.SQL_Having, inStrLast(Len(SQL_Parse.SQL_Having), SQL_Parse.SQL_Having, ";") -
1)
End Function
Function SQL_Build(pSQL As SQL_Clause) As String
  SQL_Build = pSQL.SQL_Select & " " & pSQL.SQL_From & " " & pSQL.SQL_Where & " " & pSQL.SQL_OrderBy & " " &
pSQL.SQL_GroupBy & " " & pSQL.SQL_Having
End Function


 Qui di seguito il codice da copiare così com'è:

Grazie Mille
Nicola 

 wrote:
 (...) 
Scusa, ma mi sono accorto solo ora che ti serve anche la funzione
seguente:
' Trova la posizione di una stringa all'interno di un'altra a partire
da destra
Function inStrLast(pStart As Integer, pStr1 As String, pStr2 As
String) As Integer
Dim st1 As String, st2 As String
   ' Se non passata posizione iniziale, parte dall'ultimo carattere
   If Nz(pStart, 0) = 0 Or Nz(pStart, 0) > Len(pStr1) Then
      pStart = 1
   End If
 
   ' Ribalta le stringhe
   st1 = StrReverse(pStr1)
   st2 = StrReverse(pStr2)
   inStrLast = Len(st1) - (InStr(pStart - Len(st1) + 1, st1, st2) +
Len(st2) - 1) + 1
