Visual Basic Simple
Generare dei files in base ad un particolare tracciato
(terza parte)
Sincronizza Indice
Sincronizza Indice
Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Ricerca personalizzata

Richiesta di: Roberto Corona - 12 Gennaio 2001
Difficoltà: 5 / 5

Ho bisogno di scrivere un programmino che, dopo aver analizzato dei files contenenti dei particolari tracciati, estragga dei dati da un foglio di Excel e tramite questi generi dei files di testo con una particolare struttura determinata dal file del tracciato.


<< Continua dalla parte 2

Terminata la visione e lo studio del modulo standard del progetto possiamo passare ai due form che compongono l'interfaccia utente.

Poiché i due form sono strettamente connessi, nello studio sarà necessario dare un primo sguardo al primo form, studiare il secondo e una volta fatto, terminare lo studio del primo form.

Cominciamo con la semplicissima interfaccia utente del form principale.

Figura 1Essa consiste in 5 Labele 5 TextBox e in basso appaiono due semplici CommandButtonche serviranno per accedere al secondo form e confermare i dati immessi.

Abbiamo quindi nell'ordine:

  • Una Labeldi nome DatiInputLabel con la Caption impostata a "File Dati di Input:";
  • Una TextBox di nome DatiInputText, che dovrà contenere il nome del file di Excel contenente i dati da processare;
  • Una Labeldi nome NomeFoglioLabel con la Caption impostata a "Nome del foglio:";
  • Una TextBox di nome NomeFoglioText che dovrà contenere il nome del foglio del file di Excel con i dati da processare;
  • Una Labeldi nome TracciatoLabel con la Caption impostata a "File Tracciato:";
  • Una TextBox di nome TracciatoText che dovrà contenere il nome del file di testo del tracciato;
  • Una Labeldi nome DefinizioneLabel con la Caption impostata a "File definizione:";
  • Una TextBox di nome DefinizioneText che dovrà contenere il nome di un file definizione .FDF salvato tramite l'utility di Creazione delle definizioni;
  • Una Labeldi nome OutputLabel con la Caption impostata a "File di Output:";
  • Una TextBox di nome OutputText che dovrà contenere il nome del file di testo in cui saranno salvati i dati. Tale file non deve esistere su Hard disk e nel caso che ci fosse non sarà tentata la scrittura;
  • Un CommanButtondi nome CreaDefinizione con la Caption impostata a "Crea definizione" che servirà per richiamare l'utility di Definizione delle definizioni;
  • Un CommanButtondi nome GeneraOutput con la Caption impostata a "Genera output" che servirà ad accettare tutti i dati immessi e generare il file .TXT voluto con questo programma.

Il codice è molto semplice: saranno gestiti soltanto tre eventiin questo form: il click sopra il pulsante "Crea definizione", il click sopra il pulsante "Genera output" e la chiusura del programma per effettuare la chiusura del database EXCEL aperto.

Inizialmente vedremo soltanto il primo e l'ultimo evento, poiché ancora non sappiamo come sia costituito il file di definizione.

Ecco quindi le poche righe di codice:

  1. Option Explicit
  2. Private Sub CreaDefinizione_Click()
  3.     On Error GoTo ERRORE
  4.     If FileEsiste(DatiInputText.Text) = False Then Exit Sub
  5.     If FileEsiste(TracciatoText.Text) = False Then Exit Sub
  6.     If Len(Trim(NomeFoglioText.Text)) = 0 Then Exit Sub
  7.     Set FILEXLS = OpenDatabase(DatiInputText.Text, 0, 0, "Excel 5.0")
  8.     Set FOGLIOXLS = FILEXLS.OpenRecordset(NomeFoglioText.Text & "$")
  9.     Load DefinitionForm
  10.     DefinitionForm.FileTracciato.LoadFile TracciatoText.Text, rtfText
  11.     DefinitionForm.Show vbModal
  12.     Unload DefinitionForm
  13.     Exit Sub
  14. ERRORE:
  15.     MsgBox "Si è verificato un errore.", vbCritical + vbOKOnly, "Genera output"
  16.     Set FOGLIOXLS = Nothing
  17.     Set FILEXLS = Nothing
  18. End Sub

