Pergunta

Eu tenho um conhecimento muito limitado (0) em AS400 e RPG. Mas temos um requisito urgente em que precisamos invocar um programa de RPG de uma classe Java. Então eu descobri que podemos alcançá -lo através do Jtopen. Mas estou preso em declarar a lista de programas de programas. Eu tenho as seguintes informações sobre o programa RPG

Nome do programa: ZM30000R Parâmetros: ramo 7,0 (numérico)
Tipo de conta 2 (01-Cheque, 02 Economia)
Conta número 20 (caractere)
Código de erro 7 (caractere) dr/cr indicador 1 (caractere d, c)

Mas nenhuma pista sobre o que é o intput e a saída. Como declarar o programasparâmetro. Eu fiz como abaixo. Não posso testar tão bem porque não tenho conectividade com esses sistemas.

// Create AS400 Text objects for the different lengths
          // of parameters you are sending in.
          AS400Text branchTxt = new AS400Text(7);
          AS400Text accntTypeTxt = new AS400Text(2);
          AS400Text accntNumberTxt = new AS400Text(20);
          AS400Text errorCodeTxt = new AS400Text(7);
          AS400Text DCIndicatorTxt = new AS400Text(1);            

          // declare and instantiate  your parameter list.
          ProgramParameter[] parmList = new ProgramParameter[5];

          // assign values to your parameters using the AS400Text class to convert to bytes
          // the second parameter is an integer which sets the length of your parameter output
          parmList[0] = new ProgramParameter( branchTxt.toBytes(branch),7);
          parmList[1] = new ProgramParameter( accntTypeTxt.toBytes(accntTypeTxt),2);      
          parmList[2] = new ProgramParameter( accntNumberTxt.toBytes(accntNumberTxt),20);      
          parmList[3] = new ProgramParameter( errorCodeTxt.toBytes(""),7);      
          parmList[4] = new ProgramParameter( DCIndicatorTxt.toBytes(indicator),5);

Qualquer ajuda será realmente altamente útil.

Obrigado e cumprimentos,

Srinivas

Foi útil?

Solução

Bem, eu tenho uma pista apenas pela descrição dos parâmetros. Ramo, tipo de conta e número da conta estão dentro. Você precisa dessas informações para uma reserva ou transação financeira. O código de erro aparece. Na minha experiência com sistemas financeiros, é razoável normal que a API retorne da maneira como o valor é reservado. Normalmente, alguém usaria o sinal, mas nos sistemas financeiros o (d) EBIT ou (c) Redit é a melhor maneira.

A API é muito provável a API de um sistema financeiro. Se isso for verdade, estou perdendo o valor. Tem certeza de que tem a descrição completa?

Observe que o primeiro parâmetro é numérico. Você não está com sorte. Os iSeries e RPG não perdoam muito sobre o tipo de numérico. Pode -se escolher entre bit, zoneado, embalado, decimal, inteiro, flutuar e assim por diante. Se o RPG for realmente RPG em vez de RPG ILE, você poderá reduzi -lo para zoneado, embalado e byte.

Presumo que você tenha acesso aos IRERIES. Em seguida, você pode assistir à chamada do programa, informações de depuração e despejar informações. Isso o ajudará se você precisar fazer "tentativa e erro". Se você não tiver acesso, a estrada será muito difícil. Você receberá um erro na sua classe Java se a chamada do programa não for bem -sucedida. Mas será difícil identificar o erro real sem as informações do IRERIES. Portanto, o acesso é realmente necessário.

Outras dicas

Sua amostra está principalmente no caminho certo. Mas seu parâmetro de ramificação é numérico. Portanto, você deve usar o AS400ZONEDDECIMAL em vez do AS400Text:

AS400ZonedDecimal branchNbr = new AS400ZonedDecimal(7,0)

O programa RPG pode estar esperando embalado em vez de zoneado. Não é grande coisa, basta usar o AS400PACKEDDECIMAL.

À medida que você constrói seu objeto programarâmetro, os requisitos do seu construtor são diferentes, dependendo se forem parâmetros de entrada ou saída do seu programa. Para parâmetros de entrada, basta passar nos resultados tobytes (). Não há necessidade de incluir o comprimento. Para parâmetros somente de saída, basta passar o comprimento.

Concordo com a resposta de Robert que há algumas informações ausentes, mas suas suposições sobre a saída do código de erro parecem válidas. Eu acho que, no entanto, que o parâmetro dcindicator é entrada, pois sua amostra passa um valor. Para o parâmetro de código de erro, após a chamada do programa, você precisará extrair o valor e fazer algo com ele. Dado o que você já tem, eis como a chamada do programa funcionaria. Observe que especifiquei um nome de biblioteca de "mylibrary". Isso é, por exemplo, propósitos. Você precisará determinar em qual biblioteca seu objeto de programa está.

ProgramCall pgm = new ProgramCall(as400, QSYSObjectPathName.toPath("MyLibrary","ZM30000R","PGM"), parmList);
if (pgm.run() == true) {
    String sErrorCode = (String) errorCodeTxt.toObject(parmList[3].getOutputData());

    //Do something with your output data.
}
else {
    AS400Message[] messageList = pgm.getMessageList();
    for (int i=0; i<messageList.length; i++) {
        String sMessageID = messageList[i].getID();
        String sMessageText = messageList[i].getText();

        //Do something with the error messages
    }
}

Outra coisa a considerar são as listas de bibliotecas. O programa RPG espera que certas bibliotecas estejam na lista de bibliotecas? Nesse caso, você deve emitir o CommandCalls para adicionar as bibliotecas à lista da biblioteca antes de ligar para o programa.

FWIW: É muito mais fácil chamar IBM I Host Programs & Service Programs usando PCML em vez de ProgramCall.

Os compiladores gerarão até o documento PCML para você.

Ver http://javadoc.midrange.com/jtopen/com/ibm/as400/data/programcalldocument.html para detalhes.

Se você não tem conectividade, realmente não pode fazer o que é solicitado. Como você tenta? Existem parâmetros numéricos ou todos eles são personagens?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top