Partager via


Interroger Oracle E-Business Suite à l’aide de l’instruction SELECT avec le modèle de canal WCF

Vous pouvez configurer l’adaptateur Oracle E-Business pour recevoir des messages de modification de données périodiques à l’aide d’une instruction SELECT pour interroger en continu les tables d’interface, les vues d’interface, les tables et les vues dans Oracle E-Business Suite. Vous pouvez spécifier une instruction SELECT en tant qu’instruction d’interrogation que l’adaptateur exécute régulièrement pour interroger Oracle E-Business Suite. Vous pouvez également spécifier un bloc de code PL/SQL post-interrogation que l’adaptateur exécute après l’exécution de l’instruction d’interrogation.

Pour activer l’interrogation, vous devez spécifier certaines propriétés de liaison comme décrit dans cette rubrique. Pour plus d’informations sur la façon dont l’adaptateur prend en charge l’interrogation, consultez Prise en charge des appels entrants à l’aide de l’interrogation.

Configuration d’une opération d’interrogation avec les propriétés de liaison de l’adaptateur Oracle E-Business Suite

Le tableau suivant récapitule les propriétés de liaison de l’adaptateur Oracle E-Business que vous utilisez pour configurer l’adaptateur afin de recevoir des messages de modification de données. Vous devez spécifier ces propriétés de liaison lors de l’exécution de l’application d’interrogation.

Binding, propriété Description
InboundOperationType Spécifie si vous souhaitez effectuer une opération entrante d’interrogation ou de notification . La valeur par défaut est Interrogation.
PolledDataAvailableStatement Spécifie l’instruction SQL que l’adaptateur exécute pour déterminer si des données sont disponibles pour l’interrogation. Uniquement si un enregistrement est disponible, l’instruction SELECT que vous spécifiez pour la propriété de liaison PollingInput est exécutée.
PollingInterval Spécifie l’intervalle, en secondes, auquel l’adaptateur Oracle E-Business exécute l’instruction spécifiée pour la propriété de liaison PolledDataAvailableStatement . La valeur par défaut est 30 secondes. L’intervalle d’interrogation détermine l’intervalle de temps entre les sondages successifs. Si l’instruction est exécutée dans l’intervalle spécifié, l’adaptateur est mis en veille pendant la durée restante de l’intervalle.
PollingInput Spécifie l’instruction d’interrogation. Pour interroger à l’aide d’une instruction SELECT, vous devez spécifier une instruction SELECT pour cette propriété de liaison. La valeur par défaut est null.

Vous devez spécifier une valeur pour la propriété de liaison PollingInput pour activer l’interrogation. L’instruction d’interrogation est exécutée uniquement si des données sont disponibles pour l’interrogation, ce qui est déterminé par la propriété de liaison PolledDataAvailableStatement .
PollingAction Spécifie l’action de l’opération d’interrogation. Vous pouvez déterminer l’action d’interrogation à partir de l’interface de service générée pour l’opération à l’aide du plug-in Visual Studio Add Adapter Service Reference.
PostPollStatement Spécifie un bloc d’instructions exécuté après l’exécution de l’instruction spécifiée par la propriété de liaison PollingInput .
PollWhileDataFound Spécifie si l’adaptateur Oracle E-Business ignore l’intervalle d’interrogation et exécute en continu l’instruction d’interrogation, si des données sont disponibles dans la table interrogée. Si aucune donnée n’est disponible dans la table, l’adaptateur rétablit pour exécuter l’instruction d’interrogation à l’intervalle d’interrogation spécifié. La valeur par défaut est false.

Pour obtenir une description plus complète de ces propriétés, consultez En savoir plus sur les propriétés de liaison de l’adaptateur BizTalk pour Oracle E-Business Suite. Pour obtenir une description complète de l’utilisation de l’adaptateur Oracle E-Business pour interroger la base de données Oracle, lisez le reste de cette rubrique.

Comment cette rubrique illustre l’interrogation

Dans cette rubrique, pour montrer comment l’adaptateur Oracle E-Business prend en charge la réception de messages de modification de données à l’aide d’instructions SELECT, vous interrogez la table d’interface MS_SAMPLE_EMPLOYEE dans l’application Bibliothèque d’objets d’application . Cette table est créée lorsque vous exécutez le script create_apps_artifacts.sql fourni avec les exemples pour créer ces objets dans Oracle E-Business Suite.

