Newsgroup: it.comp.appl.access
Titolo: FindFirst  su due campi

ciao a tutti
 
com è la sintassi di FindFirst
se devo cercare sullo stesso record il valore zero di due campi?
 
Ho provato cosi'
 
rs.FindFirst "a=0" And "b=0"
 
ma non va bene
 
grazie


 
il parametro della findfirst e' una WHERE senza la parola where.
Come la scriveresti in una query (select)?
quello che hai scritto e' questo "'a=0' and 'b=0'"
 
-- 
ac (x=y-1)
Aborro il Killfile
(La violenza e' l'ultimo rifugio degli incapaci -Salvor Hardin-)
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 


ciao Alessandro e grazie
 
dovrebbe essere........
rsCheck.FindFirst nBancali=0 And nColli=0
ma ho errore;
 
mentre cosi'
rsCheck.FindFirst "nBancali=0 And nColli=0"
 
il risultato non va bene!!!
 
 
 
 


perche' non va bene ?
Cosa ti aspetti e cosa, invece, ti da come risultato?



ciao Alessandro e grazie.
 
questa è la funzione:
  ByRef Campo1 As Variant, _
  ByRef Campo2 As Variant, _
  ByRef msg As String, _
  ByRef ban As String) As Boolean
 
  Dim db As Database
  Dim rsCheck As dao.Recordset
  Dim strsCheckQL As String
 
  strsCheckQL = "SELECT * FROM DettaglioCarichi" _
   & " Where IdCarico =" & idcCriterio()
 
  Set db = CurrentDb
  Set rsCheck = db.OpenRecordset(strsCheckQL)
 
  rsCheck.FindFirst "nBancali=0 And nColli=0"
 
  If Not rsCheck.NoMatch Then
    Campo2 = 0
 
  End If
 
  Dim X As String
 
    X = IIf(Nz(Campo1, 0) = 0, ", data Carico", "") & _
        IIf(Nz(Campo2, 0) = 0, ", n°Bancali", "")
 
    If (X) <> "" Then
        msg = "Attenzione manca:" & Mid(X, 2)
        ban = "Attenzione!!!"
    Exit Function
    End If
 
    Set db = Nothing
    Set rsCheck = Nothing
 
Conf_Carico = True
_________________________--
 
 
se ho p.e. nel recordset 2 records come in questo esempio:
nbancali ncolli
   0        1
   1        0
 
ho che manca "n°Bancali", mentre non è cosi'.
 
Per avere che manca "n°Bancali", dovrei avere:
nbancali ncolli
   0        0
   1        0
 
oppure:
nbancali ncolli
   0        1
   0        0
 
oppure:
nbancali ncolli
   1        1
   0        0
 
oppure:
nbancali ncolli
   0        0
   1        1
 
oppure:
nbancali ncolli
   0        0
   0        0
 
cioè entrambi i campi dello stesso record =0

 ho che manca "n°Bancali", mentre non è cosi'.
 
cioe'? if .nomatch=true?
Attenzione l'uso del "Not" puo essere *tricky*
 
[cut]



ciao Alessandro, Ottimo!!!
 
però ho delle difficolatà..............
  Dim rsCheck As dao.Recordset
  Dim strsCheckQL As String
 
  strsCheckQL = "SELECT * FROM DettaglioCarichi" _
    & " Where nBancali=0 And nColli=0 and IdCarico =" & idcCriterio()
  Set rsCheck = CurrentDb.OpenRecordset(strsCheckQL)
 
  Dim X As String
 
  X = ""
 
  Do While Not rsCheck.EOF
   qui cosa devo mettere??
  Loop
 
  X = IIf(Nz(Campo1, 0) = 0, ", data Carico", "") & _
      IIf(Nz(Campo2, 0) = 0, ", n°Bancali", "")
 
  If (X) <> "" Then
    msg = "Attenzione manca:" & Mid(X, 2)
    ban = "Attenzione!!!"
  Exit Function
  End If
 
  Set rsCheck = Nothing
 
 


 
 



come entra in
Do While Not rsCheck.EOF
....
loop
mi si blocca il programma


e ha ragione. Non c'e' il posizionamento al record successivo cioe':
 
rsCheck.movenext
prima di loop



ciao Alessandro e grazie.
 
Non capisco perchè non sempre funziona.....
in una maschera con sottomaschera
funziona in base a dov'è posizionato il cursore nella sottomaschera...
p.e. funziona se il cursore e' posizionati sul record dove il campo e'=0,
 
mentre in una seconda maschera con sottomaschera (con lo stesso codice) ha un'altro comportamento.
 
poi ho sotituito..
Do While Not rsCheck.EOF
ecc.
 
con....
If Not rsCheck.EOF Then    
Campo2 = 0
End If
 
X = IIf(Nz(Campo1, 0) = 0, ", data Carico", "") & _
  IIf(Nz(Campo2, 0) = 0, ", n°Bancali", "")
 
e sembra funzionare
 
 
 
 
 
 
 


mi sono sbagliato, neanche cosi' funziona


ciao Alessandro 
 
