PROBLEMA PK COMPOSTA MYSQL E DELETE TRIGGER?

MESTRE 13/12/2016 09:53:02
#469665
Fala galera beleza? estou com um problema.. precisei criar uma pk composta na tabela orcamento_itens conforme abaixo:

Numero (bigint) PRIMARY KEY
Mes (varchar) PRIMARY KEY
Ano (int) PRIMARY KEY
Item (bigint) <- PRIMARY KEY E AUTO_Increment



preciso que os dados fiquem da seguinte forma:

1 08 2016 1
1 08 2016 2

Porem quando eu vou colocar o 2 12 2016 deveria ser :

2 12 2016 1
só que na verdade fica:


Alguem sabe alguma forma de eu resolver isso? preciso criar uma Constraint ? na tabela de orçamento tive o mesmo problema porém não sei nem como consegui resolver que do nada começou a funcionar e contar os orçamentos..

OBS: tentei utilizando uma trigger abaixo porem esta dando erro
  CREATE TRIGGER  Orcamento_Item BEFORE INSERT ON  ordemservicocotacaoitem_hc

FOR EACH ROW BEGIN

DECLARE numero INTEGER;

SET numero = (SELECT MAX(ITEM) FROM ordemservicocotacaoitem_hc WHERE Numero = new.Numero AND Mes = new.Mes AND Ano = new.Ano);



IF (numero <= 0) OR (numero IS NULL)THEN

SET numero = 1;

ELSE

SET numero = numero + 1;

END IF;

SET new.ITEM = numero;

END$$



DELIMITER ;$$


da o erro:
  1 queries executed, 0 success, 1 errors, 0 warnings

Query: CREATE TRIGGER Orcamento_Item BEFORE INSERT ON ordemservicocotacaoitem_hc FOR EACH ROW BEGIN DECLARE numero INTEGER

Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near [ô][ô] at line 5

Execution Time : 0 sec
Transfer Time : 0 sec
Total Time : 0.006 sec


E outra duvida:
E também tenho outra duvida, preciso que ao deletar o item por exemplo tenho 10 itens, ao deletar o item 2, o 3 deve virar 2, o 4 virar 3º etc tem alguma trigger que posso utilizar pra facilitar e fazer isso automaticamente no AFTER DELETE?


Sera que é dá? na verdade a dificuldade está no delete tbm, pois se for AUTO_increment não poderei reorganizar os itens, então acredito que eu não deva usar auto_increment no ITEM

KERPLUNK 13/12/2016 10:51:20
#469666
Vamos devagar. Estou achando que seu problema é de estrutura de dados e essa PK tá meio exagerada.
Qual a estrutura da tabela e para que ela serve?
Tem alguma outra tabela que tem relação com ela? Tipo, ela é [Ô]filha[Ô] de alguma outra?
MESTRE 13/12/2016 11:36:26
#469667
Fala kerp, tranquilo? então essa estrutura é a de orçamento e itens de orçamento.. basicamente segue a logica de tabelas básica padrão nf e itens nf, só que com algumas particularidades..

porém esbarrei em 2 problemas:
1.[/b] Como retornar o numero de proposta comercial sendo que ele é composto de 3 pk[ô]s (numero) AUTO_INC,mes,ano da tabela (tentei utilizando LAST_INSERT_ID) porém apenas é mostrado um monte de registros com 0. (isso na tabela orcamento) [txt-color=#007100] DONE[/txt-color] (< ja consegui era cabaçada minha KKK)

[b]2.
Ja tirei o AUTO_INC do ITEM da tabela orcamento_itens, pois preciso também deletar o item e [Ô]realocar[Ô] a posição dos itens subsequentes ou seja: tenho 4 itens de orçamento caso deletar o 2º item, o 3º tem que virar 2º e o 4º virar o 3º, até ai pensei em pegar a posição do item ao ser deletado, item 2 no caso, deletar ele no banco e fazer um while para que de update nos proximos itens (tipo: item = item-1).. por isso tirei o AUTO_INC do itens.. é meio estranho eu sei, porém [Ô]queridos[Ô] funcionários já estão acostumados a fazer tal procedimento e não deve-se mecher com eles pois sabe como são usuarios né? (isso na tabela orcamento_itens)
PLUGSOFTSM 13/12/2016 12:24:42
#469669
Resposta escolhida
Pelo que entendi, para cada numero repetido vc precisa iniciar uma nova numeração a partir do 1 que vai crescendo para cada linha que é acrescentada.
Vi que vc usa o MySql daí eu não sei muito bem como fazer. Eu uso o SqlServer e nele, isso poderia ser resolvido de três maneiras bem simples:
1 - Criar uma sequência - Veja se o MySql suporta esse recurso;
2 - Mudar o tipo item para coluna calculada e aplicar uma função que atualize o contador do item. Isso resolveria tb para os casos de exclusão de linhas;
3 - Criar uma trigguer que nas ações insert e delete atualize o teu campo Item;

Veja a opção que vc achar melhor e que o MySql suporte e me diga que te passo um código em sql server é claro, mas daí vc adapta para o mysql
KERPLUNK 13/12/2016 12:31:58
#469670
Pode mostrar a estrutura das tabelas?
MESTRE 13/12/2016 13:05:58
#469672
Citação:

:
Pelo que entendi, para cada numero repetido vc precisa iniciar uma nova numeração a partir do 1 que vai crescendo para cada linha que é acrescentada.
Vi que vc usa o MySql daí eu não sei muito bem como fazer. Eu uso o SqlServer e nele, isso poderia ser resolvido de três maneiras bem simples:
1 - Criar uma sequência - Veja se o MySql suporta esse recurso;
2 - Mudar o tipo item para coluna calculada e aplicar uma função que atualize o contador do item. Isso resolveria tb para os casos de exclusão de linhas;
3 - Criar uma trigguer que nas ações insert e delete atualize o teu campo Item;

Veja a opção que vc achar melhor e que o MySql suporte e me diga que te passo um código em sql server é claro, mas daí vc adapta para o mysql


1. já resolvi utilizando last_insert_id corretamente.. tava usando no banco de dados direto kkkkkk acreditem se quiser to sob efeito de 3 remedios e trabalhando enquanto devia estar de folga mas é isso aí...

obs: da tabela ordemservico_itens resolvi tirar a AUTO_INC do ITEM e manter ele como INT normal..

3. Fiquei interessado, teria que fazer uma Trigger que ao deletar por exemplo item 2 ele desse um update no item de todos os meus registros que atendessem a clausula WHERE Numero=Numero AND Mes=Mes AND Ano=Ano, fazendo item=item-1... pois dai eu só teria o trabalho de fazer o DELETE FROM no projeto e a trigger se encarregaria de realizar o update dos itens.

Citação:

:
Pode mostrar a estrutura das tabelas?


Acho que unica solução seria tirar o AUTO_INC da ITEM devido terq fazer update alterar o item e etc e desconheço campo AUTO_INC que permita fazer update, conforme tenho que manipulá-lo conforme explicação (item 3.) então o problema foi resolvido agora o grande problema está na trigger de reorganizar os itens quando algum for deletado

Nunca fiz uma trigger desse tipo pois tenho que ler qual o ITEM deletado, e reorganizar os itens fazendo um update..
KERPLUNK 13/12/2016 13:20:11
#469674
E então, pode mostrar a estrutura das tabelas?
MESTRE 13/12/2016 13:34:50
#469676
Citação:

:
E então, pode mostrar a estrutura das tabelas?


Opa kerp, segue aí haha..
create table 'ordemservicocotacao_hc' (
'Numero' bigint (20),
'mes' varchar (6),
'ano' varchar (12),
'Rev' int (11),
'CodCli' varchar (765),
'CodSol' varchar (765),
'Dataofe' datetime ,
'Obs' blob ,
'Pedido' varchar (135),
'DtentradaEnsaio' datetime ,
'DtprevtermEnsaio' datetime ,
'Orcamento' varchar (135),
'Situacao' varchar (135),
'NomeAceite' varchar (135),
'DataAceite' datetime ,
'Desconto' double ,
'mkCodigo' varchar (135),
'rotina' varchar (3),
'NomeUsuario' varchar (135),
'devolucao' varchar (15),
'FatSol' int (10),
'DC' int (10),
'DN' int (10),
'Repasse' double ,
'TotalGeral' double ,
'TotalCobrado' double ,
'DataLiberacao' double ,
'Cancelamento' text ,
'Cliente' varchar (765),
'Solicitante' varchar (765),
'contatoCli' varchar (765),
'setorCli' varchar (135),
'telCli' varchar (135),
'emailCli' varchar (135),
'contatoSol' varchar (765),
'setorSol' varchar (135),
'telSol' varchar (135),
'emailSol' varchar (135)
);

create table 'ordemservicocotacaoitem_hc' (
'Numero' int (10),
'Mes' varchar (30),
'Ano' int (10),
'Item' int (10),
'Rev' int (10),
'Normaos' varchar (135),
'ProdEnsaiado' varchar (765),
'Situacao' varchar (135),
'ObsItem' text ,
'QtdItem' double ,
'UnidItem' varchar (135),
'TotalItem' double ,
'Dias' int (10),
'codform101' int (10),
'CodigoEnsaio' varchar (135),
'qtdAmostra' int (10),
'DataLiberacao' datetime ,
'laboratorio' varchar (135),
'valorItem' double ,
'valorItemFinal' double ,
'valorDesc' double ,
'valorRepasse' double
);

KERPLUNK 13/12/2016 13:36:32
#469677
O campo codigo em [Ô]ordemservicocotacao_hc[Ô] é a chave primária e é único, certo?
MESTRE 13/12/2016 13:40:45
#469678
Citação:

:
O campo codigo em [Ô]ordemservicocotacao_hc[Ô] é a chave primária e é único, certo?


isso certo, na verdade alterei pra Numero pra vc entender.. o Numero(Codigo) é o id auto_inc da tabela orcamento.
chave composta entre codigo,mes e ano..
codigo|mes|ano
Ou seja: 1 12 2016 é unico!!
2 [ô][ô] [ô][ô] é unico! ...
KERPLUNK 13/12/2016 13:43:30
#469679
Tudo que você tem à fazer é adicionar um campo na tabela de itens que vai conter o número do orçamento [Ô]pai[Ô] que é essa tabela. Quando gravar o orçamento e seus itens, grave na tabela de itens o código do orçamento [Ô]pai[Ô]. Como suspeitava, seu problema é de estrutura de dados.
Página 1 de 2 [13 registro(s)]
Tópico encerrado , respostas não são mais permitidas