0% found this document useful (0 votes)
570 views11 pages

ZSQL - A Tool To Execute SQL Statements

This tool allows users to execute SQL statements directly in SAP ABAP by creating a program called ZSQL. It provides a simple interface where users can enter SQL queries and view results. The tool parses the SQL, generates a dynamic subroutine to execute the query, and displays results in an ALV grid. It supports SELECT statements and allows exploring database relationships directly from ABAP.
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)
570 views11 pages

ZSQL - A Tool To Execute SQL Statements

This tool allows users to execute SQL statements directly in SAP ABAP by creating a program called ZSQL. It provides a simple interface where users can enter SQL queries and view results. The tool parses the SQL, generates a dynamic subroutine to execute the query, and displays results in an ALV grid. It supports SELECT statements and allows exploring database relationships directly from ABAP.
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/ 11

in

zSQL: A tool to execute SQL statements directly in


sap
Posted by Basar Ozgur Kahraman in ABAP Development on Oct 9, 2013 12:06:43 AM

Sometimes i need to write sql statements and get results immediately in abap. To
handle this requirement, i create a test program, write my sql in it and debug to
investigate results. It's difficult and time consuming work so I have developed an
SQL tool for ABAP Programmers to allow them to run select statements directly in
SAP, confirm or discover relationships and see data side by side.
Installation:
1- Create an executable program and named it "ZSQL" in se38
2- Download attached zSQL.txt.zip file and Upload into zsql(or copy&paste)
3- Create screen '0100'
4- Go into screen '0100', choose "Flow Logic" tab and add flow logic code as below
5- Go to layout of screen and add a "Custom Control" and name it "CC_SQL"
6- In layout add two buttons
-Run: FctCode: "RUN"
-Exit: FctCode: "EXIT"
7- Activate screen
8- Activate program
Flow Logic Code:

PROCESS BEFORE OUTPUT.


MODULE status_0100.
PROCESS AFTER INPUT.
MODULE user_command_0100.

Notice:
- Each FROM/JOIN clause must be in new line
- Table names&Aliases and From/Join clauses must be in the same line
- Don't use SELECT SINGLE
- Don't use INTO statement
- Doesn't support aggregate functions(e.g. SUM, MAX, AVG)
- DELETE/UPDATE statements are supported only in test systems

Examples:

Programm:
*&*
*&ReportZSQL
*&
*&*
*&Developer:BasarOzgurKAHRAMAN@basarozgur
*&*
REPORTzsql.
TYPES:BEGINOFtyp_tablename,
tabnameLIKEdd02ltabname,
aliasLIKEdd02ltabname,
ENDOFtyp_tablename.
TYPES:typ_it_tablenameTYPESTANDARDTABLEOFtyp_tablename.
TYPES:BEGINOFtyp_selfields,
tabname
LIKElvc_s_fcattabname,
fieldname LIKElvc_s_fcatfieldname,
ENDOFtyp_selfields.
TYPES:typ_it_selfieldsTYPESTANDARDTABLEOFtyp_selfields.
DATA:cc_sqlTYPEREFTOcl_gui_custom_container,
sqltextTYPEREFTOcl_gui_textedit.
DATA:BEGINOFit_sqlOCCURS0,
tdlineLIKEtlinetdline,
ENDOFit_sql.
DATA:gv_changeallowedTYPEboolean.
INITIALIZATION.
CALLSCREEN0100.
*&*
*&FormCREATE_DYNAMIC_SQL
*&*

*text
**
*>p1text
*<p2text
**
FORMcreate_dynamic_sqlTABLESp_it_sqlSTRUCTUREit_sql
CHANGINGp_programTYPEstring
p_isselectqueryTYPEboolean.
TYPES:_typ_pline(72).
DATA:_message(128),
_lineTYPEi,
_it_plineTYPETABLEOF_typ_plineWITHHEADERLINE.
CLEAR:p_program,
p_isselectquery.
_it_pline='REPORTZSQL_INNER_DYNAMICPRG.'.
APPEND_it_pline.
_it_pline='FORMcall_sql'.
APPEND_it_pline.
_it_pline='TABLESp_it_return'.
APPEND_it_pline.
_it_pline='CHANGINGp_subrcLIKEsysubrc.'.
APPEND_it_pline.
_it_pline='REFRESHp_it_return.p_subrc=4.'.
APPEND_it_pline.
READTABLEp_it_sqlINDEX1.
IFp_it_sqltdlineCS'SELECT'.
p_isselectquery='X'.
ENDIF.
LOOPATp_it_sql.
IFp_it_sqltdlineCS'FROM'AND
p_isselectquery='X'.
_it_pline='INTOCORRESPONDINGFIELDSOFTABLEp_it_return'.
APPEND_it_pline.
ENDIF.
_it_pline=p_it_sqltdline.
APPEND_it_pline.
ENDLOOP.
_it_pline='.'.
APPEND_it_pline.
_it_pline='p_subrc=sysubrc.'.
APPEND_it_pline.
_it_pline='ENDFORM.'.
APPEND_it_pline.
GENERATESUBROUTINEPOOL_it_pline
NAMEp_program
MESSAGE_message
LINE_line.
IFsysubrc<>0.
MESSAGE_messageTYPE'E'.

ENDIF.
ENDFORM."CREATE_DYNAMIC_SQL
*&*
*&ModuleSTATUS_0100OUTPUT
*&*
*text
**
MODULEstatus_0100OUTPUT.
*SETPFSTATUS'xxxxxxxx'.
*SETTITLEBAR'xxx'.
IFsqltextISINITIAL.
CREATEOBJECTcc_sql
EXPORTING
container_name='CC_SQL'
EXCEPTIONS
cntl_error=1
cntl_system_error=2
create_error=3
lifetime_error=4
lifetime_dynpro_dynpro_link=5
OTHERS=6.
CREATEOBJECTsqltext
EXPORTING
wordwrap_mode=
cl_gui_textedit=>wordwrap_at_fixed_position
parent=cc_sql
EXCEPTIONS
error_cntl_create=1
error_cntl_init=2
error_cntl_link=3
error_dp_create=4
gui_type_not_supported=5
OTHERS=6.
ENDIF.
ENDMODULE."STATUS_0100OUTPUT
*&*
*&ModuleUSER_COMMAND_0100INPUT
*&*
*text
**
MODULEuser_command_0100INPUT.
CASEsyucomm.
WHEN'EXIT'.
LEAVETOSCREEN0.
WHEN'RUN'.
PERFORMrun.
ENDCASE.
ENDMODULE."USER_COMMAND_0100INPUT
*&*
*&FormRUN
*&*
*text
**
*>p1text
*<p2text

**
FORMrun.
DATA:_it_fcatTYPElvc_t_fcat,
_cl_salvTYPEREFTOcl_salv_table,
_cl_funcTYPEREFTOcl_salv_functions_list,
_programTYPEstring,
_subrcLIKEsysubrc,
_isselectqueryTYPEboolean.
DATA:_it_newtableTYPEREFTOdata.
FIELDSYMBOLS:<_it_dyntable>TYPESTANDARDTABLE.
REFRESHit_sql.
CALLMETHODsqltext>get_text_as_r3table
IMPORTING
table=it_sql[].
*Deleteinitiallines
DELETEit_sqlWHEREtdlineISINITIAL.
*TranslateSQLtouppercaseforstringoperations
LOOPATit_sql.
TRANSLATEit_sqltdlineTOUPPERCASE.
CONDENSEit_sqltdline.
MODIFYit_sql.
ENDLOOP.
CHECKit_sql[]ISNOTINITIAL.
*Checkoperationisallowed
PERFORMcheck_operationTABLESit_sql.
*GenerateSubroutinepoolSQL
PERFORMcreate_dynamic_sqlTABLESit_sql
CHANGING_program
_isselectquery.
*CreatefieldcatalogforSQLoutput
PERFORMcreate_fieldcatalogTABLESit_sql
_it_fcat.
*Createoutputtable
CALLMETHODcl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog=_it_fcat
IMPORTING
ep_table=_it_newtable.
ASSIGN_it_newtable>*TO<_it_dyntable>.
*CallSQLQueryandgetresultstooutputtable
PERFORM('CALL_SQL')INPROGRAM(_program)
TABLES<_it_dyntable>CHANGING_subrcIFFOUND.
IF_subrcISNOTINITIAL.
MESSAGE'Norecordsfound!!/Operationcantexecuted'TYPE'W'.
EXIT.
ELSEIF<_it_dyntable>[]ISINITIAL.
MESSAGE'Operationexecuted'TYPE'I'.
EXIT.
ENDIF.

