Estoy usando la biblioteca .Net NCo 3.0 y probé un ejemplo de tRFC en el que veo que la ID de la transacción se crea y se asocia con la función RFC y luego se invoca, después de una transacción exitosa, la ID de la transacción se elimina, aquí mantenemos la Transacción detalles en la base de datos para cada operación tRFC, entonces, en este caso, si la transacción falla, podemos obtener la ID de la base de datos y podemos intentarlo de nuevo, me gustaría saber la implementación del código del mecanismo de reintento, existe la posibilidad de que el servidor SAP está inactivo, así que cuándo y cómo reiniciar y asegurarse de que la transacción iniciada se ejecute solo una vez, sin pérdida de datos ni duplicación.
TidStore tidStore = new TidStore("clientTidStore", false); static RfcTransaction CreateTransaction(TidStore tidStore, out string data) { RfcTransaction trans = new RfcTransaction(); // This creates a fresh TID.; Console.Write("Please enter some input data: "); data = Console.ReadLine(); FileStream dataFile = new FileStream(trans.Tid.TID, FileMode.Create, FileAccess.ReadWrite); byte[] utf8Data = Encoding.UTF8.GetBytes(data); dataFile.Write(utf8Data, 0, utf8Data.Length); dataFile.Close(); tidStore.CreateEntry(trans.Tid.TID); return trans; } private void SubmitTransaction(RfcTransaction trans, TidStore tidStore, String data) { try { IRfcTable dataTable = stfc_write_to_tcpic.GetTable("TCPICDAT"); dataTable.Append(); dataTable.SetValue(0, data); // Insert the function module into the transaction: trans.AddFunction(stfc_write_to_tcpic); stfc_write_to_tcpic = (IRfcFunction)stfc_write_to_tcpic.Clone(); dataTable = stfc_write_to_tcpic.GetTable("TCPICDAT"); dataTable.SetValue(0, data + " -- data of the second function module"); trans.AddFunction(stfc_write_to_tcpic); trans.Commit(_ECCsystem); tidStore.SetStatus(trans.Tid.TID, TidStatus.Committed, null); File.Delete(trans.Tid.TID); _ECCsystem.ConfirmTransactionID(trans.Tid); tidStore.DeleteEntry(trans.Tid.TID); } catch (Exception e) { tidStore.SetStatus(trans.Tid.TID, TidStatus.RolledBack, e.Message); } } } }Debe crear su propia función con un intervalo de tiempo para verificar qué TID aún no se han procesado.
Con respecto al manejo y la implementación del manejo de transacciones de SAP en el lado del programa externo, hay algunas explicaciones generales en la Guía de programación de SAP NetWeaver RFC SDK 7.50 que creo que son muy útiles. Consulte los capítulos 4.3, 4.4 y 5.5. Es más detallado que lo que se explica en la Guía de programación de SAP .NET Connector 3.0 y también se puede adaptar fácilmente a las API de programación de NCo.