..:: MX Studio Fóruns ::..: Recursividade - ..:: MX Studio Fóruns ::..

Jump to content

Publicidade




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

Recursividade Como utilizar recursividade? Também não consegui utilizar transações.

#1 User is offline   ayslan 

  • Group: Membros
  • Posts: 13
  • Joined: 24-August 10

Posted 22 November 2010 - 02:41 PM

Boa tarde para todos.

Eu havia colocado essas dúvidas em uma resposta de outro post, mas achei melhor criar um novo, porém se eu estiver errado, por favor moderem.

Primeiramente ainda não consegui utilizar o begin(), rollback() e commit()... O questionamento está no post que respondi do MaajDrall sobre controle de transações. Eu crio a instância do objeto, faço a chamada ao begin() ($obj->begin()) conforme foi explicado no post, mas não funciona.

Além disso tenho outra dúvida, porém em relação à procedures, ou quem sabe haja um método no Lumine para o que eu preciso.

Criei uma estrutura de controle de acesso conforme segue:
Usuários pertencem à Grupos e cada grupo possui ações (permissões) que são definidas para ele. Porém, quando o usuário é uma pessoa que tem permissão de acessar os grupos, criando, editando, etc, é necessário que ele veja, além do próprio grupo, somente os grupos que fazem parte da árvore para baixo, ou seja, os filhos, os netos, etc... Para isso necessito utilizar recursividade, mas não vejo muitas vantagens em utilizar da maneira como fiz. Segue:

$groupList = NULL;
$totalRow = 0;

recursion($_POST['userGroupId'], $groupList, true, $totalRow);

function recursion($_groupId, &$result, $firstTime, &$totalRow)
{
	$query = $firstTime? 'groupId = ' . $_groupId : 'groupParentId = ' . $_groupId;

	$groupObj = new Group();
	$groupObj->where($query);
	$totalRow += $groupObj->find();
	$groupObj->find();
	
	$arrayGroup = $groupObj->allToArray();
		
	foreach($arrayGroup as $group)
	{
		$result[] = $group;
		recursion($group['groupId'], $result, false, $totalRow);
	}
}



TABLE:
tb_group
FIELDS: groupId, groupName, groupParentId


Mesmo sendo de uma maneira mais simples, eu criei a paginação, a ordenação de acordo com a coluna clicada, e etc nessa estrutura, porém para filtros eu vi que eu deveria varrer novamente o array e fazer o algoritmo de busca pela palavra pesquisada (ou parte dela), ou seja, não vale muito a pena fazer assim já que uma procedure faria esse trabalho de uma maneira mais rápida e com uma quantidade de acessos ao banco muito menor, ainda mais se eu quiser utilizar essa recursividade em tabelas com uma quantidade de registros consideravelmente maior, como um programa de afiliados, por exemplo, sei lá. Assim sendo pensei que possa haver ou uma maneira de acesso à procedures pelo Lumine, ou algum método do próprio Lumine que já faça o trabalho que eu preciso.
Eu tentei, infelizmente sem sucesso, utilizar o Lumine_Dialect_MySQL($obj) para executar uma procedure. Segue como eu fiz:

$groupObject = new Group();

$teste = new Lumine_Dialect_MySQL($groupObject);
$conn = new Lumine_Connection_MySQL();
$conn->connect();
$teste->setConnection($conn);
$teste->execute('SELECT * FROM tb_group');



Seria utilizando o Lumine_Dialect_MySQL para fazer acesso à procedures mesmo? Ou existe alguma outra solução sem procedures para o problema que expus? Por favor, se souberem das duas soluções, compartilhem ambas...


Valeu galera!

Deus os abençoe!!!
0

#2 User is offline   hufersil 

  • Group: Moderadores
  • Posts: 1266
  • Joined: 15-January 04

Posted 24 November 2010 - 03:38 PM

Para chamar uma procedure você pode usar as próprias classes geradas, sem problema nenhum, mesmo que elas retornem colunas que não existem na classe.
As classes geradas pelo Lumine também são proxy, ou seja, se uma propriedade não existe, mas está presente no resultset, Lumine recupera o valor do resulset.

Faço dessa forma para alguns clientes, onde possibilito a eles criarem relatórios sozinhos. A ferramenta não é muito complexa, mas quebra um galho violento.
Em algumas colunas, utilizo procedures para facilitar.

Em anexo algumas telas para vocês verem deste módulo de relatórios.

Se eu precisar chamar procedures que retornem um valor escalar (string, int, float, etc), por exemplo, eu posso colocar no campo formatação, ou utilizar funções de formatação do banco.

Se a procedure retorna um resultset, o retorno vai ser interpretado como uma query e, teoricamente, os resultados devem vir normalmente (coloquei teoricamente pois ainda não efetuei este teste).
Se você tiver uma procedure/função que retorne um resultset, teste fazer o seguinte:

$obj = new Pessoa(); // classe gerada pelo Lumine
$obj->query('SELECT myHappyProcedure()');

print_r( $obj->allToArray() );



@braços e fique com Deus!

Attached File(s)


0

#3 User is offline   hufersil 

  • Group: Moderadores
  • Posts: 1266
  • Joined: 15-January 04

Posted 24 November 2010 - 03:41 PM

Sobre o controle de transação:

Você está fazendo comando que altere estruturas de tabela ou metadados? O MySQL tem algumas restrições em relação a isso.
Suas tabelas são InnoDB? MyISAM não suporta transação.

Eu utilizo numa boa em meus projetos.

Se puder, envie a estrutura e um trecho do código para que eu possa efetuar os testes.
Envie também a versão do Lumine que está usando.

@braços
0

