public int startTransaction(E_PWOPER operation, List <PW_Parameter> paramList) { int ret = (int)E_PWRET.PWRET_NODATA; ret = Interop.PW_iNewTransac((byte)operation); if (ret != (int)E_PWRET.PWRET_OK) { return(ret); } foreach (PW_Parameter item in paramList) { ret = Interop.PW_iAddParam(item.parameterCode, item.parameterValue); Debug.Print(string.Format("CALLED iAddParam COM ÍNDICE {0}, VALOR {1} E RETORNO {2}", item.parameterName, item.parameterValue, ret.ToString())); if (ret != 0) { return(ret); } } ret = executeTransaction(); return(ret); }
private int executeTransaction() { E_PWOPER operation = (E_PWOPER)Enum.Parse(typeof(E_PWOPER), cmbOper.SelectedValue.ToString()); PGWLib.PGWLib eft = new PGWLib.PGWLib(); int ret = eft.startTransaction(operation, lstParameters.Items.Cast <PW_Parameter>().ToList()); if (ret != 0) { string sError = ((E_PWRET)ret).ToString(); int iError = ret; // verifica se deu erro de transacao anterior pendente if (ret == (int)E_PWRET.PWRET_FROMHOSTPENDTRN) { // confirma a transacao que estava pendente E_PWCNF transactionStatus = E_PWCNF.PWCNF_REV_AUTO_ABORT; ret = eft.confirmPendTransaction(transactionStatus, getTransactionResult()); MessageBox.Show(string.Format("Erro ao executar a transação: {0}{1}{2}{3}{4}", iError, Environment.NewLine, sError, Environment.NewLine, ">> TRANSACAO PENDENTE RESOLVIDA <<")); } else { MessageBox.Show(string.Format("Erro ao executar a transação: {0}{1}{2}", iError, Environment.NewLine, sError)); } } return(ret); }
// Executa a uma operação utilizando uma lista de parâmetros pre definidos pela automação public int StartTransaction(E_PWOPER operation, List <PW_Parameter> paramList) { int ret; // Antes de iniciar uma nova transação, resolve possíveis pendência existentes ret = PendencyResolve(); // Caso ocorra algum problema na resolução de pendência retorna o erro if (ret != (int)E_PWRET.PWRET_OK) { return(ret); } // Inicializa a transação solicitada ret = Interop.PW_iNewTransac((byte)operation); // Caso ocorra algum problema na inicialização retorna o erro if (ret != (int)E_PWRET.PWRET_OK) { return(ret); } // Loop adicionando todos os parâmetros já capturados pela automação // Parâmetros já capturados devem ser adicionados, caso a biblioteca precise de qualquer // parâmetro que não foi recebido para finalizar a transação, ela irá solicitá-lo no fluxo // implementado em "executeTransaction" foreach (PW_Parameter item in paramList) { // Adiciona o parâmetro ret = Interop.PW_iAddParam(item.parameterCode, item.parameterValue); // Registra na janela de debug o resultado da adição do parâmetro Debug.Print(string.Format("PW_iAddParam ({0},{1})={2}", item.parameterName, item.parameterValue, ret.ToString())); } // Inicia o processo de execução da transação ret = ExecuteTransaction(); return(ret); }
// Executa uma transação private int ExecuteTransaction() { E_PWOPER operation = (E_PWOPER)Enum.Parse(typeof(E_PWOPER), cmbOper.SelectedValue.ToString()); List <PW_Parameter> paramList; int ret; string resultMessage; PW_Parameter param; E_PWCNF transactionStatus; // Executa a transação ret = eft.StartTransaction(operation, lstParameters.Items.Cast <PW_Parameter>().ToList()); // Obtem todos os resultados da transação paramList = GetTransactionResult(); // Caso a operação tenha sido cancelada, obtém a mensagem a ser exibida nesse caso if (ret == (int)E_PWRET.PWRET_CANCEL) { param = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_CNCDSPMSG); } else { param = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_RESULTMSG); } // Caso não seja possível obter uma mensagem de resultado da biblioteca, atribui uma padrão if (param != null) { resultMessage = param.parameterValue; } else { resultMessage = "TRANSACAO FINALIZADA"; } // Exibe a mensagem de resultado, substituindo a quebra de linha utilizada // pela biblioteca pela quebra de linha utilizada na janela MessageBox.Show(this, resultMessage.Replace("\r", "\n")); // Transação com erro if (ret != 0) { // A última transação não foi confirmada corretamente if (ret == (int)E_PWRET.PWRET_FROMHOSTPENDTRN) { // Captura do usuário o que ele deseja fazer com a transação que ficou com problema de integridade // Esse é um ponto que vai ser atingido somente se ocorrer algum erro de tratamento da automação // ou um erro grave de sistema e uma nova transação não poderá ser realizada até que // a última seja resolvida // A captura do que deve ser feita do usuário é somente um exemplo, é possível a automação // obter essa informação em seu banco de dados e saber se a transação deve ser confirmada ou desfeita // Obtem os identificadores da transação pendente PW_Parameter authSyst, virtMerch, reqNum, autLocRef, autExtRef; authSyst = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_PNDAUTHSYST); virtMerch = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_PNDVIRTMERCH); reqNum = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_PNDREQNUM); autLocRef = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_PNDAUTLOCREF); autExtRef = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_PNDAUTEXTREF); // Exibe uma mensagem identificando a transação que está pendente MessageBox.Show(this, string.Format("Existe uma transação pendente:\n" + "PNDAUTHSYST={0}\n" + "NDVIRTMERCH={1}\n" + "PNDREQNUM={2}\n" + "PNDAUTLOCREF={3}\n" + "PNDAUTEXTREF={4}\n" + "Será necessário resolvê-la !!!", authSyst == null ? "" : authSyst.parameterValue, virtMerch == null ? "" : virtMerch.parameterValue, reqNum == null ? "" : reqNum.parameterValue, autLocRef == null ? "" : autLocRef.parameterValue, autExtRef == null ? "" : autExtRef.parameterValue)); // Pergunta ao usuário qual status de confirmação atribuir para a transação ConfirmationWindow cw = new ConfirmationWindow(); transactionStatus = E_PWCNF.PWCNF_REV_ABORT; cw.ShowDialog(ref transactionStatus); // Executa a resolução de pendencia ConfirmUndoTransaction(paramList, transactionStatus, true); } } // Transação com sucesso else { // Verifica se é necessário confirmar a transação PW_Parameter confirmacaoNecessaria; confirmacaoNecessaria = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_CNFREQ); if (confirmacaoNecessaria != null && int.Parse(confirmacaoNecessaria.parameterValue) == 1) { // Pergunta ao usuário qual status de confirmação atribuir para a transação ConfirmationWindow cw = new ConfirmationWindow(); transactionStatus = E_PWCNF.PWCNF_REV_ABORT; cw.ShowDialog(ref transactionStatus); // Executa a resolução de pendencia ConfirmUndoTransaction(paramList, transactionStatus); } } // *** IMPORTANTE: // Sempre após a finalização de uma transação, é necessário verificar o conteúdo // da informação PWINFO_IDLEPROCTIME e agendar uma chamada automática da função // PW_iIdleProc no horário apontado por ela // Essa implementação é necessária para que a biblioteca seja acionada de tempos // em tempos, de acordo com a sua necessidade, para resolver pendências com // o sistema, mesmo que nenhuma nova transação seja feita // PW_Parameter idleProc = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_IDLEPROCTIME); return(ret); }