ZSQL - A Tool To Execute SQL Statements
ZSQL - A Tool To Execute SQL Statements
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:
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