Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - Ricerca multipla in un file random
Forum - Visual Basic 6 - Ricerca multipla in un file random

Avatar
WillyVB (Normal User)
Rookie


Messaggi: 31
Iscritto: 30/12/2011

Segnala al moderatore
Postato alle 14:04
Giovedì, 05/01/2012
Rieccomi qui con un nuovo quesito, sono riuscito (sbirciando molto sulla rete) a strutturare una ricerca che vada a cercare la parola ricercata in ogni parola contenuta nella stringa ricercata.

esempio:
Parola da ricercare= "Prova"
Stringa su cui cercare= "Questa è una prova"

il programma suddivide automaticamente la stringa in questo modo= |Questa|è|una|prova| quindi non fa un controllo bensì ne fa 4 inoltre non ricerca la frase esatta bensì l'inizio quindi se io nella stringa da ricercare avessi avuto "provaova" al posto di "prova" avrebbe comunque inserito il record nella listview da me creata.

Ora il problema è applicare una ricerca su più parametri, titolo, anno, categoria ect

avevo pensato di usare delle flags, ho impostato in vari modi il codice e ho riscontrato loop infiniti, controlli solo sul primo records, ed altri problemini. vi rilascio di seguito il codice che ho trovato sulla rete per la ricerca, riadattato da me per il mio programma.


Funzione di ricerca:
Codice sorgente - presumibilmente VB.NET

  1. Private Function TrovaParola2(Str1, Str2, FLAG) As String
  2.   'Str1 = Stringa che contiene un testo o un campo Memo (in Access)'
  3.  'Str2 = parola da trovare'
  4.  
  5.  Dim Pos1, Pos2, App, k, LenStr As Integer
  6.  Dim StrParte As String
  7.  
  8.  'Inizzializza le variabili'
  9.   App = 0
  10.  
  11.   FLAG = False
  12.  
  13.   Pos1 = 0 ' Punta a una spazio Chr(32)
  14.   Pos2 = 0 ' Punta sempre allo spazio successivo di Pos1
  15.  'Parola trovata provvisoria e confrontata con Str2
  16.   StrParte = " "
  17.  'Elimina eventuali spazi all'inizio e alla fine, dei parametri passati
  18.   Str1 = Trim(Str1)
  19.   Str2 = Trim(Str2)
  20.  
  21.  
  22.  'Calcola la lunghezza del Testo. Len(Str1) Si poteva mettere nel For, ma è più lento
  23.  'perchè ad ogni ciclo deve ricalcolare la lunghezza del testo
  24.  LenStr = Len(Str1)
  25.  'Qusto ciclo elimina tutti i caratteri di ritorno a capo(Chr(13)
  26.  'e il carattere di linea nuova Chr(10) e li sotitusce con uno spazio " "
  27.  For k = 1 To LenStr
  28.   If Mid(Str1, k, 1) = Chr(13) Or Mid(Str1, k, 1) = Chr(10) Then
  29.      Mid(Str1, k, 1) = " "
  30.   End If
  31.  Next
  32.  '=============== Inizio Ricerca =========================
  33.  Do
  34.   If App = 0 Then
  35.     Pos1 = InStr(1, Str1, Chr(32))             'trova la posizione del primo spazio.'
  36.     If Pos1 = 0 Then Pos1 = Len(Str1)          'Se Pos1 = 0, la stringa ha una sola parola.
  37.     StrParte = Trim(Left(Str1, Pos1))          'Salva la parola dall'inizio stringa, fino al primo spazio.
  38.     App = 1                                    'fa in modo di venire qui solo la prima volta.
  39.   Else
  40.     Pos2 = InStr(Pos1 + 1, Str1, Chr(32))      'trova la posizione dei successivi spazi.
  41.     If Pos2 = 0 Then Pos2 = Len(Str1)          'Se Pos2 = 0, ha letto l'ultima parola.
  42.     LenStr = (Pos2 - Pos1)                     'determina la lunghezza della parola.
  43.     If LenStr = 0 Then Exit Do                 'è a fine file esce dal ciclo Do.
  44.     StrParte = Trim(Mid(Str1, Pos1 + 1, LenStr)) 'Salva la parola.
  45.     Pos1 = Pos2                                'Pos1 punta all'ultimo spazio trovato.
  46.   End If
  47.    
  48.   If Str2 = StrParte Then                      'confronta la parola da ricercare con l'ultima trovata
  49.     FLAG = True
  50.     Exit Do                                    'esce dal ciclo Do'
  51.   End If
  52.  Loop                                           'ritorna al Do e riesegue il ciclo
  53. End Function



Dichiarazione variabili:
Codice sorgente - presumibilmente VB.NET

  1. Dim TitX, RegiaX, DistrX, ProdX, AnnoUX, GenX, Gen, CheckVet(), FindVet() As String
  2. Dim N, NE, i As Integer
  3. Dim F1, F2, F3, F4, F5, F6, FVet() As Boolean
  4. Dim SchedaFilm As Film



Private Sub Cerca:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub cmdCerca_Click()
  2. FrmVisList.ListFilm.ListItems.Clear
  3.  
  4. i = 0
  5. NE = 0
  6.  
  7. ReDim CheckVet(i), FindVet(i), FVet(i)
  8.  
  9. TitX = txtTitX
  10. RegiaX = txtRegiaX
  11. DistrX = txtDistrX
  12. ProdX = txtProdX
  13. AnnoUX = txtAnnoUX
  14. GenX = comboGenX
  15.  
  16. If Option1 = True Then
  17.     Open App.Path & "\Archivi\Indice" For Input As #1
  18.         Do Until EOF(1)
  19.             Input #1, Gen
  20.             Open App.Path & "\Archivi\" & Gen For Random As #2 Len = Len(SchedaFilm)
  21.             N = 0
  22.                 Do Until EOF(2)
  23.                     N = N + 1
  24.                     Get #2, N, SchedaFilm
  25.                     Call TrovaParola(SchedaFilm.Tit, TitX)
  26.                 Loop
  27.             Close #2
  28.         Loop
  29.     Close #1
  30. End If
  31.  
  32. If Option2 = True Then
  33.     If TitX <> "" Then
  34.         i = i + 1
  35.         ReDim Preserve CheckVet(i), FindVet(i), FVet(i)
  36.         CheckVet(i) = SchedaFilm.Tit
  37.         FindVet(i) = TitX
  38.         FVet(i) = F1
  39.         NE = NE + 1
  40.     End If
  41.                
  42.     If RegiaX <> "" Then
  43.         i = i + 1
  44.         ReDim Preserve CheckVet(i), FindVet(i), FVet(i)
  45.         CheckVet(i) = SchedaFilm.Regia
  46.         FindVet(i) = RegiaX
  47.         FVet(i) = F2
  48.         NE = NE + 1
  49.     End If
  50.                
  51.     If DistrX <> "" Then
  52.         i = i + 1
  53.         ReDim Preserve CheckVet(i), FindVet(i), FVet(i)
  54.         CheckVet(i) = SchedaFilm.Distr
  55.         FindVet(i) = DistrX
  56.         FVet(i) = F3
  57.         NE = NE + 1
  58.     End If
  59.                
  60.     If ProdX <> "" Then
  61.         i = i + 1
  62.         ReDim Preserve CheckVet(i), FindVet(i), FVet(i)
  63.         CheckVet(i) = SchedaFilm.Prod
  64.         FindVet(i) = ProdX
  65.         FVet(i) = F4
  66.         NE = NE + 1
  67.     End If
  68.                
  69.     If AnnoUX <> "" Then
  70.         i = i + 1
  71.         ReDim Preserve CheckVet(i), FindVet(i), FVet(i)
  72.         CheckVet(i) = SchedaFilm.AnnoU
  73.         FindVet(i) = AnnoUX
  74.         FVet(i) = F5
  75.         NE = NE + 1
  76.     End If
  77.                
  78.     If GenX <> "" Then
  79.         i = i + 1
  80.         ReDim Preserve CheckVet(i), FindVet(i), FVet(i)
  81.         CheckVet(i) = SchedaFilm.Gen1
  82.         FindVet(i) = GenX
  83.         FVet(i) = F6
  84.         NE = NE + 1
  85.     End If
  86.            
  87. Open App.Path & "\Archivi\Indice" For Input As #1
  88.     Do Until EOF(1)
  89.         Input #1, Gen
  90.         Open App.Path & "\Archivi\" & Gen For Random As #2 Len = Len(SchedaFilm)
  91.         N = 0
  92.             Do Until EOF(2)
  93.                 N = N + 1
  94.                 Get #2, N, SchedaFilm
  95.                
  96.                 For i = 0 To NE
  97.                     Call TrovaParola2(CheckVet(i), FindVet(i), FVet(i))
  98.                 Next i
  99.                
  100.                 i = 0
  101.                 Do Until i > NE
  102.                     i = i + 1
  103.                     If FVet(i) = True Then
  104.                         If i = NE Then
  105.                             Set X = FrmVisList.ListFilm.ListItems.Add(, , RTrim(SchedaFilm.Cod))
  106.                                 X.SubItems(1) = RTrim(SchedaFilm.Tit)
  107.                                 X.SubItems(2) = RTrim(SchedaFilm.TitO)
  108.                                 X.SubItems(3) = RTrim(SchedaFilm.Regia)
  109.                                 X.SubItems(4) = RTrim(SchedaFilm.AnnoU)
  110.                         End If
  111.                     Else
  112.                         If FVet(i) = False Then
  113.                             Exit Do
  114.                         End If
  115.                     End If
  116.                 Loop
  117.             Loop
  118.         Close #2
  119.     Loop
  120. Close #1
  121. End If
  122. End Sub