Nel momento in cui l'utente clicca sul pulsante CreaDefinizione viene controllato se i dati immessi nelle caselle DatiInputText, TracciatoText e NomeFoglioText sono validi mediante verifica dell'esistenza del file e apertura del foglio di Excel.

Alla riga 4 abbiamo un'istruzione di gestione degli errori; per cui ogni errore farà si che la Sub giunga al termine.

Alla riga 8 abbiamo l'apertura del database Excel tramite driver ISAM "Excel 5.0", compatibile con tutte le versioni di Excel. Alla riga successiva viene effettuata l'apertura del foglio specificato nella casella di testo apposita.

Nota che i nomi dei fogli di testo sono memorizzati in una maniera per la quale il nome del foglio è sempre seguito da un segno di dollaro ($); ecco perché l'apertura del Recordset ha come parametro il nome del foglio ed il segno di dollaro.

Alla riga 10 viene caricato il form DefinitionForm, che si occuperà di generare i file di definizione, ma non viene mostrato subito. Prima viene caricato il file di tracciato all'interno della RichTextBoxFileTracciato tramite il metodo LoadFile. Subito dopo questo viene mostrato il form in modalità modale, ovvero a scelta obbligatoria (riga 12).

Da questo punto in poi la gestione viene affidata completamente al form DefinitionForm. Il nostro form principale si occuperà soltanto di chiudere il form all'uscita da esso.

In caso fosse generato qualche errore in questa Sub verrà mostrato un messaggio di errore (riga 16) e verranno chiusi e deallocati il Recordset ed il database Excel.

  1. Private Sub Form_Unload(Cancel As Integer)
  2.     On Error Resume Next
  3.     FOGLIOXLS.Close
  4.     FILEXLS.Close
  5.     Set FOGLIOXLS = Nothing
  6.     Set FILEXLS = Nothing
  7. End Sub

La chiusura del form si assicura soltanto che vengano chiusi e deallocati correttamente il Recordset FOGLIOXLS ed il database FILEXLS.

Prima di vedere il funzionamento della routine di creazione del file di output è necessario vedere come si compone il file di definizione.
Vediamo prima, quindi, il form che si occuperà della definizione del tracciato. Il nome del form è DefinitionForm e si presenta abbastanza complesso.

Figura 2
Figura 2

Nella parte superiore del form abbiamo una RichTextBoxdi nome FileTracciato con le proprietà impostate come segue:

  • AutoVerbMenu = False
  • DisableNoScroll = True
  • Font = Courier New normale dimensione 8
  • HideSelection = False
  • Locked = True
  • MultiLine = True
  • RightMargin = 65000
  • ScrollBars = 3 - Both

Nella sezione sotto abbiamo due ListBoxdi nome ListaSezioni e ListaCampi; abbiamo anche una serie di CommandButtoni cui nomi sono: PulsanteChiudi, PulsanteCreaDefinizione, PulsanteCaricaDefinizione, PulsanteAggiungiSezione, PulsanteEliminaSezione. A questi si aggiungono tre CheckBoxdi nome RigaFissaCheck, LunghezzaFissaCheck e AllineaSinistraCheck.
Completano l'interfaccia una Labeldi nome FillerLabel ed una TextBoxdi nome FillerText con la proprietà MaxLength impostata a 1.

In sostanza, tramite questo form sarà possibile analizzare il tracciato e definire le posizioni in cui andranno inseriti i dati estratti dal file Excel. Una volta terminata la definizione sarà possibile salvarla in un file FDF. Inoltre sarà possibile caricare files FDF salvati in precedenza.

L'analisi del tracciato si effettua separando in sezioni le parti che devono subire un trattamento particolare, quale la sostituzione con un campo del database.
La RichTextBoxFileTracciato servirà per selezionare parti del testo e dividerle in sezioni.

Le sezioni saranno gestite tramite le funzioni della parte sinistra, mentre la parte centrale è dedicata alla definizione delle singole sezioni.

Accennato il funzionamento del form DefinitionForm, possiamo tuffarci nel complesso codice che ne regola il comportamento.

  1. Option Explicit
  2. Private SEZIONI As Collection
  3. Private TROVAPOSIZIONE As Boolean