*ALVoutput
CALLMETHODcl_salv_table=>factory
IMPORTING
r_salv_table=_cl_salv
CHANGING
t_table=<_it_dyntable>.
_cl_func=_cl_salv>get_functions().
_cl_func>set_all().
_cl_salv>display().
ENDFORM."RUN
*&*
*&FormCREATE_FIELDCATALOG
*&*
*text
**
*>P_IT_SQLtext
**
FORMcreate_fieldcatalogTABLESp_it_sqlSTRUCTUREit_sql
p_it_fcatSTRUCTURElvc_s_fcat.
DATA:BEGINOF_it_dbfieldsOCCURS0,
tabnameLIKEdd02ltabname,
itdbfieldTYPESTANDARDTABLEOFdbfield,
ENDOF_it_dbfields.
DATA:_dbfieldTYPEdbfield.
DATA:_it_tablenameTYPETABLEOFtyp_tablenameWITHHEADERLINE,
_it_selfieldsTYPETABLEOFtyp_selfieldsWITHHEADERLINE.
REFRESHp_it_fcat.
*Gettablenames
PERFORMget_tables_in_sqlTABLESp_it_sql
_it_tablename.
*Getreturnfieldsofsql
PERFORMget_fields_in_sqlTABLESp_it_sql
_it_selfields.
*ConvertAliastoTableName
LOOPAT_it_tablenameWHEREaliasISNOTINITIAL.
_it_selfieldstabname=_it_tablenametabname.
MODIFY_it_selfields
TRANSPORTINGtabname
WHEREtabname=_it_tablenamealias.
ENDLOOP.
*Wholefieldsoftablesinsql
LOOPAT_it_tablename.
_it_dbfieldstabname=_it_tablenametabname.
CALLFUNCTION'DB_GET_TABLE_FIELDS'
EXPORTING
tabname=_it_tablenametabname
TABLES
dbfields=_it_dbfieldsitdbfield.
APPEND_it_dbfields.
CLEAR_it_dbfields.
ENDLOOP.

*Fillfieldcatalog
IF_it_selfields[]ISINITIAL.
*Select*casefieldcatalog
LOOPAT_it_dbfields.
LOOPAT_it_dbfieldsitdbfieldINTO_dbfield.
READTABLEp_it_fcatWITHKEYfieldname=_dbfieldname.
CHECKsysubrc<>0.
p_it_fcatfieldname=_dbfieldname.
p_it_fcatref_table=_it_dbfieldstabname.
p_it_fcatref_field=_dbfieldname.
APPENDp_it_fcat.
ENDLOOP.
ENDLOOP.
ELSE.
*Selectfieldscasefieldcatalog
LOOPAT_it_selfields.
READTABLEp_it_fcatWITHKEYfieldname=_it_selfieldsfieldname.
CHECKsysubrc<>0.
p_it_fcatfieldname=_it_selfieldsfieldname.
p_it_fcatref_table=_it_selfieldstabname.
p_it_fcatref_field=_it_selfieldsfieldname.
APPENDp_it_fcat.
ENDLOOP.
*Fillref_tablevalueofrow,iftheyinitial
LOOPATp_it_fcatWHEREref_tableISINITIAL.
LOOPAT_it_dbfields.
READTABLE_it_dbfieldsitdbfieldINTO_dbfield
WITHKEYname=p_it_fcatref_field.
CHECKsysubrc=0.
p_it_fcatref_table=_it_dbfieldstabname.
EXIT.
ENDLOOP.
MODIFYp_it_fcat.
ENDLOOP.
ENDIF.
ENDFORM."CREATE_FIELDCATALOG
*&*
*&Formget_tables_in_sql
*&*
*text
**
*>P_IT_SQLtext
*>P_IT_TABLENAMEtext
**
FORMget_tables_in_sqlTABLESp_it_sqlSTRUCTUREit_sql
p_it_tablenameTYPEtyp_it_tablename.
DATA:BEGINOF_it_splitOCCURS0,
strLIKElvc_s_fcattabname,
ENDOF_it_split.
REFRESHp_it_tablename.
LOOPATp_it_sqlWHEREtdlineCS'FROM'
ORtdlineCS'JOIN'
ORtdlineCS'UPDATE'.

