SAP SQL Anywhere Tips – LinuxでのODBC接続設定


はじめに

*今回もリクエストを受け作成した記事となります。こういうのを解説してほしいとかありましたらお気軽にリクエストいただければと思います。

 SAP SQL Anywhere をWindowsサーバーからLinuxサーバーへ移行するという事例が増えています。Windowsサーバー上で動作させていたアプリケーションもLinuxへ移行することになりますが、アプリケーションがODBC接続で接続していた場合、Linuxではどのように設定すればよいのか?こちら、マニュアル上ではあまりにもさらっと触れているだけですので方法を説明したいと思います。

本投稿ではVer.17を使用しましたが、おそらくは他のバージョンでも若干の変更動作すると思われます。他のバージョンでうまく行かないなど有りましたらコメント欄よりお問い合わせいただければと思います。

説明で使用している環境

 本説明で使用しているLinuxディストリビューションはUbuntu 16.04LTSです。またSAP SQL Anywhere は17の64bit版を使用しています。おそらくは若干の変更でどのようなLinuxディストリビューションでも活用できると思いますが、お使いのディストリビューションでうまく動かないなど有りましたらコメント欄よりお問い合わせいただければと思います。

 また、今現在はLinuxでもGUIでODBCデータソースの設定を行うためのツールが提供されるようになりましたが、Linuxサーバー機の場合、GUI環境をインストールしないという場合がありますので今回はCUIでの設定方法の解説をしたいと思います。SSH、Telnet、あるいはコンソールで接続して行うことになります。

ODBCドライバマネージャ

 Windowsと違いLinuxではODBCを使用する上で必要となるODBCドライバマネージャがOSをに標準で付属していませんので通常は追加で導入する必要があります。(ディストリビューション、あるいはOSをインストール時のオプションで標準でインストールされている場合もあるかもしれませんが。)

 ここで一つ問題というか、厄介な点があり、OS標準機能として提供されているWindowsと違い、LinuxではODBCドライバマネージャ自体が何種類か存在します。また、Linux版SAP SQL Anywhere自体にもSAP製の独自のODBCドライバマネージャが付属しています。

 ではどれを使うべきなのか?に関してですが、これはそのアプリケーションにより異なるという事態が発生します。例えばスクラッチでCで開発したアプリケーションの場合、これは開発者様が決定する必要があります。ODBCドライバマネージャから提供されるライブラリをリンクしてアプリケーションをビルドするということになるからです。つまりこの場合であればどのODBCドライバマネージャを使用しても良いということになります。SAP SQL Anywhere 付属のODBCドライバマネージャを使用してSQL Anywhere専用のアプリケーションとしても良いですし、様々な種類のデータベースで使用できるようにするためにunixODBCやiODBCといったオープンソースのODBCドライバマネージャのライブラリにリンクしてアプリケーションを開発するという方法もあるでしょう。

 第三者が開発したアプリケーションや、ランタイム系の開発環境、例えばPythonを使用するといった場合、そちらの指針に従う必要があります。Pythonでpyodbcというモジュールを使用したアプリケーションを使用する場合、このモジュールはunixodbcが必要となりますので、SQL AnywhereのODBCドライバをunixodbcで使用するように設定する必要があります。

*Pythonに対してはSAP SQL Anywhereでも専用の接続モジュールを提供していますのでそれを使用する方法もあります。

本説明ではODBCドライバマネージャとしてunixODBCを使用た例を解説します。unixodbcパッケージがインストールされていない場合、追加でインストールする必要があります。ubuntuの場合であれば

# sudo apt install unixodbc

としてインストールすることになるかと思います。

SQL Anywhere側は「SQL Anywhereクライアント」のインストールが必要です。(これはインストールをディフォルトで行った場合は含まれています。)

システムデータソースとユーザーデータソース

本投稿をご覧の方でMicrosoft Windowsをお使いであれば「ODBCアドミニストレータ」というツールはご存知でしょう。
この2つは

    • ユーザーDSN

