Newsgroup: it.comp.appl.access
Titolo: query adodb per cercare campi vuoti

ciao a tutti ho un problema con una query ADODB
devo trovare dei record in cui un paticolare campo è vuoto, ho provato
a modificare la metodo che uso ma mi restituisce sempre errore
Set cmd1 = New ADODB.Command
    With cmd1
        .ActiveConnection = CurrentProject.Connection
        .CommandText = "Parameters [ctl1] Date, [ctl2] String;" & _
            "SELECT [vocimiste].[anno] AS Espr1, [vocimiste].[mese] AS
Espr2, " & _
            "[vocimiste].[data] AS Espr3, [vocimiste].[persone] AS
Espr4, " & _
            "[vocimiste].[tipo] AS Espr5, [vocimiste].[gruppo] AS
Espr6, " & _
            "[vocimiste].[sottogruppo] AS Espr7, [vocimiste].
[descrizione] AS Espr8, " & _
            "[vocimiste].[importo] AS Espr9, [vocimiste].[pagato] AS
Espr10, " & _
            "[vocimiste].[modo] AS Espr11, [vocimiste].[come] AS
Espr12, " & _
            "[vocimiste].[per] AS Espr13 " & _
            "FROM [vocimiste] " & _
            "WHERE [vocimiste].[data] <= [ctl1] AND [vocimiste].
[pagato] = [ctl2] " & _
            "ORDER BY [Vocimiste].[data], [Vocimiste].[tipo],
[Vocimiste].[gruppo], " & _
            "[Vocimiste].[sottogruppo];"
        .CommandType = adCmdText
        'Create and define parameter.
        Set prm1 = cmd1.CreateParameter("[ctl1]", adInteger,
adParamInput)
        cmd1.Parameters.Append prm1
        int1 = Forms("pilota").Controls.Item("oggi").value
        prm1.value = int1
        Set prm2 = cmd1.CreateParameter("[ctl2]", adInteger,
adParamInput)
        cmd1.Parameters.Append prm2
        int2 = Forms("pilota").Controls.Item("vpagato").value
        prm2.value = int2
        .Execute
    End With
potete aiutarmi?
grazie
dario


Ciao!
Dato che, a quanto mi è dato di capire, la query che ci indichi non è
quella che usi per cercare i record in cui un particolare campo è
vuoto, né ci dici se con vuoto intendi nullo, 0, o "", e neppure ci
dici quale sia l'errore che ti viene segnalato .... non so gli altri,
ma a me riesce un po' difficile aiutarti.
Popi

 Popi
allore con la query originale estraggo i record compresi tra due date
(>ctl1 e < ctl2)
la query che ho indicato è quella originale modificata (male
evidentemente!) per estrarre dei record in un recordset di ADODB in
cui la data sia antecedente alla data ctl1 e il cui campo vpagato sia
vuoto (il campo è un campo testo che se non vuoto contiene "si")
se creo la query con autocomposizione di access ottengo il risultato
desiderato con questo stringa SQL:
SELECT vocimiste.anno, vocimiste.mese, vocimiste.data,
vocimiste.persone, vocimiste.tipo, vocimiste.gruppo,
vocimiste.sottogruppo, vocimiste.descrizione, vocimiste.importo,
vocimiste.pagato, vocimiste.modo, vocimiste.come, vocimiste.per,
vocimiste.ID
FROM vocimiste
WHERE (((vocimiste.pagato)=""));
gli errori che ottengo sono i seguenti:
3421 il tipo di valore utilizzato dall'applicazione non è valido per
l'operazione corrente.
e dopo:
-
2147217904
 nessun valore predefinito per il parametro [ctl2]
spero di essere riuscito a spiegarmi meglio


