Monday, April 19, 2010

Intalio Introduction

ช่วงนี้กำลังทำ R&D เกี่ยวกับ Intalio เลยขอถือโอกาสเขียน Blog เกี่ยวกับมันซะเลย
ความจริง Intalio นั้นมี product อยู่หลายตัว แต่ตัวที่เรากำลังจะแนะนำนี้เป็นตัวที่ใช้จัดการเกี่ยวกับ Workflow โดยใช้มาตรฐานของ BPM กับ BPEL และ Version ที่ดูอยู่ก็เป็น community ซึ่งเราสามารถหาข้อมูลเกี่ยวกับ Version นี้ได้ใน http://community.intalio.com/
ข้อดีของ Version นี้เลยหลักคือ ฟรี สามารถ Download มาใช้ได้เลย สำหรับการ Download นั้นจะแบ่งออกเป็น 2 ส่วน คือ
  1. Designer การลง Designer นั้นก็แค่เรียก .exe ที่เราโหลดมาแล้วก็คลิก Next ไปเรื่อยๆแค่นั้น ส่วน OS ที่ใช้นั้นเท่าที่ลองมา Windows XP ใช้ได้ดี ส่วน Windows 2000 นั้นไม่เหมาะ
  2. Server การลง Server ก็ไม่มีอะไรมากแค่ Extract ไฟลืออกมาวางที่ไหนก็ได้บนเครื่องจากนั้นก็ Set Java home จากนั้นก็เรียก startup.bat(ลงบน Windows) หรือ startup.sh(ลงบน Linux) ก็ได้
จากนั้นเราก็ลองทำตาม Tutorial ดู ซึ่งใน Community ก็มี Tutorial และ Sample มากมายอยู่
แล้วไว้วันหลังเราจะมาลองอธิบายความสามารถของ Intalio กันมั่งนะ วันนี้เอาแค่ Install ให้ได้ก่อนค่ะ

Thursday, April 8, 2010

Function Key Standard Setting in SAP

Function Keys Description
F1 Help
F2 Choose
F3 Back (One Step)
F4 Possible Entries
F9 Select
F10 Jump to menu bar
F11 Save/Generate
F12 Cancel
F13 Print
F14 Delete
F17 Open
F21 First Page
F22 Previous Page
F23 Next Page
F24 Last Page

How to Upload and Download Source Code of ABAP/4

Upload Source Code from PC File to ABAP Editor
You can do it by select Utilities -> More utilities -> Upload/download -> Upload and then enter your pc file that want to upload in your ABAP editor. Finally, select action ’Copy’.

Download Source Code from ABAP Editor to PC File
You can do it by select Utilities -> More utilities -> Upload/download -> Download and then enter your pc file that want to download from your ABAP editor. Finally, select action ’Copy’.

How to Insert or Delete Comment Block in ABAP Editor

Insert Comment
Select the statement line as block by hi-light and select menu Utilities -> Block/buffer -> Insert comment * in table control mode) or use hot key Ctrl + < in textedit control mode.

Delete Comment
Select the statement line as block by hi-light and select menu Utilities -> Block/buffer -> Delete comment * in table control mode) or use hot key Ctrl + > in textedit control mode.

Wednesday, April 7, 2010

How to Assign Dynamic Fields using Filed-Symbols in ABAP/4

You can create field name in run time and assign the created name in your field-symbols by statement "ASSIGN ... TO ...".

Example

DATA: name(20),

lv_check(1).

DATA: BEGIN OF itab OCCURS 0,
fld1(4),
fld2(4),

END OF itab.

FIELD-SYMBOLS .

...

...

LOOP AT itab.

IF lv_check = ’X’.

name = ’ITAB-FLD1’.

ELSE.

name = ’ITAB-FLD2’.

ENDIF.

ASSIGN (name) TO .

...

...

ENDLOOP.

Color in ABAP/4

Name Code Color

COL_BACKGROUND 0 depends on GUI

COL_HEADING 1 grayish-blue
COL_NORMAL 2 bright gray
COL_TOTAL 3 yellow
COL_KEY 4 bluish green
COL_POSITIVE 5 green
COL_NEGATIVE 6 red
COL_GROUP 7 violet

FORMAT Options of Format Statement in ABAP/4

Option          Description
COLOR n Specific background colors
INTENSIFIED Intensified the background color
INVERSE Swap background and foreground color
HOTSPOT Effect when mouse pointer and click
INPUT Generate input field
RESET Reset formats. The format will be backed to default format.

System Field When Generate ABAP/4 Report (Often to use)

Field     Description
COLNO the current column
LINNO the current line
LINCT Number of list lines
LINSZ Line size of list
SROWS Number of lines on screen
SCOLS Number of column on screen
TITLE Program title
PAGNO Current page in list

How to Find the Number of Entries of Internal Table in ABAP/4

We can find out how many entries of internal table by apply statement "DESCRIBE".

Example

