Italian problemi con db cursor.position

3394509365

Active Member
Licensed User
Longtime User
Sicuramente sono andato nel pallone ma non riesco a capire come ottenere il valore del corsor3.position venuto fuori dalla query.

B4X:
Sub SongACaso(EntryIndex2 As Int) ' il db normale
Dim Cursor3 As Cursor
Dim Titolo As String
If IDList.Size = 0 Then 'check if the database is empty
    Return 'if yes leave the routine
End If


Titolo = spnRepertorio.SelectedItem

Cursor3 = SQL1.ExecQuery("SELECT * FROM [" & TblSpin & "] WHERE [" & GestioneTbl.ColNames(2) & "] = Titolo")

Cursor3.Position = ?????

TxtId.Text = Cursor3.GetString(GestioneTbl.ColNames(0))
TxtProg.Text = Cursor3.GetString(GestioneTbl.ColNames(1)) 'read the FirstName column
TxtTitolo.Text = Cursor3.GetString(GestioneTbl.ColNames(2)) 'read the LasstName column

Cursor3.Close 'close the cursor, we don't it anymore
End Sub

mi spiego meglio: la query attraverso la tabella TblSpin cerca il Titolo nella colonna GestioneTbl.ColNames(2) ma poi come faccio a sapere a che ID, quindi riga, corrisponde il record trovato?
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Non è che si capisca benissimo, potresti specificare come sono le tabelle.

Cmq, ammesso che tutto il resto sia giusto e ammesso che tu ti aspetti che la query restituisca un solo record, basta che usi Cursor3.Position = 0
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Secondo me 3394509365 non si è espresso molto bene,
da quel che leggo io lui vorrebbe ricavarsi il numero di riga che corrisponde alla tabella originale, ma (se ho capito bene) questa cosa non si può fare.
Di solito una tabella ha un campo ID che contiene un identificativo unico per ogni record, e per leggere/aggiornare il record si fa sempre riferimento al codice ID.
E' chiaro che se la tua query ritorna un solo record questo si prova su Position = 0, ma non è il numero della riga della tabella TblSpin, nè tantomeno il valore ID.
Una volta che hai eseguito la query, devi ricavarti il valore contenuto nel campo ID del record ricavato dalla query stessa, e con questo ID poi farai riferimento eventualmente alla tabella originale.

Sergio
 

3394509365

Active Member
Licensed User
Longtime User
Sergio hai capito benissimo, una volta trovato il titolo lo devo inserire nella casella di testo ma per farlo mi servirebbe a che ID corrisponde, si ciò come prima colonna l' ID.
Se avete un' altra soluzione . in questo momento non me ne vengono altre.

grazie
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Sinceramente non ho capito cosa devi fare,
cerca di spiegarti meglio, non descrivere il tutto in una riga sola ma usa più parole, e fai un esempio di come dovrebbe essere il tutto.

Hai già scritto del codice ?? Qualcosa funziona ??
La query che hai scritto è sbagliata, lo si capisce subito che non l'hai provata, quindi prova a spiegare come è strutturata la tabella e cosa devi estrarre.

Inoltre la variabile GestioneTbl non si capisce cosa è

Probabilmenta la query è:
B4X:
Cursor3 = SQL1.ExecQuery("SELECT * FROM [" & TblSpin & "] WHERE [" & GestioneTbl.ColNames(2) & "] = '" & Titolo & "'")

Sergio
 

LucaMs

Expert
Licensed User
Longtime User
Infatti io non ho avuto (e non ho :)) la pazienza di interpretare il tutto, dati anche i nomi usati (quanto aiuta usare i nomi adatti!!!).

Sergio hai perfettamente ragione circa il campo ID che di solito si usa nelle tabelle; però in SQLite c'è il vantaggio di poter usare questo campo esistente di default per ogni tabella, campo che si chiama ROWID. Quindi non è necessario dichiararlo ma è possibile utilizzarlo; chiaramente, a meno che non si abbia la necessità di usare chiavi primarie di tipo diverso.
 

LucaMs

Expert
Licensed User
Longtime User
vedo anche che nella routine non usi quel parametro EntryIndex2

Insomma, è un pochino incasinato :).

Se ci dici come sono le tabelle e le relazioni e cosa vuoi ottenere (una canzone a caso???), una mano te la diamo volentieri
 

3394509365

Active Member
Licensed User
Longtime User
si scusate il linguaggio ma io uso quello per visual basic.

Il codice funziona fino a Corsor3.position

Io ho una lista di tabelle dentro uno spinner da cui ne scelgo 1 in questo caso
TblSpin. scelta la tabella ne estraggo i campi titolo dentro un secondo spinner.
quando seleziono un campo "Titolo" nel secondo spinner che contiene solo i campi titolo, devo posizionarmi su quel record ed estrarre allora tutti i campi di quella riga che contiene il titolo da me scelto.

Esempio dalla tabella1 estraggo tutti i titoli, titolo1 titolo2 titolo3 quando seleziono nello spinner titolo2 per es devo a questo punto potere estrarre Id + Titolo+ colonna2+ colonna 3 che fanno capo all' ID.

Forse così è più chiaro
 

3394509365

Active Member
Licensed User
Longtime User
Praticamente io ho la lista in ordine di ID ma se mi capita devo poter estrarre un campo a caso selezionando un campo nello spinner. tutto qui
purtroppo l' ordine nello spinner è alfabetico ma nella tabella è in ordine di come i campi sono stati inseriti. se non potevo prendere come riferimento item selezionato nello spinner
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Attualmente, io sono + rinco del solito, fortunatamente :)

Qui non è tanto questione di linguaggio (molti di noi verranno da VB.Net, immagino), quanto di db e SQL.

Sarebbe utile vedere un bello schemino del tuo db (di questa parte soltanto).

Questo perché, in questi casi, si usano query con le Join, che sono "più semplici".

Dato che non ci sto capendo un tubo, provo intanto a vedere cosa mi sembra che non vada bene, cosa modificherei; poi spero che mi farai un bel disegno delle tabelle e delle relazioni :)

B4X:
Sub SongACaso(EntryIndex2 As Int) ' il db normale ??? db normale? e EntryIndex2 a che serve? non lo usi, nella routine
Dim Cursor3 As Cursor
Dim Titolo As String
If IDList.Size = 0 Then 'check if the database is empty <--- questo controllo dovresti farlo prima di chiamare la routine oppure passare il valore come parametro
    Return 'if yes leave the routine
End If


Titolo = spnRepertorio.SelectedItem ' <--- stessa cosa, meglio passare Titolo come parametro alla routine

' TblSpin come parametro, non sarà mica una variabile globale?!
Cursor3 = SQL1.ExecQuery("SELECT * FROM [" & TblSpin & "] WHERE [" & GestioneTbl.ColNames(2) & "] = Titolo")

Cursor3.Position = ?????

TxtId.Text = Cursor3.GetString(GestioneTbl.ColNames(0))
TxtProg.Text = Cursor3.GetString(GestioneTbl.ColNames(1)) 'read the FirstName column
TxtTitolo.Text = Cursor3.GetString(GestioneTbl.ColNames(2)) 'read the LasstName column

Cursor3.Close 'close the cursor, we don't it anymore
End Sub

GestioneTbl.ColNames contiene i campi di una tabella o di più tabelle?

P.S. non mi ha messo il colore blu dei miei commenti, purtroppo, così si michiano ai tuoi
 

3394509365

Active Member
Licensed User
Longtime User
un db con più tabelle con titoli di canzoni e altre informazioni che poi mi servono da spedire alle tastiere come messaggi midi.

Ogni tabella contiene 25 colonne, tutte le tabelle hanno la stessa struttura cambiano solo i titoli delle canzoni.

Dim RowNumber = 0 As Int ' number of rows
Dim ColNumber = 25 As Int ' number of columns
Dim ColNames(ColNumber) As String
ColNames(0) = "ID"
ColNames(1) = "Prog"
ColNames(2) = "Titolo"
ColNames(3) = "CanaleT1Dx"
ColNames(4) = "MSBT1Dx"
ColNames(5) = "LSBT1Dx"
ColNames(6) = "BancoT1Dx"
ColNames(7) = "SuonoT1Dx"
ColNames(8) = "CanaleT2Dx"
ColNames(9) = "MSBT2Dx"
ColNames(10) = "LSBT2Dx"
ColNames(11) = "BancoT2Dx"
ColNames(12) = "SuonoT2Dx"
ColNames(13) = "CanaleT3Sx"
ColNames(14) = "MSBT3Sx"
ColNames(15) = "LSBT3Sx"
ColNames(16) = "BancoT3Sx"
ColNames(17) = "SuonoT3Sx"
ColNames(18) = "CanaleT3Dx"
ColNames(19) = "MSBT3Dx"
ColNames(20) = "LSBT3Dx"
ColNames(21) = "BancoT3Dx"
ColNames(22) = "SuonoT3Dx"
ColNames(23) = "Path"
ColNames(24) = "Altro"

non ci sono relazioni tra le tabelle.

Ripeto io seleziono una tabella dal primo spinner e riempio già le textbox con il primo elemento della tabella poi li scorro ad uno ad uno con un pulsante.

poi in un secondo spinner c' ho la stessa tabella con i campi però in ordine alfabetico e quando ne seleziono uno a caso nelle textbox devo vedere i dati dell' item selezionato che sarebbe il titolo della canzone con relative informazioni da inviare alle tastiere.
 

LucaMs

Expert
Licensed User
Longtime User
mi sa che è un casino, non prendertela eh, oppure, molto probabilmente, io non ho capito.

A me sembra che tu abbia bisogno di una sola tabella, che contenga i campi che hai elencato.

Altrimenti, quali sono i nomi delle tabelle?

Comunque, in generale, quando usi uno spinner, puoi associare ad esso una Map.

Ad esempio, crei una mapCanzone in cui la chiave sia il titolo ed il valore l'ID, o viceversa.

Poi, quando selezioni una voce dello spinner, mettiamo sia il titolo, ricavi l'id tramite mapCanzone.GetValueAt(Titolo) (Titolo lo avrai presto dallo spinner)
 

3394509365

Active Member
Licensed User
Longtime User
ho fatto come hai detto tu ho usato una Map adesso c'ho L'ID e il Titolo nella MapID e MapTitolo.

Probabilmente però non sono veri valori INT perchè io li vedo come numeri nella label1, ma quando faccio cursor.position=MapID il programma non va, mentre se lo metto come numero fisso invece va.

Dov' è che sbaglio ancora ?


B4X:
Sub SongACaso(EntryIndex2 As Int) ' il db normale
Dim Cursor3 As Cursor
Dim Titolo As String
Dim MapTitolo As String
Dim i,MapID As Int

'If IDList.Size = 0 Then 'check if the database is empty
'    Return 'if yes leave the routine
'End If


Titolo = spnRepertorio.SelectedItem

Cursor3 = SQL1.ExecQuery("SELECT * FROM [" & TblSpin & "] WHERE [" & GestioneTbl.ColNames(2) & "] = Titolo")



For i=0 To Mappa.Size-1

    MapTitolo=Mappa.GetValueAt(i)
    MapID=Mappa.GetKeyAt(i)
  
    If MapTitolo=Titolo Then
        Cursor3.position=MapID
        Exit
    End If
Next

Cursor3.position=MapID' 0

Label1.Text=MapID & " " & MapTitolo& " = " & Titolo

TxtId.Text = Cursor3.GetString(GestioneTbl.ColNames(0))
TxtProg.Text = Cursor3.GetString(GestioneTbl.ColNames(1)) 'read the FirstName column
TxtTitolo.Text = Cursor3.GetString(GestioneTbl.ColNames(2)) 'read the LasstName column

Cursor3.Close 'close the cursor, we don't it anymore
End Sub

la mappa viene caricata in un' altra routine
 
Last edited:

3394509365

Active Member
Licensed User
Longtime User
alla fine il problema era la query questo è il codice giusto:

B4X:
Cursor3 = SQL1.ExecQuery("SELECT * FROM [" & TblSpin & "] WHERE [" & GestioneTbl.ColNames(2) & "] = '" & Titolo & "'")

e poi mettendo
B4X:
cursor3.position =0
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Esatto, proprio quello che ti avevo scritto io nel post #5
 
Top