Italian RDC con 2 query

Oldmanenzo

Member
Licensed User
Longtime User
Lo stesso quesito l’ho postato in inglese, ma sembra che sia venuto molto male e visto che LucaMs ha parecchio inchiostro da consumare (luca …..google ha tradotto cosi:(:() possa sprecare un po di inchiostro qui e farmi capire come poter risolvere il problema.:):)

Premetto che mi sto avvicinando da poco a Basic4 e quindi molte cose sono ancora un mistero, Sto provando ad utilizzare RDC di Erel Remote Database Connector.

Ho messo sul mio server il db, ho cambiato i vari indirizzi e pwd nel file php ed ho iniziato a fare delle prove, richiamando una tabella per riempire uno spinner (chi si è inventato questo nome non ho ancora capito a me piace combo box). Fin qui tutto bene, la routine viene eseguita perfettamente ed ad apertura dell’acitivity (un’altra cosa che mi fa andare in bestia, piu bello form) mi ritrovo il combo box riempito con i relativi dati provenienti dalla tabella.

Qual è il problema vi chiederete.

Semplice: presuppongo (anzi sicuramente) che la funzione inserita da Erel JobDone lavori in background e quindi una volta che i dati sono disponibili, vengono inviati al componente

Nell’inizializzazione del FORM ho la necessità di riempire il combox e prelevando il suo primo item caricare una variabile o un altro componente (non fa alcuna differenza). Il problema è che se mando in esecuzione la seconda Query selezionando i campi tramite l’item del primo combo box va in errore dicendo che l’indice 0 è OutOfBound (giustamente) perche il primo combo box non è stato ancora riempito e quindi la voce ancora non disponibile.

E possibile controllare ed in che modo, quando la funzione JobDone è stata completata avendo la certezza che i componenti sono stati inseriti nel combo box e dopodiche inviare la seconda query selezionando item del combo box.

In poche parole, come faccio a sapere quando JobDone è completo.

Non so se inserire del codice, che poi rispecchia quello messo a disposizione da Erel, cambiando le voci

Presenti in JobDone per adattarlo alle mie esigenze.

Spero di essere stato chiaro, perche sembra che con il mio Inglese, sia un po difficile farmi capire.
P.S.
parlo di 2 combobox (spinner) ma in effetti si tratta di 1 spinner ed una variabile, ma il problema non cambia.

B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim Scroll As ScrollView
    Dim CmbRegione As Spinner
    Dim cd As ColorDrawable
    Dim PanelHeight As Int : PanelHeight=80dip
    Dim REGIONE  ="Regione", PROVINCIA ="Province", PNL ="Panel", COUNT="Conteggio" As String
    Dim prov(20) As String
   
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
    Activity.LoadLayout ("frmricercaview")
    Scroll.Initialize (100%x)
    Activity.AddView (Scroll, 0, 40dip, 100%x, 100%y)
    Scroll.Color =Colors.Black
    CmbRegione.Left =Activity.Width /2 - CmbRegione.Width /2
    CmbRegione.Prompt ="Regione"
    FetchCountriesRegione
    CmbRegione.SelectedIndex =0
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub FetchCountriesRegione
'Utilizzato per riempire ilcombox delle regioni
    ProgressDialogShow("Sto caricando le informazioni")
    'Gets all the available countries
    ExecuteRemoteQuery("SELECT Regione FROM regioni ORDER BY Regione", REGIONE)
End Sub

Sub FetchProvince
'Utilizzato per riempire la variabile delle province secondo la regione selezionata
    ProgressDialogShow("Sto caricando le informazioni")
    'Gets all the available countries
    ExecuteRemoteQuery("SELECT Provincia FROM province WHERE Regione ='" & CmbRegione.SelectedItem &"' ORDER BY Provincia", PROVINCIA)
   
End Sub

Sub ExecuteRemoteQuery(Query As String, JobName As String)
    Dim job As HttpJob
    job.Initialize(JobName, Me)
    job.PostString("http://www.caravan-forum.it/portolano/portolano.php", Query)
End Sub

Sub JobDone(Job As HttpJob)
    ProgressDialogHide
    If Job.Success Then
    Dim res As String
        res = Job.GetString
        Log("Response from server: " & res)
        Dim parser As JSONParser
        parser.Initialize(res)
        Select Job.JobName
            Case REGIONE
                Utility.ExecuteSpinner (parser, CmbRegione, "Regione")
            Case PROVINCIA
                prov(19)=Utility.ExecuteLoadProvince (parser, prov, "Provincia")
        End Select
    Else
        ToastMessageShow("Error: " & Job.ErrorMessage, True)
    End If
    Job.Release
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Si, guarda, era tutto chiarissimo, anche in inglese. Anche perché è una situazione che capita spesso, quella si caricare dati in base ad una selezione da parte dell'utente (nel tuo caso, una bella... combobox* ;))

