PDA

View Full Version : come usare una variabile


visodont
26-10-2002, 20:10
Problema per me inrisolvibile in Visual Basic 6. Sono rimasto Bloccato !
____________________________
Public TipoAgenda
-----------------------------
Function Legge

TipoAgenda = "TbAgenda"
'Se il codice è il seguente : ' ( dopo aver aperto normalmente il database e essendone TbAgenda una tabella )

TbAgenda.index = "Data"
TbAgenda.moveFirst ' Tutto Ok
Ecc...
ecc...
' Ma avendone la necessità, se nel codice sostituisco TbAgenda con la variabile -> TipoAgenda

TipoAgenda.index = "Data"

' Mi da errore di runtime 424
' Necessario oggetto
--------------------------------------
1 ---- Non so cosa fare e dove è l'errore.
2 -- Inoltre, non riesco a trovare dove è l'elenco degli errori sull' help MSDN é un labirinto inestricabile !

Grazie anticipate !
Zeno Pagliai
zeno@tiscalinet

cisky
28-10-2002, 14:06
Credo di aver capito cosa intendi ...
Vuoi utilizzare una variabile stringa per poter gestire le operazioni su un DB (GIUSTO ??? )

Ecco un esempio di come fare:



Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sTable As String
Dim sCampo As String
Dim sSql As String

' *** apri prima una connessione al Database [Semplifico x praticità ...]
'
Set cn = New ADODB.Connection
cn.ConnectionString = " ... " ' *** connessione che utilizzi
cn.Open

sTable = "tblNomeTabella"

Set rs = New ADODB.Recordset
Set rs = rs.Open(sTable, cn, adOpenStatic, adLockOptimistic, adCmdTable)

' *** Ora gestisci le operazioni sul tuo recordset ...

' ... Se vuoi utilizzare la stessa tecnica per un campo del recordset.
'
sCampo = "Campo1"
rs.Fields.item(sCampo) = "Quello che vuoi"

ecc ...



Nel tuo caso ti da' errore perchè VBi si apetta di trovare un oggetto che ha un metodo (Una sub o una function) es: Index,movefirst (ecc..) MA LA VARIABILE NON E' UN OGGETTO ... quindi si verifica un errore!!!!!!!

visodont
28-10-2002, 22:58
RINGRAZIO PER LA SOLLECITUDINE, MA VORREI RIPROPORRE LA DOMANDA PERCHE'
FORSE NON L' HO FORMULATA BENE, DATE LE MIE LACUNE IN VISUAL BASIC 6.
PURTROPPO NON HO CAPITO LA TUA RISPOSTA.
SCRIVERO IN MAIUSCOLO PER DISTINGUE IL CODICE DAI COMMENTI

IL DATA BASE é ACCESS 97
NORMALMENTE USO UNA SOLA AGENDA. MA ORA HO LA NECESSITA' DI AVERNE
( UNA PER VOLTA NATURALMENTE ) , METTENDO IL NOME DELLA TABELLA IN UNA
VARIABILE O DOVE NON SO !
SENZA DOVER RISCRIVERE UN CODICE PER OGNUNA DI ESSE:
_______________________________________________________
Public TbAgendaA As Recordset
Public TbAgendaB As Recordset
Public TbAgendaC As Recordset
Public TbAgendaD As Recordset
----------------------------------
'''''''''''''''''' QUESTE SOLO LE TABELLE DELLE AGENDE
Set TbAgendaA = dBOdont.OpenRecordset("AgendaA")
Set TbAgendaB = dBOdont.OpenRecordset("AgendaB")
Set TbAgendaC = dBOdont.OpenRecordset("AgendaC")
Set TbAgendaD = dBOdont.OpenRecordset("AgendaD")
-----------------------------------------------------------------
Set dBOdont = DBEngine(0).OpenDatabase("C:\Visodont") '''''''''' APRE IL DATA BASE
--------------------------------------------------------------
Function Agenda ''''''''' CON QUESTO CODICE DI ESEMPIO E FUNZIONA BENE !!!!!!
Dim I,Ora as Integer ' MA PER LEGGERE TUTTE LE AGENDE DEVO SCRIVERE
TbAgenda.Index = "Data" ' PIU' FUNZIONI CON IL NOME DELLA RELATIVA TABELLA
TbAgenda.MoveFirst
for I = 1 to 24 ' METTO I VALORI DEI CAMPI SULLA VARIABILE GIORNO(X)
Ora(I) = TbAgenda(I) ' LEGGE I CONTENUTI DELLE ORE E QUESTO FUNZIONA CORRETTAMENTE
next
End Function
______________________________________________