Parafrasando il mio conterraneo DarioVergassola, io sto a ADO come un
diabetico alla SacherTorte.
Ciò premesso, leggo un po' di confusione nella tua esposizione ... mi
spiego: la query che riporti qua sopra è quella che ti funziona,
mentre gli errori che riporti sono quelli che ti escono lanciando la
query del tuo primo post .... è così?
A parte ciò ... se il campo è di tipo testo (e la query risultante
dall'autocomposizione lo dimostra) per testare una stringa vuota si
usa "", ma tu passi direttamente il contenuto della textbox "vpagato"
invece di "'" & vpagato & "'" (cioè: apice + controllo + apice).
Idem per il controllo sulla data, che dev'essere (AFAIK!) passata
secondo un formato ben preciso (temo, anche, prefissata e suffissata
con "#"),
HTH
Popi

cerco di spiegarmi meglio:
se creo una query con autocomposizione di access come questa di seguito 
ottengo quanto desidero:
SELECT  vocimiste.data, vocimiste.pagato
FROM vocimiste
WHERE (((vocimiste.data)<#7/1/2011#) AND ((vocimiste.pagato)=""));
con ADODB utilizzo questo codice :
Set cmd1 = New ADODB.Command
  With cmd1
   .ActiveConnection = CurrentProject.Connection
   .CommandText = "Parameters [ctl1] Date, [ctl2] String;" & _
    "SELECT [vocimiste].[data] AS Espr1, [vocimiste].[pagato] AS Espr2, 
" & _
     "FROM [vocimiste] " & _
     "WHERE [vocimiste].[data] <= [ctl1] AND [vocimiste].
[pagato] = [ctl2] " & _
     "ORDER BY [Vocimiste].[data];"
    .CommandType = adCmdText
    'Create and define parameter.
    Set prm1 = cmd1.CreateParameter("[ctl1]", adInteger,
    adParamInput)
    cmd1.Parameters.Append prm1
    int1 = Forms("pilota").Controls.Item("oggi").value
    prm1.value = int1
    Set prm2 = cmd1.CreateParameter("[ctl2]", adInteger,
    adParamInput)
    cmd1.Parameters.Append prm2
    int2 = Forms("pilota").Controls.Item("vpagato").value
    prm2.value = int2
   .Execute
End With
e ottengo questi errori:
3421 il tipo di valore utilizzato dall'applicazione non è valido per
l'operazione corrente.
-
2147217904
 nessun valore predefinito per il parametro [ctl2]
comunque se esiste un altro metodo per ottenere un recordset che io non 
conosco non esito ad usarlo
dario


Provando ad usare questo codice (che differenze *ci sono* con il tuo?)
cambia qualcosa?
Set cmd1 = New ADODB.Command
  With cmd1
   .ActiveConnection = CurrentProject.Connection
   .CommandText = "Parameters [ctl1] Date, [ctl2] String;" & _
    "SELECT [vocimiste].[data], [vocimiste].[pagato], " & _
     "FROM [vocimiste] " & _
     "WHERE [vocimiste].[data] <= [ctl1] AND [vocimiste].[pagato] =
[ctl2] " & _
     "ORDER BY [Vocimiste].[data];"
    .CommandType = adCmdText
    'Create and define parameter.
    cmd1.Parameters.Append cmd1.CreateParameter("[ctl1]", adInteger,
adParamInput, , "#" & Format$
(Forms("pilota").Controls.Item("oggi").Value, "mm/dd/yyyy") & "#")
    cmd1.Parameters.Append cmd1.CreateParameter("[ctl2]", adInteger,
adParamInput, , "'" & Forms("pilota").Controls.Item("vpagato").Value &
"'")
   .Execute
End With
E questo, invece, come lo vedi (e come funziona?)?
Set cmd1 = New ADODB.Command
  With cmd1
   .ActiveConnection = CurrentProject.Connection
   .CommandText = "SELECT [vocimiste].[data], [vocimiste].[pagato], "
& _
     "FROM [vocimiste] " & _
     "WHERE [vocimiste].[data] <= " & "#" & Format$
(Forms("pilota").Controls.Item("oggi").Value, "mm/dd/yyyy") & "# AND
[vocimiste].[pagato] = '" &
Forms("pilota").Controls.Item("vpagato").Value & "' " & _
     "ORDER BY [Vocimiste].[data];"
    .CommandType = adCmdText
   .Execute
End With
HTH
Popi

 [Vocimiste].[data];" .CommandType = adCmdText .Execute End With 
perfetto questa funziona! solo ho rimosso la virgola dopo [pagato] nella 
riga SELECT
cosě ho risolto il problema.
ora passando ad un altro problema si puň passare i parametri di questa 
query senza doverli leggere in un form?
comunque grazie dell'aiuto
dario

 query senza doverli leggere in un form?
Dario ... la virgola era già presente nella tua query iniziale (e non
me ne ero accorto), se fai caso ho semplicemente rimosso gli "AS Espr"
dal SQL, forse il tuo codice andava in errore _anche_ per quel
motivo ...
Non capisco, invece, cosa tu intenda con "formattazione corretta",
mentre il simbolo "%" si usa (AFAIK) in luogo del "*" nel SQL standard
con l'operatore LIKE.
Inoltre: la differenza tra i due SQL sta solo nel fatto che la prima
usa i parametri, mentre la seconda inserisce direttamente i valori dei
parametri nel costrutto SQL.
Per l'ultima domanda: un parametro è un dato che può arrivare da
qualsiasi origine, che sia una form, una tabella, una inputbox, una
funzione, una query, ...
Sta a te, quindi, decidere da dove prelevarne il valore ed inserirlo
(come in questo caso) nel costrutto SQL.
Così, nel caso della form userai la sintassi
Forms(NomeDellaMaschera).Controls.Item(NomeDelControllo).Value, mentre
per la inputBox dovrai solo dichiarare una variabile che contenga il
valore digitato e poi usare quella variabile come segue per passare il
valore.
Dim ValoreRichiesto As String
ValoreRichiesto = InputBox$("Codice?","Digita il testo da
selezionare")
ComandoSql="SELECT * FROM NomeTabella WHERE (Parametro = '" &
ValoreRichiesto & "');"
Nel caso della funzione sarà anche più semplice, dato che oltre a
poter costruire il SQL come negli altri casi, potresti utilizzare la
funzione (se dichiarata pubblica in un modulo accessibile)
direttamente nella query.
ComandoSql="SELECT * FROM NomeTabella WHERE (Parametro = '" &
MiaFunzione() & "');"
ComandoSql="SELECT * FROM NomeTabella WHERE (Parametro =
MiaFunzione() );"
Ovviamente, nel secondo caso la funzione dovrà restituire valori di
stringa racchiusi tra apici.
Suggerimento: è buona norma, se una domanda è stata completata, porne
una nuova in un nuovo thread.
Popi


ok capito (devo spostare questa domanda in un nuovo thread o la lascio 
qui ?)
dario