No vídeo de hoje, vamos demonstrar em como fazer um disparo de registros controlando através de um campo flag.
A dúvida de hoje, nos perguntaram, se seria possível disparar emails lendo informações de uma tabela, e gravar os que já foram enviados.
Pensando nisso, montamos um exemplo, onde vamos mostrar como fazer essa lógica com a tabela SF2, onde vamos guardar uma informação no camop F2_X_JAFOI, sendo que o que estiver como S já foi enviado ao cliente.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas TLPP
#Include "tlpp-core.th"
#Include "TopConn.ch"
//Declaração da namespace
Namespace custom.terminal.youtube
//Constantes
#Define CRLF Chr(13) + Chr(10) //Carriage Return Line Feed
/*/{Protheus.doc} User Function video0177
Função para percorrer uma tabela e ir disparando emails se o campo de flag não estiver preenchido
@type Function
@author Atilio
@since 14/06/2024
@example custom.terminal.youtube.u_video0177()
/*/
User Function video0177()
Local aArea := FWGetArea() As Array
//Somente se a pergunta for confirmada
If FWAlertYesNo("Deseja enviar eMails das NFs que não foram ainda?", "Continua?")
Processa({|| sendEmail()})
EndIf
FWRestArea(aArea)
Return
Static Function sendEmail()
Local aArea := FWGetArea() As Array
Local cQuery := "" As Character
Local lDanfe := ExistBlock("zGerDanfe") As Logical
Local nCurrent := 0 As Numeric
Local nTotal := 0 As Numeric
Local cTo := "" As Character
Local cSubject := "" As Character
Local cBody := "" As Character
Local aAttach := {} As Array
Local cDanfeFolder := "" As Character
Local cDanfeFile := "" As Character
Local lEmailSend := .F. As Logical
//Busca as notas que não foram enviadas ainda
cQuery := " SELECT " + CRLF
cQuery += " F2_DOC, " + CRLF
cQuery += " F2_SERIE, " + CRLF
cQuery += " F2_CLIENTE, " + CRLF
cQuery += " F2_EMISSAO, " + CRLF
cQuery += " F2_VALMERC, " + CRLF
cQuery += " A1_NOME, " + CRLF
cQuery += " A1_EMAIL " + CRLF
cQuery += " FROM " + CRLF
cQuery += " " + RetSQLName("SF2") + " SF2 " + CRLF
cQuery += " INNER JOIN " + RetSQLName("SA1") + " SA1 ON ( " + CRLF
cQuery += " A1_FILIAL = '" + FWxFilial("SA1") + "' " + CRLF
cQuery += " AND A1_COD = F2_CLIENTE " + CRLF
cQuery += " AND A1_LOJA = F2_LOJA " + CRLF
cQuery += " AND SA1.D_E_L_E_T_ = ' ' " + CRLF
cQuery += " ) " + CRLF
cQuery += " WHERE " + CRLF
cQuery += " F2_FILIAL = '" + FWxFilial("SF2") + "' " + CRLF
cQuery += " AND F2_TIPO NOT IN ('B', 'D') " + CRLF
cQuery += " AND SF2.D_E_L_E_T_ = ' ' " + CRLF
cQuery += " AND F2_X_JAFOI != 'S' " + CRLF
TCQuery cQuery New Alias "QRY_SF2"
TCSetField("QRY_SF2", "F2_EMISSAO", "D")
//Define o tamanho da régua
Count To nTotal
ProcRegua(nTotal)
QRY_SF2->(DbGoTop())
//Enquanto houver dados
While ! QRY_SF2->(EoF())
//Incrementa a régua
nCurrent++
IncProc("Analisando NF " + cValToChar(nCurrent) + " de " + cValToChar(nTotal) + "...")
//Define o destinatário, assunto e corpo do eMail
aAttach := {}
cTo := Alltrim(QRY_SF2->A1_EMAIL)
cSubject := "NF de número " + Alltrim(QRY_SF2->F2_DOC)
cBody := "Olá " + Alltrim(QRY_SF2->A1_NOME) + ".
"
cBody += "Obrigado por comprar conosco.
"
cBody += "Segue um resumo da NF:
"
cBody += "- "
cBody += "
- Documento / Série: " + Alltrim(QRY_SF2->F2_DOC) + " / " + Alltrim(QRY_SF2->F2_SERIE) + " " cBody += "
- Data Emissão: " + dToC(QRY_SF2->F2_EMISSAO) + " " cBody += "
- Valor Mercadorias: " + Alltrim(Transform(QRY_SF2->F2_VALMERC, "@E 999,999,999.99")) + " " cBody += "
Em anexo segue o arquivo da DANFE referente a essa NF!
" EndIf EndIf //Faz o envio do eMail lEmailSend := GPEMail(cSubject, cBody, cTo, aAttach, .F.) //Se deu certo o disparo, grava a flag If lEmailSend DbSelectArea("SF2") SF2->(DbSetOrder(1)) // F2_FILIAL + F2_DOC + F2_SERIE + F2_CLIENTE + F2_LOJA + F2_FORMUL + F2_TIPO If SF2->(MsSeek(FWxFilial("SF2") + QRY_SF2->F2_DOC + QRY_SF2->F2_SERIE )) RecLock("SF2", .F.) SF2->F2_X_JAFOI := "S" SF2->(MsUnlock()) EndIf EndIf QRY_SF2->(DbSkip()) EndDo QRY_SF2->(DbCloseArea()) FWAlertInfo("Processo finalizado!", "Atenção") FWRestArea(aArea) ReturnBom pessoal, por hoje é só.
Abraços e até a próxima.