''''''''''''''''''''' VORREI FARE QUESTO '''''''''''''''''''''''''''''''''''''
' METTERE ( QUANDO OCCORRE ) IL NOME DELLE TABELLE SU UNA VARIABILE
' PER POTERLE LEGGERE SENZA DOVER RISCRIVERE UNA FUNZIONE PER
' OGNI TABELLA
______________________________________________
Function Agenda
Dim I,Ora as Integer
Dim TipoAgenda
TipoAgenda = "AgendaA" ''''''''''' OPPURE AgendaB OPPURE AgendaC ecc.....

TipoAgenda.Index = "Data" '''''''' QUA' DA L' ERRORE RUNTIME 424 necessario oggetto
TipoAgenda.MoveFirst
for I = 1 to 24
Ora(I) = TbAgenda(I)
next
End Function
_____________________________________________

IL DATA BASE é GIA' APERTO CORRETTAMENTE
PERCHE' LO USO ATTUALMENTE CON UNA SOLA AGENDA.
COME SPOSTARSI DA UN' AGENDA ALL'ALTRA,
( DA UNA TABELLA ALL' ALTRA ) CON IL DATA BASE APERTO
COME SOPRA DESCRITTO ?

GRAZIE ANCORA, SPERO PROPRIO DI RISOLVERE QUESTO PROBLEMA CHE
E' IMPORTANTE PER ME.

Zeno Pagliai - ( Visodont ) [email protected]

tas
29-10-2002, 00:16
Se ho capito bene, dovresti avere bisogno di una cosa tipo questa:

Public Sub Agenda(rs As Recordset, ora() As Integer)
Dim i As Integer

ReDim ora(1 To 24) As Integer
For i = 1 To 24
ora(i) = rs("Data")
Next
End Sub

... funzione che potrebbe essere utilizzata così:

Public Sub Test()
Dim dBOdont As Database
Dim TbAgendaA As Recordset
Dim TbAgendaB As Recordset
Dim TbAgendaC As Recordset
Dim TbAgendaD As Recordset
Dim ora() As Integer

Set dBOdont = DBEngine(0).OpenDatabase("C:\Visodont")

Set TbAgendaA = dBOdont.OpenRecordset("AgendaA")
Set TbAgendaB = dBOdont.OpenRecordset("AgendaB")
Set TbAgendaC = dBOdont.OpenRecordset("AgendaC")
Set TbAgendaD = dBOdont.OpenRecordset("AgendaD")

'esempio con agenda A
Call Agenda(TbAgendaA, ora)

'esempio con agenda B
Call Agenda(TbAgendaB, ora)

'esempio con agenda C
Call Agenda(TbAgendaC, ora)

'esempio con agenda D
Call Agenda(TbAgendaD, ora)
End Sub

visodont
29-10-2002, 00:47
No, veramente quello era solo un esempio, io vorrei usare le seguenti linee di codice
sostituendo TbAgendaA, TbAgendaB, TbAgendaA che sono i nomi tabelle del data base già aperto

Es..
______________________
Function Legge
TbAgendaA.Index = "Data"
TbAgendaA.MoveNExt
TbAgendaA.MoveFirst
Ecc...

End Function
________________
con la variabile TipoAgenda ( che non è il nome di una tabella è una variabile ) nella quale mettere di volta in volta
il nome di una tabella e fare le stesse cose, ma usando solamente la funzione legge
con i nomi delle tabelle delle diverse agende nella variabile TipoAgenda. Se ad es. metto nella variabile TipoAgenda = "TbAgendaA"

Function Legge
TipoAgenda.index = "Data"
TipoAgenda.MoveNext
TIpoAgenda.MoveFirst
ecc....

End Function
______________________________
mi dovrebbe legere la tabella TbAgendaA


Vi ringrazio per la pazienza !
Cordiali saluti
Zeno Pagliai -Roma - Visodont
[email protected]

cisky
29-10-2002, 14:03
SPERO CHE QUESTO CODICE FACCIA AL CASO TUO,la funzione F_Agenda recupera le date da un agenda devi passargli come argomenti il Database,il nome della tabella e l'array delle ore che vuoi recuperare !!!



Private Sub Test()

Dim dBOdont As Database
Dim TbAgenda As Recordset
Dim sTabella As String
Dim ora() As Integer
Dim bOK As Boolean

Set dBOdont = DBEngine(0).OpenDatabase("C:\Visodont")

' *** esempio con agenda A
'
sTabella = "AgendaA"

bOK = f_Agenda(dBOdont, sTabella, ora())
If Not bOK Then
' *** Se si è verificato un erorre ...
MsgBox "Errore di recupero dati con tabella " & sTabella
End If


' *** esempio con agenda B
'
sTabella = "AgendaB"

bOK = f_Agenda(dBOdont, sTabella, ora())
If Not bOK Then
' *** Se si è verificato un erorre ...
MsgBox "Errore di recupero dati con tabella " & sTabella
End If

End Sub

Private Function f_Agenda(oDB As Database, ByVal sTblAgenda As String, ByRef ora() As Integer) As Boolean

Dim rs As New Recordset
Dim I As Integer
Dim bRet As Boolean

On Error GoTo lError

' *** Azzero l'array delle ore
ReDim ora(24)

' *** Apro il recordset
Set rs = oDB.OpenRecordset(sTblAgenda)

' *** Recupero i dati
'
rs.Index = "Data"
rs.MoveFirst
For I = 1 To 24
ora(I) = rs(I)
Next

bRet = True

lExit:
' *** Chiudo il recordset
On Error Resume Next
rs.Close
Set rs = Nothing

f_Agenda = bRet

lError:
Resume lExit

End Function

visodont
29-10-2002, 23:28
No, chiedo scusa, non mi mandate a quel paese, ma purtroppo anche questa volta non sono riuscito a spiegarmi.

Dimentichiamo tutto quanto scritto prima e ricominciamo da capo come fosse una nuova domanda.


Dopo aver aperto un DataBase in VB 6 e tutte le tabelle in esso contenute ( ACCESS )

Invece di spostare il puntatore del record usando il nome della tabella Es.. TbAgenda.MoveNext come faccio ora,
Vorrei poter spostare il puntatore o fare qualsiasi altra cosa a quella tabella, sostituendo il nome con una variabile che ne contiene il nome e possa contenere il nome di altre tabelle, quando occorre.
Es….. se Agen è una variabile e assegno ad Agen il nome “TaAgenda” ( Agen = “TbAgenda” ) dovrei poter fare :
Agen.MoveNext ecc.. invece di TbAgenda.MoveNext Tutto qua.

Lo scopo per fare questo è presto detto, vorrei usare una sola funzione per agire su molte tabelle, assegnando un nome diverso alla variabile Agen ogni volta che mi occorre, senza dover scrivere una funzione per ogni tabella.

Più di cosi non so cosa dire.
Cordiali saluti
Zeno Pagliai - visodont

cisky
31-10-2002, 14:08
Se vuoi assegnare ad una variabile una tabella,(o meglio un recordset) , devi dichiarare la variabile come un oggetto.

x chiarirti le idee, un codice del genere non funzionerà mai:

dim rsAgenda

rsAgenda = "AgendaA"

rsAgenda.Movenext ' *** ERRORE !!! ***

-------------------------------------------------------------

Non funziona per 2 o + motivi:

1) Siccome non hai definito il tipo di variabile rsAgenda, di default VB gli assegna un tipo Variant (Cioè puo' essere qualsiasi cosa) ... [e fin qui tutto OK]
.... ma se assegni a rsAgenda la stringa "AgendaA"
codice:[rsAgenda = "AgendaA"] , la variabile rsAgenda diventa una stringa e non un Oggetto(Recordset).

2) Quando lavori con variabili di tipo oggetto non puoi impostarli con una sintassi 'Normale' ma devi usare l'istruzione SET

es:
dim rsAgenda

set rsAgenda = new Recorset

3) x ritornare al tuo problema, la variabile che identifica le tue tabelle devi dichiararla cosi':

dim rsAgenda as recordset

set rsAgenda = new recordset
rsagenda.open ... ' *** Ecc..

4) La funzione standard che vuoi creare x gestire le tabelle,deve operare o con un Recordset che tu passerai x Riferimento alla funzione o se vuoi puoi passargli la stringa con il nome della tabella, ma in questo caso devi aprire un recordset X FORZA!!!!!

es : Vedi funzione f_Agenda (Nel mio Post precedente!)
[in quel caso gli passo il nome della tabella e nella funzione apro e gestisco le operazioni sul Recordset]

x FINIRE: in alternativa apri prima il recordset e fai una funzione di questo tipo :

private function f_Agenda(byRef rs as Recordset )
[e gestisci tutte le operazioni che vuoi .... ]


spero che ti sia chiaro, CIAO ;)

cionci
31-10-2002, 15:20
Beh...meglio passare il nome della tabella ed usarlo nella open del recordset...

visodont
31-10-2002, 21:00
Grazie mille, proverò !
Grazie ancora.
Zeno Pagliai - Visodont