Newsgroup: it.comp.lang.visual-basic
Titolo: [?] gestione recordset indicizzato, alcuni quesiti

Premesso che sono i primi passi che muovo nella gestione di DB.
Faccio una serie di asserzioni, ditemi se sbaglio qualcosa:
devo utilizzare un recordset di tipo tabella
e scorrerlo con i comandi move fino ad EOF per visualizzare tutti i valori
di un campo.
però mi serve che sia indicizzato, per mostrarlo ordinato.
l'unico modo per indicizzarlo è dichiararlo cone tabledef.
Quindi non posso aprirlo come recordset.
tuttavia modifiche e visualizzazioni si fanno con i recordset.
Quindi:
lo apro come tabledef
creo l'indice
chiudo l'oggetto tabledef (perchè senò non mi permette di riaccedervi)
apro lo stesso oggetto come recordset
lo scorro come voglio e lo mostro.
lo richiudo
lo riapro come tabledef
cancello l'indice
lo richiudo
Cavolo, mi sembra incredibilmente incasinato ma ho fatto così fin'ora.
Esiste un metodo più... affinato? (premesso che questo funziona!)
Secondo quesito:
io passo un valore alla funzione che apre il recordset. il valore
corrisponde al campo da scorrere. Se il campo non esiste mi ritorna un
errore (che intercetto con on error e risolvo)
C'è un metodo migliore per verificare la presenza o meno di un campo in una
tabella? (magari che mi dia un valore boolean) E che funzioni anche quando
tento di cancellare un intero campo (inesistente) o di aggiungerlo (e già
esiste)?
Grazie.
Paolo

 esiste)?
se ho capito, forse ti serve la sub di sotto. se la vuoi vedere in azione,
dbstru nel mio sito.
c'e' un po' di roba inutile ma non ho tempo di pulirla....
ciao, a.
--
andrea dot palazzi at tin dot it
xday at libero dot it
free vb/sw: 
http://www.comune.modena.it/cittadini/apal/html/
Private Sub cmdStructure_Click()
    On Error GoTo errman
    If DbName = "" Then Exit Sub
    List1.BackColor = GIALLO
    Dim conf As Long
    'conf = SendMessage(Me.hwnd, WM_SETREDRAW, False, 0)
    Dim db As Database
    Dim td As TableDef, prp As Property, fld As Field, idx As Index
    Dim J As Long
    Dim vval, txt
    Set db = OpenDatabase(DbName)
    List1.Clear
    List1.AddItem UCase(DbName)
    List1.AddItem "==========================="
    For Each td In db.TableDefs
        If Left(td.Name, 4) <> "MSys" Then
            List1.AddItem "TABLE: " & td.Name
            For Each prp In td.Properties
                vval = ""
                vval = prp.Value
                txt = IIf(vval <> "", prp.Name & ": " & prp.Value, prp.Name)
                List1.AddItem "---" & txt
            Next
            For Each fld In td.Fields
                List1.AddItem "------FLD: " & fld.Name
                List1.AddItem "---------Type: " & fld.Type & Chr(9) & "(" &
TipoCampo(fld.Type) & ")"
                List1.AddItem "---------Size: " & fld.Size
                List1.AddItem "---------Required: " & fld.Required
            Next
            For Each idx In td.Indexes
'                On Local Error GoTo ExitFor
                List1.AddItem "------IDX: " & idx.Name
                For Each fld In idx.Fields
                    List1.AddItem "---------" & fld.Name
                Next
            Next
'ExitFor:
            List1.AddItem "==========================="
        End If
        Status.Panels(3) = List1.ListCount: DoEvents
    Next
    List1.SetFocus
'    SendKeys "{END}"
'    conf = SendMessage(Me.hwnd, WM_SETREDRAW, True, 0)
'    For j = 0 To Me.Controls.Count - 1
'        Me.Controls(j).Refresh
'    Next
'    SendKeys "{HOME}"
'    Me.Refresh
    db.Close
    'Status.Panels(3) = List1.ListCount
    cmdExport.Enabled = True
    Icon = ImaYel
    'List1.BackColor = BIANCO
    Exit Sub
errman: MsgBox Error: Exit Sub
    'Resume Next
End Sub

errore (che intercetto con on error e risolvo)
Non capisco bene questa parte se lavori con un database il presupposto e che
tu lo conosca
puoi conoscere i campi del database dopo che lo hai aperto se passi il
parametro del campo prima non so..
tempo fa ho fatto un programma per aprire indefferentemente delle tabelle o
delle query da un DB access
prima apro il db
poi faccio la lista delle tabelle e delle query
poi apro come Recordset  quello che voglio ne leggo i campi e li metto in
un'alytra lista
a questo punto faccio quello che voglio
ciao stefano

Scusa non ho chesto che DB Usi ?
Ciao stefano

c'e' un po' di roba inutile ma non ho tempo di pulirla....
grazie per la routine... vedrò se mi è utile...
anche se da un breve sguardo credo che non risolva il mio problema.
Paolo

poi faccio la lista delle tabelle e delle query
hmmm, e come faccio ad avere la lista di tutti i campi disponibili?
grazie,
Paolo

 anche se da un breve sguardo credo che non risolva il mio problema.
mi sembrava volessi sapere se c'era un campo o una tabella ? li' lo scopri
senz'altro.
nb - va con access97 e prob precedenti, non col 2k.


grazie pal
come farei senza di te! :)))
Paolo

