Adicionado por Rafael Leandro 02/07/2015 17:22 h
Olá a todos. Meu nome é Rafael Leandro e estamos implementando o SEI na CGU.
Se alguém puder ajudar com uma dúvida!
Criei um novo método de pesquisa que tem como uma das entradas Interessados.
Eu retorno os participantes de acordo com o nome passado pelo usuário assim:
private function obterParticipante($NomeParticipante){
$objParticipanteDTO = new ParticipanteDTO();
$objParticipanteDTO->retNumIdParticipante();
$objParticipanteDTO->retNumIdContato();
$objParticipanteDTO->retStrNomeContato();
$objParticipanteDTO->retStrSiglaContato();
$objParticipanteDTO->setStrNomeContato('%'.$NomeParticipante.'%',InfraDTO::$OPER_LIKE);$objParticipanteRN = new ParticipanteRN();
$objParticipanteDTO = $objParticipanteRN->listarRN0189($objParticipanteDTO);if ($objParticipanteDTO==null){
throw new InfraException('Interessado ['.$NomeParticipante.'] não encontrado.');
}return $objParticipanteDTO;
}
Isso funciona e ele retorna a lista corretamente.
Então eu preciso enviar esse Objeto para que na RN a pesquisa inclua esses participantes como parâmetro para pesquisar um determinado procedimento, então fiz assim:
if ($Interessado!=null && $Interessado!=''){
$objParticipanteDTO = $this->obterParticipante($Interessado);
}else{
$objParticipanteDTO = null;
}
$objProcedimentoDTO->setArrObjParticipanteDTO($objParticipanteDTO);
Na classe RN eu recebo assim:
if($objProcedimentoDTO->getArrObjParticipanteDTO()!=null) {
$dto->setArrObjParticipanteDTO($objProcedimentoDTO->getArrObjParticipanteDTO());
}
Ele recebe o array de Participantes corretamente e Seta ele corretamente, mas o select não inclui essa lista como parâmetro, está ficando assim:
SELECT CAST AS idprocedimento,protocolo.protocolo_formatado AS protocoloprocedimentoformatado,protocolo.sta_nivel_acesso_global AS stanivelacessoglobalprotocolo,procedimento.id_tipo_procedimento AS idtipoprocedimento,tipo_procedimento.nome AS nometipoprocedimento,protocolo.descricao AS descricaoprotocolo,protocolo.dta_geracao AS geracaoprotocolo FROM procedimento LEFT JOIN tipo_procedimento ON procedimento.id_tipo_procedimento=tipo_procedimento.id_tipo_procedimento AND upper(tipo_procedimento.nome) LIKE '%PESSOAL%' INNER JOIN protocolo ON procedimento.id_procedimento=protocolo.id_protocolo AND protocolo.sta_nivel_acesso_global<>'2' AND protocolo.dta_geracao>='2015-06-10 00:00:00'
Eu preciso fazer mais alguma coisa para ele incluir este ObjParticipante na pesquisa?
Acredito que ele deveria fazer algo do tipo:
inner join participante part on protocolo.id_protocolo = part.id_protocolo and part.id_participante in (arrayObjParticipante que informei)
Desde já agradeço se alguém ver e puder ajudar!
Rafael Leandro
33 comentários
Adicionado por Rafael Leandro
Muito obrigado Mairon!!! ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ Olá Rafael, Dei uma olhada no código que vc postou. Existem alguns conceitos que provavelmente vcs não tiveram acesso. Por exemplo, um método "listar" sempre retorna um array de objetos enquanto que um "consultar" retorna apenas um objeto. Então no trecho postado: $objParticipanteRN = new ParticipanteRN(); $objParticipanteDTO = $objParticipanteRN->listarRN0189($objParticipanteDTO); if ($objParticipanteDTO==null){
throw new InfraException('Interessado ['.$NomeParticipante.'] não encontrado.'); } Na verdade deveria ser algo do tipo: $objParticipanteRN = new ParticipanteRN(); $arrObjParticipanteDTO = $objParticipanteRN->listarRN0189($objParticipanteDTO); if (count(arrObjParticipanteDTO )==0){
throw new InfraException('Nenhum interessado encontrado.'); } Bem, depois chega na outra parte que é a geração do SQL. O framework gera o SQL baseado nas configurações do DTO passado para a classe BD. Em teoria vc poderia ter o banco de dados inteiro mapeado dentro de um DTO. Mas na vida real cada DTO engloba apenas um subconjunto do banco. Os DTOs principais com ProcedimentoDTO, DocumentoDTO, ProtocoloDTO, InteressadoDTO, etc. são montados de forma que não façam um join com uma tabela NxN. Pois se isso acontecer poderão retornar várias ocorrências para o mesmo item do banco (por exemplo, poderia aparecer o mesmo processo 10 vezes no Controle de Processos porque ele tem 10 interessados). Se eu entendi o que vc quer fazer um consulta pelo nome do Interessado e retornar todos os processos associados. Para isso existem duas opções: 1) usar o ParticipanteRN->listarRN0189 fazendo um retDblIdProtocolo (recuperar todos os IDs de processos/documentos associados). Depois chamar o ProcedimentoRN->listarRN0278 (ou talvez o listarCompleto) passando um ProcedimentoDTO com os IDs retornados $objParticipanteDTO = new ParticipanteDTO(); $objParticipanteDTO->retDblIdProtocolo();
$objParticipanteDTO->retNumIdParticipante();
$objParticipanteDTO->retNumIdContato();
$objParticipanteDTO->retStrNomeContato();
$objParticipanteDTO->retStrSiglaContato();
$objParticipanteDTO->setStrNomeContato('%'.$NomeParticipante.'%',InfraDTO::$OPER_LIKE); //filtra somente processos
$objParticipanteDTO->setStrStaProtocoloProtocolo(ProtocoloRN::$TP_PROCEDIMENTO); //como não tem paginação é bom limitar
$objParticipanteDTO->setNumMaxRegistrosRetorno(500); $objParticipanteRN = new ParticipanteRN(); $arrObjParticipanteDTO = $objParticipanteRN->listarRN0189($objParticipanteDTO); if (count(arrObjParticipanteDTO )==0){
throw new InfraException('Nenhum interessado encontrado.'); } $objProcedimentoDTO = new ProcedimentoDTO();
$objProcedimentoDTO->setDblIdProcedimento(InfraArray::converterArrInfraDTO(arrObjParticipanteDTO,'IdProtocolo') ,InfraDTO::$OPER_IN); $objProcedimentoRN = new ProcedimentoRN(); $arrObjProcedimentoDTO = $objProcedimentoRN->listarRN0278($objProcedimentoDTO); //gera array bidimensional indexado pelo IdProtocolo, cada posição tem um array com os participantes que possuem o mesmo IdProtocolo $arrObjParticipanteDTO = InfraArray::indexarArrInfraDTO($arrObjParticipanteDTO,'IdProtocolo',true); foreach($arrObjProcedimentoDTO as $objProcedimentoDTO){
//atribui os participantes associados com este processo
$objProcedimentoDTO->setArrObjParticipanteDTO($arrObjParticipanteDTO[$objProcedimentoDTO->getDblIdProcedimento()]);
} return $arrObjParticipanteDTO; 2) a outra opção é criar um DTO específico para esta funcionalidade que faça o join com a tabela NxN. É mais complexo mas muito mais eficiente. Infelizmente, no momento não temos como dar um suporte maior a este tipo de demanda...então espero ter ajudado. PS: pode ter algum erro de sintaxe no código pois não validei em nenhuma IDE. Atenciosamente, Mairon G. Bathaglini
TRF4/DTI/DISEI
Adicionado por Douglas Dias
Douglas - SUSEP
Adicionado por Rafael Leandro