Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18

Casella di riepilogo che si compila e da sempre null alla selezione

  1. #1
    BennyB non è in linea Scolaretto
    Buongiorno.
    Ho un problema strano, cui non riesco a venire a capo.

    In una maschera ho inserito una casella di riepilogo non associata. La maschera viene aperta da un'altra tramite la selezione di una riga da un'altra casella di riepilogo qui contenuta, la quale trasmette tramite una stringa ('strmess') il dato di ricerca della query che associo come rowsource all'altra casella. Difatti, la ricerca avviene correttamente, e la casella si compila con tutti i dati richiesti.

    Il problema sorge quando vado a selezionare una riga dei record lì compilati, poichè ottengo sempre listindex=-1. Qualcuno sa spiegarmi perché?

    Entrambe le caselle di riepilogo hanno la selezione mulitpla impostata a 'Nessuna'.

    La casella "incriminata" ha nome: Lista_DVD.
    Numero colonne: 6; larghezza colonne: 1cm;3,09cm;8,202cm;5,221cm;0cm;2,591cm; colonna associata: 1
    Tipo origine riga: Tabella/query

    il codice della form, nell'evento 'load' è il seguente:
    Private Sub Form_Load()
    '
    DoCmd.Maximize
    Me.Form.OrderBy = "codiceDVD"
    Me.Form.OrderByOn = True
    Me.NomeAttore = strMess
    Me.Lista_DVD.RowSourceType = "Table/Query"
    '
    'SELECT Principale.ID, Principale.TitoloDVD, Principale.AttoriPrincipali, TabRegisti.NomeRegista,
    'TabRegisti.CognomeRegista, [nomeregista] & " " & [cognomeregista] AS Regista,
    'Principale.Ubicazione FROM TabRegisti INNER JOIN (Principale INNER JOIN
    'TabUbicazione ON Principale.Ubicazione = TabUbicazione.Ubicazione)
    'ON TabRegisti.IDRegistaUnione = Principale.IDRegistaUnione;
    strJoin = " AND "
    strSQLWhere = ""
    strSQLIni = "SELECT Principale.ID, " & _
                        "Principale.CodiceDVD, " & _
                        "Principale.TitoloDVD, " & _
                        "RicavaRegisti(Principale.IDRegisti) AS Regista, " & _
                        "Principale.AttoriPrincipali, " & _
                        "Principale.Ubicazione " & _
                        "FROM Principale " & _
                        "INNER JOIN TabUbicazione " & _
                        "ON Principale.Ubicazione = TabUbicazione.Ubicazione "
    strSQL = strSQLIni & "WHERE CodiceDVD = ANY " & _
                        "(SELECT Cod_DVD FROM Tab_DVD2 WHERE D24 LIKE " & Chr$(39) & "*" & Me.NomeAttore & _
                         "*" & Chr$(39) & ")"
    Debug.Print strSQL
    strSQL = strSQL & " ORDER BY " & "[CodiceDVD];"
    
    Me.Lista_DVD.RowSource = strSQL
    Me.Lista_DVD.Requery
    
    End Sub
    
    Per la cronaca 'ricavaregisti' è una function che esegue una ricerca complessa tramite recodset in un'altra tabella (nidificando la query, per così dire), e funziona correttamente.
    'strmess' proviene dalla form chiamante ed è un dato string dichiarato public. Anche in questo cado tutto è corretto.

    Il problema è quando cerco di accedere al singolo record della casella di riepilogo, per poter poi aprire un'altra maschera.
    Il codice dell'evento 'doppio click' nella casella di riepilogo è il seguente:
    Private Sub Lista_DVD_DblClick(Cancel As Integer)
    Dim lnChiave As Long
    Debug.Print Me.Lista_DVD.ListIndex, Me.Lista_DVD.Column(1)
    If Me.Lista_DVD.ListIndex = -1 Then Exit Sub
    'strMess = Me.Lista_DVD.Column(1)
    lnChiave = Me.Lista_DVD.ListIndex
    If lnChiave = 0 Then Exit Sub 'in caso di selezione di record vuoto da parte dell'utente
    lnChiave = DLookup("ID", "Principale", "[ID_dati] = " & lnChiave)
    [Forms]![Principale].Recordset.FindFirst "Id = " & lnChiave
    
    End Sub
    
    E' un rompicapo: a me pare tutto corretto, eppure... il debug.print da 'null' ma il record che seleziono contiene eccome i dati (me li visualizza!!), e il condizionale 'if' seguente esce sempre, qualsivoglia riga io selezioni. Non capisco...

    Se vi occorrono altre informazioni, chiedete pure. Spero qualcuno sappia aiutarmi. Grazie.

  2. #2
    OsvaldoLaviosa non è in linea Topo di biblioteca
    Mmmhhhh!!! Io non saprei da dove cominciare a "fare le mie critiche" (se mi sono concesse). Ci provo.
    1) Conviene avere una tabella Principale con quei campi? Registi uno-a-molti Principale: forse OK, ma un campo AttoriPrincipali lo trovo un karakiri della normalizzazione.
    In altri thread passati si era già discusso del fatto che avrebbe senso avere 3 tabelle:
    Films, Artisti, RuoliArtisti.
    Films molti-a-molti Artisti con RuoliArtisti avente i campi IDRA, IDArtista, Ruolo, IDFilm. Nel campo Ruolo definisci se un Artista è un Attore, Regista (come minimo), Sceneggiatura, Musiche...
    2)
    Quote Originariamente inviato da BennyB
    In una maschera ho inserito una casella di riepilogo non associata. La maschera viene aperta da un'altra tramite la selezione di una riga da un'altra casella di riepilogo qui contenuta, la quale trasmette tramite una stringa ('strmess') il dato di ricerca della query che associo come rowsource all'altra casella. Difatti, la ricerca avviene correttamente, e la casella si compila con tutti i dati richiesti.
    Potresti fornire un po' di nomi propri di tutti gli oggetti che hai dichiarato?
    3) Cos'è che devi fare veramente?

  3. #3
    BennyB non è in linea Scolaretto
    Le critiche sono sempre bene accette!!! Io ho realizzato il db tempo fa per imparare l'utilizzo di Access, da zero, e alla fine guardando al risultato sono convinto che ripartendo avrei potuto razionalizzare, ma col senno di poi...
    In ogni modo, attori, sceneggiatori, eccetera, provengono dalla tabella 'Tab_DVD2', come puoi vedere dalla query, nella quale sono contenuti moltissimi dati inerenti al DVD. Questi vengono tutti estratti dal WEB (da 6 siti diversi) tramite una routine alquanto complessa (preciso che l'uso del DB è personale, e che non utilizzo né lo farò mai i dati per scopo di lucro). Anche quello era un esercizio per apprendere; ora sono piuttosto bravo, anche perché i siti cambiano, e le routine d'estrazione sono da rivoluzionare ogni volta... Inoltre, la maschera 'attori' prevede pulsanti per l'apertura dei siti inerenti all'attore voluto dall'utente (anche in questo caso usando l'estrazione dati da google dopo la ricerca).
    Ti do ragione sul resto; se dovessi ripartire oggi, prenderei strade diverse.

    Riguardo a quello che voglio fare: la maschera 'attori_cerca' contiene un modo per ricercare nel DB (tabella 'Tab_DVD2') il nome o la parte del nome dell'attore voluto; trovate le corrispondenze, elenca gli attori in un casella di riepilogo nella quale l'utente sceglie, e il dato dell'attore scelto passa tramite la stringa 'strmess' alla maschera 'attori', che tramite la query del codice elencato nel thread compila una casella di riepilogo denominata 'lista_DVD', con tutti i titoli (e i relativi dati, visibili nella query) in cui l'attore è presente. A questo punto, tramite doppio click sul DVD voluto, l'utente seleziona il DVD; io vorrei da qui ottenere l'ID e aprire la maschera principale del DVD stesso. Perché l'istruzione 'Me.Lista_DVD.ListIndex" mi da sempre come risultato -1 (routine 'Private Sub Lista_DVD_DblClick(Cancel As Integer)'), quando l'elenco dei DVD nella casella 'lista_DVD' è corretto? Dove sbaglio?
    Spero ora sia più chiaro il problema.

  4. #4
    OsvaldoLaviosa non è in linea Topo di biblioteca
    Non riesco a capire tutta la tua matassa. Provo a farmi catturare da questa
    Quote Originariamente inviato da BennyB
    A questo punto, tramite doppio click sul DVD voluto, l'utente seleziona il DVD; io vorrei da qui ottenere l'ID e aprire la maschera principale del DVD stesso.
    Tu sei dentro una Maschera1 dove si leggono "pochi" dati riguardanti il DVD. Il doppio-clic su IDDVD dovrebbe aprirti una maschera singola Maschera2 dove vedere tutti i campi del DVD. Quindi all'evento doppio-clic di IDDVD fai succedere questo
    DoCmd.OpenForm "Maschera2", , , "[IDDVD] = " & Me![IDDVD]
    

  5. #5
    BennyB non è in linea Scolaretto
    Grazie ancora della risposta, Osvaldo.
    Allora, il mio problema non è affatto quello di aprire la form.
    Come puoi vedere dal codice della routine 'Private Sub Lista_DVD_DblClick(Cancel As Integer)', io la apro con il seguente comando (che dovrebbe funzionare, avendolo già utilizzato nel DB in altre maschere):
    [Forms]![Principale].Recordset.FindFirst "Id = " & lnChiave
    
    In ogni modo, il mio problema risiede proprio nell'IDDVD che tu citi, che è elencato nella colonna 1 della casella di riepilogo 'Lista_DVD' (correttamente, per ogni record visualizzato) - la colonna 1 è visibile per poter eseguire il debugging, normalmente la avrebbe dimensione 0 cm - .
    L'ID del DVD in oggetto dovrebbe darmelo appunto la casella di riepilogo 'Lista_DVD' e porlo nella variabile 'lnchiave', tramite il comando
    lnChiave = Me.Lista_DVD.ListIndex
    
    Giusto?
    E, invece, quando faccio doppio click su uno dei record visualizzati (quelli elencati nella query, per ogni DVD, che sono corretti in visualizzazione), 'Me.Lista_DVD.ListIndex' mi da sempre -1. Perché?

  6. #6
    BennyB non è in linea Scolaretto
    Accidenti, non riesco proprio a venirne a capo.
    Ho provato a limitare le ricerche semplificando Query, a compilare la casella di riepilogo usando i comandi del recordset, e variazioni sul tema, ma alla fine accade sempre la medesima cosa: la casella si compila correttamente: il comando
    lnChiave = Me.Lista_DVD.ListCount
    
    mi restituisce l'esatto numero dei record elencati, quindi attesta che nella lista ci sono (?!), e poi quando con il doppio click seleziono uno dei records, una delle righe della casella, per intenderci, i comandi
    lnChiave = Me.Lista_DVD.ListIndex
    lnChiave = Me.Lista_DVD.column(1)
    
    mi restituiscono invariabilmente il primo -1, il secondo Null. Non capisco...
    C'è qualche impostazione errata delle proprietà? Perché mai una casella di riepilogo correttamente compilata non dovrebbe intercettare la riga che seleziono cliccandovi sopra? Aiutatemi, per favore...

  7. #7
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Difficile capire il problema .....
    Ti suggerisco di fare alcune prove 'stupide' :
    - prova ad usare l' evento Click (al posto del doppio click)
    - prova ad usare un combobox (al posto di un listbox), magari con evento doubleclick e poi click

    Si tratta di prove 'stupide' lo so ma forse evidenziano qualche altro errore nel tuo form / codice ....

  8. #8
    BennyB non è in linea Scolaretto
    Sempre più strano... l'evento 'click' non produce alcun effetto... così come la combo creata con le medesime istruzioni: i record sono elencati correttamente, l'evento 'click' non produce alcun effetto, e il 'Me.Combo_DVD.ListIndex' da sempre -1. Che ci sia quanche problema con la query nidificata posta come rowsource? Strano, perché l'elenco dei record è giusto... Ma perchè l'evento 'click' non viene intercettato, secondo te?

  9. #9
    L'avatar di willy55
    willy55 non è in linea Scribacchino
    Utilizza il Debug e segui il codice facendoti visualizzare le variabili di interesse.
    ℹ️ Leggi di più su willy55 ...

  10. #10
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Utilizza il debug come suggerito da Willy.
    Inizio a sospettare che tu abbia problema (subdolo) con Access (e il codice) che, forse, potrebbe essere risolto con :
    - decompilazione del file mdb
    - compattazione / ripristino del file mdb

    Per la procedura di decompilazione fai una ricerca ....

    Ovviamente, se dopo aver decompilato/ricompilato e compattato/ripristinato il file mdb il problema permane, allora il problema è sicuramente nel tuo codice (in qualche parte del codice) che al momento ti (ci) sfugge.

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Casella di riepilogo selezione multipla
    Da matfed82 nel forum Microsoft Access
    Risposte: 27
    Ultimo Post: 13-06-2017, 14:53
  2. Casella riepilogo a selezione multipla
    Da Spaginato nel forum Microsoft Access
    Risposte: 6
    Ultimo Post: 18-05-2017, 08:49
  3. Selezione casella di riepilogo in un criterio di una query.
    Da terrornoize nel forum Microsoft Access
    Risposte: 9
    Ultimo Post: 10-04-2015, 20:20
  4. Risposte: 11
    Ultimo Post: 28-09-2011, 23:30
  5. access Casella di riepilogo selezione multipla
    Da Genio nel forum Microsoft Access
    Risposte: 3
    Ultimo Post: 15-01-2008, 22:22