Per cui se voglio gli appuntamenti del 27/01, scorro il campo 27/01...
Quindi, se ho capito bene aggiungi campi in base agli appuntamenti,
ma nei record cosa ci metti ?
Un Db e' fatto per aggiungere record facilmente
l'aggiunta dei campi dovrebbe essere un fatto eccezionale dopo averne
definito la struttura si modifica se le circostanze lo impongono
l'rganizzazione classica del DB e' come la griglia di Excel dove ogni
colonna rappresenta un campo e le righe i record con il tuo sistema inverti
le regole
non e' che non si possa fare ma la tecnica di programmazione con i DB e'
impostata per lavorare con questo criterio: Colonne=campi righe = record
Es Classico DB Clienti
Campi     Denominazione,     Citta,     Indirizzo,     Telefono,     Partita
IVA ecc..
Record    Pippo                        Milano    Via ...         2345678
                paperino                    Roma    Piazza ...    456789
                Topolino                    napoli    Via ....
9876543
e cosi via poi e' facile aggiungere e togliere perche' gli strumenti messi a
disposizione del linguaggio sono fatti per lavorare facilmte sui record
Ciao Stefano

 disposizione del linguaggio sono fatti per lavorare facilmte sui record
e cioe' -- spero di interpretare quello che stefano sottintende, e che
comunque e' pratica comune -- non crei un campo per ogni giorno ma crei un
campo "giorno" in cui metti la data dell'appuntamento, cosi' puoi
agggiungere i vari appuntamenti ordinandoli per data, e mettendo se e' il
caso piu' appuntamenti nello stesso giorno:
g_app    h_app      appuntamento
-----------------------------------
8/1/99  0730       comprare il giornale
7/1/99  0700       portare fuori il cane
8/1/99  0700       portare fuori il cane
7/1/99  0730       comprare il giornale
8/1/99  0745       cappuccino e brioche
7/1/99  0745       cappuccino e brioche
se il db e' struttrato cosi', non importa che i record siano inseriti
nell'ordine giusto. li inserisci come capita, e usi gli indici e/o la
clausola "order by" di sql per avere una vista ordinata del db. in questo
caso sarebbe "order by g_app, h_app".
7/1/99  0700       portare fuori il cane
7/1/99  0730       comprare il giornale
7/1/99  0745       cappuccino e brioche
8/1/99  0700       portare fuori il cane
8/1/99  0730       comprare il giornale
8/1/99  0745       cappuccino e brioche
per avere un indice lo definisci -- per far presto -- in access (si puo'
fare anche da codice vb, ma e' lunghetta), guarda l'help. puoi metterci piu'
campi. in questo caso sarebbere g_app, h_app.
poi quando apri il db in dao gli dici:
rs.index = "giorno_ora"
una volta stabilito l'indice in access, ogni nuova scheda che vai ad
aggiungere viene puntata nell'indice, e quando usi l'indice vedi il db gia'
ordinato. questo e' il grande vantaggio degli indici, che pero' si usano
quasi soltanto in locale, temo. per cui se nella stessa tabella ordini su
"app, g_app, h_app" troverai:
7/1/99  0745       cappuccino e brioche
8/1/99  0745       cappuccino e brioche
7/1/99  0730       comprare il giornale
8/1/99  0730       comprare il giornale
7/1/99  0700       portare fuori il cane
8/1/99  0700       portare fuori il cane
ma non stai a rifare gli indici ogni volta, se non sei per il collo. io ho
una tabella con 3.5 mln di schede. se gliela faccio indicizzare ogni
volta...
in pctrix trovi un esempio di questa tecnica. ma la guida in linea di vb e'
abbastanza chiara.
nb -- in access ovviamente i due campi g_app e h_app sarebbero uno solo, di
tipo date. io a volte li scindo per usi particolari, ma in genere il sistema
credo sia quello.
ciao, a.

disposizione del linguaggio sono fatti per lavorare facilmte sui record
e perchè non sconvolgerli se la necessità lo impone?
quello che ora mi preme sapere (dico ora perchè nel frattempo tramite sql
sono riuscito ad ottenere l'ordinamento dei dati senza indicizzare i campi)
è se questa organizzazione può in qualche modo appesantire il DB.
Non so se sapete che a volte i db crescono in dimensioni... perchè
cancellando tabelle et similia in realtà rimangono all'interno (non so bene,
tipo invisibili) fino alla successiva "compattazione"
E comunque se questa struttura secondo voi mi garantisce una certa stabilità
nel tempo.
arri-grazie
Paolo

periodicamente vado cancellando i campi che non mi servono piů.
Aaaargh!
Come direbbe Biso, no non no nono n ono n on on onon on o n 
Tu hai da fare una sola tabella come dice pal, data, ora, oggetto.
Ci fai un indice sulla data e uno su data+ora.
La "visualizzazione agenda" si fa poi coi campi incrociati:
TRANSFORM First(oggetto)
SELECT ora
FROM agenda
GROUP BY ora
PIVOT Format(data,"dd/mm/yyyy");
Forse si puo' pure fare con un solo campo dataora, visto che cmq il
tipo di dati te lo permette, estraedo poi la data e l'ora
distintamente al momento della query. Prova un po'.
Baibai
P.S. OT: ma ti immagini che abbiamo comprato i gamberoni e IO ho
insegnato ai miei come si mangiano? <:^D
--
Lorenzo Coronati
--
<<Nessuno sa che questa affermazione e' vera>>
(John D. Barrow)
--

insegnato ai miei come si mangiano? <:^D
E vuoi vedere che ora ti spacci per un professionista del gamberone? :)
Cmq sei un grande se sei riuscito ad introdurre il pesce in casa tua.
(Beh, niente doppi sensi!!!)
grazie,
Paolo

 Insomma, dimmelo si, ma senza farmi piangere! :)
Amici e guardati!! he he he ;-)
RoDAgo

La mamma me lo diceva sempre: fai il pittore. E io: no, programmo!
ROTFL!
:-D