Pour illustrer une opération d’interrogation, nous procédons comme suit :

  • Spécifiez une instruction SELECT pour la propriété de liaison PolledDataAvailableStatement afin de déterminer où la table d’interface interrogée (MS_SAMPLE_EMPLOYEE) contient des données. Dans cet exemple, vous pouvez définir cette propriété de liaison comme suit :

    SELECT COUNT (*) FROM MS_SAMPLE_EMPLOYEE  
    

    Cela garantit que l’adaptateur exécute l’instruction d’interrogation uniquement lorsque la table d’interface MS_SAMPLE_EMPLOYEE contient des enregistrements.

  • Spécifiez une instruction SELECT pour la propriété de liaison PollingInput . Cette instruction récupère toutes les lignes de la table d’interface MS_SAMPLE_EMPLOYEE. Dans cet exemple, vous pouvez définir cette propriété de liaison comme suit :

    SELECT * FROM MS_SAMPLE_EMPLOYEE FOR UPDATE  
    

    Notes

    Pour plus d’informations sur la clause FOR UPDATE utilisée dans l’instruction SELECT, consultez Recevoir des messages d’interrogation modifiés de données à partir d’Oracle E-Business Suite.

  • Spécifiez une instruction DELETE dans le cadre de la propriété de liaison PostPollStatement . Cette instruction supprime toutes les données de MS_SAMPLE_EMPLOYEE table d’interface. Dans cet exemple, vous pouvez définir cette propriété de liaison comme suit :

    DELETE FROM MS_SAMPLE_EMPLOYEE  
    

    Après cela, la prochaine fois que l’instruction spécifiée pour PollingInput sera exécutée, elle n’extrairea aucune donnée.

  • Tant que des données supplémentaires ne seront pas ajoutées à la table d’interface MS_SAMPLE_EMPLOYEE, vous ne recevrez aucun message d’interrogation. Vous devez donc remplir à nouveau la table d’interface MS_SAMPLE_EMPLOYEE avec de nouveaux enregistrements. Pour ce faire, exécutez le script insert_apps_data.sql fourni avec les exemples. Après avoir exécuté ce script, l’opération d’interrogation suivante extrait les nouveaux enregistrements insérés dans la table.

Consommation du message de demande d’interrogation

L’adaptateur appelle l’opération d’interrogation sur votre code pour interroger Oracle E-Business Suite. Autrement dit, l’adaptateur envoie un message de demande d’interrogation que vous recevez sur une forme de canal IInputChannel. Le message de demande d’interrogation contient le jeu de résultats de la requête spécifiée par la propriété de liaison PollingInput . Vous pouvez utiliser le message d’interrogation de deux façons :

  • Pour consommer le message à l’aide de la diffusion en continu de valeur de nœud, vous devez appeler la méthode WriteBodyContents sur le message de réponse et lui passer un XmlDictionaryWriter qui implémente la diffusion en continu de valeur de nœud.

  • Pour utiliser le message à l’aide de la diffusion en continu de nœuds, vous pouvez appeler GetReaderAtBodyContents sur le message de réponse pour obtenir un XmlReader.

À propos des exemples utilisés dans cette rubrique

Les exemples de cette rubrique interrogent la table d’interface MS_SAMPLE_EMPLOYEE. Un script pour générer la table est fourni avec les exemples. Pour plus d’informations sur les exemples, consultez Exemples pour l’adaptateur Oracle EBS. Un exemple , SelectPolling_ChannelModel, basé sur cette rubrique, est également fourni avec les exemples d’adaptateurs Oracle E-Business.

Réception de messages entrants pour une opération d’interrogation à l’aide du modèle de canal WCF

Cette section fournit des instructions sur l’écriture d’une application .NET (modèle de canal) pour recevoir des messages d’interrogation entrant à l’aide de l’adaptateur Oracle E-Business.

