Ir para conteúdo

POWERED BY:

Arquivado

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

Rogério Dias

Número de registros Mysql

Recommended Posts

Amigos, tenho um sistema onde funcionam duas empresas "A" e "B" no mesmo banco e nenhuma tem acesso aos registros de outra empresa.

As duas empresas cadastram "Ordens de serviço".

Só que está acontecendo o seguinte problema...

A empresa "A" cadastrou sua primeira OS que pegou o nº id 1 (logicamente... rsrsr), porém a empresa "B", quando cadastrou também a sua primeira OS, pegou o nº id 2.

Como fazer com que esses números não deêm sequencia entre as duas empresas?

Cada empresa deveria ter sua sequência independete.

 

Alguém pode me ajudar?

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não dá, é um sistema único que tenho que, por enquanto, apenas duas empresas vão utilizar, agora imagine que daqui um ano eu tenha 100 empresas utilizando esse sistema, terei mais 100 tabelas no banco?

 

lembrando que as empresas "A" e "B" tem um empresa_id diferente, sendo assim, uma não vê registros da outra.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então não tem como ter 2 sequências separadas. Mas por que o ID é tão importante seguir uma ordem? Ninguém liga para esses numerozinhos aí... :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na realidade id é único, porém preciso de um contador aliado ao empresa_id para que esse contador conte apartir do 0 (zero) o registro independente para cada empresa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem como, só se for feito manualmente.

Você antes de inserir um novo registro, verifica o último salvo para aquela empresa e soma um.

 

Ainda assim não vejo necessidade. Existem outras formas de se contar quantos registros existem em uma tabela...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja bem, nesse caso são Ordens de Serviços e precisam ter um número para controle, ou seja, como se fosse um número de nota fiscal para ser impresso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia,

 

Você teria como mostrar a forma como esta modelando as tabelas (empresas e ordens_servicos) em seu banco?

 

Imagino que seja mais ou menos assim:

 

Clique aqui

 

Penso que se suas tabelas estiverem modeladas como as da imagem acima, a chave estrangeira(mantendo a integridade referencial) já resolveria seu problema, ou não?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, faz em tabelas separadas, é bem melhor, e não mistura informações de ambas ..

 

hehehe, a "solução" de tabelas separadas é tão estapafúrdia, que uma lágrima escorreu aqui de tanto rir. Fiquei pensando na pessoa responsável pela manutenção, tendo que gerenciar 1000 tabelas de 1000 empresas.

 

Como fazer com que esses números não deêm sequencia entre as duas empresas?

Cada empresa deveria ter sua sequência independete.

 

Vamos supor que você tenha uma tabela de empresas assim:

 

CREATE TABLE `Company` (
`idCompany` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`companyName` VARCHAR(45) NOT NULL,
`companyOrderNumber` INT(10) UNSIGNED NOT NULL DEFAULT '1',
PRIMARY KEY (`idCompany`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

Perceba que temos um "companyOrderNumber" que onde estará armazenado o número da ordem de serviço dessa empresa.

 

Vamos inserir duas empresas nessa tabela:

 

INSERT INTO `example`.`Company` (`companyName`) VALUES ('Empresa 1');
INSERT INTO `example`.`Company` (`companyName`) VALUES ('Empresa 2');

 

Ai, temos uma tabela de ordem de serviço parecida com essa:

 

CREATE TABLE `Order` (
`idOrder` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`idCompany` INT(10) UNSIGNED NOT NULL,
`orderNumber` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`orderDescription` VARCHAR(45) NOT NULL,
PRIMARY KEY (`idOrder`),
KEY `companyOrder` (`idCompany`,`orderNumber`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

Perceba que temos aqui o idCompany e o orderNumber. Agora criamos um TRIGGER para popular essa coluna de acordo com a numeração da empresa:

 

DELIMITER $
CREATE TRIGGER `updateOrderNumber` BEFORE INSERT ON `Order`
FOR EACH ROW BEGIN
	SET @num = (SELECT `companyOrderNumber` FROM `Company` WHERE `Company`.`idCompany`=NEW.idCompany);
	SET NEW.orderNumber=@num;

	UPDATE  `Company` SET `companyOrderNumber`=`companyOrderNumber`+1 WHERE `idCompany`=NEW.idCompany;
END$
DELIMITER ;

 

Agora inserimos alguns registros:

 

INSERT INTO `example`.`Order` (`idCompany`, `orderDescription`) VALUES (1, 'Primeira ordem');
INSERT INTO `example`.`Order` (`idCompany`, `orderDescription`) VALUES (1, 'Teste');
INSERT INTO `example`.`Order` (`idCompany`, `orderDescription`) VALUES (1, 'Outra ordem');
INSERT INTO `example`.`Order` (`idCompany`, `orderDescription`) VALUES (2, 'Primeira ordem da segunda empresa');
INSERT INTO `example`.`Order` (`idCompany`, `orderDescription`) VALUES (1, 'Outro teste');
INSERT INTO `example`.`Order` (`idCompany`, `orderDescription`) VALUES (2, 'Segunda ordem da segunda empresa');
INSERT INTO `example`.`Order` (`idCompany`, `orderDescription`) VALUES (2, 'Teste');
INSERT INTO `example`.`Order` (`idCompany`, `orderDescription`) VALUES (1, 'Outra ordem da primeira empresa');

 

Veja que não informamos nesses inserts a numeração das ordens de serviço, isso é feito automaticamente pela TRIGGER. O resultado disso será:

 

mysql> use example;
Database changed
mysql> SELECT * FROM `Order`;
+---------+-----------+-------------+-----------------------------------+
| idOrder | idCompany | orderNumber | orderDescription              	|
+---------+-----------+-------------+-----------------------------------+
|   	1 | 		1 |   		1 | Primeira ordem                	|
|   	2 | 		1 |   		2 | Teste                     		|
|   	3 | 		1 |   		3 | Outra ordem               		|
|   	4 | 		2 |   		1 | Primeira ordem da segunda empresa |
|   	5 | 		1 |   		4 | Outro teste               		|
|   	6 | 		2 |   		2 | Segunda ordem da segunda empresa  |
|   	7 | 		2 |   		3 | Teste                     		|
|   	8 | 		1 |   		5 | Outra ordem da primeira empresa   |
+---------+-----------+-------------+-----------------------------------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM `Order` WHERE `idCompany`=1;
+---------+-----------+-------------+---------------------------------+
| idOrder | idCompany | orderNumber | orderDescription            	|
+---------+-----------+-------------+---------------------------------+
|   	1 | 		1 |   		1 | Primeira ordem              	|
|   	2 | 		1 |   		2 | Teste                   		|
|   	3 | 		1 |   		3 | Outra ordem             		|
|   	5 | 		1 |   		4 | Outro teste             		|
|   	8 | 		1 |   		5 | Outra ordem da primeira empresa |
+---------+-----------+-------------+---------------------------------+
5 rows in set (0.00 sec)

mysql> SELECT * FROM `Order` WHERE `idCompany`=2;
+---------+-----------+-------------+-----------------------------------+
| idOrder | idCompany | orderNumber | orderDescription              	|
+---------+-----------+-------------+-----------------------------------+
|   	4 | 		2 |   		1 | Primeira ordem da segunda empresa |
|   	6 | 		2 |   		2 | Segunda ordem da segunda empresa  |
|   	7 | 		2 |   		3 | Teste                     		|
+---------+-----------+-------------+-----------------------------------+
3 rows in set (0.00 sec)

mysql> 

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

hehehe, a "solução" de tabelas separadas é tão estapafúrdia, que uma lágrima escorreu aqui de tanto rir. Fiquei pensando na pessoa responsável pela manutenção, tendo que gerenciar 1000 tabelas de 1000 empresas.

 

Pois é, na hora foi o que me veio a cabeça, afinal, esse tipo de abordagem é melhor por dois motivos, um porque é fácil dar manutenção, dois, porque fica claro como os dados se relacionam ..

 

E sinceramente, não estou acostumado a pensar muito nesse tipo de 'e se' .. se o cliente fala que vai fornecer ordens de serviços entre duas empresas, eu crio duas tabelas, agora, se algum dia ele vier a querer fornecer mais .. aí sim é questão de analisar a modelagem e procurar uma solução na qual seria adaptada para N empresas.

 

Mesma coisa aconteceu uma vez comigo, sobre telefones de contato, o cliente falou que só iria trabalhar com 2 telefones, ou seja, o telefone , e o telefone alternativo .. também tinha o celular, mas não vem ao caso, daí eu falei o seguinte, 'e se ele quiser adicionar mais telefones, uma pessoa pode ter N telefones para contato, os quais ele pode ou não ser achado', como dar o telefone de um parente mais próximo, ou alguém que passe o contato para frente ..

 

Daí responderam assim 'normalmente as pessoas passam os telefones, mais importantes, sendo eles o fixo, e um comercial, se essa pessoa precisar adicionar mais um, ele não que é ser achado', e sinceramente, quem disse isso tem toda razão, se você complica de mais a página, enchendo de firulas como 'clique aqui para adicionar mais um telefone' .. e sai criando campos .. acaba sendo desnecessário e a página fica cheia de frescuras ..

 

Ou resumindo, se o cara pode passar dois telefones, que passe os que ele é achado facilmente, ou no local de trabalho, ou em sua casa ..

 

Por isso, que as vezes você faz o que o cliente quer, como ele pediu ordens de serviço pra duas empresas, não quer dizer que vai haver mais, ou também não quer dizer que ele não vá pedir mais ..

Compartilhar este post


Link para o post
Compartilhar em outros sites

João Batista, achei muito interessante a sua dica e tentei reproduzir um teste, porém, ao tentar criar o TRIGGER com o código que você postou, o Mysql retornou o seguinte erro:

 

#1227 - Access denied; you need the SUPER privilege for this operation

 

como resolver isso?

Abraços irmão!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aí nos seus privilégios não tem a opção TRIGGER, olha como é no cPanel do meu servidor:

 

triggern.png

 

 

Parece que o seu servidor está rodando uma versão desatualizada do MySQL. Se eu não me engano o TRIGGER está disponível a partir da versão 5 do MySQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso mesmo, rodei no meu servidor local que é a versão 5.5.8 e funcionou perfeitamente. No meu servidor web não funcionou por ser uma versão desatualizada, vou entrar em contato com o pessoal para atualizar.

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.