+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: [VB6] Ricerca nominativi in DB

  1. #1
    L'avatar di The Revolution
    The Revolution non è in linea Scolaretto
    Post
    58

    Question [VB6] Ricerca nominativi in DB

    Salve a tutti,
    ho un piccolo problemino per la ricerca di alcuni campi da Visual Basic a Database. Mi spiego meglio.
    Sto realizzando un programmino per la gestione di una biblioteca ed il mio problema riguarda la ricerca deglia autori. Inizialmente gli autori vengono inseriti, attraverso una apposita form, nel database "Biblioteca" precisamente nella tabella "Autori" costituita dai campi "Codice", "Nome" e "Cognome". Il codice viene generato automaticamente.
    Tutti gli autori inseriti saranno quindi disponibili nella form principale (dove avviene l'inserimento del singolo libro) in una ComboBox per una ricerca semplice e veloce. Fino a questo punto tutto ok ma il problema sorge al momento del salvataggio del libro. Tutti i campi vengono registrati correttamente all'interno della tabella "Libri". Ovviamente in merito alle relazioni che ho creato con Access verranno registrati i codici degli Autori, Editori ecc. e non i singoli nominativi. Pertanto se nella ComboBox degli autori seleziono l'autore Gianni Rodari, nella tabella libri andra inserito il relativo codice (AUT0002) che verrà ricercato attraverso una query nella tabella "Autori". La ricerca la eseguo in questo modo:

    Dim StringAutore as string
    dim StringAutore as Byte
    Dim LC as Byte 'Questa variabile serve a trovare la posizione dello spazio
    Dim Cognome as string
    Dim Nome as string

    StringAutore = cboautore.text
    ConteggioAutore = Len(StringAutore)
    LC = InStr(StringAutore, " ")
    Cognome = Left(StringAutore, LC - 1)
    Nome = Right(StringAutore, ConteggioAutore - LC)
    SQL = "Select Codice From Autori Where Cognome ='" & Cognome & "' and Nome ='" & Nome & "'"

    La mia ricerca quindi consiste nel confrontare il nome e il cognome dell'autore nella tabella degli autori mediante l'utilizzo della Right e della Left.
    Il problema,(finalmente sono arrivato),è quando si inserisco due nomi o due cognome per un autore.(es: l'autore Della Noce Marco crea problemi)
    In questo caso il programma si arresta perche ovviamente, attraverso la InStr, considera come cognome "Della" e come nome "Noce Marco".
    Il problema quindi sta nella ricerca degli autori che hanno nomi e/o cognomi "doppi".
    Come posso ovviare a questo inconveniente?

    Vi ringrazio anticipatamente per una eventuale risposta.

  2. #2
    L'avatar di TheTruster
    TheTruster non è in linea Moderatore Globale Ultimo blog: Mouse Wheel in Visual Basic 6 - ActiveX
    Luogo
    Messina - Italy
    Post
    7,179
    Blogs
    3
    il problema, secondo me, puoi risolverlo alla radice... mi spiego meglio.

    quando carichi nel ComboBox i nominativi degli autori, potresti tranquillamente utilizzare la proprietà ItemData che verrebbe valorizzata utilizzando il codice assegnato all'autore, preso dal corrispondente campo nel tuo DB.

    in questo modo quando un autore viene selezionato nel ComboBox quello che viene ricercato non è il valore che si vede nel controllo, ma quello presente nell'ItemData relativo all'elemento selezionato.

    in questo modo non dovrai preoccuparti di nulla nel caso un autore abbia più di uno spazio nel nome

    TheTruster
    Il Crossposting è vietato dalla Netiquette!




  3. #3
    L'avatar di The Revolution
    The Revolution non è in linea Scolaretto
    Post
    58
    Grazie per la risposta,
    il problema è che ho impostato la proprietà Sorted della ComboBox su True in modo da ordinare in ordine alfabetico tutti gli autori per rendere la ricerca più veloce e semplice.
    Quindi i relativi codici sono tutti in disordine. Ad esempio l'autore con codice AUT00010 potrebbe trovarsi nella prima posizione della ComboBox perchè inizia con la lettera A.

  4. #4
    L'avatar di TheTruster
    TheTruster non è in linea Moderatore Globale Ultimo blog: Mouse Wheel in Visual Basic 6 - ActiveX
    Luogo
    Messina - Italy
    Post
    7,179
    Blogs
    3
    Forse non mi sono spiegato....

    La proprietà ItemData è relativa *ad ogni elemento* della ComboBox... e lo segue anche se viene ordinato.
    perchè non provi a cercare sulla guida qualcosa in merito a questa proprietà, anzichè dare per assunto che non funzioni?

    TheTruster
    Il Crossposting è vietato dalla Netiquette!




  5. #5
    Luogo
    Lazio
    Post
    1,720
    Blogs
    21
    Quote Originariamente inviato da The Revolution
    Grazie per la risposta,
    il problema è che ho impostato la proprietà Sorted della ComboBox su True in modo da ordinare in ordine alfabetico tutti gli autori per rendere la ricerca più veloce e semplice.
    Quindi i relativi codici sono tutti in disordine. Ad esempio l'autore con codice AUT00010 potrebbe trovarsi nella prima posizione della ComboBox perchè inizia con la lettera A.
    Ciao ,

    credo che tu possa fare in 2 modi :

    1) L'ordinamento lo ottieni dalla query e, fermo restando la sorted=true
    per la ricerca veloce, l'inserimento lo forzi specificando l'index nell'additem
    così sai che l'ordinamento non lo cambierà e puoi sfruttare l'itemdata
    (o un vettore perchè se non ricordo male l'itemdata è di tipo long)

    2) anche se un pò brutto da vedere puoi aggiungere il codice
    alla fine del nome e cognome per. es.
    Maria Rita Teresa di Montalcini [AUT0012] e te lo ricavi
    a partire dalla fine (strReverse) senza bisogno di andare a reinterrogare
    il DB

    Ciao sspintux

  6. #6
    L'avatar di Marlboro
    Marlboro non è in linea Scolaretto
    Luogo
    Italy
    Post
    51
    La proprietà ItemData imposta un numero per ciascun elemento della comboBox

    oggetto.itemdata(indice) = numero

    L'assegnazione di un codice alfanumerico (AUT00010) provocherebbe un errore

  7. #7
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,814
    Blogs
    5
    Quote Originariamente inviato da Marlboro
    La proprietà ItemData imposta un numero per ciascun elemento della comboBox

    oggetto.itemdata(indice) = numero

    L'assegnazione di un codice alfanumerico (AUT00010) provocherebbe un errore
    Benvenuto in questo forum ...

    Quello che scrivi e' vero, ma in genere nei DB si associa ad ogni record un Id numerico autoincrementante (chiave primaria univoca) che permette la ricerca veloce dello stesso. Ed e' questo il valore che va inserito nell' ItemData e riutilizzato nella ricerca ...
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  8. #8
    L'avatar di TheTruster
    TheTruster non è in linea Moderatore Globale Ultimo blog: Mouse Wheel in Visual Basic 6 - ActiveX
    Luogo
    Messina - Italy
    Post
    7,179
    Blogs
    3
    Marlboro ha ragione, effettivamente l'assegnazione di un valore di tipo String alla ItemData provocherebbe un errore, ma mi sono un po' lasciato fuorviare, poichè generalmente io associo all'ItemData il valore del campo Counter della mia Tabella...

    ma la soluzione, in linea di principio regge comunque, nel senso che è possibile utilizzare l'ItemData in associazione al metodo proposto da sspintux (ovvero il vettore) per identificare il codice associato all'autore.

    basta creare un vettore che si ridimensiona in base al numero di autori presenti
    poi quando si popola la combo con il nome dell'autore, si valorizza la ItemData con un numero progressivo... contestualmente si assegna l'elemento del vettore corrispondente a quel numero con il codice dell'autore.

    tradotto in codice con un esempio:

    codice:
    Dim CodiceAut() 'crei il vettore dei codici
    
    'popoli la combo in questo modo:
    For K = 0 To rsAutori.Count - 1
        Combo1.AddItem rsAutori("Cognome").Value & " " & rsAutori("Nome").Value
        Combo1.ItemData(Combo1.NewIndex) = K
        ReDim Preserve CodiceAut(K)
        CodiceAut(K) = rsAutori("Codice").Value
    Next K
    così, quando si sceglierà una voce dal ComboBox, sfruttando l'evento Click:

    codice:
    Private Sub Combo1_Click()
    CodiceAutore = CodiceAut(Combo1.ItemData(Combo1.ListIndex))
    End Sub
    nella variabile CodiceAutore avrai il tuo codice

    TheTruster
    Il Crossposting è vietato dalla Netiquette!




  9. #9
    Luogo
    Lazio
    Post
    1,720
    Blogs
    21
    Ragazzi..... vi prego ditemi che c'è stato un periodo, anche lontano,
    in cui NewIndex non funzionava a dovere con il Sorted=true
    e che itemdata era di tipo variant
    ....altrimenti dovrò prendere seri provvedimenti
    per l'arteriosclerosi oltre che a cercare di dormire di più
    Ultima modifica di sspintux; 01-04-2006 10:58 

  10. #10
    L'avatar di TheTruster
    TheTruster non è in linea Moderatore Globale Ultimo blog: Mouse Wheel in Visual Basic 6 - ActiveX
    Luogo
    Messina - Italy
    Post
    7,179
    Blogs
    3
    sinceramente non ho memoria di un comportamento anomalo della NewIndex...

    a che tipo di problemi ti riferisci?

    TheTruster
    Il Crossposting è vietato dalla Netiquette!




+ Rispondi al Thread
Pagina 1 di 2 12 ultimoultimo

Discussioni simili

  1. Risposte: 3
    Ultimo Post: 22-07-2008, 22:43
  2. Errore nelll'utilizzo di FINDNEXT
    Da Cis nel forum Visual Basic 6
    Risposte: 4
    Ultimo Post: 19-08-2006, 09:22
  3. [VB6] Ricerca in un DB
    Da Aragosta nel forum Visual Basic 6
    Risposte: 1
    Ultimo Post: 12-12-2005, 16:28
  4. [vb6] Ricerca di immagini
    Da Aragosta nel forum Visual Basic 6
    Risposte: 8
    Ultimo Post: 02-12-2005, 14:59
  5. [VB6] ricerca lettera in una stringa.
    Da Louis nel forum Visual Basic 6
    Risposte: 18
    Ultimo Post: 29-10-2005, 09:31

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi