0% found this document useful (0 votes)
189 views34 pages

ABAP HANA Via Secondary Database Connection

ABAP HANA Via Secondary Database Connection

Uploaded by

Hengki Susano
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
189 views34 pages

ABAP HANA Via Secondary Database Connection

ABAP HANA Via Secondary Database Connection

Uploaded by

Hengki Susano
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 34

Products

Products Industries
Industries Support
Support Training
Training Community
Community Developer
Developer

Partner
Partner About
About

 

Home  /  Community  /  Blogs + Actions

Developer’s Journal: ABAP/HANA 
Connectivity via Secondary Database 
Connection
April 11, 2012 | 6,362 Views  |

Thomas Jung 
more by this author 

SAP HANA

In-Memory Technology | abap | abdc | accelerator | cl sql | dbacockpit | dbcon | exec sql

share
0 share
2 tweet share
262

Follow
Introduction
In this first edition of this HANA Developer’s Journey I barely scratched 
the surface on some of the ways which a developer might begin their 
transition into the HANA world. Today I want to describe a scenario I’ve 
been studying quite a lot in the past few days: accessing HANA from 
ABAP in the current state.  By this, I mean what can be built today.  We 
all know that SAP has some exciting plans for ABAP specific 
functionality on top of HANA, but what everyone might not know is how 
much can be done today when HANA runs as a secondary database 
for your current ABAP based systems.  This is exactly how SAP is 
building the current HANA Accelerators, so it’s worth taking a little time 
to study how these are built and what development options within the 
ABAP environment support this scenario.

HANA as a Secondary Database
The scenario I’m describing is one that is quite common right now for 
HANA implementations.  You install HANA as a secondary database 
instead of a replacement for your current database.  You then use 
replication to move a copy of the data to the HANA system. Your ABAP 
applications can then be accelerated by reading data from the HANA 
copy instead of the local database. Throughout the rest of this blog I 
want to discuss the technical options for how you can perform that 
accelerated read.
ABAP Secondary Database Connection
ABAP has long had the ability to make a secondary database 
connection.  This allows ABAP programs to access a database system 
other than the local database. This secondary database connection can 
even be of a completely different DBMS vendor type. This functionality 
is extended to support SAP HANA for all the NetWeaver release levels 
from 7.00 and beyond. Service Note 1517236 (for SAP Internal) 
1597627 (for everyone) lists the preconditions and technical steps for 
connection to HANA systems and should always be the master guide 
for these preconditions, however I will summarize the current state at 
the time of publication of this blog.

Preconditions
• SAP HANA Client is installed on each ABAP Application Server. 
ABAP Application Server Operating System must support the 
HANA Client (check Platform Availability Matrix for supported 
operating systems).
• SAP HANA DBSL is installed (this is the Database specific 
library which is part of the ABAP Kernel)
• The SAP HANA DBSL is only available for the ABAP Kernel 
7.20 
• Kernel 7.20 is already the kernel for NetWeaver 7.02, 
7.03, 7.20, 7.30 and 7.31
• Kernel 7.20 is backward compatible and can also be 
applied to NetWeaver 7.00, 7.01, 7.10, and 7.11
• Your ABAP system must be Unicode or Single Code Page 1100 
(Latin 1/ISO-8850-1) -See Service note 1700052 for non-
Unicode Support instructions

Next, your ABAP system must be configured to connect to this 
alternative database. You have one central location where you 
maintain the database connection string, username and password.  
Your applications then only need to specify the configuration key for the 
database making the connection information application independent.

This configuration can be done via table maintenance (Transaction 
SM30) for table DBCON. From the configuration screen you supply the 
DBMS type (HDB for HANA), the user name and password you want to 
use for all connections and the connection string. Be sure to include the 
port number for HANA systems. It should be 3<Instance Number>15. 
So if your HANA Database was instance 01, the port would be 30115.

DBCON can also be maintained via transaction DBACOCKPIT. 
Ultimately you end up with the same entry information as DBCON, but 
you get a little more information (such as the default Schema) and you 
can test the connection information from here.
Secondary Database Connection Via 
Open SQL
The easiest solution for performing SQL operations from ABAP to your 
secondary database connection is to use the same Open SQL 
statements which ABAP developers are already familiar with. If you 
supply the additional syntax of CONNECTION (dbcon), you can force 
the Open SQL statement to be performed against the alternative 
database connection.  

For instance, let’s take a simple Select and perform it against our 
HANA database:

SELECT * FROM sflight CONNECTION ('AB1')


INTO TABLE lt_sflight
WHERE carrid = 'LH'.

The advantage of this approach is in its simplicity.  With one minor 
addition to existing SQL Statements you can instead redirect your 
operation to HANA. The downside is that the table or view you are 
accessing must exist in the ABAP Data Dictionary. That isn’t a huge 
problem for this Accelerator scenario considering the data all resides in 
the local ABAP DBMS and gets replicated to HANA. In this situation we 
will always have local copies of the tables in the ABAP Data 
Dictionary.  This does mean that you can’t access HANA specific 
artifacts like Analytic Views or Database Procedures. You also couldn’t 
access any tables which use HANA as their own/primary persistence.

Secondary Database Connection Via 
Native SQL
ABAP also has the ability to utilize Native SQL. In this situation you 
write you database specific SQL statements.  This allows you to access 
tables and other artifacts which only exist in the underlying database.  
There is also syntax in Native SQL to allow you to call Database 
Procedures.  If we take the example from above, we can rewrite it 
using Native SQL:

EXEC SQL.
connect to 'AB1' as 'AB1'
ENDEXEC.
EXEC SQL.
open dbcur for select * from sflight where mandt = :sy-mandt and carrid = 'LH'
ENDEXEC.
DO.
EXEC SQL.
fetch next dbcur into :ls_sflight
ENDEXEC.
IF sy-subrc NE 0.
EXIT.
ELSE.
APPEND ls_sflight TO lt_sflight.
ENDIF.
ENDDO.
EXEC SQL.
close dbcur
ENDEXEC.
EXEC SQL.
disconnect 'AB1'
ENDEXEC.

 

Its certainly more code than the Open SQL option and a little less 
elegant because we are working with database cursors to bring back 
an array of data.  However the upside is access to features we wouldn’t 
have otherwise. For example I can insert data into a HANA table and 
use the HANA database sequence for the number range or built in 
database functions like now(). 

EXEC SQL.
insert into "REALREAL"."realreal.db/ORDER_HEADER"
values("REALREAL"."realreal.db/ORDER_SEQ".NEXTVAL,
:lv_date,:lv_buyer,:lv_processor,:lv_amount,now() )
ENDEXEC.
EXEC SQL.
insert into "REALREAL"."realreal.db/ORDER_ITEM" values((select max(ORDER_KEY)
from "REALREAL"."realreal.db/ORDER_HEADER"),0,:lv_product,:lv_quantity,:lv_amount)
ENDEXEC.

 

The other disadvantage to Native SQL via EXEC SQL is that there are 
little to no syntax checks on the SQL statements which you create. 
Errors aren’t caught until runtime and can lead to short dumps if the 
exceptions aren’t properly handled.  This makes testing absolutely 
essential.

Secondary Database Connection via 
Native SQL – ADBC
There is a third option that provides the benefits of the Native SQL 
connection via EXEC SQL, but also improves on some of the 
limitations.  This is the concept of ADBC – ABAP Database 
Connectivity.  Basically it is a series of classes (CL_SQL*) which 
simplify and abstract the EXEC SQL blocks. For example we could 
once again rewrite our SELECT * FROM SFLIGHT example:

****Create the SQL Connection and pass in the DBCON ID to state which Database Connection will be used
DATA lr_sql TYPE REF TO cl_sql_statement.
CREATE OBJECT lr_sql
EXPORTING
con_ref = cl_sql_connection=>get_connection( 'AB1' ).
****Execute a query, passing in the query string and receiving a result set object
DATA lr_result TYPE REF TO cl_sql_result_set.
lr_result = lr_sql->execute_query(
|SELECT * FROM SFLIGHT WHERE MANDT = { sy-mandt } AND CARRID = 'LH'| ).
****All data (parameters in, results sets back) is done via data references
DATA lr_sflight TYPE REF TO data.
GET REFERENCE OF lt_sflight INTO lr_sflight.
****Get the result data set back into our ABAP internal table
lr_result->set_param_table( lr_sflight ).
lr_result->next_package( ).
lr_result->close( ).

Here we at least remove the step-wise processing of the Database 
Cursor and instead read an entire package of data back into our 
internal table at once.  By default the initial package size will return all 
resulting records, but you can also specify any package size you wish 
thereby tuning processing for large return result sets.  Most importantly 
for HANA situations, however, is that ADBC also lets you access non-
Data Dictionary artifacts including HANA Stored Procedures.  Given the 
advantages of ADBC over EXEC SQL, it is SAP’s recommendation that 
you always try to use the ADBC class based interfaces.

Closing
This is really just the beginning of what you could with this Accelerator 
approach to ABAP integration into SAP HANA. I’ve used very simplistic 
SQL statements in my examples on purpose so that I could instead 
focus on the details of how the technical integration works.  However, 
the real power comes when you execute more powerful statements 
(SELECT SUM … GROUP BY), access HANA specific artifacts (like 
OLAP Views upon OLTP tables), or database procedures.  These are 
all topics which I will explore more in future editions of this blog.

Alert Moderator
171 Comments 
You must be Logged on to comment or reply to a post. 

Firoz Ashraf

October 16, 2014 at 9:50 am

Excellent Blog,

In my scenario I want to connect to BW System instead of HANA. I have 
made the DBCON entry and the connection is also successful. However, 
when I run my simple code as suggested by you I am getting a short dump 
saying the table SFLIGHT is unknown or does not exists.

SELECT * FROM sflight CONNECTION (‘SAP-BW-DEV’)

INTO TABLE lt_sflight

WHERE carrid = ‘LH’.

What could be the reason for this dump?

Regards,

Firoz.
Vivek Prabhu

October 16, 2014 at 1:01 pm

Hi Feroz,

Can you please confirm if the SLFIGHT table is in HANA ?

Regards

Vivek

Firoz Ashraf

October 17, 2014 at 6:39 pm

I am connecting to SAP BW system and SFLIGHT 
does exists there.

Kevin Che

December 3, 2014 at 1:56 am

Hello Firoz,

Is there any solution now?

We have countered the same problem.

Thanks and Regards,

Kevin

Mr. Amit W
November 20, 2014 at 11:15 am

Hi,

Below query i wanted records filters on BUKRS, but unfortunately  am getting 
whole data from view.

LV_SQL =  |SELECT MANDT, KTOPL, KSTAR, LTEXT, BUKRS | &&

                  |FROM 
_SYS_BIC.“dev.re.e10.cal.fi.tr/CV_COSTELEMENT_TEST” | &&

|(‘PLACEHOLDER’=(‘$$IP_BUKRS$$’,‘{ LV_BUKRS }’)) |

jyotsna dm

December 3, 2014 at 8:38 am

Hi Thomas,

We have HANA as a secondary DB for ECC system. through DBCOCKPIT 
the connectivity is working fine.

Do we have any other settings to perform FBL3H transaction code which is 
working on sidecar scenario i.e. HANA DB as secondary db.

Regards,

Jo

Swetha Shivakumar

March 4, 2015 at 6:51 am

Hi Thomas,

Here you have explained how to access the HANA DB which is used as a 
secondary database through Native SQL/Open SQL/ADBC. 
In our solution while having HANA as a primary DB, we used to write the 
Stored procedures in HANA DB with the presentation layer as UI5 and 
access it via AMDP through Netweaver Gateway Odata services.

My query is – can the AMDP be used to access the same HANA DB stored 
procedures if the HANA DB is a secondary database. The underlying primary 
DB is Oracle 10.2.0.5.0;

If not then what would be appropriate method to call the stored procedures for 
a secondary HANA DB? Or should we use the proxies to access it for UI5?

Thomas Jung Post author

March 4, 2015 at 2:32 pm

No AMDP is not possible with a secondary database 
connection.  To call a stored procedure from a secondary 
database connection you would have to use the techniques 
described in this blog for issuing Native SQL.  Or you could 
consider doing your service enablement within HANA directly 
using XSODATA services. 

Hugo Armstrong

March 19, 2015 at 6:59 am

Hey Thomas,

Nice blog, apparently implemented something like this but here is a 
question… there is a maximum_connections input which means that the limit 
if set to 0 then subsequently sets the maximum to 255. 

This seems like it would be an issue currently… not sure on why that is even 
a thing if secondary DB for HANA is a valid option. Definitely the connection 
works fine and can be conveniently / dynamically switched out with the ADBC 
classes otherwise…
Thomas Jung Post author

March 19, 2015 at 12:24 pm

I don’t think the maximum_connections is anything to worry 
about. People often compare it to the number of users on their 
system and that’s incorrect.  There is a connection pool and 
connections are only used while actually communicating to the 
database. Therefore you can support a very high number of 
users with a much smaller number of maximum connections. 

Swetha Shivakumar

March 24, 2015 at 12:11 pm

If the options of using the HANA as a primary or secondary DB is ruled out by 
the customer, but still they want to use the UI5 as a front end and Netweaver 
Gateway as a web service, the usage of stored procedures and AMDP is 
ruled out. Will the usage of logical databases in the Netweaver gateway 
server as this might be a performance booster? If not what will be the ideal 
approach?

Thomas Jung Post author

March 24, 2015 at 12:17 pm

Well your question really doesn’t have anything to do with this 
blog. If you just have a general question about logical databases 
in ABAP, I would post that in the ABAP forum.  However from my 
background I would say that I was never a fan of Logical 
Database. They generally decrease performance because they 
often must do a lot of unnecessary SQL to reach the lower 
objects in a hierarchy. If HANA is not an option, than just writing 
good, clean Open SQL in ABAP is probably the best 
performance option. 

Uwe Fetzer

March 24, 2015 at 12:23 pm

And Logical Databases are obsolete since, don’t 
know, 10(?) years…

Please don’t use them anymore.

Swetha Shivakumar

March 25, 2015 at 5:41 am

Thank you Thomas and Uwe Fetzer for your valuable input.

Emin Ercelik

June 2, 2015 at 11:52 am

Hi Thomas,

Do you have any solution to use HANA connection on standard SQVI Abap SQL?

We developed a custom data browser that running on HDB (ZSE16), the results 
are really perfect and imagine same benefit on sqvi..

zse16 code is below 

*&———————————————————————*

*& Report  ZBC_DATA_BROWSER

*&
*&———————————————————————*

*&

*&

*&———————————————————————*

report  zbc_data_browser.

set extended check off.

type-pools: rsds.

tables zbc_data_browser.

data: begin of gt_htables occurs 1,

       table_name(30),

end of gt_htables.

data: gs_x030l  type x030l,

       gt_dfies  type table of dfies,

       gs_dfies  type dfies,

       gt_fdiff  type table of field_dif,

       gs_fdiff  type field_dif,

       gt_ftab   like table of rsdsfields with header line,

       gt_fcode  like table of rsdsfcode with header line,

       gt_events like table of rsdsevents with header line.

data: gv_selid  type rsdynsel–selid,

       gt_tables type table of rsdstabs,

       gs_tables type rsdstabs,

*      gt_fields type table of rsdsfields with header line,

       gt_expr   type rsds_texpr,

       gt_ranges type rsds_trange,

*      gs_ranges type rsds_range,
       gt_where  type rsds_twhere,

       gs_where  type rsds_where,

       gv_active type i.

data: gt_content type ref to data,

       gt_modif   type ref to data,

       gt_fcat    type lvc_t_fcat,

       gs_pfkey   type rsdspfkey.

data: gv_fieldok,

       gv_dbcnt(30).

field-symbols: <itab> type standard table,

                <ntab> type standard table.

define table_error.

   message e398(00) with ‘Table’ p_table &1.

end-of-definition.

*———————- parameters ————————*

parameters: p_table type tabname obligatory                                 “table

                                  memory id dtb

                                  matchcode object dd_dbtb_16.

parameters p_rows type i default 1000.                                      “rows

selection-screen skip.

parameters p_conn as checkbox default ‘X’.

at selection-screen.

   if p_table ne gs_x030l–tabname.

     if not p_conn is initial.

       if not zcl_hana_cnt_util=>con_name is initial.

         perform get_hana_tables.
         read table gt_htables with key table_name = p_table.

         if sy–subrc ne 0.

           table_error ‘is not selectable for Hana DB’.

         endif.

       else.

         message e398(00) with ‘Hana connection is not active’.

       endif.

     else.

       clear zcl_hana_cnt_util=>con_name.

     endif.

     call function ‘DDIF_NAMETAB_GET’

       exporting

         tabname   = p_table

       importing

         x030l_wa  = gs_x030l

       tables

         dfies_tab = gt_dfies

       exceptions

         others    = 1.

     if gs_x030l is initial.

       table_error ‘does not exist or is not active’.

     elseif gs_x030l–tabtype ne ‘T’

       and  gs_x030l–tabtype ne ‘J’.

       table_error ‘is not selectable’.

     endif.

*   Prepare free selection on table
     clear: gt_ftab[], gt_tables[], gt_ftab, gt_tables, gv_fieldok.

     select * from zbc_data_browser where tablename = p_table.

       gt_ftab–tablename = zbc_data_browser–tablename.

       gt_ftab–fieldname = zbc_data_browser–fieldname.

       append gt_ftab.  clear gt_ftab.

     endselect.

     if sy–subrc eq 0.  gv_fieldok = ‘X’.  endif.

     loop at gt_dfies into gs_dfies

                     where keyflag = ‘X’

                       and fieldname ne ‘MANDT’

                       and fieldname ne ‘MANDANT’

                       and fieldname ne ‘CLIENT’

                       and rollname ne ‘MANDT’.

       gs_tables–prim_tab = p_table.

       append gs_tables to gt_tables.

       if gv_fieldok is initial.

         gt_ftab–tablename = p_table.

         gt_ftab–fieldname = gs_dfies–fieldname.

         append gt_ftab.

       endif.

     endloop.

     clear: gv_selid.

   endif.

*————————- start of selection ————————-*

start-of-selection.

   if gv_selid is initial.
*   Init free selection dialog

     gt_events–event = ‘5’.

     gt_events–prog = sy–cprog.

     gt_events–form =  ‘NUMBER_OF_ENTRIES’.

     append gt_events.  clear gt_events.

     call function ‘FREE_SELECTIONS_INIT’

       exporting

         expressions  = gt_expr

       importing

         selection_id = gv_selid

         expressions  = gt_expr

       tables

         events       = gt_events[]

         tables_tab   = gt_tables

         fields_tab   = gt_ftab[]

       exceptions

         others       = 1.

   endif.

   gs_pfkey–pfkey = ‘MAIN1’.

   gs_pfkey–program = sy–cprog.

   gt_fcode–fcode = ‘NUMB’.

   gt_fcode–form = ‘NUMBER_OF_ENTRIES’.

   append gt_fcode.  clear gt_fcode.

   call function ‘FREE_SELECTIONS_DIALOG’

     exporting

       selection_id            = gv_selid
       title                   = ‘Alan seçimleri’

       status                  = 1

       pfkey                   = gs_pfkey

     importing

       expressions             = gt_expr

       field_ranges            = gt_ranges

       number_of_active_fields = gv_active

     tables

       fields_tab              = gt_ftab[]

       fcode_tab               = gt_fcode[]

     exceptions

       internal_error          = 1

       no_action               = 1

       selid_not_found         = 1

       illegal_status          = 1.

   check sy–subrc eq 0.

   perform list.

*&———————————————————————*

*&      Form  list

*&———————————————————————*

form list.

   delete from zbc_data_browser where tablename = p_table.

   loop at gt_ftab.

     zbc_data_browser–tablename = gt_ftab–tablename.

     zbc_data_browser–fieldname = gt_ftab–fieldname.

     modify zbc_data_browser.  clear zbc_data_browser.
   endloop.

   perform f_create_table using p_table.

   perform f_select_table.

   perform f_display_table.

endform.                    “list

*&———————————————————————*

*&      Form  exit

*&———————————————————————*

form exit.

   exit.

endform.                    “exit

*———————————————————————*

*       FORM f_create_table                                           *

*———————————————————————*

form f_create_table using p_tabname.

   field-symbols: <l_fcat> type lvc_s_fcat.

   call function ‘LVC_FIELDCATALOG_MERGE’

     exporting

       i_structure_name = p_tabname

     changing

       ct_fieldcat      = gt_fcat

     exceptions

       others           = 1.

   if sy–subrc = 0.

*   Complete field catalog

     loop at gt_fcat assigning <l_fcat>.
       <l_fcat>–tabname = p_tabname.

     endloop.

     call function ‘LVC_FIELDCAT_COMPLETE’

       changing

         ct_fieldcat = gt_fcat

       exceptions

         others      = 1.

   else.

     write: ‘Error building field catalog’.

     stop.

   endif.

* Create dynamic table for data

   call method cl_alv_table_create=>create_dynamic_table

     exporting

       it_fieldcatalog = gt_fcat

     importing

       ep_table        = gt_content.

   if sy–subrc = 0.

     assign gt_content->* to <itab>.

   else.

     write: ‘Error creating internal table’.

     stop.

   endif.

* Create dynamic table for modif

   call method cl_alv_table_create=>create_dynamic_table

     exporting
       it_fieldcatalog = gt_fcat

     importing

       ep_table        = gt_modif.

   if sy–subrc = 0.

     assign gt_modif->* to <ntab>.

   else.

     write: ‘Error creating internal table’.

     stop.

   endif.

endform.                    “f_create_table

*———————————————————————*

*       FORM f_select_table                                           *

*———————————————————————*

form f_select_table.

   if gv_active = 0.

     select * from (p_table)

              into corresponding fields of table <itab>

                up to p_rows rows

        connection (zcl_hana_cnt_util=>con_name).

   else.

*   Selection with parameters

     clear gt_where.

     call function ‘FREE_SELECTIONS_RANGE_2_WHERE’

       exporting

         field_ranges  = gt_ranges

       importing
         where_clauses = gt_where.

     read table gt_where into gs_where with key tablename = p_table.

     select * from (p_table)

              into corresponding fields of table <itab>

                up to p_rows rows

        connection (zcl_hana_cnt_util=>con_name)

             where (gs_where–where_tab).

   endif.

   write sy–dbcnt to gv_dbcnt.

   shift gv_dbcnt left deleting leading: ‘0’, space.

   concatenate ‘Records:’(001) gv_dbcnt

          into gv_dbcnt separated by space.

   concatenate sy–title gv_dbcnt

          into sy–title separated by ‘       ‘.

   if sy–dbcnt = 0.

     write: ‘No record selected’.

     stop.

   endif.

endform.                    “f_select_table

*&———————————————————————*

*&      Form  number_of_entries

*&———————————————————————*

