How to Write LIKE Key Word SQL through a Business Function
Purpose of Document
To optimize system resource across EnterpriseOne, the query below is required,
SQL> SELECT return columns FROM Schema.Table WHERE Column LIKE 'ABC%' ORDER BY Column;
Using the EnterpriseOne APIs (Application Programming Interface), JDEBASE APIs will be used to access the database which are made up of:
Data Manipulation
Initialization
Miscellaneous
Non-JDE Table
Request Settings
JDB_ClearAggregate
JDB_ClearGroupBy
JDB_ClearSelection
JDB_ClearSequencing
JDB_CloseTable
JDB_SetAggregate
JDB_SetGroupBy
JDB_SetLowerLimit
JDB_SetRequestTriggerOption
JDB_SetSelection
JDB_SetSelectionX
JDB_SetSequencing
JDB_SetUserTriggerOption
Specifications
Table Management
Table Specific Selection
Table View
Desired Result: SQL> SELECT KGITEM, KGCO, KGMCU, KGOBJ, KGSUB FROM PRODDTA.F0012 WHERE KGITEM LIKE 'SP%' AND KGCO = '00000';
The best practice for this type of request can be fulfilled by examining existing code (standard EnterpriseOne C Business Functions) which were delivered upon installation.
Make sure that Business Function you are creating is referencing TargetTable.h where NID_Table and NID_Columns are defined with #define key word or define NID inside the C source file.
Declare Variables.
Declare Data Structure and if needed define typedef.
Initialize Memory (or pointer which is Address of Memory).
Open a specific table.
Construct the WHERE clause.
JDB_SetSelection() using Data Structure of Select[].
JDB_SelectKeyed() .
JDB_Fetch().
Loop using WHILE.
JDB_CloseTable().
NOTE:
NID stands for Named ID in describing metadata (in terms of Database)
/* 6. JDB_SetSelection() using DataStructure of Select */ idJDBReturnCode = JDB_SetSelection(hRequestF0012, (LPSELECT)Select, (ushort) 2, JDEDB_SET_REPLACE); /* 7. JDB_SelectKeyed() */ idJDBReturnCode = JDB_SelectKeyed(hRequestF0012,(ID) 0, (void *) NULL, (short) 0); /* 8. JDB_Fetch() */ idJDBReturnCode = JDB_Fetch (hRequestF0012, (void *)&dsColF0012, FALSE); /* 9. Loop using WHILE */ while (idJDBReturnCode != JDEDB_FAILED) { dsI0012.kgitem = dsColF0012.kgitem[2]; jdeStrncpy(dsI0012.kgmcu, (const JCHAR *)(dsColF0012.kgmcu), DIM(dsI0012.kgmcu)); jdeStrncpy(dsI0012.kgobj, (const JCHAR *)(dsColF0012.kgobj), DIM(dsI0012.kgobj)); jdeStrncpy(dsI0012.kgsub, (const JCHAR *)(dsColF0012.kgsub), DIM(dsI0012.kgsub)); /* Write routine to handle data or store return value into cache */ idJDBReturnCode = JDB_Fetch (hRequestF0012, (void *)&dsColF0012, FALSE); } /* 10. JDB_CloseTable() */ JDB_CloseTable(hRequestF0012); return idReturnCode; }
NOTE:
Oracle is not responsible for any custom code and will not support any issue caused by it
Memory has to be handled with care in writing code in C or C++
Alternatively, implement it using Table I/O as below,
/* Define/Initialize Variables */ VA evt_szItemNumber_ITEM = "SP%" VA evt_szCompany_CO = "00000" VA evt_szCostCenter_MCU = "" VA evt_szObjectAccount_OBJ = "" VA evt_szSubsidiary_SUB = ""
/* Open Table to make connection */ F0012.Open F0012.Select VA evt_szItemNumber_ITEM is Like TK Item Number VA evt_szCompany_CO = TK Company F0012.Fetch Next VA evt_szCostCenter_MCU <- TK Business Unit VA evt_szObjectAccount_OBJ <- TK Object Account VA evt_szSubsidiary_SUB <- TK Subsidiary While SV File_IO_Status is equal to CO SUCCESS /* Write Routine to make use of return value */ F0012.Fetch Next VA evt_szCostCenter_MCU <- TK Business Unit VA evt_szObjectAccount_OBJ <- TK Object Account VA evt_szSubsidiary_SUB <- TK Subsidiary End While F0012.Close
Reference:
Valid values for member nCmp of the SELECT structure. Defined in /system/include/database/db_defines.h
Definition
Sign
Description
JDEDB_CMP_LE = 0
<=
Less Than and Equal To
JDEDB_CMP_GE = 1
>=
Greater Than and Equal To
JDEDB_CMP_EQ
=
Equal To
JDEDB_CMP_LT
<
Less Than
JDEDB_CMP_GT
>
Greater Than
JDEDB_CMP_NE
!=
Not Equal To
JDEDB_CMP_IN
IN
JDEDB_CMP_NI
Not In
JDEDB_CMP_BW
Between A And B (Includes)
JDEDB_CMP_NB
Not Between A And B (Excludes)
JDEDB_CMP_LK
Like
JDEDB_CMP_MATCH_ALL
TextSearch MatchAll
JDEDB_CMP_MATCH_ANY
TextSearch MatchAny
JDEDB_CMP_MATCH_EXACT
TextSearch MatchExact
JDEDB_CMP_CONTAINS
TextSearch CONTAINS
JDEDB_CMP_BOGUS = 99999
Not a valid value. This is just to force 4 byte ENUM on AS/400
NOTE:
JDEDB_CMP_MATCH_ALL, JDEDB_CMP_MATCH_ANY, JDEDB_CMP_MATCH_EXACT, JDEDB_CMP_CONTAINS are for Text String Search which may cause high overhead (so do not implement this)