Pour recevoir des messages d’interrogation de l’adaptateur

  1. Créez un projet Microsoft Visual C# ® dans Visual Studio. Pour cette rubrique, créez une application console.

  2. Dans le Explorateur de solutions, ajoutez une référence à Microsoft.Adapters.OracleEBS, Microsoft.ServiceModel.Channels, System.ServiceModelet System.Runtime.Serialization.

  3. Ouvrez le fichier Program.cs et ajoutez les espaces de noms suivants :

    • Microsoft.Adapters.OracleEBS

    • System.ServiceModel

    • System.ServiceModel.Description

    • System.ServiceModel.Channels

    • System.Xml

  4. Spécifiez un URI de connexion. Pour plus d’informations sur l’URI de connexion de l’adaptateur, consultez Créer l’URI de connexion Oracle E-Business Suite.

    Uri ConnectionUri = new Uri("oracleebs://ebs_instance_name");  
    
  5. Créez un instance d’OracleEBSBinding et définissez les propriétés de liaison requises pour configurer l’interrogation. Au minimum, vous devez définir les propriétés de liaison InboundOperationType, PolledDataAvailableStatement, PollingInput et PollingAction . Pour plus d’informations sur les propriétés de liaison utilisées pour configurer l’interrogation, consultez Prise en charge des appels entrants à l’aide de l’interrogation.

    OracleEBSBinding binding = new OracleEBSBinding();  
    binding.InboundOperationType = InboundOperation.Polling;  
    binding.PolledDataAvailableStatement = "SELECT COUNT (*) FROM MS_SAMPLE_EMPLOYEE";  
    binding.PollingInput = "SELECT * FROM MS_SAMPLE_EMPLOYEE FOR UPDATE";  
    binding.PollingAction = "InterfaceTables/Poll/FND/APPS/MS_SAMPLE_EMPLOYEE";  
    binding.PostPollStatement = "DELETE FROM MS_SAMPLE_EMPLOYEE";  
    
  6. Étant donné que vous interrogez une table d’interface, vous devez également définir le contexte des applications. Pour plus d’informations sur le contexte d’application et les propriétés de liaison requises pour définir le contexte de l’application, consultez Définir le contexte de l’application.

    binding.OracleUserName = "<Enter user name here>";  
    binding.OraclePassword = "<Enter password here>";  
    binding.OracleEBSResponsibilityName = "<Enter responsibility here>";  
    
  7. Créez une collection de paramètres de liaison et définissez les informations d’identification.

    ClientCredentials credentials = new ClientCredentials();  
    credentials.UserName.UserName = "<Enter user name here>";  
    credentials.UserName.Password = "<Enter password here>";  
    
    BindingParameterCollection bindingParams = new BindingParameterCollection();  
    bindingParams.Add(credentials);  
    
  8. Créez un écouteur de canal et ouvrez-le. Vous créez l’écouteur en appelant la méthode BuildChannelListener<IInputChannel> sur OracleEBSBinding.

    IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel>(connectionUri, bindingParams);  
    listener.Open();  
    
  9. Obtenez un canal IInputChannel en appelant la méthode AcceptChannel sur l’écouteur et ouvrez-le.

    IInputChannel channel = listener.AcceptChannel();  
    channel.Open();  
    
  10. Appelez Receive sur le canal pour obtenir le message entrant suivant à partir de l’adaptateur.

    Message message = channel.Receive();  
    
  11. Consommez le jeu de résultats retourné par l’opération entrante. Vous pouvez utiliser le message à l’aide d’un XmlReader ou d’un XmlDictionaryWriter.

    XmlReader reader = message.GetReaderAtBodyContents();  
    
  12. Fermez le canal une fois que vous avez terminé de traiter la demande.

    channel.Close()  
    

    Important

    Vous devez fermer le canal une fois que vous avez terminé le traitement de l’opération entrante. L’échec de la fermeture du canal peut affecter le comportement de votre code.

  13. Fermez l’écouteur lorsque vous avez fini de recevoir des messages modifiés par les données.

    listener.Close()  
    

    Important

    La fermeture de l’écouteur ne ferme pas les canaux créés à l’aide de l’écouteur. Vous devez fermer explicitement chaque canal créé à l’aide de l’écouteur.

Exemple

L’exemple suivant montre une application d’interrogation qui interroge la table d’interface MS_SAMPLE_EMPLOYEE. La propriété PollingInput contient l’instruction select qui lit toutes les données de la table MS_SAMPLE_EMPLOYEE et l’instruction post-interrogation supprime toutes les données de la même table. Le message d’interrogation est écrit dans C:\PollingOutput.xml.

Les messages d’interrogation suivants ne contiennent pas d’enregistrements tant que d’autres données n’auront pas été ajoutées à la table d’interface MS_SAMPLE_EMPLOYEE. Pour ce faire, exécutez le script insert_apps_data.sql fourni avec les exemples. Après avoir exécuté ce script, l’opération d’interrogation suivante extrait les nouveaux enregistrements insérés dans la table. L’adaptateur continue d’interroger jusqu’à ce que vous fermez l’hôte de service en appuyant sur <RETOUR>.

