' Rapid-Q by William Yu (c)1999-2000 . ' ================================================================================ ' Upload_il_tuo_script_su_Rapidq.it ' Gestire_records_su_database_txt I file di database basati su record sono meglio conosciuti come file ad accesso random. Il termine accesso random indica che qualsiasi record del file può essere usato in qualsiasi momento e in qualsiasi ordine, o in modo random attraverso il file. Questo è possibile perchè il file è costituito in modo che identici record siano i costituenti unici del file e il punto di inizio di qualsiasi record può essere facilmente raggiunto sapendo la sua posizione nella sequenza (es ottavo, centesimo ecc ecc) e le dimensioni del singolo record standard. Definire un Record Il modo più facile per gestire i recordi presenti in un file ad accesso random è prima definire la struttura del record. Gli UDT permettono di definire il record in Rapid-Q. Se il file già esiste, allora è necessario conoscere la esatta struttura del record e definirla come UDT prima di poter leggere correttamente i dati dal file ad accesso casuale. Se stiamo generando i nostri dati, allora la struttura deve essere progettata in modo da gestire tutte le informazioni necessarie. Vediamo come progettare una semplice applicazione agenda_telefonica. Le infromazioni che vogliamo gestire nel file database saranno il nome dle contatto ed il suo numero telefonico. Possiamo creare una UDT definendo delle variabili per ciascun dato di un singolo contatto: TYPE PhoneRecordType Contact AS STRING * 20 PhoneNum AS STRING * 10 END TYPE DIM PhoneRecord AS PhoneRecordType Una volta che abbiamo creato un tipo di dati UDT notiamo che il nostro record definito nell'esempio suesposto è 30 bytes, infatti ciascun carattere presente nella stringa richiede un byte, quindi usiamo 20 bytes per il nome del contatto e 10 bytes per il numero di telefono. Localizzare uno specifico Record Il componente QFileStream ha il metodo chiamato SEEK che posiziona l'indice del file aperto a qualsiasi locazione, espressa in byte dall'inizio del file, nel file aperto. Il prossimo comando di accesso al file dopo il metodo seek inizia dalla posizione in cui si trova l'indice del file. Una operazione seek al byte 0 del file dati pone l'indice del file sul primo record del file. Se i nostri record sono esattamente di 30 bytes lunghi, una operazione seek sul byte 30 del file dati posizione l'indice del file sul secondo record. Allo stesso modo una operazione seek sul byte 60 posizione l'indice del file sul terzo record, e così rispettivamente sul byte 90 indica il quarto record ecc ecc. Il calcolo manuale dell'inizio di ciascun record sarebbe poco pratico e stupido visto che lo potrebbe fare il computer per noi, più velocemente e più precisamente. Se conosciamo l'esatta dimensione del record del file dati, possiamo moltiplicare questa lunghezza del record con il numero del record che vogliamo leggere/scrivere e ricaveremo la posizione iniziale in byte del record richiesto. Siccome la numerazione dei record sul file dati inizia da 0 invece che da 1 basterà corregere la formula decrementando di 1 unità il numero indicante il record su cui vogliamo operare. La formula fondamentale per il calcolo del punto di inizio del record desiderato è quindi: PosizioneRecord = ( NumeroRecord - 1 ) * LunghezzaRecord Nel precedente esempio, la struttura del record era esattamente di 30 byte. Potremmo anche implementare tale lunghezza nel codice sorgente, ma ci causerebbe dei problemi se un giorno cambiassimo la lunghezza del record, dovremmo riscrivere il codice sorgente. Per evitare tale inconveniente è possibile usare la funzione SIZEOF che determina l'esatta dimensione della struttura record al momento dell'esecuzione del programma ed elimina la possibilità di errori dovuti a costanti numeriche. Notare che SIZEOF può solo determinare la dimensione di una variabile attuale, e quindi la variabile deve essere prima dichiarata con DIM come UDT e passata a SIZEOF prima che ci ritorni l'esatta lunghezza di tale UDT-record. TYPE PhoneRecordType Contact AS STRING * 20 PhoneNum AS STRING * 10 END TYPE DIM PhoneRecord AS PhoneRecordType DIM RecordNumber AS INTEGER DIM RecordSize AS INTEGER DIM PhoneList AS QFileStream RecordNumber = 3 RecordSize = SIZEOF( PhoneRecord ) PhoneList.Open( "PHONE.DAT", 0 ) PhoneList.Seek( ( RecordNumber - 1 ) * RecordSize, 0 ) Il codice suesposto definisce un record, apre il file di dati, e posizione l'indice del file all'inizio del terzo record. Leggere il Record Il componente QFileStream contiente il metodo chiamato READUDT. ReadUDT che gestisce un record mettendolo in una UDT dichiarata prima con DIM e dello stesso tipo del recordo. TYPE PhoneRecordType Contact AS STRING * 20 PhoneNum AS STRING * 10 END TYPE DIM PhoneRecord AS PhoneRecordType DIM RecordNumber AS INTEGER DIM RecordSize AS INTEGER DIM PhoneList AS QFileStream RecordNumber = 3 RecordSize = SIZEOF( PhoneRecord ) PhoneList.Open( "PHONE.DAT", 0 ) PhoneList.Seek( ( RecordNumber - 1 ) * RecordSize, 0 ) PhoneList.ReadUDT( PhoneRecord ) PRINT PhoneRecord.Contact PRINT PhoneRecord.PhoneNum Il codice suesposto continua il nostro precedente esempio leggendo il terzo record dal file e mostrandone il contenuto sullo schermo. Scrivere il Record IL componente QFileStream continiene un metodo chiamato WRITEUDT. WriteUDT che prende le informazioni messe in una variabile UDT e le registra nella posizione indicata nel file ad accesso casuale. TYPE PhoneRecordType Contact AS STRING * 20 PhoneNum AS STRING * 10 END TYPE DIM PhoneRecord AS PhoneRecordType DIM RecordNumber AS INTEGER DIM RecordSize AS INTEGER DIM PhoneList AS QFileStream PhoneRecord.Contact = "Jennie" PhoneRecord.PhoneNum = "8675309" RecordNumber = 3 RecordSize = SIZEOF( PhoneRecord ) PhoneList.Open( "PHONE.DAT", 0 ) PhoneList.Seek( ( RecordNumber - 1 ) * RecordSize, 0 ) PhoneList.WriteUDT( PhoneRecord ) Il codice suesposto altera il precedente esempio poneno un nuovo nome ed un nuovo numero nelle variabili della UDT PhoneRecord e poi registra tali informazioni sul file ad accesso casuale nel terzo record. ' =============================================================================== ' 2003 Holyguard.net - 2007_Abruzzoweb