DATA: it_tab TYPE TABLE OF BKPF WITH HEADER LINE,
tot_lines TYPE i.
...
...
DESCRIBE TABLE it_tab LINES tot_lines.

Or you can apply statement ’LOOP AT’ and count it.

Example

LOOP AT it_tab.
tot_lines = tot_lines + 1.
ENDLOOP.

Operator for comparing strings in ABAP/4

Operator     Description
CO Contains Only
CN Contains Not Only
CA Contains Any
NA Contains Not Any
CS Contains String
NS Contains No String
CP Matches Pattern
NP Not Match Pattern

How to Read Table Dynamically in ABAP/4

About statement "READ TABLE", we can generate code for read key dynamic as below:

DATA: BEGIN OF itab OCCURS 0,
fld1(2),

fld2(2),

fld3(10),

fld4 TYPE i,

END OF itab,

wa_tab LIKE itab,

gv_key1(4) TYPE C VALUE ’FLD1’,

gv_key2(4) TYPE C VALUE ’FLD2’.

...

...

...

READ TABLE itab INTO wa_tab
WITH KEY (gv_key1) = ’AA’
(gv_key2) = ’BB’.

How to Generate Value Request by ABAP/4

We can use function module "F4IF_INT_TABLE_VALUE_REQUEST" for generate value request by ABAP report.

Example


*** Screen Flow ***

PROCESS ON VALUE-REQUEST.

FIELD scn_kokrs MODULE create_value_request.

*** ABAP Editor ***

MODULE create_value_request INPUT.

DATA: BEGIN OF itab_request OCCURS 0,

kokrs LIKE TKA01-KOKRS,

bezei LIKE TKA01-BEZEI,

END OF itab_request.


SELECT KOKRS BEZEI
FROM TKA01
INTO TABLE itab_request.

CALL FUNCTION ’F4IF_INT_TABLE_VALUE_REQUEST’
EXPORTING
retfield = ’KOKRS’
value_org = ’S’
TABLES
value_tab = itab_request
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.


ENDIF.

ENDMODULE.

ABAP/4 Example Code: ALV List by FM 'REUSE_ALV_LIST_DISPLAY'

Example

TYPE-POOLS: SLIS.

DATA: it_spfli TYPE TABLE OF spfli WITH HEADER LINE,
it_cat TYPE SLIS_T_FIELDCAT_ALV,
wa_cat TYPE slis_fieldcat_alv.

START-OF-SELECTION.
SELECT * FROM spfli
INTO TABLE it_spfli.

PERFORM create_field_catalog.

CALL FUNCTION ’REUSE_ALV_LIST_DISPLAY’
EXPORTING
* I_INTERFACE_CHECK = ’ ’
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE = ’ ’
* I_CALLBACK_PROGRAM = ’ ’
* I_CALLBACK_PF_STATUS_SET = ’ ’
* I_CALLBACK_USER_COMMAND = ’ ’
* I_STRUCTURE_NAME =
* IS_LAYOUT =
IT_FIELDCAT = it_cat[]
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = ’X’
* I_SAVE = ’ ’
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* IR_SALV_LIST_ADAPTER =
* IT_EXCEPT_QINFO =
* I_SUPPRESS_EMPTY_DATA = ABAP_FALSE
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
T_OUTTAB = it_spfli
* EXCEPTIONS
* PROGRAM_ERROR = 1
* OTHERS = 2
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
*&---------------------------------------------------------------------*
*& Form create_field_catalog
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM create_field_catalog .
IF it_cat[] is initial.
clear wa_cat.
wa_cat-col_pos = 1.
wa_cat-fieldname = ’CARRID’.
wa_cat-datatype = ’CHAR’.
wa_cat-inttype = ’C’.
wa_cat-intlen = 3.
wa_cat-seltext_l = ’Airline Code’.
wa_cat-seltext_m = ’Airline Code’.
wa_cat-seltext_s = ’Airline Code’.
append wa_cat to it_cat.

clear wa_cat.
wa_cat-col_pos = 2.
wa_cat-fieldname = ’CONNID’.
wa_cat-datatype = ’NUMC’.
wa_cat-inttype = ’N’.
wa_cat-intlen = 4.
wa_cat-seltext_l = ’Flight Conn. No’.
wa_cat-seltext_m = ’Flight Conn. No’.
wa_cat-seltext_s = ’Flight Conn. No’.
append wa_cat to it_cat.

clear wa_cat.
wa_cat-col_pos = 3.
wa_cat-fieldname = ’CITYFROM’.
wa_cat-datatype = ’CHAR’.
wa_cat-inttype = ’C’.
wa_cat-intlen = 20.
wa_cat-seltext_l = ’Dep. city’.
wa_cat-seltext_m = ’Dep. city’.
wa_cat-seltext_s = ’Dep. city’.
append wa_cat to it_cat.

