PDA

View Full Version : un aiuto per piacere


federchicco
18-09-2003, 01:04
In visual basic con access, dovrei fare riferimento a una controllo
in una maschera per fare una ricerca con il comando find.
Esempio:

rs1.FindFirst ("numero like '7' ")

rs1.FindFirst ("numero like 'form![tabella1]|[camera]'")

La prima istruzione funziona la seconda non mi dà errore ma e come non ci fosse.

Mi insegnate come posso fare?

grazie mille

p.s
chiedo scusa ma me ne sono venuti due messaggi e non ho idea perche sia successo

matpez
18-09-2003, 02:36
Tu cmq intendi VBA nn VB puro...cmq prova cosi:

rs1.FindFirst ("numero like '" & form![tabella1]|[camera] & "'")


ciaoooooooo :p

federchicco
18-09-2003, 16:43
Ti ringrazio ma non funziona.
Qualche altra idea?
Grazie

matpez
18-09-2003, 18:18
Scusa ma nn ho capito se sei in VB o in VBA ?!?

cmq se fai riferimento alla form: Nome_Form.Nome_Campo non ti funziona :confused:

federchicco
18-09-2003, 22:54
Sono in VBA per l'esattezza sto lavorando su un'applicativo in access e mi serviva quella funzione per verificare che ci fosse un numero uguale a un numero presente in una maschera.
In pratica non lo vede proprio.
Ho ricopiato pari pari la tua indicazione ma niente.

in dettaglio ho questa funzione:

Function ricerca()

Dim rs1 As DAO.Recordset

Set rs1 = CurrentDb.OpenRecordset("camera", dbOpenDynaset)

rs1.FindFirst ("numero like '22'")

If Not rs1.NoMatch Then

MsgBox "camere occupata!"

Else
MsgBox "camera libera"
End If

rs1.Close

Set rs1 = Nothing
End Function

Al posto del numero dovrei mettere form![tabella]![camera]
Spero di essermi espresso bene.
Grazie ancora

matpez
19-09-2003, 13:30
Io ho fatto delle prove, e cosi mi funziona:

rs1.FindFirst ("numero like '" & NomeForm.NomeCampo & "'")

federchicco
19-09-2003, 15:41
Originariamente inviato da matpez
Io ho fatto delle prove, e cosi mi funziona:

rs1.FindFirst ("numero like '" & NomeForm.NomeCampo & "'")

rs1.FindFirst ("numero like ' " & Form![tabella1]![CAMERA] & " ' ")

Ho scritto cosi e mi da errore 424 dicendo che manca l’oggetto.
In sostanza io apro la maschera (tabella1) e nel campo “camera” digito un numero e poi lancio quella funzione che deve verificare che nella tabella “camera” esiste un numero uguale.
Dov’è che sbaglio?
Grazie e scusa

matpez
20-09-2003, 11:45
Ma sembra un po' diverso il codice tuo dal mio...

rs1.FindFirst ("numero like '" & Form![tabella1]![CAMERA] & "'")
rs1.FindFirst ("numero like '" & NomeForm.NomeCampo & "'")

Cmq io nn conosco bene bene VBA ma sono abb. bene l'SQL, appunto perchè nn utilizzi le query per fare sti meccanismi:

SELECT (*) as nNumero
FROM Tabella1
WHERE Camera=[valore]

dove naturalmente il valore è il tuo numero....cmq altra cosa, il like serve maggiormente per le stringhe, se vuoi confrontare un numero mettigli "="

federchicco
21-09-2003, 00:08
Il tuo suggeriemnto era valido. La mia scrittura del codice faceva schifo. Ho scritto form invece che forms.
Adesso funziona benissimo. Se posso approfittare, si può aggiunge un " and " a quella ricerca.
Esempio:
rs1.FindFirst ("numero like '" & Forms![SITUAZIONE CAMERE]![num-chek] & "'") and data = data corrente.

In sostanza dovrei cercare un record che abbia quel tal numero e abbia una data uguale alla data corrente.

Grazie infinite

matpez
21-09-2003, 12:14
Si certo ma non così, prova in questa maniera:

rs1.FindFirst ("numero like '" & Forms![SITUAZIONE CAMERE]![num-chek] & "' AND data=#" & date() & "#")

Cosi dovrebbe andare, se vedi che la data non va bene nella ricerca allora è perchè vuole il formato americano, ma nulla di che, basta che fai cosi date() lo converti in Format(date(),"mm/dd/yyyy")


ciaoooooooooo
:p

federchicco
21-09-2003, 18:13
Grazie mille euro
Ciao

matpez
21-09-2003, 21:30
di nulla :)

federchicco
30-09-2003, 17:23
Originariamente inviato da federchicco
Grazie mille euro
Ciao

federchicco
30-09-2003, 17:26
Originariamente inviato da federchicco
Grazie mille euro
Ciao

Il famoso codice funziona bene tranne un piccolo particolare che non riesco a spiegarmi.

Se inserisco delle prenotazioni pewr un mes o più, mi capita che se inserisco un doppione nei primi giorni non viene rilevato mentre invece vien rilevato per le date successive.
Provo a postarti il codice completo nel caso tu mi possa aiutare.
Grazie infinite

Private Sub CONFERMA_Click()
Dim rs1pren As DAO.Recordset
Dim rs2pren As DAO.Recordset

'crea recordset su Tabella1

Set rs1pren = CurrentDb.OpenRecordset("tabella1", dbOpenDynaset)

'crea recordset su foglio2

Set rs2pren = CurrentDb.OpenRecordset("foglio2", dbOpenDynaset)

' crea variabili per ciclo di ricerca

Dim i As Integer
Dim cercadata
Dim ngiorni

ngiorni = rs1pren("giorni")
cercadata = rs1pren("datapren")


'cerca il record in Foglio2 in base a valori di una maschera che ha come origine dati - tabella1-


For i = 1 To ngiorni
rs2pren.FindFirst ("camera = " & Forms![tabella1]![camera] & "and datapren = #" & cercadata & "#")
'se trova il record...

If Not rs2pren.NoMatch Then

DoCmd.Beep

MsgBox " La camera scelta è già impegnata !!Cambia la camera e clicca su memorizza ", vbInformation, "Avviso problema"

' va al controllo camera per correggere

rs1pren.Edit
rs1pren("camera") = 0
rs1pren.Update
DoCmd.GoToControl "camera"

Exit Sub

End If
cercadata = cercadata + 1
Next

' chiude gli oggetti
rs1pren.Close
rs2pren.Close
Set rs2pren = Nothing
Set rs1 = Nothing

'Esegue la routine per la creazione delle prenotazioni

Call AddRecords(ID.Value)
Call AddRecords2(ID.Value)

'esegue delle query

DoCmd.SetWarnings False
DoCmd.OpenQuery "ACCODA-CLIENTE", acViewNormal, acEdit
DoCmd.OpenQuery "clienti-pren Query", acViewNormal, acEdit
DoCmd.OpenQuery "cancella clienti-pren", acViewNormal, acEdit
Beep
MsgBox "Prenotazione memorizzata", vbInformation, "Conferma comando"

' avvia un nuovo record
DoCmd.GoToRecord acForm, "Tabella1", acNewRec
DoCmd.GoToControl "dataric"


End Sub

matpez
01-10-2003, 00:00
Sinceramente, sarà l'ora tarda, ma potresti spiegarmi bene cosa ti da errore, ma è un errore del programma o un errore di gestione delle prenotazioni!

Più informazioni mi dai + capisco dato che il progetto è tutto nella tua mente...

Grazie 1000

federchicco
01-10-2003, 01:06
Originariamente inviato da matpez
Sinceramente, sarà l'ora tarda, ma potresti spiegarmi bene cosa ti da errore, ma è un errore del programma o un errore di gestione delle prenotazioni!

Più informazioni mi dai + capisco dato che il progetto è tutto nella tua mente...

Grazie 1000

Grazie per avermi risposto.
Si tratta di gestire le prenotazioni per un albergo e il codice in questione deve servire ad evitare l'inserimento di doppioni.

Dunque il problema in sintesi è questo:

Riesco a rilevare correttamente i record richiesti solo per quando riguarda quelli con data maggiore di almeno 15 giorni alla data del primo.

Ho fatto un sacco di prove e non mi dà nessun errore, solo non vede i record all'inizio.

Esempio:
Ho inserito delle prenotazioni dal 01/10/03 al 05/11/03
Dal 14/10/03 il codice funziona benissimo nel senso che rileva il record e vien fuori il messaggio.
dal 01/10/03 e fino al 13/10/03 anche se una camera esiste già in quella data, non la vede e mi trovo dei doppioni.

In definitiva, se io inserisco una prenotazione della camera n°10 per il 05/10/03 e in quella data esiste già una prenotazione, non se accorge.
Se invece inserisco una prenotazione di una camera esistente in data 15/10/03 se ne accorge benissimo.
Spero di essemi spiegato anche se mi rendo conto che è uno strano problema.
Ti ringrazio ancora e sono in debito di una cena ( ho un ristorante a Bologna)
Ciao

matpez
01-10-2003, 13:12
Purtroppo VBA nn lo conosco molto, so lavorare con VB + Database che ha una certa connessione al database, ma lavorarci denteo non saprei, se tu riesci a trovare un modo di impostare una variabile Recordset e passargli una query di esecuzione siamo a cavallo...

federchicco
01-10-2003, 16:04
Ho fatto una marea di prove e sono giunto alla conclusione che il problema si presenta con le date che cominciano con zero.
es: 01/10/03 non la vede ma 29/09/03 la vede
Evidentemente c'è qualcosa da sistemare nel formato o nella variabile della data.
Hai qualche idea ?
Grazie

matpez
01-10-2003, 16:30
Se tu gli passi nella WHERE una formato del genere #Data# di solito ti conviene passarla all'americana facendo una cosa del genere: ..... & "#" & format(date,"mm/dd/yyyy") & "#" ....


Prova :)

federchicco
01-10-2003, 17:37
Originariamente inviato da matpez
Se tu gli passi nella WHERE una formato del genere #Data# di solito ti conviene passarla all'americana facendo una cosa del genere: ..... & "#" & format(date,"mm/dd/yyyy") & "#" ....


Prova :)

Scusa se approfitto ma tenedo presente il ciclo che ho creato
dove devo correggere ?

*********************************+++++
dim cercadata
cercadata = rs1pren("datapren")


'cerca il record in Foglio2 in base a valori di una maschera che ha come origine dati - tabella1-


For i = 1 To ngiorni
rs2pren.FindFirst ("camera = " & Forms![tabella1]![camera] & "and datapren = #" & cercadata & "#")
'se trova il record...

If Not rs2pren.NoMatch Then

DoCmd.Beep

MsgBox " La camera scelta è già impegnata !!Cambia la camera e clicca su memorizza ", vbInformation, "Avviso problema"

end if
cercadata = cercadata + 1

next
********************************+


Grazie e siamo a due cene

matpez
01-10-2003, 17:46
Non sono sicuro che sia proprio li l'errore ma cmq prova a fare cosi:

rs2pren.FindFirst ("camera = " & Forms![tabella1]![camera] & "and datapren = #" & Format(cercadata,"mm/dd/yyyy") & "#")

federchicco
01-10-2003, 23:10
CHAPEAUX !!!!

Tutto ok , va benissimo.

Grazie mille e se passi da Bologna le cene son pronte.

Ciao

matpez
01-10-2003, 23:44
Io a bologna ci passo quasi tutti i mesi per andare a trovare la fidanzata ad Arezzo...magari se un giorno passo con la macchina anzichè con il treno...una pappata ci sta sempre :) :p :) :) :D ;) :oink: :p :oink: :rolleyes:

federchicco
02-10-2003, 17:17
Originariamente inviato da matpez
Io a bologna ci passo quasi tutti i mesi per andare a trovare la fidanzata ad Arezzo...magari se un giorno passo con la macchina anzichè con il treno...una pappata ci sta sempre :) :p :) :) :D ;) :oink: :p :oink: :rolleyes:

Ti ho spedito l'indirizzo

Grazie ancora