設定したユーザーでのみ参照できるODBCデータソース。

    • システムDSN

このOS上で(権限を持つ)全てのユーザーが参照できるODBCデータソース。但し管理権限がないと設定できない

という違いがあります。これはLinux上でも同様の概念であり、それによりODBC設定を行うファイルの場所が違います。Windowsから移行の場合であればWindows上でどちらを設定していたか、新規に設定するのであればどのように使用するのかを加味して決定する必要があります。

Linuxではデータソースをテキストファイルで定義します。ODBCデータソースを定義するファイルは「.odbc.ini」というファイルです。SAP SQL Anywhere ODBCドライバは以下の順で定義ファイルを検索し、使用します。(見つかったらそこで検索終了ですので、同一のDSNが存在する場合は早く見つかったほうが使用されます。)

  1. ODBCINI 環境変数
    • ファイル名を定義したフルパスで定義してください。そのため、ファイル名が「.odbc.ini」である必要はありません。
      例 export ODBCINI=/etc/odbc.ini
  2. ODBC_INI 環境変数
    • ファイル名を定義したフルパスで定義してください。そのため、ファイル名が「.odbc.ini」である必要はありません。
      例 export ODBC_INI=/etc/odbc.ini
  3. ODBCHOME 環境変数
    • パスを定義します。そのパスにある.odbc.iniファイルを使用します。
      例: export ODBCHOME=/opt/odbcsettings
  4. HOME 環境変数
    • パスを定義します。そのパスにある.odbc.iniファイルを使用します。
  5. ユーザのホームディレクトリ (~)
    • ホームディレクトリにある.odbc.iniファイルを使用します。
  6. PATH 環境変数
    • これを使うことは推奨しません。その前で見つけられるようにしてください。

LINUXにおいてはユーザーDSNとシステムDSNはファイルやディレクトリのパーミッションと関連します。例えば1のODBCINI環境変数で誰もが見られるodbc.iniファイルを設定すればそれはシステムDSNという扱いです。そして5のホームディレクトリ上に.odbc.iniを配置すれば、これは通常他のユーザーから閲覧できないことになりますのでユーザーDSNとなります。見ている限りでは1と5が使用されることが多いです。

odbcinst.iniの設定

odbcinist.iniはODBCドライバのライブラリファイルの定義です。WindowsのODBCアドミニストレータではDriversという部分に相当します。odbcinst -jで設定内容を表示させた場合に「DRIVERS」で示されるファイルとなります。上記例では/etc/odbcinst.iniです。

このファイルは直接書くのではなくodbcinstコマンドで登録するという形になります。
まず、sqladriver.templateという名称で下記のテキストファイルを作成します。

[SQL Anywhere 17]
Description=SAP SQL Anywhere 17 ODBC Driver
Driver=/opt/sqlanywhere17/lib64/libdbodbc17_r.so
Setup=/opt/sqlanywhere17/lib64/libdbodbc17_r.so

*/opt/sqlanywhere17はディフォルトのインストールディレクトリですが、違うディレクトリにインストールした場合は適宜変更してください。また、例では64bit版で設定しています。32bit版を使用する場合はlib64など64の部分を32に置換してください。

そしてSQL Anywhereの環境変数を読み込み、odbcinstコマンドで作成したsqladriver.templateファイルを指定してインストールを行います。

$ source /opt/sqlanywhere17/bin64/sa_config.sh

$ sudo odbcinst -i -d -f sqladriver.template
odbcinst: Driver installed. Usage count increased to 1.
Target directory is /etc

odbcinstコマンドは通常root権限でインストールする必要があります。なお、上記例ではUsage countは1と表示されていますが、これはカウントですので違う数字になる場合があります。

コマンドが成功すれば/etc/odbcinst.iniに下記の様なエントリが書かれます。