clear wa_cat.
wa_cat-col_pos = 4.
wa_cat-fieldname = ’AIRPFROM’.
wa_cat-datatype = ’CHAR’.
wa_cat-inttype = ’C’.
wa_cat-intlen = 3.
wa_cat-seltext_l = ’Dep. airport’.
wa_cat-seltext_m = ’Dep. airport’.
wa_cat-seltext_s = ’Dep. airport’.
append wa_cat to it_cat.

clear wa_cat.
wa_cat-col_pos = 5.
wa_cat-fieldname = ’CITYTO’.
wa_cat-datatype = ’CHAR’.
wa_cat-inttype = ’C’.
wa_cat-intlen = 20.
wa_cat-seltext_l = ’Arrival city’.
wa_cat-seltext_m = ’Arrival city’.
wa_cat-seltext_s = ’Arrival city’.
append wa_cat to it_cat.

clear wa_cat.
wa_cat-col_pos = 6.
wa_cat-fieldname = ’AIRPTO’.
wa_cat-datatype = ’CHAR’.
wa_cat-inttype = ’C’.
wa_cat-intlen = 3.
wa_cat-seltext_l = ’Dest. airport’.
wa_cat-seltext_m = ’Dest. airport’.
wa_cat-seltext_s = ’Dest. airport’.
append wa_cat to it_cat.

ENDIF.
ENDFORM. " create_field_catalog


The output is:

Sale and Distribution (SD) Table in SAP

Table Description

VBAK Sale Order Header
VBAP Sale Order Line Items
LIKP Delivery Order Header
LIPS Delivery Order Line Items
VEKP Shipping Unit Header
VEPO Shipping Unit Line Items
EIKP Foreign Trade: Header
EIPO Foreign Trade: Line Items
VBRK Billing Header
VBRP Billing Line Items
VBUK Sale Document Status Header
VBUP Sale Document Status Line Items
VBFA Document Flow
VBPA Sale Document Partner
KONV Pricing Condition

Tuesday, April 6, 2010

ดึงข้อมูลของ TCode: STAT โดยใช้ ABAP

Transaction STAT เป็น Transaction เพื่อใช้สำหรับวิเคราะห์สถิติการใช้งานโปรแกรมของผู้ใช้งาน โดยข้อมูลที่เก็บนั้นไม่ได้เก็บอยู่ในรูปของตาราง แต่เก็บอยู่ในรูปของไฟล์ ซึ่งถ้าเราต้องการดึงข้อมูลของ Transaction นี้ออกมา เราสามารถทำได้โดยการเลือกใช้ Function Module: SAPWL_STATREC_READ_FILE ดังตัวอย่าง

CALL FUNCTION 'SAPWL_STATREC_READ_FILE'
EXPORTING
READ_CLIENT = CLIENT
READ_END_DATE = ENDDATE
READ_END_TIME = ENDTIME
READ_START_DATE = STARTDATE
READ_START_TIME = STARTTIME
TABLES
V2_NORMAL_RECORDS = V2_NORMAL_RECORDS.

จากตัวอย่างจะเห็นว่าเราดึงข้อมูลใน STAT ไฟล์โดยกำหนดข้อมูลเกี่ยวกับ Client, End Date, End Time, Start Date และ Start Time เป็นเงื่อนไขในการเลือกข้อมูล และหลังจากเรียกฟังก์ชั่นนี้ทำงาน ข้อมูลจะถูกกลับมาที่ Internal Table: V2_NORMAL_RECORDS

Monday, April 5, 2010

วิธีการแก้ไข User Status ในใบสั่งผลิต โดยใช้ ABAP

ในบางครั้งระบบ PP ที่อยู่ใน SAP ได้มีการ Config User Status ขึ้นมาเพื่อเป็นข้อมูลเพิ่มเติมที่ User สามารถระบุได้ ดังงนั้นในบทความนี้เราจะใช้ Function Module "I_CHANGE_STATUS" เพื่อแก้ไขข้อมูลนี้ โดยฟังก์ชั่นนี้ต้องการเพียง Object Number ของใบสั่งผลิต, รหัสสถานะที่ Active อยู่ และรหัสสถานะที่ต้องการให้ Active
ตัวอย่างการใช้ Function มีดังนี้

CALL FUNCTION 'I_CHANGE_STATUS'
EXPORTING
OBJNR = PA_OBJNR "Object Number
ESTAT_INACTIVE = lv_inactive "สถานะที่ Active อยู่ ณ ปัจจุบัน ซึ่งหลังจากรันแล้วจะถูกเปลี่ยนเป็นไม่ Active
ESTAT_ACTIVE = lv_active "สถานะที่ต้องการเซ็ตให้ Active
EXCEPTIONS
CANNOT_UPDATE = 1
OTHERS = 2 .

เรียก BAPI_GOODSMVT_CREATE โดยใช้ PHP