ho fatto cosi, anche se non è molto bello a vedersi........
 
  Dim rsCheck As dao.Recordset
  Dim strsCheckQL As String
 
  strsCheckQL = "SELECT * FROM DettaglioCarichi" _
    & " Where nBancali=0 And nColli=0 And IdCarico =" & idcCriterio()
  Set rsCheck = CurrentDb.OpenRecordset(strsCheckQL)
 
  If Not rsCheck.EOF Then
    Campo2 = 0
 
  Else
    Campo2 = 1
 
  End If
 
  Dim X As String
 
  X = ""
 
  X = IIf(Nz(Campo1, 0) = 0, ", data Carico", "") & _
      IIf(Nz(Campo2, 0) = 0, ", n°Bancali", "")
 
  If (X) <> "" Then
    msg = "Attenzione manca:" & Mid(X, 2)
    ban = "Attenzione!!!"
  Exit Function
  End If
 
  Set rsCheck = Nothing
 
cosa ne pensi?
grazie


il problema è nella query, in pratica viene letto solo il primo record





 
Non ci credo neanche se lo vedo.
Prendi la query -la stringa che hai composto- eseguila come query 
assegnando l' idCarico e vedi che succede



ciao Alessandro,
hai ragione;
però in questo modo
mi legge il record (nella sottomaschera) dove il cursore
è posizionato.
p.e. ho 2 records nel recordset
1-nBancali=0 nColli=0
2-nBancali=0 nColli=1
 
se il cursore è sul primo record msg= manca n°Bancali
mentre se il cursore è sul secondo No!
 
 
  Dim X As String
 
  X = ""
 
  Do While Not rsCheck.EOF
 
  X = IIf(Nz(Campo1, 0) = 0, ", data Carico", "") & _
      IIf(Nz(Campo2, 0) = 0, ", n°Bancali", "")
 
  rsCheck.MoveNext
 
  Loop


 
No cosa? In entrambi i casi se queste due posizioni hanno le stesso 
idcriterio la query dovrebbe restituire /sempre/ la prima (e solo 
quella, sempre che la tabella di provenienza sia stata gia' aggiornata)


 
https://www.avast.com/antivirus
 
 
Grazie Alessandro dei chiarimenti e per il tempo che mi stai dedicando.
 
Puo' essere che il codice che uso per richiamare la funzione sia errato?
 
Su click di un pulsante ho inserito:
 
    Me.Requery
 
    Dim msg_ConfermaCarico As String
    Dim ban_ConfermaCarico As String
 
    If Conf_Carico(Me!DataCarico.Value, _
                Me!SM_DettCarichi.Form!nBancali.Value, _
                msg_ConfermaCarico, _
                ban_ConfermaCarico) = False Then
    MsgBox msg_ConfermaCarico, vbExclamation, ban_ConfermaCarico
 
    If Len(Me!DataCarico & vbNullString) = 0 Then
        Me!DataCarico.SetFocus
 
    Else
        Dim rsCheck As dao.Recordset
        Set rsCheck = Me!SM_DettCarichi.Form.RecordsetClone
 
        rsCheck.FindFirst "nColli=0 And nBancali=0"
 
        If Not rsCheck.NoMatch Then
            Me!SM_DettCarichi.Form.Bookmark = rsCheck.Bookmark
            Me!SM_DettCarichi.SetFocus
            Me!SM_DettCarichi.Form!nBancali.SetFocus
 
        End If
 
        rsCheck.Close: Set rsCheck = Nothing
 
    End If
 
    Exit Sub
 
    End If
 
    DoCmd.OpenForm "M_ConfermaCarico", , , "IdCarico=" & Me!IDCarico


Esempio con 2 posizioni in sottomaschera.
Entrami gli esempi dovrebbero dare: "manca n.bancali"
 
A volte...................
con questi valori e relative posizioni in sottomaschera:
cosi' funziona (cioè "manca n.bancali")
nBancali  nColli
   0         1
   0         0
 
cosi' non funziona  (cioè "apre il report" mentre non dovrebbe!!!)
nBancali  nColli
   1         0
   0         0


 
Sai cosa significa passare i parametri per valore o per riferimento?
Non mi ricordo nulla ma le stringhe dovrebbero essere passate per valore 
(a meno di indicazione contraria)
Fai delle cose che neanche sui "bastioni di Orione" ho mai visto
Da conf_carico invece di true/false fai ritornare la stringa msg e testa 
quella se vuota mandi il messaggio altrimenti no



lo so...
ed e' per questo che chiedo aiuto 
 
help me! ;-(
Cosa mi consigli di fare?
 

 Sai cosa significa passare i parametri per valore o per riferimento?
 
byRef è un valore che puo' cambiare
byVal non cambia



fammi p.f. un esempio per come dichiari le variabili nella funzione
e come la richiami
 
grazie


 
Fammi capire che senso ha il tutto.
1) Tu passi due parametri alla funzione (data carico e bancali)
2) Testi /questi/ due parametri nella funzione
3) A cosa serve, a questo punto, fare la query (o findfirst) nella 
funzione chiamata?
Ora il comportamento del tutto si spiega e mi sembra regolare che si 
comporti cosi'
Per vedere se c'e' una posizione (record) con colli e bancali a 0 usi la 
query ed, eventualmente, e' quel risultato, almeno per i bancali, che 
devi verificare


