Salve a tutti,
mi potete aiutare a scrivere il codice VBA per leggere un campo di una tabella di access?
il campo è una stringa che poi devo elaborare.
Salve a tutti,
mi potete aiutare a scrivere il codice VBA per leggere un campo di una tabella di access?
il campo è una stringa che poi devo elaborare.
Dim RS As New ADODB.Recordset
sql = "SELECT campo FROM tabella WHERE criterio=x"
RS.Open sql, CurrentProject.Connection
Dim valore
valore = rs!campo
Quando ti sei messo in testa di essere migliore di me ... R.DeNiro (TheScore)
Ti ringrazio molto.
Ho compilato il nome della tabella e del campo
Non so cosa si mette nei criteri "x" ??
Private Sub Comando3_Click()
Dim RS As New ADODB.Recordset
strSQL = "SELECT Interpretazione_limiti FROM DB_Monocircuito WHERE criterio=x"
RS.Open strSQL, CurrentProject.Connection
Dim valore
valore = RS!Interpretazione_limiti
MsgBox valore
End Sub
Mi genera il seg. errore sulla riga "RS.Open....." :
"Errore di runtime ..."
"Nessun valore specificato per alcuni parametri necessari"
Devi inserire un criterio di estrazione.
Per esempio se vuoi che Interpretazione_limiti sia minore di 100
Ciao,codice:strSQL = "SELECT Interpretazione_limiti FROM DB_Monocircuito WHERE Interpretazione_limiti < 100"![]()
Ciao, Brainjar
mi sto avvicinando... ma mi da lo stesso errore.
Il mio scopo è mettere in una variabile di testo il contenuto di un campo ed elaborarlo (dovrò individuare il testo tra le virgolette)
Per tutti i record (immagino che dovrò fare un ciclo for... fino ad arrivare al EOF)
Private Sub Comando3_Click()
Dim RS As New ADODB.Recordset
Dim valore
Dim strCompare As String
strCompare = "allarme se 1"
strSQL = "SELECT Interpretazione_limiti FROM DB_Monocircuito WHERE Interpretazione_limiti = strCompare"
RS.Open strSQL, CurrentProject.Connection
valore = RS!Interpretazione_limiti
MsgBox valore
End Sub
Devi tradurre "allarme se 1" in una condizione logica che puoi
individuare nei valori dei campi estratti.
Il campo 'Interpretazione_limiti' è quello che se vale 1 ti fa
scattare l'allarme ?
Se si la stringa sql diventa :
Tieni però presente che il codice, per funzionare, deve esserecodice:' Con queste istruzioni ti estrae tutti i record che hanno ' il valore Interpretazione_limiti = strCompare. strCompare = 1 strSQL = "SELECT Interpretazione_limiti FROM DB_Monocircuito WHERE Interpretazione_limiti =" & strCompare
corretto facendo queste considerazioni :
1) RS.Open strSQL, CurrentProject.Connection
Questa istruzione presuppone che tu abbia un oggetto complesso
"CurrentProject", che al suo interno contiene un oggetto
connessione "Connection".
Dai post si desume che questo è quello che funziona a
twiste_has_you, che molto probabilmente questo oggettone se lo crea
con delle sue Classi.
Tu, invece, probabilmente non ce l'hai. Allora devi inserire,
prima di RS.Open strSQL,.....
una istruzione del tipo
Dim cn As New ADODB.Connection
devi aprire la connessione
2) Estrai dei recordset con il solo campocodice:Dim cn As New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<PathFisicoDelTuoDB>;Persist Security Info=False" ' La RS.Open diventa : strCompare = 1 strSQL = "SELECT Interpretazione_limiti FROM DB_Monocircuito WHERE Interpretazione_limiti =" & strCompare RS.Open strSQL, cn, adOpenStatic, adLockOptimistic
Interpretazione_limiti.
Questa informazione non la leghi a nessun altro valore e non
saprai mai individuare qual'è il record che, si ti fa scattare
l'allarme, ma non sai qual'è.
Detto questo per proseguire devi analizzare bene cosa vuoi
estrarre dal DB (è una mia opinione, non è la regola,
intendiamoci).
Ciao,![]()
Ciao, Brainjar
Gentilissimo Brainjar
ti ringrazio per il tuo aiuto.
A questo punto devo dirla tutta......
Penso che per chi ha dimestichezza con access e VB questo è un quesito stimolante.
In pratica, sto cercando di lavorare con un database access aperto sfruttando codice VBA per operazioni complesse. Le operazioni di routine le faccio con le "pronte" querry, maschere ecc.
L'operazione complessa è la seguente:
Dentro una tabella (dello stesso DB aperto) ho un campo ("Interpretazione_limiti") di tipo stringa che può avere diverse informazioni. Queste informazioni sono racchiuse da virgolette e separate da una virgola ("xx","xxx","x"). Il numero di informazioni (separate da virgola) è variabile per ogni record.
Lo scopo è: in base al valore di un campo numerico "DefaultValue" (dello stesso record) devo compilare il campo "Interpretazione_default" (dello stesso record) con la stringa "abbinata".
Per "abbinata" faccio un chiaro esempio di un record:
se Interpretazione_limiti vale -> "italiano","inglese","francese"
e se DefaultValue = 1 -> Interpretazione_default dovrà essere -> italiano
o se DefaultValue = 2 -> Interpretazione_default dovrà essere -> inglese
o se DefaultValue = 3 -> Interpretazione_default dovrà essere -> francese
In sostanza devo prelevare una stringa in base alla "posizione" indicata.
La difficoltà è che la lunghezza delle stringhe varia e varia il numero.
Questo codice volevo metterlo dentro un bottone in una maschera dello stesso database.
Io ho pensato di risolvere il rilevamento stringhe nel seguente modo:
- per ogni record, campionare il campo "Interpretazione_limiti"e calcolare quante volte compare il carattere doppio apice (") e salvare il numero calcolato nella var. NumSeparatori.
- se NumSeparatori = 0 saltare il record
- verificare se NumSeparatori è dispari e visualizzare l'errore "Controllare Interpretazioni dei limiti"
- Se NumSeparatori è pari, trovare quante stringhe ci sono (semplicemente dividendolo per due) NumInterpretazioni = NumSeparatori / 2
- Calcolare per ogni stringa, la prima e l'ultima posizione dei caratteri in essa contenuti (per poterla poi estrarre), partendo dagli estremi del campo e via via restringendo la ricerca:
PosRicerca := 1
For I:=1 to NumInterpretazioni do
PosizStartInterpr[I] = Instr(PosRicerca,Interpretazione_Limiti, """, VbTextCompare) 'Ricerca della posizione del primo carattere " che trova (funziona """ ??)
PosRicerca := PosRicerca + 1 'esclude primo carattere per cercare il prossimo "
PosizEndInterpr[I] = Instr(PosRicerca,Interpretazione_Limiti, """, VbTextCompare) 'Ricerca della posizione del prossimo carattere " che trova che corrisponde alla fine della prima stringa
LunghStringa[I]= PosizEndInterpr[I] - PosizStartInterpr[I] - 2 ' Calcolo della lunghezza della stringa escludendo due caratteri per la posizione di " in testa ed in coda
PosizStartInterpr[I] = PosizStartInterpr[I] + 1 'per evitare il primo carattere "
Interpretazione(I) : = MID (Interpretazione_Limiti, PosizStartInterpr[I], LunghStringa[I]) 'estrazione della prima stringa contenuta tra doppie virgolette
DB_Monocircuito. DefaultValue := Interpretazione(I) ' popolamento campo del DB
End
- Resettare tutti gli indici
ciao e grazie
Davide
Ciao Davide,
Oggi non sono in ufficio e non posso sfruttare una connessione
flat di 8 ore. Per cui mi studio il tuo algoritmo e ti farò
sapere.
Ciao e buon lavoro.![]()
Ciao, Brainjar