ในบทความนี้เราจะแสดงตัวอย่างของการเรียก BAPI ที่ชื่อ BAPI_GOODSMVT_CREATE ผ่านทางภาษา PHP ก่อนอื่นขออธิบาย BAPI_GOODSMVT_CREATE ก่อน BAPI ตัวนี้ใช้สำหรับสร้าง Material Document จากระบบผ่านนอกผ่านทาง BAPI คล้ายๆกับการทำงานของ Transaction: MB1A, MB1B หรือ MB1C
และทุกครั้งหลังจากเรียนก BAPI ที่กล่าวข้างต้นทำงานแล้ว ไม่พบข้อความผิดพลาด เราจะต้องเรียก BAPI_TRANSACTION_COMMIT เพื่อบันทึกข้อมูลเข้าสู่ระบบจริง แต่หากผลข้อผิดพลาด เราก็สามารถเรียก BAPI_TRANSACTION_ROLLBACK เพื่อดึงข้อมูลย้อนกลับ มาดูตัวอย่างกันดีกว่า

// This function receive refdoc and array of goods movement details
// and return data of material doc, material year and return message
function callissuesap($refdoc, $gmm_detail){

$return = array();

// Create saprfc-instance
$sap = create_connection();

// Import Parameters
$today = date("Ymd");

$header = array();
$header["PSTNG_DATE"] = $today;
$header["DOC_DATE"] = $today;
$header["REF_DOC_NO"] = $refdoc;
$header["HEADER_TXT"] = "";

$code = array();
$code["GM_CODE"] = "03";

$item = array();
$lineitem = array();
foreach ($gmm_detail as $gmm_line) {
$lineitem["ORDERID"] = $gmm_line["orderId"];
$lineitem["MATERIAL"] = $gmm_line["material"];
$lineitem["PLANT"] = $gmm_line["plant"];
$lineitem["STGE_LOC"] = $gmm_line["loc"];
$lineitem["BATCH"] = $gmm_line["batch"];
$lineitem["MOVE_TYPE"] = "261";
$lineitem["ENTRY_QNT"] = $gmm_line["qty"];
$lineitem["ENTRY_UOM"] = $gmm_line["une"];
$item[] = $lineitem;
}

// Call-Function
$result=$sap->callFunction("BAPI_GOODSMVT_CREATE",
array(
array("IMPORT","GOODSMVT_HEADER",$header),
array("IMPORT","GOODSMVT_CODE",$code),
array("EXPORT","MATERIALDOCUMENT",""),
array("EXPORT","MATDOCUMENTYEAR",""),
array("TABLE","GOODSMVT_ITEM",$item),
array("TABLE","RETURN",array())
));

// Call successfull?
if ($sap->getStatus() == SAPRFC_OK) {
$sap->callFunction("BAPI_TRANSACTION_COMMIT",array());
$return["MAT_DOC"] = $result["MATERIALDOCUMENT"];
$return["MAT_DOC_YEAR"] = $result["MATDOCUMENTYEAR"];
$return["RETURN"] = $result["RETURN"];
}
else {
$mess = array();
$messline = array();
$messline["TYPE"] = "E";
$messline["MESSAGE"] = $sap->getStatusTextLong();
$mess[] = $messline;

// $sap->printStatus();
$sap->callFunction("BAPI_TRANSACTION_ROLLBACK",array());
$return["MAT_DOC"] = "";
$return["MAT_DOC_YEAR"] = "";
$return["RETURN"] = $mess;
}
$sap->logoff();

return $return;
}

function create_connection() {
return $sap = new saprfc(array(
"logindata"=>array(
"ASHOST"=>"xxx.xxx.xxx.xxx" // application server
,"SYSNR"=>"xx" // system number
,"CLIENT"=>"xxx" // client
,"USER"=>"xxxxxxxxx" // user
,"PASSWD"=>"xxxxxxxxx" // password
)
,"show_errors"=>false // let class printout errors
,"debug"=>false)) ; // detailed debugging information
}


Information about GM_CODE
GM_Code 01: Goods receipt for purchase order
GM_Code 02: Goods receipt for production order
GM_Code 03: Goods issue
GM_Code 04: Transfer posting
GM_Code 05: Other goods receipts
GM_Code 06: Reversal of goods movements

คุณสามารถอ่านข้อมูลเพิ่มเติมได้ โดยไปที่ TCode: BAPI -> Materials Management -> Inventory Management, Goods Movement, CreateFromData -> Tab Documentation

How to apply BAPI_GOODSMVT_CREATE by PHP

If we want to create material document in SAP R/3 from external system, we can apply BAPI function BAPI_GOODSMVT_CREATE for this action. After we already call this function, we shoud call function BAPI_TRANSACTION_COMMIT or BAPI_TRANSACTION_ROLLBACK to commit or rollback our processes. In the example , i will create issue material doc by apply this function using PHP.

Example

// This function receive refdoc and array of goods movement details
// and return data of material doc, material year and return message
function callissuesap($refdoc, $gmm_detail){

$return = array();

// Create saprfc-instance
$sap = create_connection();

// Import Parameters
$today = date("Ymd");

$header = array();
$header["PSTNG_DATE"] = $today;
$header["DOC_DATE"] = $today;
$header["REF_DOC_NO"] = $refdoc;
$header["HEADER_TXT"] = "";

$code = array();
$code["GM_CODE"] = "03";

$item = array();
$lineitem = array();
foreach ($gmm_detail as $gmm_line) {
$lineitem["ORDERID"] = $gmm_line["orderId"];
$lineitem["MATERIAL"] = $gmm_line["material"];
$lineitem["PLANT"] = $gmm_line["plant"];
$lineitem["STGE_LOC"] = $gmm_line["loc"];
$lineitem["BATCH"] = $gmm_line["batch"];
$lineitem["MOVE_TYPE"] = "261";
$lineitem["ENTRY_QNT"] = $gmm_line["qty"];
$lineitem["ENTRY_UOM"] = $gmm_line["une"];
$item[] = $lineitem;
}

// Call-Function
$result=$sap->callFunction("BAPI_GOODSMVT_CREATE",
array(
array("IMPORT","GOODSMVT_HEADER",$header),
array("IMPORT","GOODSMVT_CODE",$code),
array("EXPORT","MATERIALDOCUMENT",""),
array("EXPORT","MATDOCUMENTYEAR",""),
array("TABLE","GOODSMVT_ITEM",$item),
array("TABLE","RETURN",array())
));

// Call successfull?
if ($sap->getStatus() == SAPRFC_OK) {
$sap->callFunction("BAPI_TRANSACTION_COMMIT",array());
$return["MAT_DOC"] = $result["MATERIALDOCUMENT"];
$return["MAT_DOC_YEAR"] = $result["MATDOCUMENTYEAR"];
$return["RETURN"] = $result["RETURN"];
}
else {
$mess = array();
$messline = array();
$messline["TYPE"] = "E";
$messline["MESSAGE"] = $sap->getStatusTextLong();
$mess[] = $messline;

// $sap->printStatus();
$sap->callFunction("BAPI_TRANSACTION_ROLLBACK",array());
$return["MAT_DOC"] = "";
$return["MAT_DOC_YEAR"] = "";
$return["RETURN"] = $mess;
}
$sap->logoff();

return $return;
}

function create_connection() {
return $sap = new saprfc(array(
"logindata"=>array(
"ASHOST"=>"xxx.xxx.xxx.xxx" // application server
,"SYSNR"=>"xx" // system number
,"CLIENT"=>"xxx" // client
,"USER"=>"xxxxxxxxx" // user
,"PASSWD"=>"xxxxxxxxx" // password
)
,"show_errors"=>false // let class printout errors
,"debug"=>false)) ; // detailed debugging information
}


Information about GM_CODE

GM_Code 01: Goods receipt for purchase order
GM_Code 02: Goods receipt for production order
GM_Code 03: Goods issue
GM_Code 04: Transfer posting
GM_Code 05: Other goods receipts
GM_Code 06: Reversal of goods movements

You can read the further informations in tcode -> Materials Management -> Inventory Management -> GoodsMovement -> CreateFromData -> Tab Documentation.

How to retrieve data from transaction STAT

The STAT transaction is transaction for analyze the statistics by users or programs. These data is kept in the server as file. If we want to retrieve these data, we should apply function 'SAPWL_STATREC_READ_FILE'. this function will return the raw data. you can take these data to analyze or verify depend on your requirement.

Example

CALL FUNCTION 'SAPWL_STATREC_READ_FILE'
EXPORTING
READ_CLIENT = CLIENT
READ_END_DATE = ENDDATE
READ_END_TIME = ENDTIME
READ_START_DATE = STARTDATE
READ_START_TIME = STARTTIME
TABLES
V2_NORMAL_RECORDS = V2_NORMAL_RECORDS.


In above example, i want to retreive stat data by client, enddate, endtime, startdate and starttime. After i call this function, the retreived data will be returned in internal table V2_NORMAL_RECORDS.

How to change user status by ABAP

SAP R/3 4.6c, if we want to change user status in production order by ABAP, we can apply function 'I_CHANGE_STATUS'. This function requires object number, current active status and status that we want to set as active.
Example:

CALL FUNCTION 'I_CHANGE_STATUS'
EXPORTING
OBJNR = PA_OBJNR
ESTAT_INACTIVE = lv_inactive
ESTAT_ACTIVE = lv_active
EXCEPTIONS
CANNOT_UPDATE = 1
OTHERS = 2 .

Saturday, April 3, 2010

How to get status by ABAP

In SAP 4.6c, when we want to retrieve status of production order by ABAP, we can apply function 'STATUS_READ'.
This function require only object no. of production order.
Example

CALL FUNCTION 'STATUS_READ'
EXPORTING
* CLIENT = SY-MANDT
OBJNR = PA_OBJNR
* ONLY_ACTIVE = ' '
* IMPORTING
* OBTYP =
* STSMA =
* STONR =
* TABLES
* STATUS =
* EXCEPTIONS
* OBJECT_NOT_FOUND = 1
* OTHERS = 2 .

If we want to know only active status, we can mark 'X' in export parameter 'ONLY_ACTIVE'. This function will return all status in term of internal table and return active user status in import parameters.

Create Dynamic Select in ABAP/4

In the example, i want to select data from table VBAK by created date as '20050105'. In the selected fields, i will choose them and append those fields into internal table 'it_fldtab'.
Example
TABLES: VBAK.
DATA: it_vbak TYPE TABLE OF vbak WITH HEADER LINE,
wa_fld(72) TYPE C,
it_fldtab LIKE TABLE OF wa_fld.
wa_fld = 'VBELN'.
APPEND wa_fld TO it_fldtab.
wa_fld = 'VBTYP'.
APPEND wa_fld TO it_fldtab.
wa_fld = 'AUDAT'.
APPEND wa_fld TO it_fldtab.
SELECT (it_fldtab) INTO CORRESPONDING FIELDS OF TABLE it_vbak
FROM VBAK
WHERE ERDAT = '20050105'.
IF SY-SUBRC = 0.
LOOP AT it_vbak.
write:/ it_vbak-vbeln,
it_vbak-vbtyp,
it_vbak-audat.
ENDLOOP.
ENDIF.

ท้าวความเรื่องการทำ Blog เกี่ยวกับ Programming

ความจริงเคยเขียนเกี่ยวกับ Programming ไว้นานมาแล้วที่ http://www.howforge.com/blog/thitima แต่หลังๆมานี่ไม่ค่อยได้ไปอัปเดทเท่าไหร่ แถมมีคนมาคอมเม้นต์ก็ไม่ตอบ(ความจริงเขียนเสร็จแล้วก็ไม่เคยเข้าไปอ่านหรอก) ตอนนี้กำลังคิดว่าจะเขียนที่ๆเคยเขียนไปแล้วใหม่ในเวอร์ชั่นภาษาไทย รวมทั้งจะเอาของเดิมที่เคยเขียนไว้มารวมเข้าไว้ที่นี่ด้วย อีกอย่างตั้งใจว่าจะเข้ามาอ่านบ่อยๆเพื่อตอบคำถามบ้าง อะไรบ้าง(แต่ถ้าตอบไม่ได้ก็ไม่ว่ากันนะ ใช้ประสบการณ์เอาน่ะ) ยังไงก็ช่วยมาอ่านกันด้วยนะ จะพยายามเขียนให้เข้าใจ ให้เอาไปใช้งานกันให้ได้ สิ่งที่เอามาเขียนเนี่ยก็เป็นสิ่งที่ได้มาจากประสบการณ์ทั้งนั้นแหละ ส่วนใหญ่จะเป็น ABAP เพราะชีวิตการทำงานเนี่ยยังไม่เคยวาง ABAP ได้เลย ความจริงตอนนี้ก็ไม่ค่อยได้เขียนโค๊ดแล้วเพราะงานที่ได้รับมอบหมายเปลี่ยนไปเป็นทาง Research เป็นส่วนใหญ่ แต่ก็ยังไม่ได้ทิ้งการเขียนโปรแกรมหรอกนะ ก็ังมีงานเข้ามาให้แก้ปัญหาบ้างเพียงแต่ไม่ใช่งานหลักเหมือนแต่ก่อน แต่โดยส่วนตัวชอบการเขียนโปรแกรมนะเพราะทำงานกับมันมานาน ตั้งแต่เรียนจบอายุ 22 จนตอนนี้ 31 ก็ยังเขียนอยู่เลย แก่เนอะ ขึ้นเลยสามแล้ว :(
ยิ่งพูดมากเหมือนจะกลายเป็นเริ่มบ่นแล้ว วันนี้ท้าวความแค่นี้ก่อนดีกว่า ถ้าใครอยากโทรมาถามก็ได้นะ ที่เบอร์ 0863004260 ให้เบอร์ด้วย :) แต่อย่ามาขายของ หรือยืมเงินนะ ไม่มีหรอก หรือไงก็ Mail มาที่ thitimap@gmail.com ก็ได้
อ้อ เรามีอีก Blog นึงไว้เขียนนู่นนี่ที่ไม่เกี่ยวกับ programming นะ คือ http://nootid.blogspot.com/ ยังไงถ้าอยากรู้จักเราให้มากกว่านี้ในมุมอื่นนอกจากการเขียนโปรแกรมก็เชิญที่ blog นั้นได้นะ

Friday, April 2, 2010

วิธี การดึงข้อมูล System Status ของ Production Order โดยใช้ ABAP [2]

