Dropdownlist - Exibir Múltiplos Valores

Bom dia, pessoal!

Estou montando uma estrutura que deve exibir para o usuário a faixa numérica (num_sequencial_inicial e num_sequencial_final), quantidade disponível dessa faixa se tiver requisição (quatidade_disponivel) e a quantidade disponível se não houver requisição (quantidade_disponivel_sem_requisicao)

  • o cálculo é feito diferente para cada quantidade

Esses dados são buscados no banco de acordo com um tipo de número previamente selecionadoe e devem ser exibidos em um componente selecionável para os demais cálculos(pensei no combobox, más poderia ser talvez um gridview)

  • A consulta SQL, funciona chama o método no controller e tudo mais, porém não sei como fazer para trazer todos esses dados que vem em um objeto. Ja tentei bastante aqui.

Gostaria de saber como poderia montar isso o combo ficaria dessa maneira por ex:

Faixas disponíveis | Série | Quantidades Disponíveis

  • 08000001 (inicial) 09000000 (final) XX 10

  • 05431851 (inicial) 05431900 (final) A 20

.

.

.

Segue o código que estou fazendo:

_form.php




<div class="row">

             

                   <?php echo CHtml::label('Tipo de Receita', 'id_tp_num_sequencial'); ?>

                   <?php

                          echo CHtml::dropDownList('id_tp_num_sequencial','', CHtml::listData(TpNumSequencial::model()->findAllBySql("SELECT tp.id_tp_num_sequencial as id_tp_num_sequencial, tp.tp_num_sequencial as tp_num_sequencial

FROM

sch_scspm.tb_num_sequencial faixa,  sch_scspm.tb_tp_num_sequencial tp

WHERE

faixa.id_tp_num_sequencial = tp.id_tp_num_sequencial

GROUP BY

tp.id_tp_num_sequencial, tp.tp_num_sequencial"), 'id_tp_num_sequencial', 'tp_num_sequencial'),

                            array(

                            'empty' => 'Escolha um Tipo de Receita',

                            'ajax' => array(

                            'type'=>'POST', //request type

                            'url'=>CController::createUrl('Requisicao/BuscaSerie'), //url to call.

                            //Style: CController::createUrl('currentController/methodToCall')

                            'update'=>'#series_disponiveis', //selector to update

                            //'data'=>'js:javascript statement' 

                            //leave out the data key to pass all form values through

                            ))); 

    

?>

         

</div>

<div class="row">

<?Php

   echo CHtml::label('Faixas | Séries | Quantidades Disponíveis', 'series_disponiveis');

                    //empty since it will be filled by the other dropdown

                    echo CHtml::dropDownList('series_disponiveis','', array('empty' => 'Escolha um Tipo de Receita', 

                    ));


?>

</div>



_RequisicaoController.php





 public function actionBuscaSerie()

 {

               $param=(int) $_POST['id_tp_num_sequencial'];

        

            

               $data =  NumSequencial::model()->findBySql("SELECT

                                                            num.num_sequencial_inicial as num_sequencial_inicial,

                                                            num.num_sequencial_final as num_sequencial_final,

                                                            MAX(num.num_sequencial_final) - MAX(req.num_requisicao_final_medico) as quatidade_disponivel,

                                                            num_sequencial_final - num_sequencial_inicial as quantidade_disponivel_sem_requisicao,

                                                            num.serie_num_sequencial as serie_num_sequencial

                                                          FROM

                                                              sch_scspm.tb_tp_num_sequencial tp

                                                          INNER JOIN

                                                               sch_scspm.tb_num_sequencial num

                                                          ON 

                                                              (num.id_tp_num_sequencial = tp.id_tp_num_sequencial)

                                                          LEFT JOIN    

                                                               sch_scspm.tb_requisicao req

                                                          ON

                                                            (req.id_num_sequencial = num.id_num_sequencial)

                                                          WHERE

                                                             num.id_tp_num_sequencial=:parent_id

                                                          GROUP BY

                                                             num.num_sequencial_inicial, num.num_sequencial_final, num.serie_num_sequencial", array(':parent_id' => $param));

               $data=CHtml::listData($data,'id_num_sequencial', 'serie_num_sequencial');


               foreach($data as $value=>$name)

               {

                

                     echo CHtml::tag('option',array('value'=>$value),CHtml::encode($name),true);

                }

             

}




Consegui trazer todos os dados no DropDownlist, esteticamente ainda não é o ideal mas por enquanto vou manter assim.Caso alguém saiba alguma outra forma de levar isso pro grid através do widget.

Só estou com um problema, ele traz vários valores iguais dentro do combo ao invés de trazer os diferentes.

Acredito que seja dentro do laço de repetição foreach. Como poderia fazer?

Segue abaixo o novo código:

RequisicaoController.php





 public function actionBuscaSerie()

        {

               $param=(int) $_POST['id_tp_num_sequencial'];

           

               $data =  NumSequencial::model()->findBySql("SELECT

							    num.id_num_sequencial as id_num_sequencial,		

                                                            num.num_sequencial_inicial as num_sequencial_inicial,

                                                            num.num_sequencial_final as num_sequencial_final,

                                                            MAX(num.num_sequencial_final) - MAX(req.num_requisicao_final_medico) as quantidade_disponivel,

                                                            num_sequencial_final - num_sequencial_inicial as quantidade_disponivel_sem_requisicao,

                                                            num.serie_num_sequencial as serie_num_sequencial

							  FROM

                                                              sch_scspm.tb_tp_num_sequencial tp

                                                          INNER JOIN

                                                               sch_scspm.tb_num_sequencial num

                                                          ON 

                                                              (num.id_tp_num_sequencial = tp.id_tp_num_sequencial)

                                                          LEFT JOIN    

                                                               sch_scspm.tb_requisicao req

                                                          ON

                                                            (req.id_num_sequencial = num.id_num_sequencial)

                                                          WHERE

                                                             num.id_tp_num_sequencial=:parent_id

                                                          GROUP BY

                                                             num.id_num_sequencial,num.num_sequencial_inicial, num.num_sequencial_final, num.serie_num_sequencial", array(':parent_id' => $param));


               foreach($data as $value=>$name)

               {

                

                     //echo CHtml::tag('option',array('value'=>$data['num_sequencial_inicial']),CHtml::encode($name),true);

                     echo CHtml::tag('option',array('value'=>$data['id_num_sequencial']),$data['num_sequencial_inicial'].'-'.$data['num_sequencial_final'].'-'.$data['serie_num_sequencial'].'-'.$data['quantidade_disponivel'] ,true);

                }

             

        }




samjf,

No actionBuscaSerie(), está retornando correto todos os <options> do <select> ?

No actionBuscaserie(), para você montar o:


echo CHtml::tag('option',array('value'=>$value),CHtml::encode($name),true);

Você vai precisar de um ID e de um titulo ou texto que irá mostrar no <option>

Na consulta SQL do actionBuscaSerie(), qual é o ID? Por que assim você pode montar ou concatenar o texto que vai no <option>

Newerton ,

Estão retornando todos dados corretamente.

Não sei se você olhou meu segundo post já consegui fazer quase tudo concatenado dentro do dropdownlist.

A consulta retorna os dados corretamente.

O único problema é que os dados do dropdown aparecem repetidos. (isso pela forma que montei o laço já que a consulta esta correta).

Queria fazer uma forma de contar quantas linhas tem o resultado da consulta. ai faria um for percorrendo.

Tipo:




for ($i=1;$i<NUMERO DE LINHAS RETORNADAS PELA CONSULTA???, $i++){

     echo CHtml::tag('option',array('value'=>$data['id_num_sequencial']),$data['num_sequencial_inicial'].'-'.$data['num_sequencial_final'].'-'.$data['serie_num_sequencial'].'-'.$data['quantidade_disponivel'] ,true);


}



Tentei usar o count na consulta, acontece que pela estrutura da mesma seria mais simples usar algo dentro do próprio php. Isso que não estou conseguindo

Executa a consulta em uma outra página até mesmo direto no _form, e coloca o echo count($data), veja se está retornando a quantidade exata.

Você executou essa query SQL no banco de dados e está retornando menos que no projeto?

Usa a função count() e veja se está retornando a mesma quantidade do banco de dados, na verdade não era para repetir os dados.

Newerton,

Executei no banco e retorna 3 linhas, 2 depende de qual tipo de faixa numérica selecionei previamente.

Porém, quando executo count($data) no form ele retorna o número 1.

No dropdownlist ele retorna apenas o primeiro registro. O foreach está realmente certo? Estou suspeitando dele. Gostaria de trocar para for, más não sei como fazer no YII algo tipo pg_num_rows () por exemplo.

Não existe uma forma de saber pelo método findBySql quantas linhas a consulta retornou?

Tenta fazer assim:


$sql = "SELECT

	num.id_num_sequencial as id_num_sequencial,         

	num.num_sequencial_inicial as num_sequencial_inicial,

	num.num_sequencial_final as num_sequencial_final,

	MAX(num.num_sequencial_final) - MAX(req.num_requisicao_final_medico) as quantidade_disponivel,

	num_sequencial_final - num_sequencial_inicial as quantidade_disponivel_sem_requisicao,

	num.serie_num_sequencial as serie_num_sequencial

  FROM

	  sch_scspm.tb_tp_num_sequencial tp

  INNER JOIN

	   sch_scspm.tb_num_sequencial num

  ON 

	  (num.id_tp_num_sequencial = tp.id_tp_num_sequencial)

  LEFT JOIN    

	   sch_scspm.tb_requisicao req

  ON

	(req.id_num_sequencial = num.id_num_sequencial)

  WHERE

	 num.id_tp_num_sequencial={$param}

  GROUP BY

	 num.id_num_sequencial,num.num_sequencial_inicial, num.num_sequencial_final, num.serie_num_sequencial";


	 $sql = Yii::app()->db->createCommand($sql)->query();


	 while (( $data = $sql->read() ) !== false) {

		echo CHtml::tag('option',array('value'=>$data['id_num_sequencial']),$data['num_sequencial_inicial'].'-'.$data['num_sequencial_final'].'-'.$data['serie_num_sequencial'].'-'.$data['quantidade_disponivel'] ,true);

	}

Poxa, cara valeu!

Me parece que deu certo, estou testando com calma aqui!

Então o efeito do createCommand é o mesmo do findbySql?

Legal mesmo!

Obrigado mais uma vez

createCommand() não é igual ao findBySql().

O createCommand() ele executa somente a query criada, o findBySql, ele usa o Model e cria uma subconsulta com a query.

Depois com calma habilita o debug e veja como o Yii monto a query com o findBySql();

Ok deu certo sim!

Valeu mesmo. Como faço para colocar o tópico como resolvido? Sou eu mesmo que faço ou o administrador?

Não há esta opção no fórum, infelizmente.

A recomendação é apenas compartilhar o resultado, dizendo que a solução proposta funcionou, como você fez.