form number_of_entries tables pt_rsseldyn structure rsseldyn

                               pt_rsdsfldnum structure rsdsfldnum

                         using p_fcode type rsdsfcode–fcode. “#EC *

   data: ls_rsseldyn type rsseldyn,
         ls_ranges like line of gt_ranges,

         ls_frange like line of ls_ranges–frange_t,

         ls_selopt type rsdsselopt.

   clear: gt_ranges, gt_where, gs_where,

          gs_where–where_tab[], gv_active.

   loop at pt_rsseldyn into ls_rsseldyn.

     if ls_rsseldyn–sign ne space.

       ls_ranges–tablename = ls_rsseldyn–tablename.

       ls_frange–fieldname = ls_rsseldyn–fieldname.

       ls_selopt–sign = ls_rsseldyn–sign.

       ls_selopt–option = ls_rsseldyn–option.

       ls_selopt–low = ls_rsseldyn–low.

       ls_selopt–high = ls_rsseldyn–high.

       append ls_selopt to ls_frange–selopt_t.  clear ls_selopt.

       append ls_frange to ls_ranges–frange_t.  clear ls_frange.

       append ls_ranges to gt_ranges.  clear ls_ranges.

       add 1 to gv_active.

     endif.

   endloop.

   delete adjacent duplicates from gt_ranges comparing all fields.

   if gv_active = 0.

     select count(*) from (p_table)

       connection (zcl_hana_cnt_util=>con_name).

   else.

*   Selection with parameters

     call function ‘FREE_SELECTIONS_RANGE_2_WHERE’
       exporting

         field_ranges  = gt_ranges

       importing

         where_clauses = gt_where.

     read table gt_where into gs_where with key tablename = p_table.

     select count(*) from (p_table)

       connection (zcl_hana_cnt_util=>con_name)

            where (gs_where–where_tab).

   endif.

   write sy–dbcnt to gv_dbcnt.

   shift gv_dbcnt left deleting leading: ‘0’, space.

   concatenate ‘Records:’(001) gv_dbcnt

          into gv_dbcnt separated by space.

   message gv_dbcnt type ‘I’.

   clear: pt_rsseldyn[], pt_rsdsfldnum[], p_fcode.

endform.                    “number_of_entries

*———————————————————————*

*       FORM f_display_table                                          *

*———————————————————————*

form f_display_table.

   call function ‘REUSE_ALV_GRID_DISPLAY_LVC’

     exporting

       i_structure_name = p_table

     tables

       t_outtab         = <itab>

     exceptions
       program_error    = 1

       others           = 2.

endform.                    “f_display_table

*———————————————————————*

*       FORM f_add_system                                             *

*———————————————————————*

form f_add_system using p_new type c.

   field-symbols: <l_irec> type any,

                  <l_upd>  type any.

   loop at gt_fdiff into gs_fdiff.

     read table gt_dfies into gs_dfies

                     with key fieldname = gs_fdiff–fieldname.

     loop at <ntab> assigning <l_irec>.

       assign component gs_fdiff–fieldname of structure <l_irec> to <l_upd>.

       if gs_dfies–datatype = ‘CLNT’.

         <l_upd> = sy–mandt.

       else.

         case gs_dfies–rollname.

           when ‘AENAM’.

             <l_upd> = sy–uname.

           when ‘AEDAT’ or ‘LAEDA’.

             <l_upd> = sy–datum.

           when ‘AETIM’.

             <l_upd> = sy–uzeit.

           when others.

         endcase.
       endif.

     endloop.

   endloop.

endform.                    “f_add_system

*&———————————————————————*

*&      Form  GET_HANA_TABLES

*&———————————————————————*

form get_hana_tables .

   clear: gt_htables[], gt_htables.

   try.

       “open hana db connection

       exec sql.

         connect to :zcl_hana_cnt_util=>con_name

       endexec.

       if sy–subrc <> 0.

         raise exception type cx_sy_native_sql_error.

       endif.

       “get hana db tables

       exec sql.

         open dbcur for

           select distinct table_name

             from M_CS_TABLES

            where schema_name = :zcl_hana_cnt_util=>con_name

              and table_name = :p_table

       endexec.

       do.
         exec sql.

           fetch next dbcur into :gt_htables

         endexec.

         if sy–subrc ne 0.

           exit.

         else.

           append gt_htables.  clear gt_htables.

         endif.

       enddo.

       exec sql.

         close dbcur

       endexec.

       “get hana db views

       exec sql.

         open dbcur for

           select distinct view_name

             from VIEWS

            where schema_name = :zcl_hana_cnt_util=>con_name

              and view_name = :p_table

       endexec.

       do.

         exec sql.

           fetch next dbcur into :gt_htables

         endexec.

         if sy–subrc ne 0.

           exit.
         else.

           append gt_htables.  clear gt_htables.

         endif.

       enddo.

       exec sql.

         close dbcur

       endexec.

       “close hana db connection

       exec sql.

         disconnect :zcl_hana_cnt_util=>con_name

       endexec.

     catch cx_sy_native_sql_error.

       message ‘SQL error’ type ‘I’.

   endtry.

