FILESTREAM & STRUTTURE… non ci capisco nulla

dove sto sbagliando… continuo ad ottenere solo errori …

Sub Creariba(distinta as string)
  dim testata as ribarecordib
  dim ribagen as ribarecord14
  dim creditore as ribarecord20
  dim debitore as ribarecord30
  dim domiciliazione as ribarecord40
  dim daticreditore as ribarecord50
  dim datiriba as ribarecord51
  dim datiesito as ribarecord70
  dim piede as ribarecordef
  dim numero as integer
  dim ragsoct() as string
  dim vuoto() as string
  dim totaleimporti as Double
  dim numerorecord as integer
  dim datibancaazienda as string
  
  'testata
  '    *** riba 1 ***
  '    ribagen
  '    creditore
  '    debitore
  '    domiciliaz
  '    daticreditore
  '    datiriba
  '    datiesito
  '    *** riba 2 ***
  '    ribagen
  '    creditore
  '    debitore
  '    domiciliaz
  '    daticreditore
  '    datiriba
  '    datiesito
  'piede
  
  self.Listbox1.DeleteAllRows()
  Dim db as New REALSQLDatabase
  db.DatabaseFile = GetFolderItem(main.database)
  self.Listbox1.DeleteAllRows
  If Not db.Connect then
    msgbox("errore nella lettura del database di contabilità, prego contattare l'autore del programma")
  else
    Dim sql As String
    sql = "SELECT *,rowid from scadenze order by datascadenza ASC, clifor"
    
    Dim rsitem As RecordSet
    rsitem = db.SQLSelect(sql)
    
    ' ora controllo se ho i record
    if rsitem.eof then
      msgbox("Nessun record trovato")
    else
      
      ' scrivo il file riba cbi
      Dim t As TextOutputStream
      Dim f As FolderItem
      f = GetSaveFolderItem("", "ribacbi.txt")
      If f <> Nil Then
        t = TextOutputStream.Create(f)
        ' scrivo il record di testa
        numerorecord = 1
        datibancaazienda = Datibanca(self.bancariba)
        'testata = new ribarecordib
        testata.tiporecord = "IB"
        testata.mittente = NthField(datibancaazienda,"%",4)
        testata.ricevente = NthField(datibancaazienda,"%",2)
        testata.datacreazione = Datasia()
        testata.nomesupporto = "DISTINTA " + trim(self.distinta)
        testata.codicedivisa = "E"
        t.WriteLine testata.StringValue
        
        numero = 1
        totaleimporti = 0
        while not rsitem.eof
          ' scrivo i record riba
          numerorecord = numerorecord + 1
          'ribagen = new ribarecord14
          ribagen.tiporecord = "14"
          ribagen.numeroprogressivo = fillernumero(str(numero),7,"0",1)
          ribagen.causale = "30000"
          ribagen.datapagamento = datasia(rsitem.field("datascadenza").StringValue)
          ribagen.importo = numerosia(rsitem.field("importoeff").DoubleValue,13)
          totaleimporti = totaleimporti + rsitem.field("importoeff").DoubleValue
          ribagen.segno = "-"
          ribagen.abipres = NthField(datibancaazienda,"%",2)
          ribagen.cabpres = NthField(datibancaazienda,"%",3)
          ribagen.contopres = fillernumero(NthField(datibancaazienda,"%",5),12,"0",1)
          ribagen.abi = Abicabsia(rsitem.field("iban").StringValue,1)
          ribagen.cab = Abicabsia(rsitem.field("iban").StringValue,2)
          ribagen.codicesia = NthField(datibancaazienda,"%",4)
          ribagen.tipocodice = "4"
          ribagen.codicecliente = rsitem.field("clifor").StringValue
          ribagen.codicedivisa = "E"
          t.WriteLine ribagen.StringValue
          
          ' srivo il record ribagen
          numerorecord = numerorecord + 1
          'creditore = new ribarecord20
          creditore.tiporecord = "20"
          creditore.numeroprogressivo = fillernumero(str(numero),7,"0",1)
          ' modifica main per leggere i dati dell'azienda.
          creditore.creditore1 = "PIPOTTINI INTERNATIONAL S.P.A."
          creditore.creditore2 = "VIA PIPPO PADELLA 22"
          creditore.creditore3 = "OSIO SOTTO"
          creditore.creditore4 = "24040-BG"
          t.WriteLine creditore.StringValue
          
          ' salvo il record del debitore
          numerorecord = numerorecord + 1
          'debitore = new ribarecord30
          debitore.tiporecord = "30"
          debitore.numeroprogressivo = fillernumero(str(numero),7,"0",1)
          ragsoct() = Splittacliente(Cercafield("codice","ragionesociale","clientifornitori",rsitem.field("clifor").StringValue),Cercafield("codice","supragionesociale","clientifornitori",rsitem.field("clifor").StringValue)
          debitore.debitore1 = ragsoct(0)
          debitore.debitore2 = ragsoct(1)
          ragsoct() = vuoto()
          debitore.codicefiscale = Cercafield("codice","codicefiscale","clientifornitori",rsitem.field("clifor").StringValue)
          t.WriteLine debitore.StringValue
          
          ' salvo i record della domiciliazione
          numerorecord = numerorecord + 1
          'domiciliazione = new ribarecord40
          domiciliazione.tiporecord = "40"
          domiciliazione.numeroprogressivo = fillernumero(str(numero),7,"0",1)
          domiciliazione.indirizzo = Cercafield("codice","indirizzo","clientifornitori",rsitem.field("clifor").StringValue)
          domiciliazione.cap = Cercafield("codice","cap","clientifornitori",rsitem.field("clifor").StringValue)
          domiciliazione.localitaeprov = Cercafield("codice","localita","clientifornitori",rsitem.field("clifor").StringValue) + Cercafield("codice","sigla","clientifornitori",rsitem.field("clifor").StringValue)
          domiciliazione.denominazionebanca = Cercafield("abicab","banca","abicab",Abicabsia(rsitem.field("iban").StringValue,1) + " " + Abicabsia(rsitem.field("iban").StringValue,2)) + Cercafield("abicab","descrizione","abicab",Abicabsia(rsitem.field("iban").StringValue,1)+Abicabsia(rsitem.field("iban").StringValue,2))
          t.WriteLine domiciliazione.StringValue
          
          ' dati del creditore
          numerorecord = numerorecord + 1
          'daticreditore = new ribarecord50
          daticreditore.tiporecord = "50"
          daticreditore.numeroprogressivo = fillernumero(str(numero),7,"0",1)
          if rsitem.field("raggruppata").BooleanValue = true then 
            ' la riba raggruppata ha il numero doc in coda nelle note.
            ragsoct() = rsitem.field("note").StringValue
          else
            ragsoct() = splittacreditore("Doc. " + rsitem.field("numerodoc").StringValue + " del " + dataitalia(rsitem.field("datadoc").StringValue))
          end if
          daticreditore.creditorerigo1 = ragsoct(0)
          daticreditore.creditorerigo2 = ragsoct(1)
          ragsoct() = vuoto()
          ' prendi i dati azienda da main sono ancora da creare
          daticreditore.codicefiscale = "02184590160"
          t.WriteLine daticreditore.StringValue
          
          ' datiriba 
          ' serve dati del beneficiario
          numerorecord = numerorecord + 1
          'datiriba = new ribarecord51
          datiriba.tiporecord = "51"
          datiriba.numeroprogressivo = fillernumero(str(numero),7,"0",1)
          datiriba.numeroricevuta = fillernumero(str(numero),10,"0",1)
          datiriba.denomincred = "PIPOTTINI INTERNATIONAL S.P.A."
          datiriba.provincia = "BERGAMO"
          t.WriteLine datiriba.StringValue
          
          ' riga70 solo esiti
          numerorecord = numerorecord + 1
          'datiesito = new ribarecord70
          datiesito.tiporecord = "70"
          datiesito.numeroprogressivo = fillernumero(str(numero),7,"0",1)
          t.WriteLine datiesito.StringValue
          rsitem.MoveNext
          numero = numero + 1
        wend
        
        ' piede delle riba
        numerorecord = numerorecord + 1
        'piede = new ribarecordef
        piede.tiporecord = "IB"
        piede.mittente = NthField(datibancaazienda,"%",4)
        piede.ricevente = NthField(datibancaazienda,"%",2)
        piede.datacreazione = Datasia()
        piede.numerodisposizione =  fillernumero(str(numero),7,"0",1)
        piede.importinegativi = numerosia(rsitem.field("totaleimporti").DoubleValue,15)
        piede.importinegativi = "000000000000000"
        piede.numerorecord = fillernumero(str(numerorecord),7,"0",1)
        piede.codicedivisa = "E"
        t.WriteLine piede.StringValue
        t.Close
      End If
      
    end if
  end if
End Sub

Chi riesce a darmi una dritta ?? — ma anche una storta va bene .-.

Ci sono riuscito da solo.
Innanzitutto nella documentazione per quanto riguarda le strutture per la funzione struttura.stringvalue manca un parametro fondamentale.
Infatti la riga t.WriteLine piede.StringValue genera un errore (questo metodo richiede più parametri di quelli passati)
occorre utilizzare il metodo aggiungendo true es:
t.WriteLine piede.StringValue(true)

Per utilizzare una struttura che genera un record a lunghezza fissa occorre compilare tutte le parti della struttura ed effettuare un filler
ad esempio se ho variabile as string * 8 e variabile è “CIAO” dovrò scrivere "CIAO "
per questo ho creato una funzione che ho chiamato fillerstring

Function Fillerstring(stringa as string, lunghezza as integer, filler as string = " ") As string dim lungostringa as integer dim lungofill as integer dim stringafiller as string = "" dim cursore as integer ' elimino gli spazi stringa = trim(stringa) ' determino la lunghezza di stringa lungostringa = len(stringa) ' se la lunghezza della stringa è maggiore o uguale alla lunghezza della stringa da ritornare allora invio la stringa lunga quanto mi serve senza proseguire if lungostringa >= lunghezza then return left(stringa, lunghezza) end if lungofill = lunghezza - lungostringa ' riempio la parte che manca con il carattere di filler for cursore = 1 to lungofill stringafiller = stringafiller + filler next ' invio la stringa fillata return stringa + stringafiller End Function

Poi alla fine ci sono riuscito … il file sequenziale con record a lunghezza fissa è abile ed arruolato.
Ecco un esempio per il record di tipo14 della mia funzione

ribagen.fillera = " " ribagen.tiporecord = "14" ribagen.numeroprogressivo = fillernumero(str(numero),7,"0",1) ribagen.fillerb = Fillerstring("",12," ") ribagen.datapagamento = datasia(rsitem.field("datascadenza").StringValue) ribagen.causale = "30000" ribagen.importo = numerosia(rsitem.field("importoeff").DoubleValue,13) totaleimporti = totaleimporti + rsitem.field("importoeff").DoubleValue ribagen.segno = "-" ribagen.abipres = fillerstring(NthField(datibancaazienda,"%",3),5," ") ribagen.cabpres = fillerstring(NthField(datibancaazienda,"%",4),5," ") ribagen.contopres = fillernumero(NthField(datibancaazienda,"%",6),12,"0",1) ribagen.abi = fillerstring(Abicabsia(rsitem.field("iban").StringValue,1),5," ") ribagen.cab = fillerstring(Abicabsia(rsitem.field("iban").StringValue,2),5," ") ribagen.fillerc = fillerstring("",12," ") ribagen.codicesia = fillerstring(NthField(datibancaazienda,"%",5),5," ") ribagen.tipocodice = "4" ribagen.codicecliente = fillerstring(rsitem.field("clifor").StringValue,16," ") ribagen.flagdebitore = " " ribagen.fillerd = fillerstring("",5," ") ribagen.codicedivisa = "E" t.WriteLine ribagen.StringValue(false)

da notare l’uso della funzione fillerstring per riempire ovviamente il campo
questo perché in scrittura del file struttura.stringvalue(false) scrive solo il contenuto delle componenti della struttura senza tenere conto delle lunghezze :

ad esempio
struttura prova
tipo as string * 5
data as string * 10
nome as string * 20

tipo = “12345”
data = “01/01/2014”
nome = “GIUSEPPE”

avrebbe scritto “1234501/01/2014GIUSEPPE” e non "1234501/01/2014GIUSEPPE "

Poi ovviamente (non mi serve per il momento) ma se dovessi effettuare l’operazione inversa cioè leggere il record sequenziale dovrei smadonnare altri 3-4 giorni per capire come scrivere un adeguata funzione.

Interessante grazie