[firebase-br] [Fwd: Help com um SQL]

Coutinho - IG emanuel.coutinho em ig.com.br
Qui Fev 26 16:24:45 -03 2009


Colegas...

Sou meio que novato no uso de triggers e stored procedures assim,
preciso da ajuda de vocês:

Tenho uma aplicação que roda com uma base de dados access e muitas das
rotinas que estão sendo executadas no aplicativo poderiam ser rodadas no
banco, mas eu não tenho muito conhecimento de algumas técnicas... E
estou migrando para Firebird!

Agradeço desde já se alguém tiver material que dê exemplos claros, não 
apenas a sintaxe de stored procedures, pois a sintaxe não é o problema...
Por exemplo: Posso fazer vários updates numa única stored procedure?, 
posso fazer vários inserts numa única stored procedure... em tabelas 
diferentes?
Há alguma coisa que posso faze só em stored procedures que não possa 
fazer em um trigger? Como faço para verificar um valor em uma tabela e 
dependendo do valor, atualizar, incluir, ou excluir em uma outra tabela? 
Essas coisas... Assim, se alguém tiver material que possa me indicar, 
que seja tipo apostila, ou algo que valha, ficarei muito grato.

Preciso desenvolver uma rotina que no banco, pegue o valor de um 
determinado campo em uma tabela, e dependendo do campo, e do valor 
contido, insira ou exclua um registro em uma outra tabela...

Vou dar um exemplo:

Tenho algumas tabelas:

ISOMETRICOS -> ISOMÉTRICOS DE TUBULAÇÃO DO PROJETO SENDO CONSTRUÍDO
( a estrutura dessa não importa muito só que ela é a mãe das outras)

ISOMETRICOS_LM -> LISTA DE MATERIAIS DOS ISOMETRICOS DE TUBULAÇÃO
lm_codigo autoinc PK
lm_tipo, varchar 40,
is_codigo (fk igual a chave primária de isometricos)
lm_descricao varchar 250
lm_peso decimal 10,3
lm_JuntaFab inteiro (refere-se ao código da junta que dará avanço de
fabricação)
lm_JuntaMont inteiro (refere-se ao código da junta que dará avanço de
montagem)

(... há ainda outros campos que não importam agora)

ISOMETRICOS_LM_AVANCOS -> AVANÇOS DA CONSTRUÇÃO, E QUE SÃO PARÂMETROS
PARA MEDIÇÃO
lma_codigo (autoinc) PK
ta_codigo inteiro fk com TIPOS DE AVANCOS
lm_codigo inteiro FK com ISOMETRICOS_LM
lma_pct
lma_pesoavancado
e outros campos...

ISOMETRICOS_JUNTAS -> SÃO AS JUNTAS SODLADAS QUE UNE OS TRECHOS DE
TUBO DA TUBULAÇÃO SENDO CONSTRUÍDA
jt_codigo (autoinc) PK
is_codigo inteiro FK com ISOMETRICOS
jt_spool varchar 5
jt_nbr smallint
jt_letra varchar 3
jt_bisel Date
jt_acoplamento Date
jt_solda date
jt_tipo char 2
jt_local char 2

e mais outros campos que não são importantes agora

A questão é a seguinte:
Tenho alguns tipos de avanço que são codificados em ordem cronológica de
1 a 4 para cada disciplina e critério... e cada item da LM pode ter:
Fabricação 1 - Corte/Bisel
Fabricação 2 - Acoplamento
Fabricação 3 - Solda
Fabricação 4 - Inspeção EVS

Montagem 1 - Lançamento
Montagem 2 - Acoplamento
Montagem 3 - Solda
Montagem 4 - Inspeção EVS

A chave da coisa toda está nas juntas.
Ao colocar uma data no biselamento (para as juntas do jt_Local=SW, que
também é avanço para o lançamento para as juntas do jt_Local=FW) tenho
de incluir na tabela ISOMETRICOS_LM_AVANCOS o lançamento pertinente.
Se a junta é SW, insiro um lançamento para o avanço Fabricação 1
Se a junta é FW insiro um lançamento para o avanço Montagem 1
Se for colocada uma data no campo acoplamento, faço o mesmo para
Fabricação 2 e Montagem 2
Se for colocada uma data no campo Solda, faço o mesmo para Fabricação 3,
Montagem 3

O que eu não sei..

Como posso montar um trigger para pegar o que foi alterado no registro
em isometricos_juntas, e dependendo da junta (SW ou FW) selecionar todos
os itens de
isometricos_lm que tem o lm_juntafab dessa junta (se for SW) ou os itens
de isometricos_lm que tem o lm_juntamont (se for FW), e para cada um
deles verificar se já tem o lançamento pertinente. Caso não tenha,
inserir um registro adequado.
Se por acaso o campo da data de bisel ou de acoplamento, ou de solda for
apagado, tem de ir lá retirar o lançamento...

pensei em alguma coisa usando o on Select... mas aí eu esbarro em como
fazer certas buscas nas outras tabelas e filtrar dentro do próprio
Trigger!!!

Sei que para muitos pode ser alguma coisa bem banal o que estou perguntando.
A rotina está rodando blz mas é um processo que tenho de rodar no final
do dia, pois demora muito... e dar o resultado atualizado aos gerentes
pela manhã!!!
Queria fazer a coisa acontecer on-the-fly, no momento que o campo da
junta fosse atualizado...

Será que consegui me fazer entender? Pois sei que os colegas estão mais
acostumados aos termos comerciais, notas fiscais, faturamento etc, e
isso é MUITO específico.

PEÇO PERDÃO por esta mensagem ser tão longa...

Sds
Emanuel Coutinho







Mais detalhes sobre a lista de discussão lista