function createDataset(fields, constraints, sortFields) {

    var ds = DatasetBuilder.newDataset();
    ds.addColumn("Solicitacao");
    ds.addColumn("Status");

    // CONFIGURAÇÕES
    var PROCESSO = "FlowEssentials_AberturaDeChamado";
    var URL = "https://comerciode188006.fluig.cloudtotvs.com.br";
    var USER = "andrey.cunha";
    var PASS = "88253332Wa@"; // <-- coloque aqui a senha do usuário
    
    var LOTES = 200; // processa 200 solicitações por vez (pode aumentar)

    try {

        // BUSCA TODAS AS SOLICITAÇÕES
        var dsProc = DatasetFactory.getDataset(
            "workflowProcess",
            ["workflowProcessPK.processInstanceId"],
            [
                DatasetFactory.createConstraint("processId", PROCESSO, PROCESSO, ConstraintType.MUST)
            ],
            null
        );

        log.info("### TOTAL DE PROCESSOS ENCONTRADOS: " + dsProc.rowsCount);

        // IMPORTA CLASSES DO WEBSERVICE
        var authService = ServiceManager.getService("ECMCardService");
        var serviceInstance = authService.instantiate("com.totvs.technology.ecm.dm.ws.ECMCardServiceService");
        var port = serviceInstance.getECMCardServicePort();

        // Processar lote por lote
        for (var i = 0; i < dsProc.rowsCount; i++) {

            var idSolic = dsProc.getValue(i, "workflowProcessPK.processInstanceId");

            try {

                // PEGA O CARD DE ORIGEM
                var cardData = port.getCardData(
                    USER,
                    PASS,
                    1,         // companyId
                    idSolic
                );

                // REESCREVE OS CAMPOS
                var newCard = [];

                var CAMPOS = [
                    "requesterName",
                    "requesterMail",
                    "requesterId",
                    "currentUserName",
                    "currentUsermail",
                    "currentUserId",
                    "userSolicitante",
                    "emailSolicitante",
                    "nomeGestorArea",
                    "emailGestorArea",
                    "estabelecimentoFilial",
                    "complemento",
                    "tipoOcorrencia",
                    "tituloOcorrencia",
                    "detalheSolicitacao",
                    "analistaTecnico",
                    "dataAnaliseTecnica",
                    "consegueResolver",
                    "possuiInconsistencia",
                    "consideracoesTecnicas",
                    "userValidacao",
                    "dataUserValidacao",
                    "situacaoResolvida",
                    "ratingValue",
                    "consideracoes",
                    "dataAbertura"
                ];

                // MONTA ARRAY DOS CAMPOS
                for (var j = 0; j < CAMPOS.length; j++) {
                    var nomeCampo = CAMPOS[j];
                    var valorCampo = cardData.get(nomeCampo) ? cardData.get(nomeCampo).get(0) : "";
                    newCard.push({
                        item: {
                            key: nomeCampo,
                            value: valorCampo
                        }
                    });
                }

                // GRAVA O CARD ATUALIZADO
                port.updateCardData(
                    USER,
                    PASS,
                    1, // tenant/companyId
                    idSolic,
                    newCard
                );

                ds.addRow([idSolic, "OK"]);

            } catch (err1) {
                ds.addRow([idSolic, "ERRO: " + err1]);
            }
        }

    } catch (err2) {
        ds.addRow(["GERAL", "ERRO: " + err2]);
    }

    return ds;
}
