Yii Framework Forum: Cgridview - Operazioni Di Calcolo - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Cgridview - Operazioni Di Calcolo Rate Topic: -----

#1 User is offline   hyde82 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 62
  • Joined: 15-November 10
  • Location:Italy

Posted 15 October 2013 - 04:09 PM

Salve a tutti.

In un progetto sviluppato per la gestione delle vendite al banco ,di articoli di abbigliamento ,spesso i cassieri necessitano di visualizzare a piè di griglia l'importo totale delle vendite , gli sconti effettuati , l'importo dei resi , l'importo dei buoni emessi.. etc. , insomma un sommario di tutte le operazioni effettuate sulla base dei criteria di ricerca messi a disposizione da CgridView. Tale sommario "dovrebbe" tener conto però dei record paginati e non.
Es.
Su una griglia con pageSize a 10 record ,attualmente, un sommario calcolerebbe solo la somma o la differenza dei dieci record, senza calcolare quelli nelle successive pagine. Certo si potrebbe aumentare il numero di paginazione degli elementi da visualizzare,ma ciò porterebbe tanta lentezza ,soprattutto se dietro vi è un relazionato complesso ed il dataset estratto non è conosciuto(chiaramente!).
Al momento, adotto questo tipo di soluzione che a dire il vero, ho preso in prestito da un altro post:

public function getSearchCriteria()
{
    $criteria=new CDbCriteria;

    $criteria->compare('id',$this->id);
    $criteria->compare('name',$this->data_vendita);
    $criteria->compare('stock',$this->stock);
    $criteria->compare('user_id',$this->user_id);
   //etc .. etc...
    return $criteria;
}

public function search()
{
    return new CActiveDataProvider(get_class($this), array(
        'criteria'=>$this->getSearchCriteria(),
    ));
}

public function totaleVenduto()
{
    $criteria=$this->getSearchCriteria();
    $criteria->select='SUM(somecolumn)';
    return $this->commandBuilder->createFindCommand($this->getTableSchema(),$criteria)->queryScalar();
}

public function totaleReso()
{
    $criteria=$this->getSearchCriteria();
    $criteria->select='SUM(somecolumn)';
    return $this->commandBuilder->createFindCommand($this->getTableSchema(),$criteria)->queryScalar();
}
public function totaleSospeso()
{
    $criteria=$this->getSearchCriteria();
    $criteria->select='SUM(somecolumn)';
    return $this->commandBuilder->createFindCommand($this->getTableSchema(),$criteria)->queryScalar();
}

Questo approccio è davvero funzionale!
Ma....profilando l'applicazione ,mi son reso conto che ognuno dei metodi che effettua il conteggio, richiama il criteria originario.
Ciò porta ad una duplicazione del criteria per ogni metodo di conteggio richiamato in griglia(cosa che rallenta tantissimo le performance globali del sistema).
Possibile che non esiste altra soluzione?
Ogni consiglio è ben accetto.
0

#2 User is offline   claudio.ferrari 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 23
  • Joined: 23-November 11
  • Location:Brescia - Italy

Posted 16 October 2013 - 06:06 PM

..non riesci a mettere tutto nelle relations del model ?

View Posthyde82, on 15 October 2013 - 04:09 PM, said:

Salve a tutti.

In un progetto sviluppato per la gestione delle vendite al banco ,di articoli di abbigliamento ,spesso i cassieri necessitano di visualizzare a piè di griglia l'importo totale delle vendite , gli sconti effettuati , l'importo dei resi , l'importo dei buoni emessi.. etc. , insomma un sommario di tutte le operazioni effettuate sulla base dei criteria di ricerca messi a disposizione da CgridView. Tale sommario "dovrebbe" tener conto però dei record paginati e non.
Es.
Su una griglia con pageSize a 10 record ,attualmente, un sommario calcolerebbe solo la somma o la differenza dei dieci record, senza calcolare quelli nelle successive pagine. Certo si potrebbe aumentare il numero di paginazione degli elementi da visualizzare,ma ciò porterebbe tanta lentezza ,soprattutto se dietro vi è un relazionato complesso ed il dataset estratto non è conosciuto(chiaramente!).
Al momento, adotto questo tipo di soluzione che a dire il vero, ho preso in prestito da un altro post:

public function getSearchCriteria()
{
    $criteria=new CDbCriteria;

    $criteria->compare('id',$this->id);
    $criteria->compare('name',$this->data_vendita);
    $criteria->compare('stock',$this->stock);
    $criteria->compare('user_id',$this->user_id);
   //etc .. etc...
    return $criteria;
}

public function search()
{
    return new CActiveDataProvider(get_class($this), array(
        'criteria'=>$this->getSearchCriteria(),
    ));
}

public function totaleVenduto()
{
    $criteria=$this->getSearchCriteria();
    $criteria->select='SUM(somecolumn)';
    return $this->commandBuilder->createFindCommand($this->getTableSchema(),$criteria)->queryScalar();
}

public function totaleReso()
{
    $criteria=$this->getSearchCriteria();
    $criteria->select='SUM(somecolumn)';
    return $this->commandBuilder->createFindCommand($this->getTableSchema(),$criteria)->queryScalar();
}
public function totaleSospeso()
{
    $criteria=$this->getSearchCriteria();
    $criteria->select='SUM(somecolumn)';
    return $this->commandBuilder->createFindCommand($this->getTableSchema(),$criteria)->queryScalar();
}

Questo approccio è davvero funzionale!
Ma....profilando l'applicazione ,mi son reso conto che ognuno dei metodi che effettua il conteggio, richiama il criteria originario.
Ciò porta ad una duplicazione del criteria per ogni metodo di conteggio richiamato in griglia(cosa che rallenta tantissimo le performance globali del sistema).
Possibile che non esiste altra soluzione?
Ogni consiglio è ben accetto.

claudio.ferrari@imagis.it
0

#3 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 17 October 2013 - 03:09 AM

View Posthyde82, on 15 October 2013 - 04:09 PM, said:

Ciò porta ad una duplicazione del criteria per ogni metodo di conteggio richiamato in griglia(cosa che rallenta tantissimo le performance globali del sistema).
Possibile che non esiste altra soluzione?


Duplicare i criteria non ha nessun impatto sulle performance, perche' si tratta di semplici oggetti con pochi dati.

Quello che puo' essere importante e' fare 3 query quando ne potrebbe bastare una:

public function totali()
{
    $criteria=$this->getSearchCriteria();
    $criteria->group= 'id';
    $criteria->limit= null;
    $criteria->select='SUM(somecolumn) as Venduto, SUM(somecolumn) as Reso, SUM(somecolumn) as Sospeso ';
    return $this->commandBuilder->createFindCommand($this->getTableSchema(),$criteria)->queryRow();
}


Inoltre, perche' il conto riesca, devi eliminare una eventuale limit e raggruppare per qualcosa
0

#4 User is offline   hyde82 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 62
  • Joined: 15-November 10
  • Location:Italy

Posted 22 October 2013 - 02:03 AM

View Postzaccaria, on 17 October 2013 - 03:09 AM, said:

Duplicare i criteria non ha nessun impatto sulle performance, perche' si tratta di semplici oggetti con pochi dati.


ok , ma l'esecuzione della query no.
Per ogni metodo accessorio ove richiamerò il criteria originario (getSearchCriteria()) ci sarà l'esecuzione di una query duplicata ,più quella che innesto nel metodo accessorio stesso.

Quote

Quello che puo' essere importante e' fare 3 query quando ne potrebbe bastare una:


chiaro, laddove i campi da conteggiare appartengono ad una stessa tabella.
Ma dove invece ci sono join molti a molti ove i risultati sono il prodotto della somma di campi sparsi su più tabelle , credo sia inevitabile.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users