using System;  
using Microsoft.Adapters.OracleEBS;  
using System.ServiceModel;  
using System.ServiceModel.Description;  
using System.ServiceModel.Channels;  
using System.Xml;  

namespace SelectPolling_ChannelModel  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            Console.WriteLine("Sample started. This sample will poll 5 times and will perform the following tasks:");  
            Console.WriteLine("Press any key to start polling...");  
            Console.ReadLine();  
            IChannelListener<IInputChannel> listener = null;  

            IInputChannel channel = null;  

            try  
            {  
                TimeSpan messageTimeout = new TimeSpan(0, 0, 30);  

                OracleEBSBinding binding = new OracleEBSBinding();  
                binding.InboundOperationType = InboundOperation.Polling;  
                binding.PolledDataAvailableStatement = "SELECT COUNT (*) FROM MS_SAMPLE_EMPLOYEE";  
                binding.PollingInput = "SELECT * FROM MS_SAMPLE_EMPLOYEE FOR UPDATE";  
                binding.PollingAction = "InterfaceTables/Poll/FND/APPS/MS_SAMPLE_EMPLOYEE";  
                binding.PostPollStatement = "DELETE FROM MS_SAMPLE_EMPLOYEE";  
                binding.OracleUserName = "<Enter user name here>";  
                binding.OraclePassword = "<Enter password here>";  
                binding.OracleEBSResponsibilityName = "<Enter responsibility here>";  

                Uri ConnectionUri = new Uri("oracleebs://ebs_instance_name?");  

                ClientCredentials credentials = new ClientCredentials();  
                credentials.UserName.UserName = "<Enter user name here>";  
                credentials.UserName.Password = "<Enter password here>";  

                BindingParameterCollection bindingParams = new BindingParameterCollection();  
                bindingParams.Add(credentials);  

                listener = binding.BuildChannelListener<IInputChannel>(ConnectionUri, bindingParams);  
                listener.Open();  

                channel = listener.AcceptChannel();  
                channel.Open();  

                Console.WriteLine("Channel and Listener opened...");  
                Console.WriteLine("\nWaiting for polled data...");  
                Console.WriteLine("Receive request timeout is {0}", messageTimeout);  

                // Poll five times with the specified message timeout   
                // If a timeout occurs polling will be aborted  
                for (int i = 0; i < 5; i++)  
                {  
                    Console.WriteLine("Polling: " + i);  
                    Message message = null;  
                    XmlReader reader = null;  
                    try  
                    {  
                        //Message is received so process the results  
                        message = channel.Receive(messageTimeout);  
                    }  
                    catch (System.TimeoutException toEx)  
                    {  
                        Console.WriteLine("\nNo data for request number {0}: {1}", i + 1, toEx.Message);  
                        continue;  
                    }  

                    // Get the query results using an XML reader  
                    try  
                    {  
                        reader = message.GetReaderAtBodyContents();  
                    }  
                    catch (Exception ex)  
                    {  
                        Console.WriteLine("Exception :" + ex);  
                        throw;                          
                    }  

                    XmlDocument doc = new XmlDocument();  
                    doc.Load(reader);  
                    using (XmlWriter writer = XmlWriter.Create("C:\\PollingOutput.xml"))  
                    {  
                        doc.WriteTo(writer);  
                        Console.WriteLine("The polling response is saved at 'C:\\PollingOutput.xml'");  
                    }  
                    // return the cursor  
                    Console.WriteLine();  

                    // close the reader  
                    reader.Close();  

                    message.Close();  
                }  
                Console.WriteLine("\nPolling done -- hit <RETURN> to finish");  
                Console.ReadLine();  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine("Exception is: " + ex.Message);  
                Console.ReadLine();  
                if (ex.InnerException != null)  
                {  
                    Console.WriteLine("Inner Exception is: " + ex.InnerException.Message);  
                    Console.ReadLine();  
                }  
            }  
            finally  
            {  
                // IMPORTANT: close the channel and listener to stop polling  
                if (channel != null)  
                {  
                    if (channel.State == CommunicationState.Opened)  
                        channel.Close();  
                    else  
                        channel.Abort();  
                }  

                if (listener != null)  
                {  
                    if (listener.State == CommunicationState.Opened)  
                        listener.Close();  
                    else  
                        listener.Abort();  
                }  
            }  
        }  
    }  
}  

Voir aussi

Développer des applications Oracle E-Business Suite à l’aide du modèle de canal WCF