Abbiamo definito due variabili globali all'interno del form. La prima è una Collection di nome SEZIONI che conterrà tutte le sezioni convertite in stringa tramite la funzione Sezione2Riga. La seconda variabile è TROVAPOSIZIONE, di tipo booleano e servirà per inibire l'esecuzione di certi eventi nel momento in cui cambieremo alcuni stati.

  1. Public Sub MostraSezioni()
  2.     Dim CONTA As Integer
  3.     Dim TMPSEZIONE As TIPOSEZIONE
  4.     ListaSezioni.Clear
  5.     For CONTA = 1 To SEZIONI.Count
  6.         Riga2Sezione SEZIONI.Item(CONTA), TMPSEZIONE
  7.         ListaSezioni.AddItem "Da " & TMPSEZIONE.INIZIO & " A " & TMPSEZIONE.FINE
  8.     Next CONTA
  9.     ListaSezioni.ListIndex = SEZIONI.Count - 1
  10. End Sub

Prima di addentrarci nel form vediamo la Sub MostraSezioni. La sua esecuzione comporta l'azzeramento della ListBoxListaSezioni (riga 8) ed il successivo riempimento tramite lettura della Collection SEZIONI.

  1. Private Sub Form_Load()
  2.     Dim CONTA As Integer
  3.     Set SEZIONI = New Collection
  4.     ListaCampi.AddItem "(nessuno)"
  5.     For CONTA = 0 To FOGLIOXLS.Fields.Count - 1
  6.         ListaCampi.AddItem FOGLIOXLS.Fields(CONTA).Name
  7.     Next CONTA
  8.     ListaCampi.ListIndex = 0
  9.     PulsanteAggiungiSezione.Enabled = True
  10.     PulsanteEliminaSezione.Enabled = False
  11. End Sub

Al caricamento del form vengono inseriti nella ListBox ListaCampi i nomi dei campi del foglio di Excel (riga 21) e la selezione del primo elemento (riga 23).

  1. Private Sub PulsanteAggiungiSezione_Click()
  2.     Dim TMPSEZIONE As TIPOSEZIONE
  3.     If FileTracciato.SelLength > 0 Then
  4.         TMPSEZIONE.INIZIO = FileTracciato.SelStart
  5.         TMPSEZIONE.FINE = TMPSEZIONE.INIZIO + FileTracciato.SelLength - 1
  6.         TMPSEZIONE.CAMPO = ListaCampi.ListIndex
  7.         TMPSEZIONE.RIGAFISSA = RigaFissaCheck.Value
  8.         TMPSEZIONE.LUNGHEZZAFISSA = LunghezzaFissaCheck.Value
  9.         TMPSEZIONE.ALLINEAMENTO = AllineaSinistraCheck.Value
  10.         TMPSEZIONE.FILLER = FillerText.Text
  11.         If ListaSezioni.ListIndex >= 0 Then
  12.             SEZIONI.Add Sezione2Riga(TMPSEZIONE), , , ListaSezioni.ListIndex + 1
  13.         Else
  14.             SEZIONI.Add Sezione2Riga(TMPSEZIONE)
  15.         End If
  16.         FileTracciato.SelColor = RGB(255, 0, 0)
  17.     End If
  18.     MostraSezioni
  19.     FileTracciato.SetFocus
  20. End Sub

Il click sul pulsante PulsanteAggiungiSezione comporta la creazione di una nuova sezione, i cui valori sono determinati dallo stato di alcuni elementi dell'interfaccia. Per creare una sezione è necessario selezionare del testo (almeno un carattere - riga 31) e premere questo pulsante. Verranno memorizzate le coordinate iniziali e finali della selezione (righe 32 e 33), il campo associato del foglio (riga 34), ed altri parametri definiti dai controlli posti nella parte centrale dell'interfaccia (righe 35-38).

Tale sezione verrà inserita subito dopo la sezione selezionata al momento nella ListBox ListaSezioni (riga 40) o all'inizio della Collection SEZIONI (riga 42).
Una volta creata la sezione il testo selezionato diverrà rosso (riga 44) al fine di poterlo distinguere dalle parti non selezionate.

Fin qui abbiamo inserito la nuova sezione nella Collection; la riga 46 provvederà a mostrare i dati della Collection nella ListBox ListaSezioni e poi riportare il focus sulla RichTextBox FileTracciato (riga 47).

Segue parte 4 >>

Fibia FBI
27 Gennaio 2001

Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Scarica il testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Torna all'introduzione delle Richieste dei lettori