Sintaxis de una instrucción SELECT en SAP
En las secciones siguientes se describen las especificaciones gramaticales para implementar consultas SELECT en el proveedor de datos de .NET Framework para mySAP Business Suite. Tenga en cuenta que, en varios casos, la sintaxis es algo diferente de la sintaxis base de Transact-SQL.
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'
Donde:
<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
<Predicado> =
[ predicate [AND|OR] predicate [between|not between] predicate | NOT predicate | ‘(‘ predicate ‘)’ | condition ]
Las condiciones y expresiones admitidas son:
<Condición> =
[ expr | expr [NOT | ] BETWEEN const AND const | expr [NOT | ] LIKE const ]
<Expr> =
[ const | column_name [= | ! = | > | > = | ! > | < | < = | ! < ] const | column_name | - const | const | column_name ]
Donde <const> =
integer | real | string | ? | NULL | xml_element
.Valores de la palabra clave OPTION
Puede especificar las opciones como
OPTION '<option>'
, donde<option> = 'no_conversion' | 'batchsize <size>' | 'disabledatavalidation'
La opción no_conversion :
Si se usa la opción no_conversion , los campos de la tabla se exponen mediante los tipos de .NET equivalentes. Para obtener información sobre el equivalente de .NET de los tipos de datos de SAP, consulte Tipos de datos básicos de SAP.
Si no se usa la opción no_conversion y si un campo no tiene definida una salida de conversión, esos campos de la tabla se exponen mediante los tipos de .NET equivalentes. Para obtener información sobre el equivalente de .NET de los tipos de datos de SAP, consulte Tipos de datos básicos de SAP.
Cuando no se usa la opción no_conversion y si un campo tiene una salida de conversión definida, esos campos de la tabla se exponen como cadena de .NET.
Cuando se establece en tamaño de tamaño por lotes<>, la ejecución de la instrucción SELECT hace que se realicen varias llamadas al sistema SAP y, en cada llamada, solo <se recupera el número de registros de tamaño>. Por ejemplo, si especifica "batchsize 100", la consulta SELECT recupera 100 registros solo en cada llamada al sistema SAP. Si no se especifica el tamaño> del tamaño por lotes<, se asume el valor predeterminado de 10 000 para el tamaño del lote. Tenga en cuenta que debe especificar un valor óptimo para el tamaño del lote en función de la memoria física del equipo y el número de filas en el sistema SAP. El error al especificar un valor óptimo para el tamaño del lote puede provocar excepciones de memoria insuficiente.
Cuando se establece en disabledatavalidation, el proveedor de datos para SAP no valida los valores presentes en las columnas DATS, TIMS y NUMC, sino que los expone como cadena.
Esto resulta útil en escenarios en los que ADO.NET clientes no pueden recuperar datos de una tabla de SAP que tienen datos no válidos en las columnas DATS, TIMS y NUMC. Dado que SAP permite que los datos no válidos estén presentes en las columnas DATS, TIMS y NUMC, ADO.NET los clientes que intentan leer los datos no podrán analizar los datos no válidos y producirán una excepción. Si la opción disabledatavalidation se establece en la consulta SELECT, el proveedor de datos para SAP no analiza los datos no válidos, pero los extrae como cadenas.
Importante
Siempre debe proporcionar los valores de la palabra clave OPTION entre comillas simples, por ejemplo, "disabledatavalidation".
Para obtener instrucciones de ejemplo, vea Examples for SELECT Statement.
Sintaxis de predicados
A continuación se especifica la gramática para usar predicados en una instrucción 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']'
Consideraciones al llamar a una instrucción SELECT
En esta sección se enumeran los puntos que debe tener en cuenta al usar la instrucción SELECT con el proveedor de datos para SAP.
Al especificar valores de fecha y hora en parámetros o consultas, proporcione los valores como una cadena. Proporcione cadenas de fecha y hora en el formato de fecha y hora de SAP.
SAP date format
:AAAAMMDDPor ejemplo, la fecha 2004 de noviembre de 10 en una consulta de SAP se expresa como "20041110".
La fecha del 10 de noviembre de 2004 en un SAPParameter p1 es la cadena p1. Value='20041110'.
SAP time format
:HHMMSSPor ejemplo, la hora 10:34:32 en una consulta de SAP se expresa como "103432".
La hora 10:34:32 en un SAPParameter p2 es la cadena p2. Value='103432'.
Para una instrucción SELECT, el proveedor de datos para SAP devuelve
DATE
valores de campo como objetos .NETSystem.DateTime
y devuelveTIME
valores de campo comoSystem.TimeSpan
objetos . Si el valor del objeto SAPDATE
es menor que el valor mínimo permitido SQL Server valor (1/1/1753
), el proveedor de datos para SAP devuelve este valor mínimo,1/1/1753
.
En la cláusula TOP de una consulta SELECT, cuando se usan los caracteres especiales "#", "^", "&" y "%" antes o después de un entero, se omiten los caracteres especiales, aunque no se genera ningún mensaje de error. Por ejemplo, en la cláusula TOP de una consulta SELECT se omite lo siguiente:
#5, 5^, %5%, o &5
Sin embargo, el uso de estos caracteres entre enteros, como en 5$5, produce un error.
Los nombres de columna devueltos en un esquema para una tabla se devuelven como todos los caracteres en mayúsculas. Por ejemplo, un conjunto de resultados de consulta en el campo
Last Name
devuelve el encabezadoLAST NAME
de columna . Para evitar conflictos de unicidad, se recomienda usar todas las mayúsculas en las instrucciones SELECT.En la cláusula LIKE de una consulta SELECT, solo el signo de porcentaje, "%" (para cualquier cadena de cero o más caracteres) y el carácter de subrayado, "_" (para cualquier carácter único), son caracteres especiales permitidos. Todos los demás caracteres especiales se consideran valores de cadena y se omiten.
El proveedor de datos para SAP usa la Z_EXTRACT_DATA_OO RFC para realizar consultas SELECT en el sistema SAP. RFC admite la lectura de datos de tablas que cumplen las condiciones siguientes:
TabClass para la tabla es TRANSP, CUSTER o POOL.
TabClass es VIEW y ViewClass es D o P.
Asegúrese de que la instrucción SELECT lee datos de tablas que cumplen estas condiciones.
Los valores de los tipos de datos que pueden tardar más de 255 caracteres, por ejemplo, STRING, RAWSTRING, LRAW, VARC y LCHAR no se pueden usar en una consulta SELECT. El proveedor de datos para SAP usa una RFC personalizada enviada con el adaptador de SAP, Z_EXTRACT_DATA_OO, para realizar consultas SELECT en el sistema SAP. Esta RFC personalizada no admite ningún tipo de datos que pueda tardar más de 255 caracteres.
El número máximo de columnas o campos que se admiten en una instrucción SELECT es 1000.
El número máximo de predicados admitidos en una cláusula WHERE es 100.
No se admite la selección del mismo campo varias veces en la misma instrucción SELECT. La RFC personalizada (Z_EXTRACT_DATA_OO) usada por el proveedor de datos para SAP quita los campos duplicados de la instrucción antes de ejecutarse. Por ejemplo, esta instrucción:
SELECT BUKRS, BUKRS, BUKRS from T001
se ejecuta como si se escribiera como esta instrucción:
SELECT BUKRS from T001
El proveedor de datos para SAP no admite nombres de alias duplicados en una instrucción SELECT. Por lo tanto, la siguiente instrucción SELECT produce un error:
SELECT KUNNR AS [MYKNA1], JMJAH AS MYKNA1 from KNA1 where KUNNR LIKE 'T-S62A08' AND JMJAH=1995
El proveedor de datos para SAP no admite una instrucción SELECT con nombres de columna duplicados. Por lo tanto, la siguiente instrucción SELECT produce un error:
SELECT KUNNR AS [MYKNA1], KUNNR AS MYKNA2 from KNA1 where MYKNA2='T-S62A08'
SAP no almacena valores NULL en las tablas. Como resultado, el proveedor de datos para SAP no admite un valor "IS NULL" en una instrucción SELECT. Por lo tanto, la siguiente instrucción SELECT produce un error:
SELECT NAME1, PSTLZ from KNA1 where CITY IS NULL AND NAME1 LIKE '%MODE%'
El proveedor de datos para SAP no admite una cláusula ORDER BY en una instrucción SELECT. Por lo tanto, la siguiente instrucción SELECT produce un error:
SELECT NAME1 AS [MYNAME], LAND1, KUNNR from KNA1 where NAME1 LIKE '%MODE%' ORDER BY NAME1 ASC
El proveedor de datos para SAP no admite la especificación de un asterisco (*) para seleccionar todos los campos de una tabla de SAP. Por lo tanto, la siguiente instrucción SELECT produce un error:
SELECT spfli.* from spfli inner join sflight on spfli.carrid = sflight.carrid
Para seleccionar todos los campos, debe especificar los nombres de campo individualmente.
Como parte de la instrucción SELECT, puede especificar un archivo en el que se escribirá la salida de la instrucción SELECT. Sin embargo, si el archivo de salida está en un recurso compartido de red, asegúrese de que la cuenta de servicio de SAP en la que se ejecuta el servicio SAP tiene permiso de escritura para el recurso compartido de red. Por ejemplo:
SELECT * into file '\\share\output.txt' from spfli inner join sflight on spfli.carrid = sflight.carrid
En el ejemplo anterior, la cuenta de servicio de SAP debe tener permiso de escritura para el recurso compartido de red con el nombre "recurso compartido".
Una instrucción SELECT que usa el proveedor de datos para SAP admite nombres de parámetros para los valores de argumento en una consulta SELECT. Sin embargo, asegúrese de seguir estas reglas con respecto a los nombres de parámetros:
En la consulta SELECT, un símbolo "@" debe preceder al nombre del parámetro.
El símbolo "@" debe seguir un carácter alfabético (A-Z o a-z).
El nombre del parámetro puede contener caracteres alfanuméricos (A-Z, a-z o 0-9) y caracteres especiales. Los únicos caracteres especiales que se pueden incluir en el nombre del parámetro son el carácter de subrayado "_" y el hash "#".
Al ejecutar una consulta SELECT en una vista, asegúrese de que todas las columnas de clave principal de la tabla base también están presentes en la vista. Además, como práctica, también debe marcar las columnas como columnas de clave principal en la vista.
Si las columnas de clave principal no están presentes en la vista, una consulta SELECT en la vista producirá una excepción.
Al ejecutar una consulta SELECT en una tabla para seleccionar campos de tipo LRAW, asegúrese de seleccionar el campo PREC correspondiente. Además, el campo PREC debe aparecer inmediatamente antes del campo LRAW en la cláusula SELECT.
Cada campo LRAW de una tabla tiene un campo PREC correspondiente que almacena la longitud de los datos en el campo LRAW. Especificar solo el campo LRAW en la cláusula SELECT sin el campo PREC puede dar lugar a que se extraigan datos incorrectos.
En un sistema SAP, las comparaciones de caracteres distinguen mayúsculas de minúsculas. Por lo tanto, las dos consultas siguientes pueden devolver resultados diferentes.
SELECT * FROM KNA1 WHERE LAND1 LIKE 'D%'
And
SELECT * FROM KNA1 WHERE LAND1 LIKE 'd%'
Asegúrese de usar los casos adecuados al enmarcar una consulta de selección. Además, en un sistema SAP, no todas las columnas pueden contener caracteres en minúsculas o en mayúsculas. Puede usar la GUI de SAP para averiguar si una columna de una tabla almacena caracteres en minúsculas o en mayúsculas. Para obtener instrucciones sobre cómo usar la GUI de SAP, consulte Determinar si una columna almacena valores en minúsculas o en mayúsculas.
La condición WHERE solo se admite para la comparación de un valor de campo con algún valor de datos y no con otro valor de campo de tabla. Dado que el proveedor de datos para SAP solo admite una consulta SELECT de tabla, las consultas de campo de tabla en condiciones de combinación deben usar la condición de combinación para admitir lo mismo.
Una condición de combinación debe contener un nombre de tabla.
A continuación se muestra una instrucción SELECT correcta.
select A.x, B.y from A inner join B on A.m = B.n
A continuación se muestra una instrucción SELECT incorrecta.
select A.x, B.y from A inner join B on m = n
En una condición de combinación, la tabla izquierda de una condición de combinación debe estar en el lado izquierdo de la condición y la tabla derecha de la condición de combinación debe especificarse en el lado derecho de la condición de combinación.
La siguiente es la manera correcta de especificar una condición de combinación:
select A.x, B.y from A inner join B on A.m = B.n
La siguiente es una manera incorrecta de especificar una condición de combinación:
select A.x, B.y from A inner join B on B.n = A.m
Una instrucción SELECT solo puede contener una condición "igual a" en una cláusula JOIN. Por ejemplo:
select * from spfli inner join sflight on spfli.carrid = sflight.carrid
Una instrucción SELECT no recupera columnas de tipo STRING del sistema SAP.
Una instrucción SELECT debe contener solo una instrucción JOIN. Por ejemplo:
select * from spfli inner join sflight on spfli.carrid = sflight.carrid
Consulte también
Acerca del proveedor de datos de .NET Framework para mySAP Business Suite