Itgencmr406 con Exact Online en Invantive Data Hub 26.0

La actualización a 26 se instaló (ver Error itgenobr344: Missing state - #16).

La renovación comienza, pero luego falla durante el proceso:

itgencmr406
No hay proveedor disponible para manejar la solicitud de Obtener Token OAuth.
Por favor, contacta con el administrador de la aplicación.

¿Cuál podría ser la razón de esto?

2026-06-25 15:37:24.231 Error itgencun016: Error itgencmr406: No hay proveedor disponible para manejar la solicitud de obtener el Token OAuth.
Por favor, contacte a su administrador de aplicaciones

Una actualización se puede encontrar en:

Se recomienda intentar con la versión 26.0.164 de Invantive Data Hub, disponible para descargar en https://download.invantive.com como la versión “actual”.

Esta versión debería resolver el mensaje de error itgencmr406.

Todavía no hemos logrado reproducir el segundo problema, donde ocurre confusión en la selección de bases de datos.

Si ya existe una versión anterior, el contenido del archivo zip puede copiarse sobre los archivos del mismo nombre.

Esta pregunta se cerró automáticamente después de 1 semana de inactividad. La última respuesta proporcionada fue marcada como solución.

Por favor, presenta una nueva pregunta en un tema aparte si el problema vuelve a ocurrir. Por favor, incluye en la nueva pregunta un enlace a este tema pegando su URL en el texto.

El error parece persistir con Invantive Data Hub Multi-Platform (26.0.164-PROD+5982).

2026-06-30 06:01:58.886 Error itgencun016: Error itgencmr406: No hay proveedor disponible para manejar la solicitud de Obtener Token OAuth.
Por favor, contacte al administrador de su aplicación

Después de instalar Invantive Data Hub Multi-Platform (26.0.164-PROD+5982) el itgencmr406 sigue presente.

Capturamos el siguiente error en uno de nuestros scripts:

itgencmr406:
No hay ningún proveedor disponible para procesar la solicitud de Obtener Token OAuth.
Por favor, contacte a su administrador de aplicaciones.
(OAuthHeadless, InvantiveProducer, SqlServer (…), SqlServer (…), SqlServer (…), SqlServer (…), SqlServer (…), ExactOnlineAll (eol), TeamViewer, PostgreSql (****), KeePass, Mail, Ossus, Os, InMemoryStorage, DataDictionary, LastResort).

Este error no siempre ocurre. Tenemos otro script que funciona bien.

Después de un poco de prueba, tenemos

  • un script que siempre funciona
  • uno que siempre produce este error, en la primera declaración al consultar Exact Online.

Este es el que produce el error:

use ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol, ****@eol;

Create or Replace procedure sendmail
( email_subject text
, email_body text
, email_recipients text
)
as
declare
l_error_txt varchar2;
l_error_cnt varchar2;
l_email_table varchar2;
begin
set smtp-host-address@mail ‘smtp.office365.com’;
set smtp-user-name@mail ‘user@mycompany.com’;
set smtp-password@mail ‘****’;
set [mail-from-name]@mail ‘systems’;
set [mail-from-email]@mail ‘reporting@mycompany.com’;
set smtp-enable-ssl@mail true;
set smtp-minimum-deliver-duration-ms@mail 1000;
set mail-body-html@mail true;
set mail-priority@mail 0;
begin
– enviando correo electrónico
insert into smtp@mail
( toEmail
, ccEmail
, bccEmail
, subject
, body
–, attachmentContents – comenzando PROD 20.2.112, usa Attachment1Contents en su lugar
–, attachmentName
–, attachmentMimeType
)
select email_recipients
as toEmail
,      cast(null as varchar2)
as ccEmail
,      cast(null as varchar2)
as bccEmail
,      email_subject
as subject
,      email_body
as body
–,      null – rfe.file_contents
–       attachmentContents – comenzando PROD 20.2.112, usa Attachment1Contents en su lugar
–,      null – basename(‘{USER_MULTI_PARTIES_FILE_NAME}’)
–       attachmentName
–,      null – cast(null as varchar2)
–       attachmentMimeType
;
end;
end;

– deja una línea en blanco arriba, de lo contrario el procedimiento almacenado entra en conflicto con el bloque de SQL a continuación.
declare
l_scriptstart datetime;
l_stmtstart datetime;
l_sqlresult INT;
l_log varchar2;
l_debug varchar2;
l_scriptsuccess boolean;
l_scriptduration varchar2;
l_emailrecipients text :=‘user1@mycompany.com,user2@mycompany.com’;
–l_emailrecipients text :=‘user1@mycompany.com’;
begin
l_scriptstart := sysdate;
l_debug := 'script started at ’ || l_scriptstart;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);

l_stmtstart := sysdate;
create or replace table eol_rest_cashflowpaymentsbulk@sqlserver as select * from paymentsbulk@eol where EntryDate > dateadd(‘year’,-2,sysdate) and isbatchbooking = 1;
l_sqlresult := sqlrowcount;
l_debug := 'paymentsbulk@eol con filtro en  EntryDate>(hoy-2 años) y isbatchbooking = 1 actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);

l_stmtstart := sysdate;
create or replace table eol_rest_glaccountsbulk@sqlserver as select * from ExactOnlineREST.Financial.glaccountsbulk@eol;
l_sqlresult := sqlrowcount;
l_debug := 'ExactOnlineREST.Financial.glaccountsbulk@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);

l_stmtstart := sysdate;
create or replace table eol_rest_GlClassificationsBulk@sqlserver as select * from   ExactOnlineREST.Financial.GLClassificationsBulk@eol;
l_sqlresult := sqlrowcount;
l_debug := 'ExactOnlineREST.Financial.GLClassificationsBulk@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);

l_stmtstart := sysdate;
create or replace table eol_rest_GLAccountClassificationMappings@sqlserver as select * from  ExactOnlineREST.GLAccountClassificationMappings@eol;
l_sqlresult := sqlrowcount;
l_debug := 'ExactOnlineREST.GLAccountClassificationMappings@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);

l_stmtstart := sysdate;
create or replace table eol_xml_balancelines@sqlserver as select * from ExactOnlineXML.XML.BalanceLines@eol;
l_sqlresult := sqlrowcount;
l_debug := 'ExactOnlineXML.XML.BalanceLines@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);

l_stmtstart := sysdate;
–create or replace table eol_rest_accountsbulk@sqlserver as select * from  accountsbulk@eol;
create or replace table eol_rest_accountsbulk@sqlserver as select * from syncAccounts@eol where Timestamp >0 batchsize 50000; – ajusta el tamaño del lote (predeterminado: 3000)
– la declaración de sincronización se ejecuta en aproximadamente 2 minutos cuando la caché está actualizada. el Bulk se ejecuta en aproximadamente 5,2 minutos. 135710 registros a partir del 26/06/2024.
– el punto final de sincronización tiene un poco menos de información (156 vs 190 campos)
l_sqlresult := sqlrowcount;
l_debug := 'sync.account@eol actualizado vía SYNC. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);

l_stmtstart := sysdate;
create or replace table eol_rest_agingreceivableslist@sqlserver as select * from  AgingReceivablesList@eol;
l_sqlresult := sqlrowcount;
l_debug := 'AgingReceivablesList@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);

l_stmtstart := sysdate;
create or replace table eol_rest_agingpayableslist@sqlserver as select * from  AgingPayablesList@eol;
l_sqlresult := sqlrowcount;
l_debug := 'AgingPayablesList@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);

l_stmtstart := sysdate;
create or replace table eol_rest_ReportingBalance@sqlserver as select * from ReportingBalance@eol where reportingYear >= to_char(dateadd(‘year’,-2,sysdate),‘YYYY’) batchsize 50000; – ajusta el tamaño del lote (predeterminado: 3000)
l_sqlresult := sqlrowcount;
l_debug := 'ReportingBalance@eol con filtrado por reportingYear en los últimos 3 años actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);

l_stmtstart := sysdate;
create or replace table EOL_REST_CURRENTYEAR_OPENIGNBALANCE@sqlserver as select * from CurrentYearAfterEntry@eol;
l_sqlresult := sqlrowcount;
l_debug := 'CurrentYearAfterEntry@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);

l_stmtstart := sysdate;
create or replace table EOL_REST_PREVIOUSYEAR_OPENIGNBALANCE@sqlserver as select * from PreviousYearAfterEntry@eol;
l_sqlresult := sqlrowcount;
l_debug := 'PreviousYearAfterEntry@eol actualizado. duración: ’ || round((sysdate-l_stmtstart)6060*24,0) || 's. número de registros: ’ || l_sqlresult;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ’ ’ || l_debug || chr(13);

l_scriptduration := round((sysdate-l_scriptstart)*60*60*24,0); – en segundos.
l_debug := 'el script termina. Duración total del script: ' || l_scriptduration || 's.';
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ' ' || l_debug || chr(13);
sendmail(
– asunto del correo aquí
'script de sincronización para tablas eol excepto transactionlines: éxito.'
– cuerpo del correo aquí
,'estado del script: OK.' || ''
|| 'hora de inicio del script: ' || to_char(l_scriptstart, 'YYYY-MM-DD HH24:MI:SS') || ''
|| 'duración del script: ' || l_scriptduration || ' segundos.' || ''
|| 'registro completo abajo' || ''
|| replace(l_log, chr(13), '')
– destinatarios aquí
,l_emailrecipients
);
exception
when others
then
l_debug := 'Error capturado en excepción: ' || chr(13) || sqlerrm;
dbms_output.put_line(l_debug); l_log := l_log || sysdate || ' ' || l_debug || chr(13);
l_scriptsuccess := false;
l_scriptduration := round((sysdate-l_scriptstart)*60*60*24,0); – en segundos. calculado de nuevo aquí debido a que la excepción lo saltó.
sendmail(
– asunto del correo aquí
'script de sincronización para tablas eol excepto transactionlines: ERROR. Ocurrió una excepción SQL.'
– cuerpo del correo aquí
,'estado del script: ERROR. Ocurrió una excepción SQL.' || ''
|| 'hora de inicio del script: ' || to_char(l_scriptstart, 'YYYY-MM-DD HH24:MI:SS') || ''
|| 'duración del script: ' || l_scriptduration || ' segundos.' || ''
|| 'registro completo abajo' || ''
|| replace(l_log, chr(13), '')
– destinatarios aquí
,l_emailrecipients
);
end;

Se ha solucionado un problema con la reautenticación en la versión 26.0.167. Esta versión está ahora disponible como descarga “actual” en: