Olá pessoal,
Há como alterar o registro de um formulário que não esteja vinculado ao processo?
Preciso salvar no Fluig algumas informações sobre grupo de e-mail, e para isso resolvi criar um formulário simples ligado a um processo. No meu processo atual, inclui um subprocesso com o fluxo simples de criação de grupo de e-mail. Porém preciso quando preciso alterar algum grupo existente, não sei como fazer, já que não posso só alterar o registro dataset.
Vi o método ECMCardService, porém consigo alterar apenas os formulários apenas do processo vinculado a ele (e o formulário que preciso alterar é um subprocesso deste).
Olá Patricia,
Sempe que necessito alterar o formulário de um Processo, utilizo o Método saveAndSendTaskClassic do WS (ECMWorkflowEngineService), passando o ( processInstanceId ) ID do processo, acredito que no caso de SubProcesso você tamém possa utilizar.
Segue um Exemplo do XML para o método saveAndSendTaskClassic
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://ws.workflow.ecm.technology.totvs.com/">
<SOAP-ENV:Body>
<ns1:saveAndSendTaskClassic>
<ns1:username>seuusuario</ns1:username>
<ns1:password>suasenha</ns1:password>
<ns1:companyId>1</ns1:companyId>
<ns1:processInstanceId>41</ns1:processInstanceId>
<ns1:choosedState>53</ns1:choosedState>
<ns1:colleagueIds>
<item>seuusuario</item>
</ns1:colleagueIds>
<ns1:comments>Automatico - Movimentacao de integracao</ns1:comments>
<ns1:userId>seuusuario</ns1:userId>
<ns1:completeTask>true</ns1:completeTask>
<ns1:attachments/>
<ns1:cardData>
<item>
<key>GPTB1_OC</key>
<value>conteudo_do_campo</value>
</item>
</ns1:cardData>
<ns1:appointment/>
<ns1:managerMode>false</ns1:managerMode>
<ns1:threadSequence>0</ns1:threadSequence>
</ns1:saveAndSendTaskClassic>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Algumas observaçoes:
<ns1:choosedState>53</ns1:choosedState> - Numero da Atividade de Destino, proxima atividade
<ns1:completeTask>true</ns1:completeTask> - true -> Salva e movimenta o processo para proxima atividade definida em <ns1:choosedState> false -> Somente salva o Processo ( formulário).
<item>
<key>GPTB1_OC</key> - Campo do Formulario que deseja atualizar
<value>conteudo_do_campo</value> - Conteudo do Campo
</item>
Espero ter ajudado,
Anderson Mendes
Olá Patrícia,
O webservice ECMCardService funciona para outro formulário, segue um exemplo utilizando o método updateCardData;
function afterTaskComplete(colleagueId, nextSequenceId, userList) {
try {
log.warn('%%%%%% INICIANDO ECMCardService');
var servico = ServiceManager.getServiceInstance("ECMCardService");
log.warn('%%%%%% servico: ' + servico);
var locator = servico.instantiate("com.totvs.technology.ecm.dm.ws.ECMCardServiceService");
log.warn('%%%%%% locator: ' + locator);
var portServico = locator.getCardServicePort();
log.warn('%%%%%% portServico: ' + portServico);
var cardDocArray = servico.instantiate("com.totvs.technology.ecm.dm.ws.CardFieldDtoArray");
log.warn('%%%%%% cardDocArray: ' + cardDocArray);
//------------------Dados do Formulários----------------------//
//Usuário de altenticação
var user = hAPI.getAdvancedProperty("loginUserWS")
log.warn('%%%%%% user: ' + user);
//Usuário de altenticação
var password = hAPI.getAdvancedProperty("passwdUserWS")
log.warn('%%%%%% password: ' + password);
//Número do documento a ser editado, tipo int
var documentId = parseInt(hAPI.getCardValue('docIdControleSaldo'));
log.warn('%%%%%% documentId: ' + documentId);
//Código da empresa, tipo int
var empresa = parseInt(getValue("WKCompany"));
log.warn('%%%%%% empresa: ' + empresa + ' TypeOf: ' + typeof empresa);
//------------------------Montar array de objs---------------------------//
//Novo valor que será alterado
var valor_1 = hAPI.getCardValue('NomeCampo_1');
//Objeto do campo d formulário que será alterado.
var objCampo_1 = servico.instantiate("com.totvs.technology.ecm.dm.ws.CardFieldDto");
objCampo_1.setField("campo_1");//NOME DO CAMPO DO FORMULÁRIO QUE SERÁ ALTERADO
objCampo_1.setValue(valor_1);//VALOR QUE SERÁ INSERIDO NO CAMPO
cardDocArray.getItem().add(objCampo_1);//ADD OBJ CAMPO AO OBJ CARDARRAY
//Novo valor que será alterado
var valor_2 = hAPI.getCardValue('NomeCampo_2');
//Objeto do campo d formulário que será alterado.
var objCampo_2 = servico.instantiate("com.totvs.technology.ecm.dm.ws.CardFieldDto");
objCampo_2.setField("campo_2");//NOME DO CAMPO DO FORMULÁRIO QUE SERÁ ALTERADO
objCampo_2.setValue(valor_2);//VALOR QUE SERÁ INSERIDO NO CAMPO
cardDocArray.getItem().add(objCampo_2);//ADD OBJ CAMPO AO OBJ CARDARRAY
//-------------------------Executando WS---------------------------//
var WSretorno = portServico.updateCardData(empresa, user, password, documentId, cardDocArray);
var retorno = getRetorno(WSretorno);
log.warn('%%%%%% retorno updateCardData ' + retorno);
log.warn('%%%%%% FINALIZANDO ECMCardService');
} catch (e) {
throw "Erro ao atualizar SALDO " + e;
}
}
function getRetorno(WebServiceMessage) {
var empresa = WebServiceMessage.getItem().get(0).getCompanyId();
log.warn('%%%%%% empresa: ' + empresa);
var documentDescription = WebServiceMessage.getItem().get(0).getDocumentDescription();
log.warn('%%%%%% documentDescription: ' + documentDescription);
var documentId = WebServiceMessage.getItem().get(0).getDocumentId();
log.warn('%%%%%% documentId: ' + documentId);
var version = WebServiceMessage.getItem().get(0).getVersion();
log.warn('%%%%%% version: ' + version);
var message = WebServiceMessage.getItem().get(0).getWebServiceMessage();
log.warn('%%%%%% message: ' + message);
if (documentDescription == null || documentDescription == "") {
throw "Erro ao atualizar ficha (WS): " + message;
}
return "Formulário atualizado: " + documentDescription + " --- " + " DocumentId: " + documentId + " --- " + " Versão: " + version;
}
Espero ter ajudado.
Abraço
Patrícia, não esqueça de configurar o serviço ECMCardService
Adicionei o serviço, mas não funcionou… Em qual evento de workflow adiciono o código? Estou colocando no afterTaskSave.
Patrícia, se não é o mesmo formulário do processo que está tentando editar é para funcionar no evento que você colocou. Consegue compartilhar o código para ver como está?
Lembrando que nesse modelo que coloquei é necessário colocar o usuário e senha para autentica nas propriedades avançadas do processo que está rodando o evento.
No log aparece o erro: “Executando evento : afterTaskCompleteERRO AO EXECUTAR SCRIPT → NOK - sun.org.mozilla.javascript.internal.JavaScriptException: Erro ao atualizar documento TypeError: getRetorno is not a function, it is undefined.”
Patrícia, realizei uma mudança no código e deixei exatamente como está funcionando na minha base. Só é necessário mudar os campos e valor que você que editar.
Muito obrigada, Marcos, deu certo!!!