Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Washington Patricio

Trabalhando com dois banco de dados.

Recommended Posts

Bom Dia Galera!

 

Minha dúvida é relacionada à banco de dados mas acho que trata também das referências da linguagem, por isso postei aqui no PHP.

 

Bom.. estou trabalhando alguns tempo no desenvolvimento de um e-commerce integrado á um ERP da Totvs, ou seja, tenho um banco de dados para o e-commerce (MySQL) e outro onde executo algumas consultas no Sistema ERP (MSSQL).

 

Até então não estava tendo grandes problemas, mas...

 

Tenho no MySQL uma tabela onde tenho informações dos produtos que são lançados para venda no site e tenho uma outra tabela, essa em MSSQL, que possui informações de estoque destes produtos.

Minha necessidade seria cruzar essas informações no momento da consulta.

 

Alguém possui uma idéia ou uma solução ?

 

Att.

Washington Patrício

Compartilhar este post


Link para o post
Compartilhar em outros sites

"Você mencionou o PostgreSQL (não é Postgre nem potgree nem postigri como já vi escrito).

 

Se fosse o MS SQL Server, é possível relacionar tabelas em bancos diferentes, se os bancos tiverem drivers ADO disponíveis (ou seja, você pode relacionar uma tabela do MS SQL Server com uma do Oracle).

 

No caso do PostgreSQL, acho que isso não exista (mas dê uma olhadinha na documentação), ou seja, provavelmente você vai ter de fazer alguns relacionamentos pelo seu programa." thingol.

fonte:http://www.guj.com.br/java/75886-join-em-tabelas-em-bancos-diferentes

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use ADODB.. assim você pode fazer consultas nos dois bancos, apenas definindo variaveis, uma para cada conexão com o banco de dados. e na hora de executar a query apenas passar como parametro do banco de dados!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use ADODB.. assim você pode fazer consultas nos dois bancos, apenas definindo variaveis, uma para cada conexão com o banco de dados. e na hora de executar a query apenas passar como parametro do banco de dados!

 

Amigo, já ouvi falar de ADODB, mas confesso que nunca trabalhei com ele.

Saberia me responder se é possível realizar em uma única consulta um Inner Join com uma tabela do mySQL com outra tabela do MSSQL?

Poderia me dar um exemplo?

 

Agradecido!

Compartilhar este post


Link para o post
Compartilhar em outros sites

faça uma integração por meio de integração com APIs (webservices)

 

Pelo fato de ser um ERP, o banco de dados deve ser encapsulado, utilizar uma conexão direta com esse banco de dados por comprometer a segurança de toda a empresa e, por isso, o uso de webservices, é altamente aconselhável.

 

Uma outra possibilidade é utilizar um servidor de buscas como o Sphinx

Compartilhar este post


Link para o post
Compartilhar em outros sites

faça uma integração por meio de integração com APIs (webservices)

 

Pelo fato de ser um ERP, o banco de dados deve ser encapsulado, utilizar uma conexão direta com esse banco de dados por comprometer a segurança de toda a empresa e, por isso, o uso de webservices, é altamente aconselhável.

 

Uma outra possibilidade é utilizar um servidor de buscas como o Sphinx

 

Bom.. vou explicar minha situação mais detalhada pra chegarmos numa solução.

 