Di solito mi metto a fare prove, prima di rispondere (così evito figuracce e di mettere nei guai il "consigliato"), in questo caso, penso che DonManfred abbia ragione, pur non avendo provato; ovvero, dovresti caricare lo spinner (hehehe) nel blocco "Case REGIONE", perché in quel punto i dati dovrebbero essere disponibili.

* Si chiama Spinner, anziché combobox, probabilmente perché funziona in modo leggermente diverso: fa comparire una dialog, anziché "srotolare" il proprio contenuto.

A questo proposito, ti segnalo una custom view a dir poco meravigliosa, dato l'autore (tale LucaMs, nome d'arte, sigh).
Te la segnalo, ma aspetta a provarla, perché proprio in questi giorni mi sono accorto che contiene un super bug.
E' una vera combobox (nel senso, appunto, che visualizza il contenuto alla vecchia maniera) ma può essere utilizzata anche come semplice EditText (TextBox ;)) e come AutoCompleteTextBox (consentendo la ricerca per inizio parola o contenuto parola, con distinzione o meno tra maiuscole e minuscole. Inoltre, consente di associare oggetti alle varie voci contenute e, per questo, ti segnalo un altro mio codice).

(Il bug è nell'aggiunta di voci a runtime da parte dell'utente; se trovo tempo e soprattutto voglia, correggo)
 
Last edited:

Oldmanenzo

Member
Licensed User
Longtime User
Si Luca (ti chiamo direttamente cosi, senza nome d'arte)
di logica e guardando quello scritto da donmanfred dovrebbe essere esatto anche se non ho ancora avuto il tempo di provare. Ma comunque la logica dovrebbe essere quella. Mandi in esecuzione la seconda query al ritorno del riempimento dello spinner e quindi si dovrebbe avere la certezza che in quel momento lo spinner e stato riempito dei suoi item.
Comunque sarebbe stato carino poter controllare direttamente Job ed avevo pensato di dichiare job as httpjob non localmente ma globale e dopodiche se jo.release era true, ma in ogni caso mi dovevo poi inventare qualche cosa per far perdere tempo al programma affinche potessi accedere ai dati. Sicuramente molto piu macchinoso, mentre cosi mi sembra la soluzione migliore.
Per quanto riguarda la tua combobox attendo e cerca di farti venire voglia di mettere il tutto a posto :):)
ciao e grazie di tutto
 

udg

Expert
Licensed User
Longtime User
Ciao,
non ho ancora letto la parte in inglese, ma dal tuo codice nel post #1, mi sembra che basti spostare
CmbRegione.SelectedIndex =0
dalla Activity_Create alla JobDone e quindi avere qualcosa tipo:
B4X:
Select Job.JobName
Case REGIONE
  Utility.ExecuteSpinner (parser, CmbRegione, "Regione")
  CmbRegione.SelectedIndex =0
  FetchProvince
Case PROVINCIA

Considera che caricare i dati direttamente in un componente visual (spinner, combobox,listview..) comporta il fatto che la relativa variabile deve appartenere al gruppo Globals e quindi viene distrutta e ricreata ad ogni rotazione del telefono o evento assimilabile.
Visto che prelevi dati da un DB remoto, potrebbe essere conveniente caricarli una tantum in variabili Process_Globals e poi passarli al componente visuale all'occorrenza (leggi rotazione schermo). La scelta dipenderà dalla quantità di dati e dall'efficienza attesa del server (soprattutto se utilizzato da tanta gente).

Umberto
 

Oldmanenzo

Member
Licensed User
Longtime User
Una giusta osservazione la tua UDG
comunque ora funziona con la modifica fatta.
Sono stato sempre contrario alle dichiarazioni di variabili globali (ovviamente a volte non se ne puo fare a meno) ma l'aspetto da te considerato è sicuramente da valutare a fondo, non tanto per questa activity dove vengono mostrati alcuni campi del db con informazioni generali in alcuni panel secondo la regione selezionata. Il problema da porsi sarà nell'estrazione dei singoli record, dove vengono mostrate tutte le notizie contenute in quel determinato record ed ovviamente il carico di lavoro diventa piu elevato, consideranto anche che il server su cui mi appoggio e dove risiede il db e condiviso (se vogliamo usare questo termine) da un forum con vbulletin con il suo database e dove gli utenti smanettano non poco.
Comunque grazie per le dritte.
 
Top