Questa è l'impostazione attuale, il concetto logico è che appare la finestra di ricerca, si seleziona tramite l'option il metodo (il metodo semplice funziona alla grande), ma il nostro caso riguarda quello avanzato, mettiamo caso che io cerco i film anno di uscita (Variabile AnnoUX) il programma controlla quali campi sono "compilati" riscontra che solo il campo txtAnnoUX è compilato allora incrementa l'indice "i", ridimensiona i vettori, aggiunge al vettore CheckVet la variabile dove si deve cercare, in FindVet aggiunge la variabile contente il valore da ricercare, mentre in FVet la Flag appartenente, dopodiché legge l'archivio SchedaFilm, e richiama la funzione di ricerca, una volta qui controlla se all'interno della variabile c'è la parola o il numero ricercato, se c'è imposta la flag su VERO altrimenti rimane falsa. Finito il controllo su ogni vettore indicizzato dovrebbe controllare in modo ciclico le flag se sono tutte vere allora dovrebbe aggiungere la scheda nella listview uscendo dal do per ripetere l'operazione per la prossima scheda fin quando non finiscono (aggiungendo allo stesso modo altri risultati), altrimenti esce dal do e riprende i controlli sulla prossima scheda.

Ma purtroppo ciò non avviene o almeno... clicko su cerca, mi cancella i campi della listview ma non mi da nessun risultato... Qualche soluzione?!

Ultima modifica effettuata da WillyVB il 05/01/2012 alle 14:20
PM Quote
Avatar
ampeg (Normal User)
Pro


Messaggi: 124
Iscritto: 21/04/2011

Segnala al moderatore
Postato alle 22:52
Giovedì, 05/01/2012
la prima cosa da fare è sistemare tutte le dichiarazioni delle variabili assegnadogli il tipo di dato specifico, ad esempio tu stai utilizzando il modo di dichiarare le variabili implementato in vb.net che permette di dichiarare il tipo di un blocco di variabili mentre in VB6 ogni variabile va dichiarata specificatamente

Codice sorgente - presumibilmente VB.NET

  1. ad esempio Dim a, b, c As Integer in vb.net  sono 3 variabili Integer, in VB6 solo la c è Integer le altre sono Variant, quindi vanno specificate tutte: Dim a As Integer, b As integer, c As integer


la funzione TrovaParola2 non ha senso poiché restituisce sempre un valore vbnullstring

io la correggerei così togliendo la variabile FLAG:

Codice sorgente - presumibilmente VB.NET

  1. Private Function TrovaParola2(ByVal Str1 As String , ByVal Str2 As String) As Boolean
  2.  
  3.   ....
  4.  
  5.  
  6.   'parte finale
  7.  
  8.   If Str2 = StrParte Then                      'confronta la parola da ricercare con l'ultima trovata
  9.  
  10.     TrovaParola2 = True 'al posto della var FLAG
  11.  
  12.     Exit Do                                    'esce dal ciclo Do'
  13.  
  14.   End If
  15.  
  16.  Loop    
  17.  
  18. End Function
  19.  
  20.  
  21. poi la userei così:
  22. 'in pratica il flag me lo restituisce la funzione direttamente
  23.  
  24. For i = 0 To NE
  25.    FVet(i) = TrovaParola2(CheckVet(i), FindVet(i))
  26. Next i



questo non so se risolverà il problema, dovresti provare a fare il debug e vedere se effettivamente la variabile FVett(i) assume il valore desiderato

Ultima modifica effettuata da ampeg il 05/01/2012 alle 22:55
PM Quote
Avatar
WillyVB (Normal User)
Rookie


Messaggi: 31
Iscritto: 30/12/2011

Segnala al moderatore
Postato alle 15:10
Venerdì, 06/01/2012
Grazie mille ampeg dalla base dei tuoi consigli e con una trentina di prove in debug sono riuscito a trovare "l'errore" ed isolarlo, ora il codice è completo e funzionante, ho dovuto usare i checkbox per "attivare" i vari parametri da ricercare in quanto lo stesso "spazio" ovvero "" per vb è un "carattere" quindi va ricercato tramite i checkbox e l'utilizzo delle FLAGS ho creato dei vettori che contengono i parametri da ricercare posto qui il controllo finale che faccio, chissà mai sarà utile a qualcuno in futuro.

Codice sorgente - presumibilmente VB.NET

  1. For i = 1 To NE
  2.                         If CheckVet(i) <> "" And FindVet(i) <> "" Then
  3.                             FVet(i) = TrovaParola2(CheckVet(i), FindVet(i))
  4.                             If FVet(i) = False Then
  5.                                 Exit For
  6.                             Else
  7.                                 If FVet(i) = True And i = NE Then
  8.                                     Set X = FrmVisList.ListFilm.ListItems.Add(, , RTrim(SchedaFilm.Cod))
  9.                                         X.SubItems(1) = RTrim(SchedaFilm.Tit)
  10.                                         X.SubItems(2) = RTrim(SchedaFilm.TitO)
  11.                                         X.SubItems(3) = RTrim(SchedaFilm.Regia)
  12.                                         X.SubItems(4) = RTrim(SchedaFilm.AnnoU)
  13.                                 End If
  14.                             End If
  15.                         End If
  16.                     Next i



Grazie ancora per l'aiuto :)

PM Quote