Tenho em meu sistema uma função responsável pela listagem de produtos na pagina. Onde com base em definições passadas ele monta uma consulta SQL vejam:

 

	# Verifica usuario logado
	if(!$_SESSION['klimax_'.token()]['login']['id']):
		$preco = 'style="display:none;"';
	endif;

	# Inicia a construçao da consulta SQL
       	$select 		 = "SELECT * FROM `prd_produto` ";
	$where 			.= " WHERE `prd_produto`.`visivel` LIKE '1' ";

	# Exibir somente destaques?
	if($destaque):
		$where 		.= " AND `prd_produto`.`destaque` LIKE '1' ";
	endif;

	#Verifica a subcategoria
	if($categoria):
		$innerjoin 	.= " INNER JOIN `prd_produto_categoria` ON `prd_produto`.`produto_id` = `prd_produto_categoria`.`id_produto` ";
		$where		.= " AND `prd_produto_categoria`.`id_categoria` LIKE '" . $categoria . "' ";
		$cat_url 	 = '&categoria='.$categoria;
	endif;

	#Verifica a subcategoria
	if($subcategoria):
		$where		.= " AND `prd_produto_categoria`.`id_subcategoria` LIKE '" . $subcategoria . "' ";
		$scat_url 	 = '&subcategoria='.$subcategoria;
	endif;

	#Verifica a marca
	if($marca):
		$innerjoin 	.= " INNER JOIN `prd_marca` ON `prd_produto`.`marca` = `prd_marca`.`id` ";
		$where 		.= " AND `prd_produto`.`marca` LIKE '".$marca."' ";
		$mrk_url	 = '&marca='. $marca;
	endif;

	# Monta a query baseado na ordem.
	switch($ordem):
		case 'maisvendidos':
			$orderby .= " ORDER BY `prd_produto`.`num_vendas` ".$listOrder;
		break;

		case 'maisvisualizados':
			$orderby .= ' ORDER BY `prd_produto`.`num_visualizacoes` '.$listOrder;
		break;

		case 'porcodigo':
			$orderby .= ' ORDER BY `prd_produto`.`codigo` '.$listOrder;
		break;                

		case '---ome':
			$orderby .= ' ORDER BY `prd_produto`.`nome` '.$listOrder;
		break;

		default:
			$orderby .= ' ORDER BY RAND()';
		break;
	endswitch;

	#Monta a SQL
	$sql = $select.$innerjoin.$where.$orderby;

	# Monta a query.
	$query['produto_total'] = @mysql_query($sql) or fail('mySQL Error: '.mysql_error());

 

Esta consulta vai resultar em uma listagem com produtos que estão disponíveis no banco. O meu problema é que eu necessito verificar no banco de dados do ERP de o produto possui ou não slado em estoque, pois só assim, eu exibo ou oculto o botão "Comprar".

 

Vejam aqui tenho uma função que com base no código do produto verifica o saldo no estoque no banco do ERP

 

# Consulta o saldo de estoque de um produto no protheus
function consultaSaldo($codProduto)
{
	$connection = mssql_connect(mssql_server,mssql_user,mssql_password) or fail('DB100');
	@mssql_select_db('protheustst', $connection) or fail('Erro ao conectar com o banco de dados Protheus.');
	$query['saldo_produto'] = mssql_query("SELECT B2_COD, B2_QATU FROM SB2010 WHERE B2_COD = '".$codProduto."';");
	$ved = mssql_fetch_object($query['saldo_produto']);
	return $ved->B2_QATU;
}

 

Até aí tudo bem eu consigo saber o produto e seu saldo.. e até exibi-lo na listagem corretamente. Porém gostaria de fazer uma melhoria nessa listagem.

Gostaria de Ordenar essa listagem de acordo com a disponibilidade do produto.. Se o produto está disponível em estoque ele fica no topo, caso contrário, vai pro fim da listagem.

 

O meu problema é que eu só sei se o produto está disponível após já realizada a consulta, pois vou no outro banco e verifico o saldo dele.

 

Sacaram meu lance? Alguém possui uma sugestão ?

 

Abraços e muito obrigado galera

Compartilhar este post


Link para o post
Compartilhar em outros sites

não li os códigos, pulei direto para as suas descrições

 

O meu problema é que eu só sei se o produto está disponível após já realizada a consulta, pois vou no outro banco e verifico o saldo dele

 

Faça algum tipo de cache.

Por exemplo, coloque um schtask (windows) ou crontab (unix) para executar algum outro script que faça isso e grave numa outra tabela que servirá de cache.

Aí então você faz a consulta nessa tabela de cache.

 

 

Quanto a performance, se puder, rode a parte pesada no server que não seja do website. O site é a vitrine e tem que estar livre de processos para obter boa performance ao usuário.

 

Para processos em background, execute-os usando multi-threads. O Apache tem a versão thread-safe.

Execute num thread diferente do utilizado pelo site, para evitar travá-lo quando o aplicativo executar.

 

 

Outro modo que facilita bastante, é o aplicativo ERP fazer esse processo de setar as flags necessárias para o website e inclusive gerar os dados de cache. Isso diminuirá boa parte dos processos desnecessários.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.