จากที่กล่าวถึงวิธีแรกไปแล้วเป็นวิธีที่ใช้ Function Module
วิธีที่สองที่จะกล่าวถึงนี้เราจะเขียนวิธีการดึง System Status เองเลย ซึ่งความจริงก็ไม่ยาก เพราะ System Status นั้นจะเก็บอยู่ในตาราง JEST ซึ่งเราก็จะเอา เลขที่ OBJNR ที่เราหาได้จากตาราง AUFK เข้าไปทำการ Query เหมือนกัน

SELECT STAT INACT INTO TABLE it_stat
FROM jest
WHERE OBJNR = wa_aufk-objnr.


ถ้าเราต้องการเฉพาะสถานะที่ Active ก็ให้เราใส่เงื่อนไขดังนี้ เ้ข้าไปตอน Query

INACT = ' '


Completed Code:

DATA: it_stat TYPE TABLE OF JSTAT WITH HEADER LINE,
wa_aufk LIKE aufk.

SELECT SINGLE * FROM AUFK INTO wa_aufk
WHERE AUFNR = 'TEST54'.
IF SY-SUBRC = 0.
SELECT STAT INACT INTO TABLE it_stat
FROM jest
WHERE OBJNR = wa_aufk-objnr.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ELSE.
LOOP AT it_stat.
WRITE:/ it_stat-STAT,
it_stat-INACT.
ENDLOOP.
ENDIF.
ENDIF.


ผลลัพธ์ที่ได้

E0001 X
E0010
I0001 X
I0002
I0010
I0016
I0028
I0115
I0118 X
I0215
I0340 X
I0361
I0369
I0420


จะเห็นว่าผลลัพธ์ที่ได้เหมือนกับวิธีแรกเลย

วิธีการดึงข้อมูล System Status ของ Production Order โดยใช้ ABAP [1]

ในการดึงข้อมูลเกี่ยวกับ Production Order บางครั้งเราต้องการทราบข้อมูลที่อยู่ในส่วนของ System Status ซึ่งวิธีแรกที่เราจะนำเสนอนี้คือการใช้ Function Module: STATUS_READ ดังตัวอย่างต่อไปนี้


CALL FUNCTION 'STATUS_READ'
EXPORTING
* CLIENT = SY-MANDT
objnr = wa_aufk-objnr
* ONLY_ACTIVE = ' '
* IMPORTING
* OBTYP =
* STSMA =
* STONR =
TABLES
STATUS = it_stat
EXCEPTIONS
OBJECT_NOT_FOUND = 1
OTHERS = 2
.


ฟังก์ชั่นนี้ใช้ง่ายมาก ขอเพียงรู้เลขที่ OBJNR ที่เราหาได้จากตาราง AUFK ที่นำ Production Order เข้าไป Query
ผลลัพธ์ที่ได้จะออกมาในรูปของ Internal Table ซึ่งมีโครงสร้างประกอบได้ด้วย STAT: รหัสสถานะ และ INACT: Inactive Flag
ในกรณีที่เราต้องการเฉพาะสถานะที่ Active ให้เราเอา Comment ของ ONLY_ACTIVE ออก และ Assign ค่า "X" ให้

ONLY_ACTIVE = ' X'


Completed Code:

DATA: it_stat TYPE TABLE OF JSTAT WITH HEADER LINE,
wa_aufk LIKE aufk.

SELECT SINGLE * FROM AUFK INTO wa_aufk
WHERE AUFNR = 'TEST54'.
IF SY-SUBRC = 0.
CALL FUNCTION 'STATUS_READ'
EXPORTING
* CLIENT = SY-MANDT
objnr = wa_aufk-objnr
* ONLY_ACTIVE = ' '
* IMPORTING
* OBTYP =
* STSMA =
* STONR =
TABLES
STATUS = it_stat
EXCEPTIONS
OBJECT_NOT_FOUND = 1
OTHERS = 2
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ELSE.
LOOP AT it_stat.
WRITE:/ it_stat-STAT,
it_stat-INACT.
ENDLOOP.
ENDIF.
ENDIF.


ผลลัพธ์ที่ได้

E0001 X
E0010
I0001 X
I0002
I0010
I0016
I0028
I0115
I0118 X
I0215
I0340 X
I0361
I0369
I0420

วิธีการสร้าง Dynamic Selected ตอนทำ Query

ตัวอย่างนี้เราจะ Query ข้อมูลจากตาราง VBAK โดยกำหนดเงื่อนไขในการเลือกข้อมูลว่าเอาข้อมูลของ Sale Order ที่มี Created Date ในวันที่ 05/01/2005. ส่วน Column ที่เราจะเลือกมาแสดงข้อมูลนั้นเราจะใส่เข้าไปใน Internal Table ชื่อ it_fldtab โดย Internal Table นี้ มีโครงสร้างภายในเก็บเป็น Text เท่านั้น
วิธีการประกาศ Internal Table it_fldtab เป็นดังนี้
DATA: wa_fld(72) TYPE C,
it_fldtab LIKE TABLE OF wa_fld.


