Partager via


Syntaxe d’une instruction SELECT dans SAP

Les sections suivantes décrivent les spécifications grammaticales pour l’implémentation de requêtes SELECT sur le fournisseur de données .NET Framework pour mySAP Business Suite. Notez que dans plusieurs cas, la syntaxe est quelque peu différente de la syntaxe Transact-SQL de base.

SELECT {TOP <const> }[0,1] <select_list>  {INTO FILE [‘file_name’ | “file_name”]   
{DELIMITED}[0,1]}[0,1]  FROM table_name  {AS alias_name }[0,1]    
{INNER JOIN table_name {AS alias_name}[0,1] ON  <Join_Condition>}[0,1]  
{ WHERE <predicate> } [0,1] {;}[0,1]   
[OPTION 'no_conversion' | 'batchsize <size>' | 'disabledatavalidation'  

Où :

  • <select_list> = [ {table_name.}[0,1]column_name { AS alias_name } [0,1] } [ 1, …n ]

  • <Join_Condition> = [Alias_name.|table_name.]column_name <expr> [Alias_name.|table_name.]column_name

  • <Prédicat> = [ predicate [AND|OR] predicate [between|not between] predicate | NOT predicate | ‘(‘ predicate ‘)’ | condition ]

    Les conditions et expressions prises en charge sont les suivantes :

  • <Condition> = [ expr | expr [NOT | ] BETWEEN const AND const | expr [NOT | ] LIKE const ]

  • <Expr> = [ const | column_name [= | ! = | > | > = | ! > | < | < = | ! < ] const | column_name | - const | const | column_name ]

    <const> = integer | real | string | ? | NULL | xml_element.

    Valeurs du mot clé OPTION

    Vous pouvez spécifier les options en tant que OPTION '<option>', où <option> = 'no_conversion' | 'batchsize <size>' | 'disabledatavalidation'

  • Option no_conversion :

    • Si l’option no_conversion est utilisée, les champs de la table sont exposés à l’aide des types .NET équivalents. Pour plus d’informations sur l’équivalent .NET des types de données SAP, consultez Types de données SAP de base.

    • Si l’option no_conversion n’est pas utilisée et si une sortie de conversion n’est pas définie dans un champ, ces champs de la table sont exposés à l’aide des types .NET équivalents. Pour plus d’informations sur l’équivalent .NET des types de données SAP, consultez Types de données SAP de base.

    • Lorsque l’option no_conversion n’est pas utilisée et si une sortie de conversion est définie dans un champ, ces champs de la table sont exposés en tant que chaîne .NET.

  • Lorsqu’elle est définie sur la taille> par <lots, l’exécution de l’instruction SELECT entraîne l’exécution de plusieurs appels au système SAP et, dans chaque appel, seul <le nombre de taille> des enregistrements est récupéré. Par exemple, si vous spécifiez « batchsize 100 », la requête SELECT récupère 100 enregistrements uniquement dans chaque appel au système SAP. Si la taille> du lot < n’est pas spécifiée, la valeur par défaut de 10 000 est supposée pour la taille du lot. Notez que vous devez spécifier une valeur optimale pour la taille du lot en fonction de la mémoire physique de l’ordinateur et du nombre de lignes dans le système SAP. L’échec de la spécification d’une valeur optimale pour la taille du lot peut entraîner des exceptions de mémoire insuffisantes.

  • Lorsqu’il est défini sur disabledatavalidation, le fournisseur de données pour SAP ne valide pas les valeurs présentes dans les colonnes DATS, TIMS et NUMC, mais les expose sous forme de chaîne.

    Cela est utile dans les scénarios où ADO.NET clients ne parviennent pas à récupérer des données d’une table SAP contenant des données non valides dans les colonnes DATS, TIMS et NUMC. Étant donné que SAP autorise la présence de données non valides dans les colonnes DATS, TIMS et NUMC, ADO.NET clients qui tentent de lire les données ne pourront pas analyser les données non valides et lèveront une exception. Si l’option disabledatavalidation est définie sur la requête SELECT, le fournisseur de données pour SAP n’analyse pas les données non valides, mais les extrait sous forme de chaînes.

Important

Vous devez toujours fournir les valeurs de l’option mot clé entre guillemets uniques, par exemple, « disabledatavalidation ».

Pour obtenir des exemples d’instructions, consultez Exemples d’instruction SELECT.

Syntaxe des prédicats

Ce qui suit spécifie la grammaire pour l’utilisation de prédicats dans une instruction SELECT :

Predicate:

Predicates [AND | OR] Predicates [between|not between] Predicates | [NOT] Predicates | '(' Predicates ')' | Condition  

Condition:

Expr | LExpr [NOT] BETWEEN RExpr AND RExpr | LExpr [NOT] LIKE Const  

Expr:

LExpr [=|!=|>|>=|!>|<|<=|!<] RExpr>  

LExpr:

ColumnName  

RExpr:

Const | PlaceHolder  

ColumnName:

Column | TableName.Column | '['Column']'  

Tablename:

Table | '['Table']'  

Considérations lors de l’appel d’une instruction SELECT

Cette section répertorie les points que vous devez garder à l’esprit lorsque vous utilisez l’instruction SELECT avec le fournisseur de données pour SAP.

  • Lorsque vous spécifiez des valeurs date-heure dans des paramètres ou des requêtes, fournissez les valeurs sous forme de chaîne. Fournissez des chaînes date-heure au format date-heure SAP.

    • SAP date format:AAAAMMJJ

      Par exemple, la date du 10 novembre 2004 dans une requête SAP est exprimée « 20041110 ».

      La date du 10 novembre 2004 dans un p1 SAPParameter est la chaîne p1. Value='20041110'.

    • SAP time format:HHMMSS

      Par exemple, l’heure 10 :34 :32 dans une requête SAP est exprimée « 103432 ».

      L’heure 10 :34 :32 dans un SAPParameter p2 est la chaîne p2. Value='103432'.

      Pour une instruction SELECT, le fournisseur de données pour SAP retourne DATE les valeurs de champ en tant qu’objets .NET System.DateTime et retourne TIME les valeurs de champ en tant qu’objets System.TimeSpan . Si la valeur de l’objet SAP DATE est inférieure à la valeur minimale autorisée SQL Server (1/1/1753), le fournisseur de données pour SAP retourne cette valeur minimale, 1/1/1753.

  • Dans la clause TOP d’une requête SELECT, lorsque vous utilisez les caractères spéciaux « # », « ^ », « & » et « % » avant ou après un entier, les caractères spéciaux sont ignorés, bien qu’aucun message d’erreur ne soit déclenché. Par exemple, les éléments suivants sont ignorés dans la clause TOP d’une requête SELECT :

    #5, 5^, %5% ou &5

    Toutefois, l’utilisation de ces caractères entre des entiers, comme dans 5$5, génère une erreur.

  • Les noms de colonnes retournés dans un schéma pour une table sont retournés sous forme de caractères majuscules. Par exemple, un jeu de résultats de requête sur le champ Last Name retourne l’en-tête LAST NAMEde colonne . Pour éviter les conflits d’unicité, il est recommandé d’utiliser toutes les majuscules dans les instructions SELECT.

  • Dans la clause LIKE d’une requête SELECT, seuls le signe pourcentage, « % » (pour toute chaîne de zéro caractères ou plus) et le trait de soulignement , « _ » (pour tout caractère unique), sont des caractères spéciaux autorisés. Tous les autres caractères spéciaux sont considérés comme des valeurs de chaîne et sont ignorés.

  • Le fournisseur de données pour SAP utilise le Z_EXTRACT_DATA_OO RFC pour exécuter des requêtes SELECT sur le système SAP. Le RFC prend en charge la lecture des données à partir de tables qui répondent aux conditions suivantes :

    • TabClass pour la table est TRANSP, CUSTER ou POOL.

    • TabClass est VIEW et ViewClass est D ou P.

      Assurez-vous que l’instruction SELECT lit les données des tables qui répondent à ces conditions.

  • Les valeurs des types de données pouvant prendre plus de 255 caractères, par exemple STRING, RAWSTRING, LRAW, VARC et LCHAR ne peuvent pas être utilisées dans une requête SELECT. Le fournisseur de données pour SAP utilise une RFC personnalisée fournie avec l’adaptateur SAP, Z_EXTRACT_DATA_OO, pour exécuter des requêtes SELECT sur le système SAP. Ce RFC personnalisé ne prend pas en charge aucun type de données pouvant prendre plus de 255 caractères.

  • Le nombre maximal de colonnes ou de champs pris en charge dans une instruction SELECT est de 1000.

  • Le nombre maximal de prédicats pris en charge dans une clause WHERE est de 100.

  • La sélection du même champ plusieurs fois dans la même instruction SELECT n’est pas prise en charge. Le RFC personnalisé (Z_EXTRACT_DATA_OO) utilisé par le fournisseur de données pour SAP supprime les champs en double de l’instruction avant l’exécution. Par exemple, cette instruction :

    SELECT BUKRS, BUKRS, BUKRS from T001

    s’exécute comme s’il était écrit comme si cette instruction :

    SELECT BUKRS from T001

  • Le fournisseur de données pour SAP ne prend pas en charge les noms d’alias en double dans une instruction SELECT. Par conséquent, l’instruction SELECT suivante lève une erreur :

    SELECT KUNNR AS [MYKNA1], JMJAH AS MYKNA1 from KNA1 where KUNNR LIKE 'T-S62A08' AND JMJAH=1995  
    
  • Le fournisseur de données pour SAP ne prend pas en charge une instruction SELECT avec des noms de colonnes en double. Par conséquent, l’instruction SELECT suivante lève une erreur :

    SELECT KUNNR AS [MYKNA1], KUNNR AS MYKNA2 from KNA1 where MYKNA2='T-S62A08'  
    
  • SAP ne stocke pas de valeurs NULL dans les tables. Par conséquent, le fournisseur de données pour SAP ne prend pas en charge une valeur « IS NULL » dans une instruction SELECT. Par conséquent, l’instruction SELECT suivante lève une erreur :

    SELECT NAME1, PSTLZ  from KNA1 where CITY IS NULL AND NAME1 LIKE '%MODE%'  
    
  • Le fournisseur de données pour SAP ne prend pas en charge une clause ORDER BY dans une instruction SELECT. Par conséquent, l’instruction SELECT suivante lève une erreur :

    SELECT NAME1  AS [MYNAME],  LAND1, KUNNR  from KNA1 where NAME1 LIKE '%MODE%'  ORDER BY NAME1  ASC  
    
  • Le fournisseur de données pour SAP ne prend pas en charge la spécification d’un astérisque (*) pour sélectionner tous les champs d’une table SAP. Par conséquent, l’instruction SELECT suivante lève une erreur :

    SELECT spfli.* from spfli inner join sflight on spfli.carrid = sflight.carrid  
    

    Pour sélectionner tous les champs, vous devez spécifier les noms des champs individuellement.

  • Dans le cadre de l’instruction SELECT, vous pouvez spécifier un fichier dans lequel la sortie de l’instruction SELECT sera écrite. Toutefois, si le fichier de sortie se trouve sur un partage réseau, assurez-vous que le compte de service SAP sous lequel le service SAP s’exécute dispose de l’autorisation d’écriture sur le partage réseau. Par exemple :

    SELECT * into file '\\share\output.txt' from spfli inner join sflight on spfli.carrid = sflight.carrid  
    

    Dans l’exemple précédent, le compte de service SAP doit disposer d’une autorisation d’écriture sur le partage réseau avec le nom « share ».

  • Une instruction SELECT utilisant le fournisseur de données pour SAP prend en charge les noms de paramètres pour les valeurs d’argument dans une requête SELECT. Toutefois, veillez à suivre ces règles en ce qui concerne les noms de paramètres :

    • Dans la requête SELECT, un symbole « @ » doit précéder le nom du paramètre.

    • Le symbole « @ » doit être suivi d’un caractère alphabétique (A-Z ou a-z).

    • Le nom du paramètre peut contenir des caractères alphanumériques (A-Z, a-z ou 0-9) et des caractères spéciaux. Les seuls caractères spéciaux qui peuvent être inclus dans le nom du paramètre sont le soulignement « _ » et le hachage « # ».

  • Lorsque vous exécutez une requête SELECT sur une vue, assurez-vous que toutes les colonnes de clé primaire de la table de base sont également présentes dans l’affichage. En outre, dans la pratique, vous devez également marquer les colonnes en tant que colonnes de clé primaire dans l’affichage.

    Si les colonnes de clé primaire ne sont pas présentes dans l’affichage, une requête SELECT sur la vue entraîne une exception.

  • Lorsque vous exécutez une requête SELECT sur une table pour sélectionner des champs de type LRAW, veillez à sélectionner le champ PREC correspondant. En outre, le champ PREC doit apparaître immédiatement avant le champ LRAW dans la clause SELECT.

    Chaque champ LRAW d’une table a un champ PREC correspondant qui stocke la longueur des données dans le champ LRAW. Si vous spécifiez uniquement le champ LRAW dans la clause SELECT sans le champ PREC, vous risquez d’extraire des données incorrectes.

  • Dans un système SAP, les comparaisons de caractères respectent la casse. Par conséquent, les deux requêtes suivantes peuvent retourner des résultats différents.

    SELECT * FROM KNA1 WHERE LAND1 LIKE 'D%'  
    

    And

    SELECT * FROM KNA1 WHERE LAND1 LIKE 'd%'  
    

    Veillez à utiliser les cas appropriés lors de l’encadrement d’une requête select. En outre, dans un système SAP, toutes les colonnes ne peuvent pas contenir de caractères minuscules ou majuscules. Vous pouvez utiliser l’interface graphique graphique SAP pour déterminer si une colonne d’une table stocke des caractères en minuscules ou en majuscules. Pour obtenir des instructions sur l’utilisation de l’interface utilisateur graphique SAP, consultez Déterminer si une colonne stocke des valeurs minuscules ou majuscules.

  • La condition WHERE est prise en charge uniquement pour la comparaison d’une valeur de champ avec une valeur de données, et non avec une autre valeur de champ de table. Étant donné que le fournisseur de données pour SAP ne prend en charge qu’une seule requête SELECT de table, les requêtes de champ de table dans les conditions de jointure doivent utiliser la condition de jointure pour prendre en charge la même.

  • Une condition de jointure doit contenir un nom de table.

    Voici une instruction SELECT correcte

    select A.x, B.y from A inner join B on A.m = B.n  
    

    Voici une instruction SELECT incorrecte

    select A.x, B.y from A inner join B on m = n  
    
  • Dans une condition de jointure, la table de gauche d’une condition de jointure doit se trouver sur le côté gauche de la condition, et la table de droite de la condition de jointure doit être spécifiée sur le côté droit de la condition de jointure.

    Voici la façon correcte de spécifier une condition de jointure :

    select A.x, B.y from A inner join B on A.m = B.n  
    

    La méthode suivante est incorrecte pour spécifier une condition de jointure :

    select A.x, B.y from A inner join B on B.n = A.m  
    
  • Une instruction SELECT ne peut contenir qu’une condition « égale à » dans une clause JOIN. Par exemple :

    select * from spfli inner join sflight on spfli.carrid = sflight.carrid  
    
  • Une instruction SELECT ne récupère pas les colonnes de type STRING du système SAP.

  • Une instruction SELECT ne doit contenir qu’une seule instruction JOIN. Par exemple :

    select * from spfli inner join sflight on spfli.carrid = sflight.carrid  
    

Voir aussi

À propos du fournisseur de données .NET Framework pour mySAP Business Suite