Il 31/07/2015 12:12, Alessandro Cara ha scritto:
 
P.S. Non avevo visto che avevi messo la byRef sui parametri di query.
Passare stringhe e modificarle e ', allora, corretto.


 devi verificare
 
 
allora....
come dovrei procedere?



ecco come ho modificato, ma ancora non va bene
 
_________inizio__________
Public Function Conf_Carico( _
  ByVal Campo1 As Variant, _
  ByVal Campo2 As Variant) As Boolean
 
  Dim rsCheck As dao.Recordset
  Dim strsCheckQL As String
 
  strsCheckQL = "SELECT * FROM DettaglioCarichi" _
    & " Where nBancali=0 And nColli=0 And IdCarico =" & idcCriterio()
  Set rsCheck = CurrentDb.OpenRecordset(strsCheckQL)
 
  Dim X As String
 
  X = ""
 
  Do While Not rsCheck.EOF
 
    X = IIf(Nz(Campo1, 0) = 0, ", data Carico", "") & _
      IIf(Nz(Campo2, 0) = 0, ", n°Bancali", "")
 
    rsCheck.MoveNext
 
  Loop
 
  If (X) <> "" Then
    MsgBox "Attenzione manca:" & Mid(X, 2), vbExclamation, "Attenzione!!!"
 
  Exit Function
  End If
 
  Set rsCheck = Nothing
 
Conf_Carico = True
End Function
_________fine__________
 
cosi' la richiamo.......
    If Conf_Carico(Me!SM_CarichiFornitori.Form!DataCarico.Value, _
                    Me!SM_DettCarichi.Form!nBancali.Value) = False Then
    Exit Sub  
    End If
 
il problema è
Me!SM_DettCarichi.Form!nBancali.Value
 
perchè se la sottomaschera ha piu posizioni,
la funzione mi restituisce quella
della prima posizione.


Campo1 e Campo2 sono i parametri che hai passato. lLa query si e' 
accorta che c'e' una posizione con colli e  bancali a 0 ma i tuoi due 
parametri (quelli relativi alla riga corrente,immagino)  sono diversi da 
0 quindi.......?
X rimane vuota....quindi?
la funzione /non/ esce per false .....quindi?



un brutto sistema è questo...........
 
Public Function Conf_Carico( _
  ByVal Campo1 As Variant, _
  ByVal Campo2 As Variant) As Boolean
 
  Dim rsCheck As dao.Recordset
  Dim strsCheckQL As String
 
  strsCheckQL = "SELECT * FROM DettaglioCarichi" _
    & " Where nBancali=0 And nColli=0 And IdCarico =" & idcCriterio()
  Set rsCheck = CurrentDb.OpenRecordset(strsCheckQL)
 
  If Not rsCheck.EOF Then
    Campo2 = 0
 
  Else
    Campo2 = 1
 
  End If
 
  Dim X As String
 
  X = ""
 
  X = IIf(Nz(Campo1, 0) = 0, ", data Carico", "") & _
    IIf(Nz(Campo2, 0) = 0, ", n°Bancali", "")
 



 
 
Messa cosi' passare il parametro campo2 non serve piu' e' una variabile 
locale
 
Dim campo2 as integer
.......
campo2=iif(rsCheck.EOF,1,0)



Ciao Alessandro
perfetto!!!
 
cerca di farmi capire il tuo ragionamento
grazie


ciao Alessandro
questa puo' esserre realizzata cosi'.......
 
query: se nColli=0 Or quantità=0 Or prezzo=0
 
Public Function Conf_Chiusura( _
  ByVal campo1 As Variant, _
  ByVal campo2 As Variant) As Boolean
 
  Dim rsCheck As dao.Recordset
  Dim strsCheckQL As String
 
  strsCheckQL = "SELECT" _
    & " Min(nColli) AS xnColli, Min(Quantità) AS xQuantità, Min(Prezzo) AS xPrezzo" _
    & " FROM DettaglioCarichi" _
    & " Where IdCarico=" & idcCriterio()
  Set rsCheck = CurrentDb.OpenRecordset(strsCheckQL)
 
  Dim campo3 As Integer
  Dim campo4 As Integer
  Dim campo5 As Integer
  Dim X As String
 
  X = ""
 
  campo3 = rsCheck!xnColli
  campo4 = rsCheck!xQuantità
  campo5 = rsCheck!xPrezzo
 
  X = IIf(Nz(campo1, 0) = 0, ", data Chiusura", "") & _
    IIf(Nz(campo2, 0) = 0, ", Targa", "") & _
    IIf(Nz(campo3, 0) = 0, ", n°Colli", "") & _
    IIf(Nz(campo4, 0) = 0, ", Quantità", "") & _
    IIf(Nz(campo5, 0) = 0, ", Prezzo", "")