Newsgroup: it.comp.lang.visual-basic
Titolo: File MultiRecod

Dovrei salvare (e poi leggere) in un file dei dati appartenenti a diversi
tiporecord (utilizzando cioč due UserType).
Avrei pensato a due strade:
1) scrivo 2 file (uno per ogni tipo record) e poi ne scrivo uno unico
ottenuto come unine dei due, separando i due tipo tracciato da una stringa
di spearazione. Quando li dovrň leggere creerň 2 file per poi leggerli
ognuno col rispettivo tiporecord.
2) faccio in modo che ogni tipo record sia di dimensioni identiche agli
altri anche se con struttura diversa.
Qualcuno ha qualche suggerimento?
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


La seconda che hai detto se i dati sono tutte stringhe, devi gestire tre
usertype con dimensione uguale e poi a seconda di un identificatore scarichi
sul tracciato corretto:
ad esempio
Private Type rec
    record As String * 10
End Type
Private Type rec1
    tipo As String * 1
    d1 As String * 4
    d2 As String * 5
End Type
Private Type rec2
    tipo As String * 1
    d1 As String * 8
    d2 As String * 1
End Type
'-- dove rec č il record fisico dei dati mentre rec1 e rec2 sono i tracciati
da usare per la visualizzazione e il primo byte di rec č l'identificatore
del tipo
Private Sub Command1_Click()
Dim aRec As rec
Dim aRec1 As rec1
Dim aRec2 As rec2
Dim i As Integer, ii As Integer
    i = FreeFile
    Open "d:\pippo.txt" For Random As #1 Len = Len(aRec)
 
    For ii = 1 To 5
        If (ii Mod 2) = 0 Then
            aRec.record = "1123412345"
        Else
            aRec.record = "
2123456781
"
        End If
        Put #i, ii, aRec
    Next
    Close #1
 
    i = FreeFile
    Open "d:\pippo.txt" For Random As #1 Len = Len(aRec)
 
    For ii = 1 To 5
        Get #1, ii, aRec
        If Left$(aRec.record, 1) = "1" Then
            LSet aRec1 = aRec
            MsgBox aRec1.tipo & vbNewLine & aRec1.d1 & vbNewLine & aRec1.d2
        Else
            LSet aRec2 = aRec
            MsgBox aRec2.tipo & vbNewLine & aRec2.d1 & vbNewLine & aRec2.d2
        End If
    Next
    Close #1
End Sub


Inviato via 
http://arianna.libero.it/usenet/
  La prima domanda che mi viene in mente e': tu saprai quale tipo di
variabile ci sara' in un dato record? Se la risposta e' si puoi
tranquillamente scriverli entrambi nello stesso file, altrimenti e'
meglio usarne due e mantenerli separati perche' non ho mica capito
come faresti poi a gestire la stringa di separazione in maniera
efficiente.
-- 
  Ciao :-)
  Massimo
  Nell'indirizzo, sostituire "micio" con "mc"


Si che conosco i due tipi di tracciato, ma non capisco come possa scrivere e
leggere il file con due tipi di tracciato.
Per la stringa di sepaazione avevo pensato di inserire tra i due tipi di
tracciato una stringa di decodifica del tipo
"(¯`·.¸StringaDiDecodifica¸.·´¯)", cioè una stringa che non possa esistere
in nessuno dei file con i dati dei tracciati. Poi con una InStr la
intercetto e splitto i file.
Fammi sapere!


intercetto e splitto i file.
  Come intendi leggere i file? Usare i tipi di tracciato record ha
senso per i file random ma a quel punto dei usare la soluzione
proposta da DAS, non e' che puoi ficcare nel file stringhe come ti
pare.



Ho fatto qualche prova. In un form metti due pulsanti (command1 per la
scrittura e command2 per la lettura) e incolla questo codice.
La definizione dei tipi prevede che per ogni tipo record abbia una versione
di Write e una di Read. Nella fase di read leggerò il tipo e poi deciderò
con quale tracciato leggere i dati.
Che ne dici?
Ora però ho una seconda questione: io dovrei scrivere delle stringhe che
generalemnte saranno di una decina di caratteri, ma potrebbero essere anche
molto lunghe. Non volendo dichiarare una stringa del tipo String*200 (che
sarà tendenzialemnte di dimensioni esagerate), come si potrebbe fare?
Option Explicit
Private Type udtTipo
  valore As String * 1
End Type
Private Type udtTT1
  valore As String * 3
End Type
Private Type udtTT2
  valore As String * 5
End Type
Private Type udtTipoTracciato_1_WRITE
  tipo As udtTipo
  dato As udtTT1
End Type
Private Type udtTipoTracciato_1_READ
  dato As udtTT1
End Type
Private Type udtTipoTracciato_2_WRITE
  tipo As udtTipo
  dato As udtTT2
End Type
Private Type udtTipoTracciato_2_READ
  dato As udtTT2
End Type
Private Sub Command1_Click()
  On Error Resume Next
  Kill App.Path & "\file1.data"
  On Error GoTo 0
  '____ WRITE ____
  Dim numFile As Integer
      numFile = FreeFile
  Dim tr_1 As udtTipoTracciato_1_WRITE
      tr_1.tipo.valore = "A"
  Dim tr_2 As udtTipoTracciato_2_WRITE
      tr_2.tipo.valore = "B"
  '
  ' Scrivo nel file un tipo di record o l'altro
  '
  Open App.Path & "\file1.data" For Binary Access Write As #numFile
  tr_1.dato.valore = "111"
  Put #numFile, , tr_1
  tr_2.dato.valore = "22222"
  Put #numFile, , tr_2
  tr_2.dato.valore = "33333"
  Put #numFile, , tr_2
  tr_1.dato.valore = "444"
  Put #numFile, , tr_1
  tr_1.dato.valore = "555"
  Put #numFile, , tr_1
  Close #numFile
End Sub
Private Sub Command2_Click()
  '____ READ ____
  Dim numFile As Integer
      numFile = FreeFile
  Dim t As udtTipo
  Dim tr_1 As udtTipoTracciato_1_READ
  Dim tr_2 As udtTipoTracciato_2_READ
  Open App.Path & "\file1.data" For Binary Access Read As #numFile
  Do While Not EOF(numFile)
    Get #numFile, , t
    '
    ' Leggo dal file il tipo e a seconda del suo tipo leggo i successivi dati
    '
    Select Case t.valore
    Case "A"
      Get #numFile, , tr_1
      Debug.Print "tipo:" & t.valore & " valore:" & tr_1.dato.valore
    Case "B"
      Get #numFile, , tr_2
      Debug.Print "tipo:" & t.valore & " valore:" & tr_2.dato.valore
    Case Else
      Debug.Print "tipo:? valore:?"
    End Select
  Loop
  Close #numFile
End Sub


sarà tendenzialemnte di dimensioni esagerate), come si potrebbe fare?
  Non so se con i file binary sia possibile ovviare al problema senza
rivedere completamente la struttura dei dati che utilizzi per il
motivo che ho spiegato sopra: prova  a studiarti quel tipo di file e
vedi cosa riesci a tirarne fuori o spera che qualcuno che li conosce
bene ti aiuti.