[SQL Anywhere 17]
Description=SAP SQL Anywhere 17 ODBC Driver
Driver=/opt/sqlanywhere17/lib64/libdbodbc17_r.so
Setup=/opt/sqlanywhere17/lib64/libdbodbc17_r.so
UsageCount=1

これでODBCドライバが「使える」ようになりました。

odbc.iniの設定

例で接続するデータベース

ここからの例で接続するデータベースは下記のものとします。

・ホスト:Localhost、ポート2638で稼働

・データベースサーバー名、データベース名はdemo

ローカルホスト上で

dbsrv17 -n demo -x “tcpip(port=2638)” demo.db

で起動したデータベースとしてお考えいただければと思います。

システムデータソースとして定義する

システムデータソースとして複数のユーザーで使用できるようにします。ここでは/etc/odbc.iniとしてODBCデータソース定義ファイルを作成します。このファイルは一般的なユーザーでは変更できないようにすべきでしょう。たとえば

# sudo nano /etc/odbc.ini

としてroot権限で作成します。

ファイルの中身は以下のように入力します。

[demodb1]
Driver=SQL Anywhere 17
DatabaseName=demo
ServerName=demo
CommLinks=tcpip(host=localhost;port=2638)

[demodb1]:データソース名
Driver:使用するODBCドライバ名
DatabaseName:データベース名
ServerName:データベースサーバー名
CommLinks:ネットワーク設定、上記はtcpip接続でHostがlocalhost、portが2638で接続ということです。

設定内容はSQL CentralやInteractive SQLから接続する場合と同じですのでSQL Anywhereのマニュアルを参照してください。

注意として、Driverはodbcinst.iniで定義した名称、sqladriver.templateの1行目の[]で囲んだ中身と一致させるようにしてください。これでodbcinst.iniで定義したライブラリが使用され、ODBC接続されるようになります。

ユーザーデータソースとして定義する

*説明の都合上、システムデータソースとして設定したデータベースと同じデータベースに対しての接続を違うDSN名を使用して作成しています。(同じDSN名を使用した場合は上で説明したとおり、先に見つかった方の接続設定が使用されます。)

ユーザーデータソースとしてあるユーザーしか使用できないデータソースを作成します。ホームディレクトリに.odbc.iniとしてODBCデータソース定義ファイルを作成します。これで(管理者ユーザーを除けば)そのディレクトリをホームディレクトリとしているユーザーしか設定ファイルが読めなくなりますのでユーザーデータソースとして機能することになります。

% cd $HOME
% nano .odbc.ini

中身は以下のように入力します。

[demodb2]
Driver=SQL Anywhere 17
DatabaseName=demo
ServerName=demo
CommLinks=tcpip(host=localhost;port=2638)

これでユーザーデータソースが完成しました。

テスト接続してみる

テスト接続してみます。ここではunixodbc付属のisqlというコマンドラインのSQLツールを使用してみます。

使用する前には環境変数の読み込み・設定を忘れないようにしてください。

# source /opt/sqlanywhere17/bin64/sa_config.sh
# export ODBCINI=/etc/odbc.ini

*下の行はシステムデータソースを使用する場合のみ必要です。

isqlのコマンド書式は以下になります。

isql <DSN名> <ユーザー名> <パスワード>

これに従い接続してみます。下記はdemodb1を使用して接続します。

# isql demodb1 DBA sql
+—————————————+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+—————————————+
SQL>

Connected!と表示されれば接続成功です。適当なSQL文を打って正しく接続できているか確認しましょう。

