Fetching data from transparent tables - abap

There is a new bapi developed in our sap environment which is fetching data from pool tables and transparent tables.
When this bapi is called from non sap environment then only pool tables are returning data .Transparent tables are returning blank values.
Case
When we are passing hard coded values in "Where Clause" of transparent tables like A931 table ,then transparent tables are also returning data from bapi in non sap environment.
But when we pass values in "Where Clause " of transparent tables through Variables declared in bapi then transparent tables are not returning any value (instead returns Blank) in non SAP environment.

The length of my variable was not of SAP Length required, so I appended zeros.
It worked.

Could you post some ABAP code ?
if you declare the tables in your module function, their content should be accessible, and can be returned as table params.
For example in the following code, called by RFC, the table STATES will never be empty, even if you comment the 'select' statement, as two insert statement fill it.
FUNCTION z_prt_dns_status_get.
*"----------------------------------------------------------------------
*"*"Interface locale :
*" IMPORTING
*" VALUE(LANGU) TYPE LANGU DEFAULT 'F'
*" EXPORTING
*" VALUE(RETURN) TYPE BAPIRETURN1
*" TABLES
*" STATES STRUCTURE ZPRT_ATN_STATEST
*"----------------------------------------------------------------------
SELECT t~atn t~state t~langu t~text s~seqnr
INTO CORRESPONDING FIELDS OF TABLE states
FROM zprt_atn_statest AS t
INNER JOIN zprt_atn_states AS s
ON s~atn = t~atn AND s~state = t~state
WHERE t~atn = 'DNS'
ORDER BY s~seqnr.
states-text = 'A traiter'.
states-state = 'OPEN'.
INSERT states INDEX 1.
states-text = 'Tous'.
states-state = '****'.
INSERT states INDEX 1.
ENDFUNCTION.
regards

Related

Is it possible to specify a function in a bind variable using Oracle?

When inserting data into an Oracle table from .NET is it (and how) possible to specify a function as a bind variable instead of a value?
The example below is simplistic on purpose.
For example;
dim oraCommand as OracleCommand = new OracleCommand("insert into dummy(dummy_string) values :value_to_insert")
oraCommand.Parameters.Add("value_to_insert", OracleDbType.VarChar, 200)
oraCommand.Parameters("value_to_insert").Value = "MY_USER_DEFINED_FUNCTION(23,98,"TEST")
Where "MY_USER_DEFINED_FUNCTION" is a function that returns a string. I have values which can be used by an existing Oracle function to provide the value to be inserted in the DB. Since these values are time critical, I need to call the function as I am inserting the data rather than call Oracle get the data back to the client and then pass it back to Oracle.
EDIT:
I have an existing generic VB.NET function which builds insert statements from an object which contains column name, type & value for each column in the table. Igor's comment below cleared my cobwebs, and I think I've painted myself into a corner.

Dynamic SQL Server query in Powerapps

