/// <summary> /// Devolve uma instância única singleton para essa classe /// </summary> /// <returns></returns> public static SAPConnect getInstance() { Object o = new Object(); lock (o){ if (instance == null) { instance = new SAPConnect(); } } return(instance); }
private static string DEST_NAME = "RW_SAPTEST"; //Definida no App.config public void processe() { //Isolei os métodos de acesso ao SAP na classe SAPConnect. Adotei o Singleton Pattern SAPConnect conn = SAPConnect.getInstance(); //Cria um Destination (destino ou servidor). Neste caso implementei duas possibilidades: 1 - Obter do app.config ou de outro local (BD por exemplo - não implementei) RfcDestination dest = conn.getDestination(DEST_NAME, SAPConnect.DESTINATION_DEF.APP_CONFIG); //Configura o nome do programa ABAP que será chamado, no destino obtido no passo anterior IRfcFunction func = conn.getFunction("ZCO_FROTA", dest); /* * Neste exemplo, a Função SAP recebe uma tabela contendo as placas de veículos e a função ABAP calcula, * para cada veículo, o valor da despesa e o combustível usado no período de referência informado. * */ //A Função ABAP define um parâmetro do tipo tabela que recebe várias frotas como filtro. //Essa tabela tem uma estrutura definida lá no ABAP //Neste exemplo, a função ABAP define 3 parêmetros, sendo duas datas (Início e Fim) //e uma tabela que pode conter várias linhas de parâmetros IRfcTable filtroFrotas = func.GetTable("FROTA"); //Adiciona uma linha para informar os parâmetros esperados pela estrutura -> há várias formas de fazer isso... filtroFrotas.Append(); //Informa os valores dos parametros da linha atual da tabela de parâmetros filtroFrotas.SetValue("AUFNR", "000000000357"); filtroFrotas.SetValue("KMROD", "00000000"); filtroFrotas.SetValue("PLACA", "357 - KBV-5953"); //Adiciona nova linha e configura os parâmetros dessa nova linha filtroFrotas.Append(); filtroFrotas.SetValue("AUFNR", "000000000100"); filtroFrotas.SetValue("KMROD", "00002131"); filtroFrotas.SetValue("PLACA", "100 - KFB-2220"); //Adiciona nova linha e configura os parâmetros dessa nova linha filtroFrotas.Append(); filtroFrotas.SetValue("AUFNR", "000000010007"); filtroFrotas.SetValue("KMROD", "00000722"); filtroFrotas.SetValue("PLACA", "10007 - MWE-8625"); //Informa os valores dos parâmetros globais da função ABAP (fora da tabela) func.SetValue("DATA_FIM", "20130731"); func.SetValue("DATA_INI", "20130701"); //Executa a funçao no SAP func.Invoke(dest); //Para ler o retorno....caso necessário.... IRfcTable data = func.GetTable("FROTA"); //Obtém a tabela de retorno - o nome é definido na função ABAP StringBuilder sb = new StringBuilder(); //Percorre cada linha da tabela retornada foreach (IRfcStructure linha in data) { //Percorre as linhas retornadas obtendo os valores das colunas que eu preciso sb.Clear(); sb.Append("Placa: "); sb.Append(linha.GetValue("PLACA")); //Ler o valor do campo da linha atual sb.Append(" - Combustível: "); sb.Append(linha.GetValue("COMBS")); //Ler o valor do campo da linha atual sb.Append(" - Despesa: "); sb.Append(linha.GetValue("DESPE")); //Ler o valor do campo da linha atual Console.WriteLine(sb.ToString()); } }