# isql demodb1 DBA sql
+—————————————+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+—————————————+
SQL> select * from customers;
+————+———————+———————+——————————-+———————+—————–+—————–+———–+————–+———————————+
| ID | Surname | GivenName | Street | City | State | Country | PostalCode| Phone | CompanyName |
+————+———————+———————+——————————-+———————+—————–+—————–+———–+————–+———————————+
| 101 | Devlin | Michaels | 114 Pioneer Avenue | Kingston | NJ | USA | 07070 | 2015558966 | The Power Group |
| 102 | Reiser | Beth | 33 Whippany Road | Rockwood | NY | USA | 10154 | 2125558725 | AMF Corp. |
| 103 | Niedringhaus | Erin | 190 Windsor Street | Tara | PA | USA | 19301 | 2155556513 | Darling Associates |
| 104 | Mason | Meghan | 5520 Dundas Street East | Cheslea | TN | USA | 37919 | 6155555463 | P.S.C. |
| 105 | McCarthy | Laura | 110 Highway 36 | Clinton

………………(中略)………………….

5165552549 | The Apple Farm |
+————+———————+———————+——————————-+———————+—————–+—————–+———–+————–+———————————+
SQLRowCount returns 126
126 rows fetched
SQL> quit
#

次は実際に使用されるアプリケーションでテストしてみてください。

まとめ

上記のようにしてLinux上でもODBC接続できるようになります。まだまだ使用されることが多い形式ですのでお役に立てば幸いです。

IBP TS Opt – Co Product Cycle Error

Hello Colleagues,

The purpose of this blog is to share some information regarding Co-Product modelling in IBP TS Optimizer (Cycle Error).

1) When is Co-Product required?
Co-product is mainly used to represent the production of one product that is generated automatically while manufacturing a semi-finished or finished product. This co-product is normally consumed in the process or kept is stock or even sold. In segment like Mills, Sugar Cane and mining this is a very common scenario.

2) How to build this in IBP TS Supply optimizer?

1st) You need to know where you will generate the Co-Product on your BOM structure.
Example:

2nd) You should define your co-product source type = C, in the Master Data Type > Production Source Header as follows:

3rd) With this basic setting you can see your co-product being manufactured and stocked as follows:

4th) The Cycle error, normally happens when you generate and consume the co-product, as follows

Then while running the optimizer or the check mode you get error:

Invalid production source: Cycle is defined. Co-product RM – SF2 is also component RM – SF2 and both have set time-independent, non-zero coefficients. (Co-product coefficient is 1.000000 and component coefficient is 1.000000).

The reason is written in help: “The main output product can’t also be a co-product in the same production source”. To solve this I normally create an “intermediate” product  as bellow:

Further details:

help.sap.com > IBP > Business Application > Time Series Based Supply Planning > Production > Co Production > Setting up a data model for Co production

Hope this blog makes your life easier 😉 !

Rgds

Raquel Melo

Fundamental Library Styles version 0.10.0 is out

Another Fundamental Library Styles milestone has been achieved – version 0.10.0 has been released!

There are new and completely refactored components included in this release in order to make them match the latest and greatest Fiori 3, support accessibility and theming.

Here is the list of the components:

Panel

The panel is a container for grouping and displaying information. It can be collapsed to save space on the screen. You can use the component when you need to group or display information; when you want to give users the options of hiding this information; or want to show additional information on demand.

Expandable (collapsed) panel

Expanded panel

Fixed panel

Layout Panel

The Layout Panel are used to encapsulate part of content, form elements, lists, collections, etc., on a page.

Generic Tile

Generic Tiles can be used to represent an app similar to the SAP Fiori launchpad home page. They can display different types of content, which are based on the data supplied by the app. They can contain an icon, a title, an informative text, KPIs, counters and charts.

The tiles have 2 sizes: large(11 x 11rem) and small(9.25 x 9.25rem)

The generic tile control supports two tile dimensions – 1×1 (default) and 2×1:

  • Large Tile (1 x 1) – 11 x 11rem
  • Large Tile (2 x 1) – 22.5 x 11rem
  • Small Tile (1 x 1) – 9.25 x 9.25rem
  • Small Tile (2 x 1) – 19 x 9.25rem

Launch Tile

Launch Tile With Numeric Content and Launch Icon

Launch Tile With Combined Header and Content

Launch Tile (Profile)

Launch Tile (Logo)

KPI Tile with Numeric Content

Key Performance Indicators (KPIs) are used to measure and monitor a company’s performance at a strategic and operational level. The KPI Tile control supports a limited number of digits which varies depending on the size of the tile.

KPI Tile with L-Size Numeric Content

KPI Tile with M-Size Numeric Content

KPI Tile with S-Size Numeric Content

Feed Tile

The Feed tile can be used to show new notification content in a news feed.

Badge Tile

Badges are used to display very short and important information. Use a badge on a Tile if the Tile is new or has been newly added to a page. Tiles do not display badges in action/edit mode.

Slide Tile

The Slide Tile contains a news headline, a background image, the news source, and a time stamp. A start and pause button are always displayed on touch devices and can be revealed by hovering the mouse over the tile on desktop devices. The dots on the bottom of each tile identify the number of pages they contain.

Tile in Action Mode

In action mode view, the close button is displayed on the top right-hand corner of the Tile. The action icon is only an indicator and is displayed on the bottom right-hand corner. The click/touch area fills the entire Tile, excluding the click/touch area reserved for the close button.

Line Tile

The line tiles are a text only version of a launch tile. It acts as a link agglomeration in one container. The title is mandatory while the subtitle is optional.

Toolbar and Overflow Toolbar

The toolbar enables the user to change the UI or trigger an action. For example, the toolbar allows the user to change views, manipulate data or objects, navigate to another page, perform generic actions, and so on. It is most commonly used to display buttons, labels, selects and various other input controls.

Toolbar offers few design types (solid, transparent, auto, info, and title.

The component also offers 2 types of spacers (auto and fixed). You can add also separators between the items.

The Overflow toolbar can be used to add additional elements when extra space is required.

Step Input

The step input component allows the user to change the input values in predefined increments (steps). You can use the step input if you want the user to adjust amounts, quantities, or other values quickly, or toadjust values for a specific step (for example, in a shopping cart).

Accessibility

When it comes to accessibility guidelines we take the task very seriously and work hard to meet those guidelines. Delivering accessible applications is a task that involves all the layers and roles during the design and development phases. We can only achieve this if we work together. It requires the design language and guidelines to reflect certain qualities such as color and contrasts. It requires the components to be accessible and respect the ARIA specifications. It requires keyboard support, and many other requirements.

Accessibility cannot be achieved only by one team or one library.

Fundamental Library’s team is working with design teams, application teams, accessibility experts. Fundamental Library Styles is applying the Fiori 3 design which is created with accessibility in mind. The library is also trying to apply the right ARIA attributes so the components are accessible.

The full release notes can be find here.

More cool and new things to come. We are more than excited to keep this momentum.

Stay tuned for more updates. Want to read more blog posts about Fundamental Library? Check these out.

Feel free to raise any questions or try our libraries in case you didn’t have a chance.

Reverse and Delete CO-PA line items

Have you ever experience a mismatch in the information shown in KE24 and KE30?

Sometimes this could happen prior to finalizing the month closing activities and you are in a hurry. Even this can be generated when you were trying to correct the differences by posting a reversal of some CO-PA line items and generating new line items.

This sounds complex, right?

So let’s check out step by step the two cases we have.

Standard situation – posting reversal document :

  • The first you will make is to identify the operation that is causing the difference. A suggestion is to make the exploration using the transaction KE24.
  • Get the document number. Write it down to not lose it.

  • Go to transaction KE4S00, Complete the mandatory fields and Document number. Mark test run. Then unmark, and execute it in real.

  • Read the log, and double click on “Number of line items canceled”. There you have the Document Number of the cancelation items.

  • On transaction KE24 reviews the result. You must have zero balance between these documents. The reversal process is complete.

Post the reversal twice or more (by mistake) and How to correct it

  • The function of the transaction KE4S00 can have a gap. if you execute this twice for the same document it will allow it.
  • Let’s use the same document from above. This document is already reversed. Run KE4S00. Read the log and you will get a new Cancelation document number.

  • In KE24 review the three documents numbers we have by now. You have to realize you won’t get zero balance because you ran the reversal twice.

  • Delete the last document that produces the distortion. Go to SE38 and run the report RKEDELE1. Complete the mandatory fields. This document should never have been posted, so the best solution is to delete it. Run test first, then execute it in real.

  • Review the three documents in the KE24 transaction. The one that you deleted is missing but that’s fine. The balance is zero and you are done!

In conclusion, here you have two scenarios where you can need to use the reversal or the deletion of COPA documents. The second one is more an activity related to erase documents that had shouldn’t be posted.

Login to SAP Using Python

The Programming Language Python gives you many possibilities to use SAP in different ways.

One of them is Logging into SAP without providing Client Number, User Name, or Password.

You might be surprised how this is possible !! 🙂

But, to use this kind of feature you need to maintain Client Number, User Name, passwords, etc in your Python Program.

Let me give you more information on this.

There are few Pre-Requisites before we begin.

  • SAP GUI must be installed in your machine. As you are on SCN site I expect you must already know this 😉 ( If not Click here )
  • Python also must be installed in your machine. How to Install( Click Here)

Once you have these Softwares installed in your machine you can write your program or copy the below code and use it 🙂

Obviously, with few modifications as below 😉

<SID> = You need to mention System SID.

<NUM>= Client Number.

<UserName>= User name through which you wanted to log in to SAP.

<Password>= Maintain your User password.

Don’t worry I have copied here the same code as shown in the above screenshot.

import os import tkinter as tk WIDTH = 200 HEIGHT = 300 root = tk.Tk() canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH) canvas.pack() def myClick1():     <SID> = os.system('start sapshcut.exe -system=<SID> -client=<NUM> -user=<UserName> -pw=<Password>')     <SID>.pack() def myClick2():     <SID1> = os.system('start sapshcut.exe -system=<SID> -client=<NUM> -user=<UserName> -pw=<Password>')     <SID1>.pack() button1 = tk.Button(root, text="<SID>", command=myClick1) button1.pack() button2 = tk.Button(root, text="<SID>", command=myClick2) button2.pack() root.mainloop()