*TRANSLATEp_it_sqltdlineUSING'()'.
REFRESH_it_split.
SPLITp_it_sqltdline+syfdposATspaceINTOTABLE_it_split.
DELETE_it_splitWHEREstrISINITIAL
ORstr='('
ORstr=')'.
CLEAR_it_split.
READTABLE_it_splitINDEX2.
CHECK_it_splitstrISNOTINITIAL.
p_it_tablenametabname=_it_splitstr.
CLEAR_it_split.
READTABLE_it_splitINDEX3.
IF_it_splitstr='AS'.
CLEAR_it_split.
READTABLE_it_splitINDEX4.
p_it_tablenamealias=_it_splitstr.
ENDIF.
COLLECTp_it_tablename.
CLEARp_it_tablename.
ENDLOOP.
ENDFORM."GET_TABLES_IN_SQL
*&*
*&FormGET_FIELDS_IN_SQL
*&*
*text
**
*>P_P_IT_SQLtext
*>P__IT_SELFIELDStext
**
FORMget_fields_in_sqlTABLESp_it_sqlSTRUCTUREit_sql
p_it_selfieldsTYPEtyp_it_selfields.
DATA:BEGINOF_it_splitOCCURS0,
strLIKElvc_s_fcattabname,
ENDOF_it_split.
DATA:_willexitTYPEboolean.
REFRESHp_it_selfields.
*GetSelectionFields
LOOPATp_it_sql.
CONDENSEp_it_sqltdline.
IFp_it_sqltdlineCS'FROM'OR
p_it_sqltdlineCS'UPDATE'.
IFsyfdpos=0.
EXIT.
ENDIF.
p_it_sqltdline=p_it_sqltdline(syfdpos).
_willexit='X'.
ENDIF.

REFRESH_it_split.
SPLITp_it_sqltdlineATspaceINTOTABLE_it_split.
DELETE_it_splitWHEREstrISINITIAL
ORstr='SELECT'
ORstr='SINGLE'
ORstr='*'
ORstr='INSERT'
ORstr='UPDATE'
ORstr='MODIFY'
ORstr='DELETE'.
LOOPAT_it_split.
IF_it_splitstrCA'~'.
SPLIT_it_splitstrAT'~'INTOp_it_selfieldstabname
p_it_selfieldsfieldname.
ELSE.
p_it_selfieldsfieldname=_it_splitstr.
ENDIF.
APPENDp_it_selfields.
CLEARp_it_selfields.
ENDLOOP.
CHECK_willexit='X'.
EXIT.
ENDLOOP.
ENDFORM."GET_FIELDS_IN_SQL
*&*
*&FormCHECK_OPERATION
*&*
*text
**
*>P_IT_SQLtext
**
FORMcheck_operationTABLESp_it_sqlSTRUCTUREit_sql.
DATA:_ccnocliindLIKEt000ccnocliind.
IFgv_changeallowedISINITIAL.
SELECTSINGLEccnocliind
INTO_ccnocliind
FROMt000
WHEREmandt=symandt.
IFsysubrc=0AND_ccnocliindISINITIAL.
gv_changeallowed='X'.
ELSE.
gv_changeallowed=''.
ENDIF.
ENDIF.
CHECKgv_changeallowed<>'X'.
READTABLEp_it_sqlINDEX1.
IFp_it_sqltdlineCS'DELETE'OR
p_it_sqltdlineCS'UPDATE'.
MESSAGE'DELETE/UPDATEoperationsallowedonlyinTestSystems'
TYPE'E'.
ENDIF.
ENDFORM."CHECK_OPERATION

You might also like