จากนั้นให้นำชื่อ Column ที่ต้องการ Select ใส่เข้าไปใน it_fldtab ดังนี้
wa_fld = 'VBELN'.
APPEND wa_fld TO it_fldtab.
wa_fld = 'VBTYP'.
APPEND wa_fld TO it_fldtab.
wa_fld = 'AUDAT'.
APPEND wa_fld TO it_fldtab.


จาก Code ข้างต้น เราเลือก Column ที่ชื่อ VBELN คือ เลขที่ Sale Order, VBTYP คือ ประเภทของเอกสาร, AUDAT คือ วันที่ของเอกสาร
จากนั้นก็ Query ข้อมูลตามเงื่อนไขที่ได้กำหนด
SELECT (it_fldtab) INTO CORRESPONDING FIELDS OF TABLE it_vbak
FROM VBAK WHERE ERDAT = '20050105'.


เมื่อ Query ข้อมูลเสร็จก็ทำการเขียนข้อมูลออกมา
IF SY-SUBRC = 0.
LOOP AT it_vbak.
write:/ it_vbak-vbeln, it_vbak-vbtyp, it_vbak-audat.
ENDLOOP.
ENDIF.


Completed Code:

TABLES: VBAK.
DATA: it_vbak TYPE TABLE OF vbak WITH HEADER LINE,
wa_fld(72) TYPE C,
it_fldtab LIKE TABLE OF wa_fld.
wa_fld = 'VBELN'.
APPEND wa_fld TO it_fldtab.
wa_fld = 'VBTYP'.
APPEND wa_fld TO it_fldtab.
wa_fld = 'AUDAT'.
APPEND wa_fld TO it_fldtab.
SELECT (it_fldtab) INTO CORRESPONDING FIELDS OF TABLE it_vbak
FROM VBAK WHERE ERDAT = '20050105'.
IF SY-SUBRC = 0.
LOOP AT it_vbak.
write:/ it_vbak-vbeln, it_vbak-vbtyp, it_vbak-audat.
ENDLOOP.
ENDIF.

วิธีการเรียกหน้าจอ Standard จาก ABAP Report

วิธีการเรียกหน้าจอ Standard จาก ABAP Report เช่นจาก ABAP Report เมื่อเรา Double Click แล้วให้แสดงหน้าจอของ Sale Order (Transaction VA03) ในกรณีที่บรรทัดที่เรา Double Click นั้นเป็นเลขที่ Sale Order
ขั้นตอนเป็นดังนี้
1. ให้ Select ข้อมูลที่เราต้องการแสดงในหน้าแรกก่อน ในตัวอย่างนี้ขอแสดงข้อมูลเลขที่ Sale Order โดยมีการรับค่าจากหน้าจอเป็น select-options และนำมา Query ในตาราง VBAK จากนั้นให้นำข้อมูลที่ Query ได้มาเขียนออกหน้าจอ
SELECT-OPTIONS s_vbeln for vbak-vbeln.

START-OF-SELECTION.
SELECT * FROM vbak INTO TABLE it_vbak
WHERE vbeln in s_vbeln.
LOOP AT it_vbak.
WRITE:/ it_vbak-vbeln.
HIDE it_vbak.
ENDLOOP.

จะสังเกตเห็นว่าตอนที่เรา WRITE ข้อมูลออกหน้าจอนั้นได้เรียกคำสั่ง HIDE ด้วย ซึ่งคำสั่งนี้จะมีผลเมื่อต้องการให้รายงานของเราสามารถ Drill-Down ได้ โดยใช้คู่กับ Event: AT LINE-SELECTION

2. เราจะใช้ Event: AT LINE-SELECTION. เพื่อให้สามารถ Double Click ได้ จากนั้นให้เรียกคำสั่ง CALL TRANSACTION เพื่อใช้ในการเปิดหน้าจอ Standard
AT LINE-SELECTION.
IF sy-lsind = 1.
SET PARAMETER ID 'AUN' FIELD it_vbak-vbeln.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
ENDIF.

จากตัวอย่างเราได้มีการเปิดหน้าจอ โดยก่อนเปิดเราต้อง Set Parameter ID ก่ิ่อน เพราะตอนที่เปิด Transaction ของ Standard นั้น เราจะ Default ค่าของเลขที่ Sale Order ให้แล้วเปิดเลย

Completed Code:

TABLES vbak.

DATA: it_vbak TYPE TABLE OF vbak WITH HEADER LINE.

SELECT-OPTIONS s_vbeln for vbak-vbeln.

START-OF-SELECTION.
SELECT * FROM vbak INTO TABLE it_vbak
WHERE vbeln in s_vbeln.
LOOP AT it_vbak.
WRITE:/ it_vbak-vbeln.
HIDE it_vbak.
ENDLOOP.

AT LINE-SELECTION.
IF sy-lsind = 1.
SET PARAMETER ID 'AUN' FIELD it_vbak-vbeln.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
ENDIF.