Professional Documents
Culture Documents
SQL, FOCCO
VISION e
FOCCOMAIL
2014
Sejam bem vindos ao Curso de SQL, Focco Vision e Focco MAIL.
Neste curso de 2 dias trabalharemos com 3 ferramentas que sero muito teis no dia-a-dia das
suas empresas , trazendo vantagem competitiva.
Espero que ao final do curso tenham levado para casa mais conhecimento e novas
experincias.
DIREITOS AUTORAIS
PR-REQUISITOS DO CURSO
PBLICO ALVO
OBJETIVOS DO CURSO
1. INTRODUO AO SQL
Tabela: algo que possui significado sobre o qual as informaes precisam ser
conhecidas. Exemplos: TCLIENTES, TFORNECEDORES
Coluna: descreve ou qualifica caractersticas de uma entidade uma
propriedade de uma tabela.
Relacionamento: associao nomeada entre entidades que faz a ligao entre
as informaes.
Exemplos:
Tabela Coluna
TNFS_SAIDA NUM_NF
TNFS_ENTRADA VLR_TOTAL
TCLIENTES COD_CLI
3. Funcionamento da Linguagem
SQL - STRUCTURED QUERY LANGUAGE
A linguagem SQL lhe permite comunicar com o servidor.
4. Funo SELECT
Comando SELECT Bsico
SELECT identifica quais colunas
FROM identifica qual tabela
WHERE restringe as informaes
JOIN Exemplo
JOIN Resultado
DESCRICAO CIDADE
Relacionamentos
TABELA_PAI.ID = TABELA_FILHA.XXX_ID
Exemplo:
Clientes e Estabelecimentos
Juno: voc pode usar o recurso de juno da linguagem SQL para reunir
dados armazenados em diferentes tabelas, criando um vnculo entre eles. Voc
aprender mais sobre junes em uma lio posterior.
Exemplo: SELECT *
FROM TCLIENTES
Operador Descrio
+ Adio
_ Subtrao
* Multiplicao
/ Diviso
Operador Significado
... AND...
18. A Condio IN
Para testar valores em um conjunto de valores especificado, use a condio IN.
A condio IN tambm chamada de condio de associao. A condio IN
pode ser usada com qualquer tipo de dados.
SELECT *
FROM TCLIENTES
WHERE DESCRICAO LIKE 'A%'
A condio IS NULL testa valores que so nulos. Um valor nulo significa que o
valor no est disponvel, no atribudo, desconhecido ou no aplicvel.
Portanto, no possvel testar com = porque um valor nulo no pode ser igual
ou desigual a nenhum valor.
Operador Significado
SELECT TCLIENTES.COD_CLI
, TPEDIDOS_VENDA.NUM_PEDIDO
, TPEDIDOS_VENDA.DT_EMIS
FROM TPEDIDOS_VENDA
, TCLIENTES
WHERE TPEDIDOS_VENDA.CLI_ID = TCLIENTES.ID
AND TCLIENTES.COD_CLI = '1118'
23. O Operador OR
O exemplo exibe todos os pedidos de venda do cdigo do cliente 1118 ou do
cdigo do cliente 688.
SELECT TCLIENTES.COD_CLI
, TPEDIDOS_VENDA.NUM_PEDIDO
, TPEDIDOS_VENDA.DT_EMIS
FROM TPEDIDOS_VENDA
, TCLIENTES
WHERE TPEDIDOS_VENDA.CLI_ID = TCLIENTES.ID
AND TCLIENTES.COD_CLI = '1118'
OR TCLIENTES.COD_CLI = '688'
25. ORDER BY
A clusula ORDER BY ordena os dados e aparece por ltimo na instruo
SELECT.
O exemplo exibe todos os pedidos de venda ordenados pela data de emisso
dos mesmos.
SELECT TCLIENTES.COD_CLI
, TPEDIDOS_VENDA.NUM_PEDIDO
, TPEDIDOS_VENDA.DT_EMIS
FROM TPEDIDOS_VENDA
, TCLIENTES
WHERE TPEDIDOS_VENDA.CLI_ID = TCLIENTES.ID
ORDER BY TPEDIDOS_VENDA.DT_EMIS
26. ASC
ordem de classificao default, crescente:
SELECT TCLIENTES.COD_CLI
, TPEDIDOS_VENDA.NUM_PEDIDO
, TPEDIDOS_VENDA.DT_EMIS
FROM TPEDIDOS_VENDA
, TCLIENTES
WHERE TPEDIDOS_VENDA.CLI_ID = TCLIENTES.ID
ORDER BY TPEDIDOS_VENDA.DT_EMIS ASC
27. DESC
Para reverter a ordem de exibio das linhas, especifique a palavra-chave
DESC aps o nome da coluna na clusula ORDER BY. O exemplo do slide
classifica o resultado pelo funcionrio contratado mais recentemente.
SELECT TCLIENTES.COD_CLI
, TPEDIDOS_VENDA.NUM_PEDIDO
, TPEDIDOS_VENDA.DT_EMIS
FROM TPEDIDOS_VENDA
, TCLIENTES
WHERE TPEDIDOS_VENDA.CLI_ID = TCLIENTES.ID
ORDER BY TPEDIDOS_VENDA.DT_EMIS DESC
ROUND(45.926, 2) 45.93
TRUNC(45.926, 2) 45.92
19 94 06 07 05 10 43
Exemplo
SELECT SYSDATE
FROM DUAL
SELECT TNFS_SAIDA.NUM_NF
, TTIT_CR.PARC
, TTIT_CR.DT_VCTO
, TTIT_CR.VLR_TIT
, (SYSDATE - TTIT_CR.DT_VCTO) DIAS_EM_ATRASO
FROM TTIT_CR
, TNFS_SAIDA
WHERE TTIT_CR.NFS_ID = TNFS_SAIDA.ID
AND TTIT_CR.VLR_PGTO < TTIT_CR.VLR_TIT
AND TTIT_CR.DT_VCTO < SYSDATE
ORDER BY TNFS_SAIDA.ID DESC
Observao: Se uma data mais atual for subtrada de uma data mais antiga, a
diferena ser um nmero negativo.
TITENS.ID =
TITENS_EMPR.ITEM_ID
TITENS_EMPR.ID = TITENS_EMPR
TITENS_SUPRIMENTOS.ITEMPR_ID Itens das empresas TITENS_EMPR.ID =
TITENS_ESTOQUE.ITEMPR_ID
TITENS_SUPRIMENTOS TITENS_ESTOQUE
Pasta Suprimentos dos Itens Pasta Estoque dos Itens
TITENS_SUPRIMENTOS.I TITENS_SUPRIMENTOS.ID =
D = TITENS_NFE.ITES_ID TPEDC_ITEM.ITEM_ID
TITENS_ESTOQUE.ID =
TMOV_ESTQ.ITESTQ_ID
TMOV_ESTQ
TITENS_NFE TPEDC_ITEM Movimentos do Estoque
Itens da Nota Fiscal Itens dos Pedidos de Compra
Eletronica
Itens
Itens
Itens
TITENS_EMPR.ID =
TITENS_COMERCIAL.ITEMPR_ID
TITENS_COMERCIAL
Pasta Comercial dos Itens
TITENS_COMERCIAL.ID = TITENS_COMERCIAL.ID =
TITENS_NFS.ITCM_ID TITENS_PDV.ITCM_ID
TITENS_NFS TITENS_PDV
Itens da Nota Fiscal de Sada Itens do Pedido de Venda
Itens
TNFS_SAIDA.ID = TPEDIDOS_VENDA.ID =
TITENS_NFS.NFS_ID TITENS_PDV.PDV_ID
TNFS_SAIDA TPEDIDOS_VENDA
Nota Fiscal de Sada Pedidos de Venda
TTP_DOC
Tipo de Documento
Itens TTP_DOC.ID =
TTIT_CP.TP_DOC_ID
TEMPRESAS.ID = TTIT_CP.ID =
TTIT_CP.EMPR_ID THIST_MOV_CP.TP_CP_IDTI
TEMPRESAS THIST_MOV_CP
TTIT_CP Histrico de movimentao
Empresas Ttulos de Contas a Pagar do contas a pagar
Itens
TTP_CP.ID =
TTIT_CP.TP_CP_ID
TFORNECEDORES.ID =
TFORNECEDORES TTIT_CP.TFOR_ID
TTP_CP
Fornecedores
Tipos de Contas a Pagar
TTP_DOC
Tipo de Documento
TTP_DOC.ID =
Itens TTIT_CR.TP_DOC_ID
TEMPRESAS.ID = TTIT_CR.ID =
TTIT_CR.EMPR_ID THIST_MOV_CR.TIT_CR_ID
Itens TCLIENTES.ID =
TTIT_CR.CLI_ID
TCLIENTES
Clientes
TITENS_EMPR TITENS_ESTOQUE
Itens das empresas TITENS_EMPR.ID =
TITENS_ESTOQUE.ITEMPR_ID Pasta de Estoque do Item
TITENS.ID =
TITENS_EMPR.ITEM_ID TITENS_ESTOQUE.ID =
TMOV_ESTQ.ITESTQ_ID
TITENS TMOV_ESTQ
Itens Movimentao de Estoque
Itens
TALMOXARIFADOS1.ID = TALMOXARIFADOS.ID =
TMOV_ESTQ.ALMOX_ID_ORIG TMOV_ESTQ.ALMOX_ID_DEST
TALMOXARIFADOS1 TALMOXARIFADOS
Almoxarifados Almoxarifados
TTP_MOV_ESTQ.ID =
TMOV_ESTQ.TMVES_ID
TTP_MOV_ESTQ
Tipos de Movimentos de
Estoque
TMASC_ITEM TCLIENTES
Mscara do Item Clientes
(Configurado)
TNFS_SAIDA.ID = TITENS_NFS.NFS_ID
TITENS_COMERCI TITENS_NFS
AL Itens da Nota Fiscal de Sada
Itens TITENS_PDV
Itens do Pedido de Venda
TITENS.ID =
TITENS_EMPR.ITEM_ID
TPEDIDOS_VENDA.ID =
TITENS_PDV.PDV_ID
TITENS
Itens TPEDIDOS_VENDA
Pedido de Venda
TNFS_ENTRADA TITENS_NFE
Nota Fiscal de Entrada Itens da Nota Fiscal de Entrada
TNFS_ENTRADA.ID=
TITENS_NFE.NFE_ID
Itens TI
THIST_MOV_ITE_PDC.ITNFE_I
D = TITENS_NFE.ID
TPEDC_ITEM THIST_MOV_ITE_PDC
Itens do Pedido de Compra THIST_MOV_ITE_PDC.PEDCITE Histrico de Movimento dos
M_ID = TPEDC_ITEM.ID itens do Pedido de compra
Itens
TPEDC_ITEM.TPEDC_ID =
TPED_COMPRA.ID TITENS_SUPRIMENTOS.ID =
TPEDC_ITEM.ITEM_ID
TPED_COMPRA TITENS_SUPRIMENTOS
Pedidos de Compra Pasta de Suprimentos do Item
Itens
TITENS_EMPR.ID =
TITENS_SUPRIMENTOS.ITEMPR_ID
TITENS_EMPR
Itens das empresas
TITENS.ID = TITENS_EMPR.ITEM_ID
TITENS
Itens
TMASC_ITEM.ID = TITENS_PLANEJAMENTO.ID
TORDENS.TMASC_ITEM_ID = TORDENS.ITPL_IDTI
TORDENS TITENS_PLANEJAMENTO
TMASC_ITEM
Ordens Itens do Planejamento
Mascaras dos Itens
Itens
TEMPRESAS.ID =
TORDENS.EMPR_ID
TITENS_EMPR.ID =
TITENS_PLANEJAMENTO.ITEMPR_ID
TEMPRESAS
Empresas
TITENS_EMPR.ID =
TMASC_ITEM.ITEMPR_ID
TEMPRESAS.ID =
TITENS_EMPR.EMPR_ID
TITENS_EMPR
Itens das empresas
TITENS.ID =
TITENS_EMPR.ITEM_ID
TITENS
Itens
DIREITOS AUTORAIS
PR-REQUISITOS DO CURSO
PBLICO ALVO
OBJETIVOS DO CURSO
FoccoVISION
1. Localizao no Menu
2. Tela principal
Botes de Manuteno:
Novo: F6 Criar um novo registro.
Atualizar: F10 Gravar as informaes/alteraes.
Cancelar: CTRL+Q Abandonar as alteraes
Apagar: CTRL + A Exclui um relatrio.
Sair: CTRL + S Sair do Programa
Botes de Navegao:
Servem para navegar entre os registros disponveis na tela. (Primeiro, Anterior,
Prximo, ltimo).
Boto de Consulta (F7 / F8): Ativa modo de Consulta pelo nome do relatrio.
Lista de Valores (Relatrios): Apresenta uma lista contendo os relatrios
previamente salvos.
Limpa a Tela:
Pr Visualia SQL: Ativa a Tela de restrio (ver na Prxima Pgina).
Cadastro original do campo: a lupa dos cadastros do FoccoERP. No est
em funcionamento no FoccoVISION.
Ajuda do Sistema:
Libera Relatrio no Menu: Libera o relatrio criado para que os usurios
possam acessar. (Veremos adiante neste treinamento sobre como organizar os
relatrios criados no Menu)
Atalhos: Direciona para os programas cadastrados na lista de atalhos
(Cadastro de Atalhos Gerais FUTL0070).
Selecionando Tabelas
Anlise de Relacionamentos
Anlise de Relacionamentos
Veja acima como fica o SELECT para este tipo de SELEO de dados.
Veja acima como fica o SELECT para este tipo de SELEO de dados.
Observar o sinal: (+)
Exemplo Ord:
O Percentual s/ Total indica qual percentual que o campo (de acordo com os
agrupamentos utilizados) representa no total de registros do relatrio. As outras
operaes, pelo seu nome, so auto-explicativas.
P.S. O relatrio deve ter todos os campos como Nenhum ou se algum campo
estiver marcado com alguma operao de agrupamento, todos os outros
campos devem estar marcados como Agrupamento.
R: Restrio usurio final. Indica que o campo atual poder ser utilizado para
coletar informaes do usurio.
Restrio Fixa: uma restrio que ser incorporada ao SQL, o usurio final
no poder alterar e nem visualizar. Em SQL, representa o where.
PrVisualizaSQL.
Boto Detalhes
DICA: Caso seja necessrio usar separador de milhares, porm, sem casas
aps a virgula, basta escolher a mscara FM999G999G990D99 e retirar os
trs ltimos caracteres, deixando assim FM999G999G990.
$FM999G999G990D99 $ 100,30
FM999G999G990D99 100,30
FM999G999G990 100
Vale citar que possvel alterar todas as mscaras e compor novas, sempre
respeitando as regras vlidas do SGBD Oracle ou Aplicao.
Detalhes JOB: Aqui possvel fazer a criao de uma rotina que ser
executada periodicamente conforme parametrizao, e, neste caso serve para
a gerao peridica de relatrio/arquivos texto. O melhor exemplo de aplicao
do JOB a gerao de arquivos texto de dados para importao em Softwares
de BI (Business Inteligence) em um diretrio especfico.
19. Ordenaes
Repetir este mesmo procedimento para as demais pastas que se deseja criar
4 Clicar em RECORTAR.
5 Clicar com o Boto Direito do Mouse sobre a Pasta onde Deseja colocar o
Relatrio.
7 Clicar em Incio
PASSO a PASSO
4 Clica com o Boto Direito do Mouse sobre o Relatrio que deseja liberar o
acesso.
LEMBRE-SE:
1. Introduo
A empresa Focco Informatica Ltda 1atua no negcio de sistemas de gesto e disponibiliza
solues na rea de gesto empresarial como o FoccoERP. A partir desse sistema principal, outras
solues abrangem diferentes mdulos tais como, CRM (Customer Relationship Management -
Gesto de Relacionamento com o Cliente), WMS (Warehouse Management System), soluo
comercial Web e geradores de informao.
Para o desenvolvimento dessas solues a empresa dividida nos setores de
desenvolvimento de produto, customizao e consultoria. O setor de consultoria tem por objetivo
mapear os processos dos clientes para garantir melhor aderncia e utilizao do sistema de acordo
com o negcio e setor da empresa. Mediante isso, existem solues que auxiliam a tratar e
disponibilizar para o cliente informaes a nvel gerencial para auditoria e tomada de decises.
O objetivo desse trabalho fazer um diagnstico da ferramenta de envio de mensagens
automticas a partir dos dados do FoccoERP para verificar a necessidade de melhorias. Atravs
desse aspecto, definir as etapas de desenvolvimento da modificao na ferramenta em um
cronograma detalhado de tarefas.
Este artigo est dividido nas seguintes sees: diagnstico onde ser revisada a ferramenta
a ser alterada durante o estgio, identificao do problema que mostra a necessidade apresentada,
objetivos e proposta de soluo que mostra a possvel alterao a ser feita e relatrio de
desenvolvimento onde so apresentados os passos da alterao.
2. DIAGNSTICO
Esta seo apresenta uma viso detalhada da ferramenta FoccoMail, juntamente com os
passos a serem seguidos para configurar o envio automtico das mensagens.
2.1. FOCCOMAIL
Atualmente o sistema FoccoERP possui uma ferramenta de envio automtico de mensagens
chamada FoccoMail. Para a execuo do envio dessas mensagens so necessrios alguns
componentes (Figura 1).
1
Site: www.focco.com.br
Figura 1. Fluxo de atividades para execuo do envio
das mensagens automticas do FoccoMail.
A primeira atividade a criao do relatrio que envolve a seleo de fontes dos dados para
posterior envio das mensagens. Esse relatrio desenvolvido usando o gerador de informaes
mostrado na Figura 2.
O gerador de informaes tem por objetivo gerar uma instruo SQL (Structured Query
Language) que ser executada em ambiente de banco de dados a fim de retornar os dados a serem
enviados na mensagem. A execuo dessa instruo interpretada e transformada em um arquivo
XML (Extensible Markup Language) cujos atributos so lidos com o intuito de compor os campos
da mensagem.
Para que as mensagens sejam enviadas necessria a interpretao dos dados para o
formato HTML (HyperText Markup Language). A linguagem de programao XSL (EXtensible
Stylesheet Language) utilizada para interpretar o XML e transformar em HTML. Esses comandos
so cadastrados no Cadastro de Templates que exibido na Figura 3.
3. IDENTIFICAO DO PROBLEMA
Na situao atual da ferramenta, a definio dos destinatrios de e-mail feita no cadastro
de configuraes conforme apresentado anteriormente. Essa definio fixa para cada
configurao, no sendo possvel definir os envios conforme regras baseadas nos dados gerados.
Um exemplo caracterstico o acompanhamento de vendas para representantes da empresa.
Necessidade de envio mensal da gesto de vendas de cada representante juntamente com a
expectativa da empresa para com o mesmo. Da forma como o sistema est estruturado hoje a
soluo para essa necessidade composta pelos itens:
Template: Cadastrada para interpretao dos dados para HTML conforme mostra a Figura
7.
Figura 7: Template cadastrada para interpretao dos dados
do relatrio de acompanhamento de metas.
Configuraes: Cadastro que liga os pontos anteriores e as definies de envio das mensagens.
Nesse ponto so definidos os destinatrios de forma fixa. A Figura 8 mostra um exemplo deste
cadastro.
No relatrio de dados sero includas as tabelas onde se encontram esses dados, de forma
que exista uma coluna na instruo SQL gerada que traga os endereos de e-mail para os quais a
informao daquele registro deve ser enviada. Na figura 11 mostrada a utilizao da tabela
TEMAIL_REP que o repositrio das informaes de contatos de e-mails dos representantes.
Figura 11: Gerador de informaes:relatrio utilizando a tabela TEMAIL_REP.
Importante ressaltar que por questes de execuo o campo e-mail deve obrigatoriamente
ser a coluna dois do relatrio. A rotina de envio das mensagens utiliza a segunda coluna do relatrio
para efetuar o envio diferenciado para cada representante com suas informaes. Essa coluna o
filtro do contedo do relatrio para enviar apenas as informaes do representante em questo.
Diferentemente do relatrio citado na identificao do problema, aps a alterao no ser
necessrio filtrar o representante pelo seu cdigo, apenas que o mesmo tenha um endereo de e-
mail vlido cadastrado na pasta de contatos.
Foi efetuada uma alterao no cadastro de configuraes para que seja possvel identificar
quais as configuraes que utilizaro gerao dinmica de destinatrios de e-mail. Conforme pode
ser visto na figura 12 possvel marcar um indicador para que o tratamento feito para garantir que
exista a informao do e-mail do destinatrio atravs dos campos usurio ou e-mail, existente em
tela seja desconsiderado, j que o destinatrio ser gerado atravs de uma coluna no relatrio de
dados criado no Gerador de Informaes. Nesse contexto o usurio informado sobre a
necessidade de o campo e-mail ser a coluna dois do relatrio, como mostrado na Figura 12.
Figura 12: Cadastro de configuraes com novo campo Destinatrios Dinmicos. Mensagem
mostrada para alertar sobre a restrio nos dados.
Conforme pode ser visto na Figura 14, foi includo um teste do indicador de destinatrios
dinmicos para desviar o processamento original para que seja efetuado o tratamento dos dados de
acordo com o e-mail de cada representante. A nova rotina que efetua esse tratamento pode ser vista
a seguir.
--COLUNA 2 TEM OS E-MAILS DOS DESTINATARIOS
v_select_dest := 'SELECT DISTINCT "col2"
FROM ('||v_select_gi||')
WHERE "col1" NOT IN (SELECT chave
FROM thist_mail
WHERE tconf_mail_id =
'||pi_config_email_id||')';
BEGIN
-- monta o select para que pegue apenas os registros q no foram enviados
-- SELECIONA APENAS OS DADOS REFERENTES AO ENDEREO DE E-MAIL DO REGISTRO
DO CURSOR CORRENTE
v_select := 'SELECT *
FROM ('||v_select_gi||')
WHERE "col2" = '''||v_email_dest||'''
AND "col1" NOT IN (SELECT chave
FROM thist_mail
WHERE tconf_mail_id =
'||pi_config_email_id||')';
END;
END LOOP;
CLOSE cur;
O cdigo da rotina de interpretao e envio das mensagens foi unido em uma nica funo,
pois necessrio que esse processo se repita para cada endereo de e-mail identificado de acordo
com a coluna 2 do relatrio de dados. Na figura 15 est demonstrada a parte do cdigo que efetua
esse tratamento utilizando um cursor para executar a interpretao, seleo e envio das mensagens
tantas vezes quantos forem os endereos de e-mail distintos no relatrio.
Os resultados obtidos no desenvolvimento da proposta foram as mensagens de e-mail
separadas para cada um dos representantes (figura 16 e figura 17). Como pode ser visto a seguir, o
relatrio lista todos os pedidos de venda dentro de um perodo definido e atravs do campo de e-
mail associado foi possvel separar essa informao e enviar ao e-mail associado apenas os pedidos
de venda referentes ao representante citado na mensagem.
Figura 16: Mensagem gerada a partir do relatrio de dados de pedidos de venda com apenas
os pedidos do representante LOJA D&D.
Figura 17: Mensagem gerada a partir do relatrio de dados de pedidos de venda com apenas
os pedidos do representante ORNARE IND E COM DE MOVEIS.
6. Concluses
Nesta seo o autor deve fazer uma avaliao da proposta de estgio, com base no relatrio
e nos resultados obtidos. Para a avaliao final o autor deve fazer uma anlise crtica sobre o
diagnstico, a soluo e as referncias bibliogrficas que a fundamentaram, com vistas a expor a
sua contribuio organizao e ao assunto abordado. Tambm poder propor sugestes de outros
encaminhamentos ou melhorias soluo desenvolvida.
Os resultados permitem avaliar que a necessidade identificada em alguns clientes de poder
definir dinamicamente os destinatrios das mensagens automticas geradas atravs da ferramenta
FoccoMail so de muita utilidade. A alterao proposta foi testada em bases internas e em clientes e
atravs da mesma foi possvel aumentar a abrangncia da utilizao da ferramenta.
Neste estudo pode-se verificar que alm da possibilidade de definir dinamicamente os
destinatrios, seria necessrio definir uma hierarquia para envio das mensagens com perodos
diferentes para cada destinatrio.
Na continuidade do trabalho ser avaliada essa nova alterao com o levantamento dos
reais requisitos, definio da alterao e analise de custos da mesma.
7. Referncias
LORENTZ, Diana, GREGOIRE, Joan Oracle Database SQL Reference 10g Release 1. Oracle
Corporation, 2003.
Anexo A
PROCEDURE FMAIL_ENVIA_EMAIL_DINAMICO
( pi_config_email_id tconfig_mail.id%TYPE
, pi_empr_id tempresas.id%TYPE) IS
--DESTINATARIOS DINAMICOS
v_email_dest VARCHAR2(32767);
--MONTAGEM DO TEXTO
v_select VARCHAR2(32767);
v_select_dest VARCHAR2(32767);
v_select_gi v_select%TYPE;
v_cab_id tcab_dinamico.id%TYPE;
v_template ttemplate.texto%TYPE;
v_ctxh DBMS_XMLGEN.CTXHANDLE;
v_queryresult XMLTYPE;
v_xsl_trans XMLTYPE;
v_cursor INTEGER;
v_campo_unique VARCHAR2(200);
v_status INTEGER;
v_clob CLOB;
--ENVIO
v_corpo_email CLOB;
v_assunto tconfig_mail.assunto%TYPE;
v_usuarios tconfig_mail.usuarios%TYPE;
v_email tconfig_mail.email%TYPE;
v_prog_desvio tconfig_mail.programa%TYPE;
v_aux NUMBER;
v_ids_usuarios VARCHAR2(32000);
v_smtp VARCHAR2(4000);
v_erro VARCHAR2(8000);
v_erro_externo BOOLEAN := FALSE;
v_erro_interno BOOLEAN := FALSE;
--para limpar a wg
DELETE wg_hist_mail;
SELECT mail.cab_din_id
, tem.texto
INTO v_cab_id
, v_template
FROM tconfig_mail mail
,ttemplate tem
WHERE mail.id = pi_config_email_id
AND tem.id = mail.ttemplate_id;
BEGIN
-- monta o select para que pegue apenas os registros q no
foram enviados
v_select := 'SELECT *
FROM ('||v_select_gi||')
WHERE "col2" = '''||v_email_dest||'''
AND "col1" NOT IN (SELECT chave
FROM thist_mail
WHERE tconf_mail_id =
'||pi_config_email_id||')';
v_queryresult :=
DBMS_XMLGEN.GETXMLTYPE(v_ctxh).transform(v_xsl_trans);
v_clob := v_queryresult.GETCLOBVAL();
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END;
BEGIN
v_smtp := FOCCO3I_EMAIL.RETORNASMTPSERVER(pi_empr_id);
v_corpo_email := v_clob;
FROM tusuarios
v_aux := FOC-
CO3I_MAIL.ENVIA_MENSAGEM_CHAR_CLOB(v_assunto, v_corpo_email, NULL, 1,
'N', 1, NULL, v_ids_usuarios,v_prog_desvio,1);
EXCEPTION
WHEN OTHERS THEN
v_erro_interno := TRUE;
v_erro := v_erro||'Erro ao enviar emails inter-
nos:
'||DBMS_UTILITY.FORMAT_ERROR_STACK||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
END;
END IF;
v_email := v_email_dest;
-- envia emails externos
IF v_email IS NOT NULL THEN
DECLARE
v_anexos FOCCO3I_EMAIL.ANEXOSTB;
BEGIN
FOCCO3I_EMAIL.ENVIAEMAIL(nvl(focco3i_email.retornaemail(v_login),'foccoma
il@focco.com.br')
,REPLACE(v_email,',',';')
,NULL
,focco3i_email.retornausuario(v_login)
,focco3i_email.retornasenhaemail(v_login)
,v_smtp
,v_assunto
,v_corpo_email
,FALSE
,v_anexos);
EXCEPTION
WHEN OTHERS THEN
v_erro_externo := TRUE;
v_erro := v_erro||'Erro ao enviar emails exter-
nos:
'||DBMS_UTILITY.FORMAT_ERROR_STACK||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
END;
END IF;
IF NOT v_erro_externo OR
NOT v_erro_interno THEN
FOR i IN (SELECT chave
FROM wg_hist_mail)LOOP
BEGIN
INSERT INTO thist_mail(id
, chave
, dt_envio
, tconf_mail_id)
VALUES (seq_id_thist_mail.NEXTVAL
, i.chave
, SYSDATE
, pi_config_email_id);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END LOOP;
END IF;
COMMIT;
END LOOP;
CLOSE cur;
END;