Note: Before running the above program you need to make sure the Tkinter is installed on your windows and also adjust the height and width as per your requirement.

I have used Visual Studio to write and execute this code.

The above program directly won’t work it will require a few packages that need to be installed using pip. Before executing the above program you need to install pip install Tkinter ( For more information you can click here )

So here you go, When you run the above program you will get something like below as a GUI PopUp.

When you click on any of the buttons <SID> or whatever you have mentioned that system will connect and opens up with the maintained credentials. So Enjoy 😀

Here you go 🙂

HOLD ON!!

This is not the end 🙂

You can even use this feature or program for opening any of the URLs in the default browser of your computer, for example, google.com or maybe Monitoring any of the JAVA Portals 😉

So, to use this you need to include the below:

and Run the Program :

Google.com will be opened in your default browser :

If you like this or helps you then please hit Like & Comment And Obviously share 🙂

ABAP CDS View(s) Finder

In my previous blog, CDS Data flow I had explained how we can get the data flow for CDS view(s), Today I am trying to explain how we can search the CDS view(s) for the corresponding S/4HANA table through a simple ABAP program which can be very useful when we are working on the implementation projects. I know we can get the CDS list by using the where-used list from ABAP Studio and also through the process I had explained in the blog CDS Search AMDP, But this program will be very easy to use and I prefer this approach.

ABAP Program 

*&---------------------------------------------------------------------* *& Report ZCDSFINDER *&---------------------------------------------------------------------* *& Author : Bhaskar Shanthi *&---------------------------------------------------------------------* REPORT ZCDSFINDER. TABLES: ddldependency,dd25t,dd26s. DATA: gt_25t TYPE STANDARD TABLE OF dd25t, gs_25t TYPE dd25t. CONSTANTS: gc_true TYPE sap_bool VALUE 'X', gc_false TYPE sap_bool VALUE ' '. * Deferred Class Definition CLASS lcl_handle_events DEFINITION DEFERRED. DATA: gt_outtab TYPE STANDARD TABLE OF alv_t_t2. DATA: gr_table TYPE REF TO cl_salv_table. DATA: gr_container TYPE REF TO cl_gui_custom_container. *... object for handling the events of cl_salv_table DATA: gr_events TYPE REF TO lcl_handle_events. DATA: g_okcode TYPE syucomm. DATA: it_bdcdata TYPE bdcdata OCCURS 0 WITH HEADER LINE . DATA:wa_bdcdata TYPE bdcdata . * Event Handler Class Definition CLASS lcl_handle_events DEFINITION. PUBLIC SECTION. METHODS: on_link_click FOR EVENT link_click OF cl_salv_events_table IMPORTING row column. ENDCLASS . * Event Handler Class Implementation CLASS lcl_handle_events IMPLEMENTATION. * On Click Method METHOD on_link_click. READ TABLE gt_25t INTO DATA(ls_25t) INDEX row. PERFORM bdc_dynpro USING 'SAPLSD_ENTRY' '1000'. PERFORM bdc_field USING 'BDC_CURSOR' 'RSRD1-TBMA_VAL'. PERFORM bdc_field USING 'BDC_OKCODE' '=WB_DISPLAY'. PERFORM bdc_field USING 'BDC_OKCODE' '=WB_DISPLAY'. PERFORM bdc_field USING 'RSRD1-TBMA' 'X'. PERFORM bdc_field USING 'RSRD1-TBMA_VAL' ls_25t-viewname. * Navigate to Data Dictionary CALL TRANSACTION 'SE11' USING it_bdcdata MODE 'E' UPDATE 'A' . CLEAR:it_bdcdata,it_bdcdata. . ENDMETHOD. ENDCLASS. * Selection Screen SELECT-OPTIONS: s_view FOR dd25t-ddtext NO INTERVALS , s_tab FOR dd26s-tabname NO INTERVALS. * At Selection Screen AT SELECTION-SCREEN. * Start of Selection START-OF-SELECTION. * Pull the data from the db tables SELECT a~viewname, ddtext, objecttype FROM dd25t AS a INNER JOIN ddldependency AS b ON a~viewname = b~objectname INNER JOIN dd26s AS c ON a~viewname = c~viewname INTO TABLE @DATA(lt_final) WHERE a~ddlanguage = 'E' AND a~ddtext IN @s_view AND c~tabname IN @s_tab. LOOP AT lt_final INTO DATA(ls_final). MOVE-CORRESPONDING ls_final TO gs_25t . APPEND gs_25t TO gt_25t. CLEAR:gs_25t. ENDLOOP. SORT gt_25t BY viewname ASCENDING. DELETE ADJACENT DUPLICATES FROM gt_25t COMPARING viewname. DESCRIBE TABLE gt_25t LINES DATA(l_tabix). DATA: l_count TYPE c LENGTH 7. l_count = l_tabix. CONCATENATE 'Total no. of CDS found' l_count INTO DATA(msg). MESSAGE msg TYPE 'I'. * Call Factory Method CALL METHOD cl_salv_table=>factory IMPORTING r_salv_table = gr_table CHANGING t_table = gt_25t. DATA: lr_columns TYPE REF TO cl_salv_columns_table, lr_column TYPE REF TO cl_salv_column_table. lr_columns = gr_table->get_columns( ). lr_columns->set_optimize( gc_true ). lr_column ?= lr_columns->get_column( 'VIEWNAME' ). lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ). lr_column->set_icon( if_salv_c_bool_sap=>true ). lr_column->set_long_text( 'VIEWNAME' ). DATA: lr_events TYPE REF TO cl_salv_events_table. lr_events = gr_table->get_event( ). CREATE OBJECT gr_events. * Set Handler SET HANDLER gr_events->on_link_click FOR lr_events. * Display ALV gr_table->display( ). *--------------------------------------------------- * form for bdc dynpro *--------------------------------------------------- FORM bdc_dynpro USING program dynpro. CLEAR it_bdcdata. wa_bdcdata-program = program. wa_bdcdata-dynpro = dynpro. wa_bdcdata-dynbegin = 'X'. APPEND wa_bdcdata TO it_bdcdata. CLEAR:wa_bdcdata. ENDFORM. "bdc_dynpro *--------------------------------------------------- * form for bdc field *--------------------------------------------------- FORM bdc_field USING fnam fval. CLEAR it_bdcdata. wa_bdcdata-fnam = fnam. wa_bdcdata-fval = fval. APPEND wa_bdcdata TO it_bdcdata. CLEAR:wa_bdcdata. ENDFORM. 

