(Estou editando tudo para ficar menos ruim. Não há mais referência a tabela interna do dataset. E há uma função que transforma mês de número para nome porque o banco de dados Oracle está num servidor que está com uma configuração em que os meses aparecem como letras)
Eu tenho este Dataset Avançado que envia email regularmente, todos os dias, sem problemas.
Se servir, adapte-o.
A versão do meu Fluig é Crystal Lake 1.7.1-211222.
Ele procura no Protheus por aniversariantes.
E aprendi foi aqui mesmo, neste Forum de que gosto muito.
Feita a codificação, foi só agendar para todos os dias às 09:00hs.
O bloco útil naturalmente é na função onSync e não uso a createDataset.
Basicamente, é o seguinte:
function onSync(lastSyncDate) {
var dataSource = "/jdbc/PROTHEUS";//cuidado. Case sensitive
var created = false;
var dataset = DatasetBuilder.newDataset();
var ic = new javax.naming.InitialContext();
var ds = ic.lookup(dataSource);
//--------selecionando os de hoje e de mais 4 dias
let txtDataHoje = new Date().toLocaleDateString();//MON dd, yyyy
let txtDataReforma = fRetraduzDataParaLocal(txtDataHoje);//dd/mm/yyyy
let dia = txtDataReforma.substr(0,2);
let mes = txtDataReforma.substr(3,2);
let ano = txtDataReforma.substr(6,4);
//----Tornando os meses em número e reformulando a data para dd/mm/yyyy
let mesDiaVez = (mes*1).toString()+(dia*1).toString();//mesdia de hoje na string
//-----calculando 4 dias à frente
let diasAFrente = 4;
let objDataFutura = new Date(ano*1,(mes*1-1),(dia*1+diasAFrente));//mês-1 por exigência do js
let txtDataFutura = objDataFutura.toLocaleDateString();//MON dd, yyyy futura dias à frente
let txtDataFuturaReforma = fRetraduzDataParaLocal(txtDataFutura);//dd/mm/yyyy
let diaF = txtDataFuturaReforma.substr(0,2);
let mesF = txtDataFuturaReforma.substr(3,2);
let mesDiaFrente = (mesF*1).toString()+(diaF*1).toString();
//-----------------------------
let myQuery="SELECT DISTINCT R.RA_NOMECMP,R.RA_NASC,R.RA_XFORNEC,R.RA_EMAIL,"+
"R.RA_CATFUNC "+
"FROM SRA010 R "+
"WHERE R.RA_DEMISSA = ' ' "+
"AND cast(substr(R.RA_NASC,5,4) as number) >= "+mesDiaVez+" "+
"AND cast(substr(R.RA_NASC,5,4) as number) <= "+mesDiaFrente+" "+
"AND R.RA_CATFUNC IN ('P','E','M','A') "+
"AND R.D_E_L_E_T_ = ' ' "+
"UNION " +
"SELECT DISTINCT S.RA_NOMECMP,S.RA_NASC,S.RA_XFORNEC,S.RA_EMAIL,S.RA_CATFUNC "+
"FROM SRA020 S " +
"WHERE S.RA_DEMISSA = ' ' "+
"AND cast(substr(S.RA_NASC,5,4) as number) >= "+mesDiaVez+" "+
"AND cast(substr(S.RA_NASC,5,4) as number) <= "+mesDiaFrente+" "+
"AND S.RA_CATFUNC IN ('P','E','M','A') "+
"AND S.D_E_L_E_T_ = ' ' "+
"ORDER BY RA_NASC,RA_NOMECMP";
log.info("myQuery ONSYNC SELECT ==================== " + myQuery);
try {
var conn = ds.getConnection();
var stmt = conn.createStatement();
var rs = stmt.executeQuery(myQuery);
var columnCount = rs.getMetaData().getColumnCount();
while (rs.next()) {
if (!created) {
for (var i = 1; i <= columnCount; i++) {
dataset.addColumn(rs.getMetaData().getColumnName(i));
}
created = true;
}
var Arr = [];
for (var i = 1; i <= columnCount; i++) {
var obj = rs.getObject(rs.getMetaData().getColumnName(i));
if (null !== obj) {
Arr[i - 1] = rs.getObject(rs.getMetaData().getColumnName(i)).toString();
} else {
Arr[i - 1] = "null";
}
}
dataset.addRow(Arr);
}//while
} catch (e) {
log.error("ERRO==============> " + e.message);
} finally {
if (rs !== null) {
rs.close();
}
if (stmt !== null) {""
stmt.close();
}
if (conn !== null) {
conn.close();
}
}//finally
//-------------------
var template = "tpl_aniversario";
var parametros = new java.util.HashMap();
let destinatarios = new java.util.ArrayList();
destinatarios.add("mausim@meudominio.com.br");//ativado para teste
let concatena = "<table style='text-align:center/'>";
let concatenaFuturo = "<table style='text-align:center/'>";
let intTemHoje=0;
let intTemFuturo=0;
for (var j = 0; j < dataset.rowsCount; j++) {
//----se for RPA, tem de ter EMAIL DO UCRG
let categoria = dataset.getValue(j,'RA_CATFUNC');
let emailUcrg = dataset.getValue(j,'RA_EMAIL');
emailUcrg = emailUcrg.toUpperCase();
let intPodeConsiderar = 1;
let nome =dataset.getValue(j, 'RA_NOMECMP').trim();
let sigla = dataset.getValue(j, 'RA_XFORNEC').trim().toLowerCase();
let nasc = dataset.getValue(j, 'RA_NASC').trim().toLowerCase();
let foto = "https://www.meudominio.com.br/institucional/imagens/"+sigla+".png";
//---pegando dia e mês da data do nascimento que chega yyyymmdd
let dia = nasc.substr(6,2);
let mes = nasc.substr(4,2);
//--
if(mes.toString()+dia.toString()==mesDiaVez){
//é aniversariante de hoje
intTemHoje=1;
concatena = concatena +
"<tr><td style='padding:10px;'>"+
"<img src='" + foto + "' " +
"width='100' height='100'></td>"+
"<td style='padding:10px;'>" +
nome + "</td><td style='padding:10px;'>" +
dia +"/"+mes+ "</td></tr>";
parametros.put("nome", concatena);
}else{
//é aniversariante futuro
intTemFuturo=1;
concatenaFuturo = concatenaFuturo +
"<tr><td style='padding:10px;'>"+
"<img src='" + foto + "' " +
"width='100' height='100'></td>"+
"<td style='padding:10px;'>" +
nome +" (Categoria deste profissional: "+categoria+")</td><td style='padding:10px;'>" +
dia +"/"+mes+ "</td></tr>";
parametros.put("nome", concatenaFuturo);
}
}//for j
concatena = concatena +'</table>';
//-------------------HOJE?
if(intTemHoje==1){
parametros.put("subject", "Aniversariantes do dia (dataset a_ds_ucrg_avancao) ");
votos="<p>Aos amigos aniversariantes, "+
"nossos votos de felicidades.</p>";
parametros.put("votos", votos);
notifier.notify("fluig", template, parametros, destinatarios, "text/html");
}
//-----------------FUTUROS?
if(intTemFuturo==1){
log.info("Tem futuros");
parametros.put("subject", "Aniversariantes FUTUROS (dataset a_ds_ucrg_avancao)");
votos="<p>Aniversariantes e suas datas</p>";
parametros.put("votos", votos);
notifier.notify("fluig", template, parametros, destinatarios, "text/html");
}
//------os aniversariantes nulos têm de ficar por último, porque do contrário o...
//...put "nome" abaixo iria apagar os nomes futuros
if(intTemHoje===0){
log.info("Não tem hoje");
parametros.put("subject", "Não há aniversariantes do dia (dataset a_ds_ucrg_avancao) ");
votos="<p>Hoje, "+txtDataReforma +", não há aniversariantes.</p>";
parametros.put("votos", votos);
parametros.put("nome", ""); //anula o parâmetro dos outros que podem ter dados
notifier.notify("fluig", template, parametros, destinatarios, "text/html");
}
return dataset;
}//onSync
function createDataset(fields, constraints, sortFields) {
}
function onMobileSync(user) {
}
function fRetraduzDataParaLocal(txtDataHoje){
let numeroMes=0;
//----
let mesLido = txtDataHoje.substr(0,3);
let diaLido = txtDataHoje.substr(4,2);
let anoLido = txtDataHoje.substr(8,4);
//----
switch(mesLido.toUpperCase()){
case "JAN":
numeroMes="01";
break;
case "FEV":
numeroMes="02";
break;
case "MAR":
numeroMes="03";
break;
case "APR":
numeroMes="04";
break;
case "MAY":
numeroMes="05";
break;
case "JUN":
numeroMes="06";
break;
case "JUL":
numeroMes="07";
break;
case "AUG":
numeroMes="08";
break;
case "SEP":
numeroMes="09";
break;
case "OCT":
numeroMes="10";
break;
case "NOV":
numeroMes="11";
break;
case "DEC":
numeroMes="12";
break;
}//switch
return diaLido+"/"+numeroMes+"/"+anoLido;
}// fRetraduzDataParaLocal