endform.                    ” GET_HANA_TABLES

Shounak Mukherjee

June 9, 2015 at 10:49 pm

Hello All,

We are using a HANA Sidecar setup. In HANA Studio I created a view joining 
FAGLFLEXA and BSEG with around 10 columns. I am able to preview data in 
the view.

Within ECC I created a view with the same set of columns so that I can use 
OpenSQL. But when I am trying to query the view using OpenSQL , I am 
getting the following error:

SQL error 258 when accessing table
Error Text of the Database: “insufficient privilege: Not authorized:

The schema has other views in it which is working fine. I believe some of the 
other tables and views that got replicated via the SLT had automatically 
granted the “select” rights on the schema.

What am I missing here or some other approach is required. Do I need to 
execute the GRANT on the schema again after this view was created via the 
SYSTEM user?

Thanks,

Shounak

Joachim Paulini

August 16, 2015 at 7:25 pm

Hi Thomas,

very helpful blog post! However, a questions which remains to me is about 
the security of the network protocol underneath the DB connection in 
DBAcockpit. Can it be securely used to connect to a HANA database in the 
cloud? Do you know which protocol/DB query technology is used?

Thanks a lot

Joachim

Raghavender Poosarla

September 21, 2015 at 12:21 pm

Hi Thomas,

                I read in one of your comments about the Kernal switch pilot which 
was in progress then. Is it live now?
               Can SQL be directed to secondary DB hana without any change in 
existing code?

Regards,

Raghav

Thomas Jung Post author

September 21, 2015 at 12:48 pm

The Kernel switch has been available to Max Attention 
customers for several years. 

Justin Molenaur

September 21, 2015 at 1:23 pm

As Thomas mentioned this is available and I helped a customer 
take this live. You can indeed redirect to the secondary DB 
without any code changes, only requires some configuration.

See this webinar for more information – “Speedup ABAP 
applications with SAP HANA Application Accelerator with little or 
no code changes”

http://www.hdespot.com/2015/09/16/hde-webinars/

Regards,

Justin

Lucas Ferraz

October 22, 2015 at 11:14 pm
Hi,

Could you post an example setting the package size and fetch chunks of data 
until it ends ?

meenu agrawal

June 28, 2016 at 7:56 am

Hi Thomas,

Excellent blog.

Thanks a lot for writing this.

I am facing some issue .

I am able to create a table in sec. data base from  ABAP using native sql. 
Also I am able to fetch data.

But my methods to update data are not working (  example  Delete and 
insert).

Also I am not getting any error in ABAP code , sy-subrc is always 0. still i can  
not see my updates in HANA DB.

What can be the reason ? DO we need any kind of commit statement or 
something?

Regards,

Meenu

Thomas Jung Post author

June 28, 2016 at 1:44 pm

I think you answered your own question at the end.  Yes an 
explicit commit is required. 
Marcio Aikawa

August 4, 2017 at 2:35 pm

Hi,

I installed the SAP AS 7.5 trial and now, and DB System was installed also.

To add the second connection (HANA Database) do I need to have this 
database (like Database in the SAP Cloud Platform Cockpit) or if I click 
on the Add button the SAP AS will create a secondary HANA database ?

 Previous  1 2

Share & Follow
Privacy Terms of Use Legal Disclosure Copyright Trademark Sitemap Newsletter

You might also like