Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2015
    Messaggi
    23

    [Android] settaggio giorni calendario

    Ciao a tutti, nella mia applicazione Android utilizzo un database con 2 Tabelle, la tabella A può avere da 1 a 7 records:
    codice:
    Tabella A
    _id - campo1
    1      testo
    2      testo
    3      testo
    4      testo
    5      testo
    6      testo
    7      testo



    La tabella B è composta dall'id, dall' id della tabella A e un altro campo:
    codice:
    La tabella B è composta dall'id, dall' id della tabella A e un altro campo:
    
    Tabella B
    _id - id_tabella_A - campo3
    1         2                  testo
    2         3                  testo
    3         5                  testo
    4         1                  testo
    5         7                  testo
    Ora, prelevo i dati dalle tabelle con il LEFT JOIN e in base all'id della tabella A aggiungo i giorni al calendario in questo modo:
    codice:
    @Override    public List<WeekViewEvent> onMonthChange(int newYear, int newMonth) {
            List<WeekViewEvent> events = new ArrayList<WeekViewEvent>();
            SQLiteDatabase db = new DatabaseHelper(getActivity()).getReadableDatabase();
    
            String tabella_op = "SELECT " +
                     ....
                     ....
                    "FROM Tabella a " +
                    "LEFT JOIN TabellaB b ON (a._id = b.id_tabella_A) " +                
                    "ORDER BY a._id ASC";
            Cursor cur = db.rawQuery(tabella_op, null);
                  while (cur.moveToNext()) {
                  id_a = cur.getInt(0);
                  giorno_ok= cur.getInt(1);
                 if (id_a == 1) {
                    startTime.set(Calendar.DAY_OF_MONTH, giorno_ok);
                } else if (id_a == 2) {
                    startTime.set(Calendar.DAY_OF_MONTH, giorno_ok);
                    startTime.add(Calendar.DATE, 1);
                } else if (id_a == 3) {
                    startTime.set(Calendar.DAY_OF_MONTH, giorno_ok);
                    startTime.add(Calendar.DATE, 2);
                } else if (id_a == 4) {
                    startTime.set(Calendar.DAY_OF_MONTH, giorno_ok);
                    startTime.add(Calendar.DATE, 3);
                } else if (id_a == 5) {
                    startTime.set(Calendar.DAY_OF_MONTH, giorno_ok);
                    startTime.add(Calendar.DATE, 4);
                } else if (id_a == 6) {
                    startTime.set(Calendar.DAY_OF_MONTH, giorno_ok);
                    startTime.add(Calendar.DATE, 5);
                } else if (id_a == 7) {
                    startTime.set(Calendar.DAY_OF_MONTH, giorno_ok);
                    startTime.add(Calendar.DATE, 6);
                }
    
    
    }
            cur.close();
            db.close();
           ...
           ...
        }
    Il problema nasce quando l'id non è in sequenza ad esempio: (1,3,5,6,7,8,9)

    In pratica a prescindere dal numero dell'id (sono ordinati in ordine crescente), il primo deve aggiungere un giorno, il secondo id 2 giorni, il terzo id 3 giorni e così via.
    Grazie per i vostri suggerimenti


  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Premesso che non si è capito quale sia il problema, quel while è decisamente troppo prolisso. Lo si può tranquillamente ridurre:

    codice:
    while (cur.moveToNext()) {
       id_a = cur.getInt(0);
       giorno_ok= cur.getInt(1);
       if ((id_a > 0) && (id_a < 8)) {   // Solo per sicurezza
          startTime.set(Calendar.DAY_OF_MONTH, giorno_ok);
          startTime.add(Calendar.DATE, id_a-1);
       }
    }

    Tante operazioni ripetute (il setting dell'oggetto startTime lo fai ad ogni if: fallo una volta sola all'inizio, tanto è indipendente) e tante if per nulla (io ne ho messa una solo per evitare eventuali valori "sporchi" nel DB).

    Per quanto riguarda il tuo problema, dovresti ri-spiegarlo perchè non ho capito nulla.
    L'unico vero problema che vedo è che continui a modificare sempre lo stesso oggetto per ogni record che vai a leggere... non credo sia ciò che tu vuoi ottenere, ma non si è capito esattamente cosa vuoi ottenere.


    Ciao.
    Ultima modifica di LeleFT; 22-09-2015 a 09:14
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2015
    Messaggi
    23
    Provo a spiegare meglio.
    La tabella A può contenere al massimo 7 records, quindi una volta inseriti avrò l'id in sequenza da 1 a 7 (1,2,3,4,5,6,7).
    In base ai numeri di quell'id setto il calendario, cioè,
    sel'id è 1 il calendario và impostato alla data presa dal db (giorno_ok),
    se l'id è 2 il calendario và impostato con
    giorno_ok + 1,
    se l'id è 3 il calendario và impostato con
    giorno_ok + 2,
    se l'id è 4 il calendario và impostato con giorno_ok + 3, e così via...

    Ora però se viene eliminato un record poi magari aggiunto uno nuovo l'id giustamente non sarà più in sequenza e potrebbe essere in questo modo (es: 2,3,4,5,6,7,8).

    Quindi, in un caso del genere l'id più piccolo dovrà impostare il calendario
    giorno_ok
    il secondo id dovrà impostare il calendario con
    giorno_ok + 1
    il terzo id
    dovrà impostare il calendario con giorno_ok + 2
    il quarto id dovrà impostare il calendario con giorno_ok + 3 e così via

    Spero di essermi spiegato, attendo tue notizie, grazie

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ok, ho capito la problematica, ma quel che mi perplime è il perchè possa succedere una cosa del genere.
    Che venga eliminato un record ci può stare... ma se poi lo devo re-inserire lo re-inserirò con il valore che voglio io.
    Se è stato usato un campo auto-increment per quel valore... allora significa che si è sbagliato: quello è il tipico caso in cui l'auto-increment non ha nessun senso di esistere (e non andrebbe usato).
    Ad ogni modo, pur lasciando le cose come stanno, si può ovviare abbastanza facilmente (a questo punto anche la mia if "di sicurezza" non ha più alcun senso di esistere): basta non tener conto del valore, ma solo della sequenza:

    codice:
    int numero = 0;
    while (cur.moveToNext()) {
       id_a = cur.getInt(0);   // Questa può anche essere omessa, non serve
       giorno_ok= cur.getInt(1);
       startTime.set(Calendar.DAY_OF_MONTH, giorno_ok);
       startTime.add(Calendar.DATE, numero);   // Non mi importa più di quale sia l'effettivo valore, conta solo la "posizione"
       numero++;
    }

    Rimane il problema che ad ogni ciclo (quindi per ogni record) usi sempre lo stesso oggetto "startTime"...


    Ciao.
    Ultima modifica di LeleFT; 22-09-2015 a 10:09
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2015
    Messaggi
    23
    Siamo vicini alla soluzione ma c'è un problema, come ho scritto nel primo post recupero i dati dalle 2 tabelle e la chiave primaria della tabella A (id) è presente anche nella tabella B per la relazione..

    Quindi se ad esempio nella tabella A ci sono 3 records (es con id: 1,2,3) e nella Tabella B un id di questi tre non è presente (es: 1,3), quando recupero i dati il risultato è sballato. Ti faccio un esempio di cosa accade:

    Tabella A
    id - campo1
    1 -Mario Rossi
    2 -Giovanni Verdi
    3 -Mirko Bianchi


    Tabella B
    id - id_tabella_A - campo2
    1 -1- Viola
    2 -3- Rosso


    In questo caso, quello che vedi sotto è ciò che accade quando prelevo i dati(in pratica Mario Rossi è oggi, Giovanni Verdi è oggi + 1, Mirko Bianchi è oggi +2. Il programma è una sorta di agenda, quindi le date, quando stampo a video i risultati mi servono per posizionare nella colonna giusta i vari valori.

    Mario rossi - Giovanni Verdi - Mirko Bianchi
    Viola- Rosso

    Invece il valore "Rosso" dovrebbe essere posizionato un giorno più avanti.
    Grazie per la tua pazienza
    Ultima modifica di Calis; 22-09-2015 a 12:58

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Questo accade perchè sicuramente verranno sollevate delle eccezioni in quel codice. Io mi aspettavo che tutti i record della tabella A avessero un corrispondente nella tabella B... se così non è, non puoi semplicemente far finta di nulla, ma devi preoccuparti che non vi siano campi nulli.
    Non hai mostrato i campi che hai selezionato nella SELECT, quindi io presumo che sia una cosa di questo tipo:


    codice:
    SELECT b.id, b.id_tabella_A, b.campo2, ...
    FROM TabellaA a LEFT JOIN TabellaB b ON( ... )
    Se così fosse, la query restituisce il seguente recordset:

    codice:
    1 - 1 - Viola
    NULL - NULL - NULL
    2 - 3 - ROSSO

    Al momento di andare a reperire i valori dei campi, viene sollevata un'eccezione (il valore NULL non può essere convertito in un intero) ed il comportamento in questo caso è implementation-defined (vedi documentazione del metodo getInt() di Cursor nella JavaDoc di Android), quindi può succedere di tutto.

    Dovrei, comunque, vedere ESATTAMENTE cosa hai messo nella clausola SELECT della query. Se la master table è TabellaA, allora il suo ID recuperalo da TabellaA e non da TabellaB... almeno avrai un valore non nullo su cui poterti appoggiare per le valutazioni successive.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2015
    Messaggi
    23
    il codice completo
    codice:
    @Override
    public List<WeekViewEvent> onMonthChange(int newYear, int newMonth) {
    
    SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd");
    final String strDate = simpleFormat.format(calendarioFooter.getTime());
    
    List<WeekViewEvent> events = new ArrayList<WeekViewEvent>();
    SQLiteDatabase db = new DatabaseHelper(getActivity()).getReadableDatabase();
    
    String tabella_op = "SELECT " +
            "a.id_appuntamento, " +
            "a.id_operatore," +
            "a.id_servizio, " +
            "a.data, " +
            "a.ora_inizio, " +
            "a.ora_fine, " +
            "c._id, " +
            "c.nome, " +
            "c.cognome, " +
            "o.nome, " +
            "s.colore, " +
            "s.tipo " +
            "FROM Appuntamenti a " +
            "LEFT JOIN Operatori o ON (a.id_operatore = o._id) " +
            "LEFT JOIN Clienti c ON (a.id_cliente = c._id) " +
            "LEFT JOIN Servizi s ON (a.id_servizio = s._id) " +
            "WHERE a.data LIKE '" + strDate + "' AND o.eliminato = 0 " +
            "ORDER BY a.id_operatore ASC";
    
    Cursor cur = db.rawQuery(tabella_op, null);
    while (cur.moveToNext()) {
        startTime = (Calendar) calendarioFooter.clone();
    id_appuntamento = cur.getString(0);
    id_operatore = cur.getInt(1);//****//
    id_servizio = cur.getString(2);
    dat = cur.getString(3);
    ora_iniz = cur.getString(4);
    ora_fin = cur.getString(5);
    id_client = cur.getString(6);
    nome_cliente = cur.getString(7);
    cognome_cliente = cur.getString(8);
    nome_operatore = cur.getString(9);
    colore_serv = cur.getInt(10);
    tipo_serv = cur.getString(11);
    
    
    startTime.set(Calendar.DAY_OF_MONTH, giorno_ok);
    startTime.add(Calendar.DATE, numero);
    // Non mi importa più di quale sia l'effettivo valore, conta solo la "posizione"
    numero++;
    
    //inizio
    startTime.set(Calendar.HOUR_OF_DAY, ora_inizio);
    startTime.set(Calendar.MINUTE, minuto_inizio);
    startTime.set(Calendar.MONTH, newMonth - 1);
    startTime.set(Calendar.YEAR, newYear);
    
    //fine
    Calendar endTime = (Calendar) startTime.clone();
    endTime.set(Calendar.HOUR_OF_DAY, ora_fine);
    endTime.set(Calendar.MINUTE, minuto_fine);
    
    //setto la weekview
    WeekViewEvent event = new WeekViewEvent(id_appuntamento, getEventTitle(startTime, endTime), startTime, endTime);
    event.setColor(colore_serv);
    events.add(event);
    }
        cur.close();
    db.close();
        return events;
    }
    
    la classe WeekViewEvent
    codice:
    public class WeekViewEvent {
        private String mId;
        private Calendar mStartTime;
        private Calendar mEndTime;
        private String mName;
        private int mColor;
    
    
    public WeekViewEvent(String id, String name, int startYear, int startMonth, int startDay, int startHour, int startMinute, int endYear, int endMonth, int endDay, int endHour, int endMinute) {
        this.mId = id;
    
        this.mStartTime = Calendar.getInstance();
        this.mStartTime.set(Calendar.YEAR, startYear);
        this.mStartTime.set(Calendar.MONTH, startMonth-1);
        this.mStartTime.set(Calendar.DAY_OF_MONTH, startDay);
        this.mStartTime.set(Calendar.HOUR_OF_DAY, startHour);
        this.mStartTime.set(Calendar.MINUTE, startMinute);
    
        this.mEndTime = Calendar.getInstance();
        this.mEndTime.set(Calendar.YEAR, endYear);
        this.mEndTime.set(Calendar.MONTH, endMonth-1);
        this.mEndTime.set(Calendar.DAY_OF_MONTH, endDay);
        this.mEndTime.set(Calendar.HOUR_OF_DAY, endHour);
        this.mEndTime.set(Calendar.MINUTE, endMinute);
    
        this.mName = name;
    }
    
    
    public WeekViewEvent(String id, String name, Calendar startTime, Calendar endTime) {
            this.mId = id;
            this.mName = name;
            this.mStartTime = startTime;
            this.mEndTime = endTime;
    }
    
    
        public Calendar getStartTime() {
            return mStartTime;
    }
    
        public void setStartTime(Calendar startTime) {
            this.mStartTime = startTime;
    }
    
        public Calendar getEndTime() {
            return mEndTime;
    }
    
        public void setEndTime(Calendar endTime) {
            this.mEndTime = endTime;
    }
    
        public String getName() {
            return mName;
    }
    
        public void setName(String name) {
            this.mName = name;
    }
    
        public int getColor() {
            return mColor;
    }
    
        public void setColor(int color) {
            this.mColor = color;
    }
    
        public String getId() {
            return mId;
    }
    
        public void setId(String id) {
            this.mId = id;
    }
    }
    questo screenshot del programma mostra il buon funzionamento, perchè le 3 colonne hanno l'id che corrisponde nella tabella "Appuntamenti"Screenshot_2015-09-22-14-52-27.jpg


    Questo sotto invece mostra cosa accade se ad esempio una uno degli id della Tabella A(operatori) non è presente nella Tabella B(appuntamenti).
    Se controlli lo screenshot di prima il riquadro rosso con scritto "Giorgia Capogrossi" dovrebbe essere visualizzato nella terza colonna.
    Screenshot_2015-09-22-14-56-41.jpg

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Per fare ciò che vuoi tu devi procedere in modo diverso e non lo puoi fare con una query sola.
    Perchè se nella tabella Appuntamenti non è presente alcun record legato alla tabella Operatori per l'operatore Giovanni, allora non esisterà nessuna data che soddisfi quel legame (nota la clausola WHERE a.data LIKE ' ... ')... di conseguenza il record relativo all'operatore mancante semplicemente non verrà estratto (di fatto, non esiste).

    Quello che puoi fare in modo semplice è la seguente cosa:

    1) Con una prima query, estrai TUTTI gli operatori: a te servono tutti (è questa la tua master table).
    2) Per ciascun operatore, estrai tutti gli appuntamenti ad esso legati con una query dedicata.

    A questo punto, l'operatore Giovanni non avrà alcun appuntamento ad esso legato, ma la struttura dati sarebbe coerente.

    In questo modo andrai ad aggiungere un "null" alla lista events al posto corretto, in corrispondenza dell'operatore che non ha alcun appuntamento assegnato.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2015
    Messaggi
    23
    Per settare la view con tutti gli operatori avevo già creato un metodo che mi estrae tutti gli operatori, li butto in un array e li passo alla view. Nel Fragment dove è presente la lista, prima di tutto lancio il metodo che dicevo, questo:
    Gli array sono dichiarati all'inizio della classe
    codice:
    public void checkOperatori() {
        SQLiteDatabase db = new DatabaseHelper(getActivity()).getReadableDatabase();
    String OPERATORI = "SELECT _id, nome, cognome FROM Operatori WHERE eliminato = 0 ORDER BY _id ASC";
    Cursor cur = db.rawQuery(OPERATORI, null);
        int count = cur.getCount();
    id_nome_op = new Integer[count];
    nome_op = new String[count];
    cognome_op = new String[count];
        for (int i = 0; i < count; i++) {
            cur.moveToNext();
    id_nome_op[i] = cur.getInt(0);
    nome_op[i] = cur.getString(1);
    cognome_op[i] = cur.getString(2);
    
    //passo gli operatori alla View 
    mWeekView.setOperatoriColonne(nome_op, cognome_op);
    
    }
        cur.close();
    db.close();
    }
    Vorrei pubblicare anche la classe che estende la view, ma è molto codice e non sò se me lo fa fare...

    A questo punto avendo popolato gli array con tutti gli operatori, come cambio la query della lista?

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ciao.
    Ho visto il PVT e ho visto il codice.
    A parte la complessità di quel codice, che è incomprensibile per chiunque non sia dentro al progetto, me compreso, non si capisce in che modo sia stato pensato il controllo degli appuntamenti.

    Quello che non ho visto da nessuna parte (ma forse non l'ho visto perchè in tutto quel marasma è davvero difficile orientarsi) è l'aver pensato che un operatore possa anche non avere alcun appuntamento per un determinato giorno.

    Da nessuna parte c'è un controllo che dica "ehi, se oggi tizio non ha nessun appuntamento, salta...". Sembra quasi che si dia per scontato che ciascun operatore abbia almeno un appuntamento al giorno (anzi, probabilmente ne deve avere uno ed uno solo, boh... che succede se ne ha due?).

    Io non so se quel codice sia tutto tuo o se tu ti sia appoggiato ad un progetto già fatto (mezzi commenti sono in inglese, mezzi in italiano), ma senza avere un minimo di "background" su quel progetto non ti si può aiutare più di tanto: personalmente non so come debba funzionare, non so se chi ha scritto quel codice abbia pensato alla possibilità di avere un operatore senza appuntamenti (come nel tuo caso), non so come debba essere gestito questo caso (inserimento di un "null" nell'elenco degli appuntamenti? Direi di no, visto che nessuno dei metodi che ci lavora prevede questo caso: sort degli appuntamenti, caching degli stessi, ecc; inserimento di un appuntamento "fasullo"? E come lo si identifica?).

    Insomma: sono davvero troppe le cose "oscure" di quel progetto, per cui risulta davvero difficile darti qualche suggerimento su come gestire questo caso... rimane il fatto: nel tuo DB c'è un operatore che in un determinato giorno non ha alcun appuntamento. Questo caso va gestito.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.