#4 User is offline   ayslan 

  • Group: Membros
  • Posts: 13
  • Joined: 24-August 10

Posted 25 November 2010 - 02:38 PM

Olá Hugo,

Estou utilizando a versão 1.5.7 do Lumine.
As tabelas são InnoDB e estou alterando somente dados. Segue o código:

Recebo os dados no "codebehind", crio uma instância do objeto controller dos grupos e chamo a função groupPermission deste objeto. Ocorre o seguinte erro: "Metodo inexistente: begin". Explicando melhor, ocorre o erro no begin, entra no catch, ocorre o erro no rollback também, e a mensagem de erro no final da função é "Metodo inexistente: rollback". Talvez a estrutura não seja a ideal, mas o importante nesse momento é que não está reconhecendo as funções de transações.

public function groupPermission($_groupId, $_groupPermissionList)
{
   $arrayPermission = explode(',', $_groupPermissionList);
   $groupActObj = new GroupAction();
		
   try
   {		
	$groupActObj->begin();			
			
	$groupActObj->where('groupId = ' .$_groupId);
	$groupActObj->delete(true); // Remove baseado na condição where.
				
	foreach( $arrayPermission as $perm )
	{					
		if($perm != '')
		{
			$groupActObj->groupId = $_groupId;
			$groupActObj->actionId = $perm;
			$groupActObj->addMultiInsertItem();
		}
	}
				
	$groupActObj->multiInsert();
	$groupActObj->commit();
   }
   catch(Exception $e)
   {
	$groupActObj->rollback();
	throw new Exception('Erro ao Salvar Permissões de Grupo.');
   }
}


Obrigado e Deus o abençoe!



View Posthufersil, on 24 November 2010 - 03:41 PM, said:

Sobre o controle de transação:

Você está fazendo comando que altere estruturas de tabela ou metadados? O MySQL tem algumas restrições em relação a isso.
Suas tabelas são InnoDB? MyISAM não suporta transação.

Eu utilizo numa boa em meus projetos.

Se puder, envie a estrutura e um trecho do código para que eu possa efetuar os testes.
Envie também a versão do Lumine que está usando.

@braços

0

#5 User is offline   hufersil 

  • Group: Moderadores
  • Posts: 1266
  • Joined: 15-January 04

Posted 26 November 2010 - 04:34 PM

Olá ayslan!

Perdão pela minha falha, mas é realmente de outra forma (maldita leitura dinâmica kkk).

É através do objeto de conexão com o banco que você consegue iniciar a transação:

$obj = new Pessoa();
$obj->_getConnection()->begin();
....

$obj->_getConnection()->commit();

// ou

$obj->_getConnection()->rollback();


@braços e fique com Deus!
0

#6 User is offline   ayslan 

  • Group: Membros
  • Posts: 13
  • Joined: 24-August 10

Posted 28 November 2010 - 05:28 PM

Olá Hugo!

Tudo funcionou perfeitamente agora. Tanto as chamadas às procedures e functions, quanto as transações.

Deus te abençoe, cara!


[Extra Lumine] Aos interessados, ou até curiosos, resolvi não utilizar recursividade no MySQL mesmo já tendo a rotina pronta, pois é preciso utilizar um cursor, etc. Como não sou um programador muito experiente em MySQL, procurei na internet como fazer consultas hierárquicas e encontrei bons posts sobre o assunto. O processo que eu utilizei está neste link (em inglês): http://goo.gl/SyYGG.


Fiquem com Deus!

Ayslan Jenken.



View Posthufersil, on 26 November 2010 - 04:34 PM, said:

Olá ayslan!

Perdão pela minha falha, mas é realmente de outra forma (maldita leitura dinâmica kkk).

É através do objeto de conexão com o banco que você consegue iniciar a transação:

$obj = new Pessoa();
$obj->_getConnection()->begin();
....

$obj->_getConnection()->commit();

// ou

$obj->_getConnection()->rollback();


@braços e fique com Deus!

0

#7 User is offline   hufersil 

  • Group: Moderadores
  • Posts: 1266
  • Joined: 15-January 04

Posted 30 November 2010 - 05:17 PM

Excelente link Ayslan!

Obrigado por compartilhar!

@braços e fique com Deus!
0

Share this topic:


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


Similar Topics Collapse

  Topic Forum Started By Stats Last Post Info
New Replies Vc´s sabem como fazer isso
Me ajudem
Flash & ActionScript Renan Azevedo 
  • 3 Replies
  • 1020 Views
New Replies Como inserir um botão neste código? Flash & ActionScript hekick 
  • 0 Replies
  • 498 Views
New Replies Como fazer download
no flash ?
Flash & ActionScript westerFERNANDO 
  • 0 Replies
  • 588 Views
New Replies Como que distorce no PS??
Não sei nem fazer isso!
Photoshop & Image Ready Jacoh 
  • 2 Replies
  • 1072 Views
New Replies Como coloca nome na foto com marca d´gua??
quero escreveo nome do site na foto
Fireworks Renan Azevedo 
  • 4 Replies
  • 7184 Views
New Replies Alinhamento inferior do texto com o ScroolBar no flash
Como alinhar a textarea com a ponta da seta que faz o texto descer?
Flash & ActionScript Heremitsoldier 
  • 1 Reply
  • 851 Views
New Replies Sistema de newsletter na página criada
... como colocar um newsletter?
ASP e ASP.Net heltonweb 
  • 2 Replies
  • 869 Views
New Replies MMS no Flash
tem como?
Flash & ActionScript N007 
  • 2 Replies
  • 2436 Views

Publicidade




2 User(s) are reading this topic
0 membro(s), 2 visitante(s) e 0 membros anônimo(s)