When you execute the program you need to enter for which table you want to verify the CDS available both SAP delivered and Custom CDS views. I am taking the most important table in Simple finance ACDOCA

Upon execution, you can see number CDS Views(s) which ACDOCA references.

Press OK, then we can see the list of CDS views

You can double click on any of the CDS to see the SQL View name, Structure, and also DDL code. I had chosen  KKAG_ACDOCA_VIEW 

If you want to narrow search you can enter the CDS description by using wild characters as shown below.

The result will be narrowed out where we get only CDS views which are referenced EKKO table.

I wrote a pretty similar program, but SAPyard had better code, So picked the code from them 🙂

Thanks for reading, I hope this blog is helpful to you guys.

Please shoot any comments.

Thanks,

Shanthi.

Blog It Forward – Paweł Pawlak (release 2020.06)


Hello! Cześć! Hallo!

Special thanks to Paweł Grześkowiak for nominating me, I will try not to bore you to death. I’m really glad that we have this kind of initiative in our fellow SAP Community. To be honest, I hope that this will encourage people to be more active in the community.

About me:

  • Resident of Wrocław since 2011
  • An employee of Capgemini since late 2018
  • SAP Finance Consultant with ABAP background
  • Creator of SAP-related infographics (available via my LinkedIn)
  • Gaming enthusiast (kind of PlayStation fanboy to be honest)
  • Amateur half-time powerlifter

BIF questions

First two from Susan Keohan list and two more from Paweł’s post.

#01 Fun fact about my country, Poland

We have made some really important inventions. The first bulletproof vest was invented in 1897 by two Poles, the priest – engineer Kazimierz Żegleń and inventor Jan Szczepanik. The vest became famous  in 1902, when the bulletproof material installed on a carriage saved the life of Alfonso XIII, King of Spain during an assassination attempt in Paris on his wedding day. It’s hard to imagine a better field test.

#02 Fun fact about my city, Wrocław

Poles often say that Wrocław is a city of bridges. They’re right. Wrocław is situated on 12 islands connected by 112 bridges. Therefore it’s often referred to as ‘Lower Silesian Venice.’ Nowadays taking into account modern criteria i.e. all the river bridges, canal bridges, footbridges over the railway tracks and the streets, there are about 220 of them. The view at night can be really charming.

#03 You’re a mad scientist, what scientific experiment would you run if money and ethics weren’t an issue?

I don’t think I should write about it in public 😛 Sorry, but Google, Facebook and a lot of others are listening. I don’t want to give them any inspiration. You’re gonna thank me for that one day 😉 #Skynet

#04 If you were arrested with no explanation, what would your friends and family assume you had done?

What kind of questions are these? Paweł Grześkowiak, you must have done a lot of questionable things in your life 😛 OK, hypothetically, they’d probably be convinced it’s some kind of misunderstanding. Why? Because I’d hide all the bodies really well.

The next BIF nominations

Please follow Susan Keohan‘s BIF sequel post and answer:

  • Name the person who affected you most in your career/ way of thinking and why?
  • If SAP suddenly ceased to exist, what would you do professionally in life?