I have created a simple form in Powerapps which has a text input field called name and a data table which shows a list of all customers from a table called customer in a SQL Server database and I have also added a button labelled "Go" on the form.
What I want to do is:
See a blank data table when I first open the form
I would enter a customer name in the name text input field
Click the "Go" button and then the value from the name field will be passed to the SQL Server database in a query which only returns
the records which have the same name
Display the results of the query in the data table.
How can I do this?
Thanks
Assuming you've been able to correctly add your on-premise SQL server as a data source:
You'll want to use a combination of Collect() and Filter()
Assign your user input to a variable using (this isn't strictly necessary)
GetContext({UserVariable: TextInput.Text})
Use a combination of Collect() to store the data you pull from MSSQL, and Filter() to, well, filter the data.
Collect(AppStorageTable1, Filter('[dbo].SqlTable]', ColumnName1 = UserVariable))
If you assign AppStorageTable1 as your data source for your data table, it should now appear. (Note, you'll have to declare/create it before it will appear as an option, but once you've used the name in Collect() it will appear as a data source).
EDIT: The term you likely were looking for is "delegable", a quick search will yield a few articles about it. The "Filter" function will pass the work off to your SQL server, so your app won't be responsible for processing/filtering the data.

Creating a Column Store Table Type in HANA

I am trying to create a table type which has ARRAY as a column type in SAP HANA. When I use the standard DDL for creating the table type, i.e.
CREATE TYPE MYSCHEMA.TABNAME AS TABLE("ObjList" INTEGER ARRAY);
I get the following error :
Could not execute 'CREATE TYPE "schema"."ListType" AS TABLE ( "ID" BIGINT CS_FIXED, ...'
SAP DBTech JDBC: [7]: feature not supported: cannot create row table having array type: ObjList
It is unclear from the documentation how to create a table type of column store type. Since I am passing ARRAY value from .NET code to Stored procedure in HANA for bulk update/upsert, I cannot do away with this requirement.
TIA
There is no way to create column table types - table types are always a row structure as they define how records should look like. Types don't store data, so there is no distinction between row/column/whatever here.
For what you want to do - handing ARRAYs from a client application to SAP HANA - this difference doesn't matter since it's simply not possible to do that.
You can pass arrays between procedures/functions and tables, but no external interface can feed data into them.
Only with the ARRAY() function you can create arrays on the server-side.
If you search for 'hana array' here on stackoverflow, you'll find that this has been discussed quite extensively already...
Insert array in HANA with JAVA , Upload an array in HANA or How to insert an array in a loop to the database to list a few examples.

Use of multiple column name as input parameter or wild card in stored procedure

I would want to add an optional parameter to my stored procedure with default *. If the list of columns is provided [delimited by a comma] these columns should be returned back by the procedure. If the wildcard character is provided [star] *, all columns should be returned. Please let me know how to implement it.
First thing - why stored procedure not table UDF?
Anyway it would be easier to pass null instead of "*" - tsql allows default values on UDF parameters.
You would have to construct query dynamically and then use sp_executesql().
The issue is that you should validate columns list to prevent errors.

Informix: Update Statement Error In WebSphere

I am trying to run this update statement but informix doesn't allow me to.
I have a table, named ITEMS and below I have selected some records from it.
SELECT SHORT_SKU, ITEMS."STYLE" FROM ITEMS;
SHORT_SKU STYLE
--------- -----
01846173 null
01811752 null
01811748 null
Trying to run the below UPDATE statement, informix says syntax error.
UPDATE ITEMS SET ITEMS."STYLE" = 'M' WHERE SHORT_SKU = '01846173';
^ syntax error here
Then I changed (as below) and got "Column (style) not found in any table in the query (or SLV is undefined)."
UPDATE ITEMS SET STYLE = 'M' WHERE SHORT_SKU = '01846173';
How do I update the "STYLE" field?
UPDATE 1
I did a change to one of WAS data source's custom properties, ifxDELIMIDENT. Originally it was blank. So, I changed it to true. Restarted WAS. And I couldn't login to our application. SQLExceptions were thrown by WAS but was not able to see the stack trace because WAS has truncated the last few lines. After changing the property back to blank, I was able to login to our application.
I tried another approach, which was to write a Java class that updates the ITEMMST.STYLE column. I executed this from a shell script. In the shell script, I defined and exported the variable DELIMIDENT with the value 'Y'. But I am still getting 'Syntax error'.
UPDATE 2
I managed to update the column. This is done by adding the 'DELIMIDENT=Y' property at the end of the connection string which will be passed to the DriverManager object when opening the database connection.
But, this won't work for our web application because it uses the WebSphere data source to create the db connection. It would be super if there's a way to set this property in the Informix environment itself.
Try:
UPDATE ITEMS SET "STYLE" = 'M' WHERE SHORT_SKU = '01846173';
It must be that STYLE is a reserved word so you must double-quote it to refer to the column. But standard UPDATE syntax doesn't allow you to prefix column names with the table name in the SET clause (since you can only be updating the columns of one table: the table mentioned in the UPDATE).
The right Syntax would be
UPDATE ITEMS SET STYLE = 'M' WHERE SHORT_SKU = '01846173';
As stated on IBM Documentation but as STYLE is a reserved word i guess your getting problems, Read IBM Recommendation on this.
Anyway you may find a work arround oat this link, otherwise you may consider changing the column name.
I am not aware of STYLE being a keyword in Informix (but I haven't gone to look for it). However, you can usually use keywords as column names etc without much problem.
If you must quote it, you need to set the DELIMIDENT environment variable - the value doesn't matter, but use DELIMIDENT=1 for concreteness. This enables SQL standard 'delimited identifiers', where double quotes surround identifiers (column names, table names, etc) and single quotes surround strings. (Normally, you can use either single quotes or double quotes around strings.)
One other point: if you use delimited identifiers, they also become case-sensitive (whereas normally, identifiers are case-insensitive). So you need to know how the STYLE column is stored in the system catalog. In most databases, they will be in lower-case. There's an outside chance that in a MODE ANSI database, they are stored in upper-case (but it is a while since I looked to make sure).
Use this query:
UPDATE ITEMS SET ITEMS.STYLE = 'M' WHERE SHORT_SKU = '01846173';
I think double quotes not required for column name.
Updated Answer 1:
Error Description-
-217 Column column-name not found in any table in the query
(or SLV is undefined).
The name appears in the select list or WHERE clause of this query but is
not defined in a table and does not appear as a statement local variable
(SLV) definition. Check that the column name or SLV name and the names of
the selected tables are spelled as you intended.
If all names are spelled correctly, you are not using the right tables,
the database has been changed, or you have not defined the SLV. If the
name not found is a reference to a column, that column might have been
renamed or dropped. If the name not found represents an SLV and you
defined the SLV in the statement, make sure that the SLV definition
appears before all other references to that SLV name.
This error message can also appear during the execution of an ALTER TABLE
statement when the engine tries to update views that depend on the table.
More info link
Updated Answer 2:
If not possible to change column name then get more information about SLV.
You can refer following links for description and use of SLV:
link1
link2
link3
There are 2 solutions for this.
Set the Informix JDBC data source 'ifxDELIMIDENT' property to 'true'
Rename the affected table columns
For the 1st option, we had a problem after setting the data source to 'true'. Suddenly all our queries did not work. After much troubleshooting, we found out that by setting the 'ifxDELIMIDENT' property to 'true', it also changed Informix to be case sensitive. In our Java code, we have all the column names in uppercase, and in Informix (Example: resultSet.getString("STYLE")), but the table column names are lowercase (Example: 'style'). This was why after changing this property, we were not able to login to our application Unfortunately this behavior was not documented anywhere in IBM's Info Centre nor in the internet.
We opted for the 2nd option which involved changing the affected column names to another column name (Example: Changed 'STYLE' to 'ITEM_STYLE').