วันจันทร์ที่ 11 ธันวาคม พ.ศ. 2560

ABAP in sap


ABAP (การเขียนโปรแกรมแอพพลิเคชันทางธุรกิจขั้นสูง) เป็นภาษาการเขียนโปรแกรมรุ่นที่ 4 ซึ่งใช้สำหรับวัตถุประสงค์ในการพัฒนาและปรับแต่งซอฟต์แวร์ SAP ขณะนี้ตำแหน่งพร้อมกับ Java เป็นภาษาหลักสำหรับการเขียนโปรแกรมเซิร์ฟเวอร์แอ็พพลิเคชัน SAP ส่วนใหญ่ของโปรแกรมจะทำงานภายใต้การควบคุมของระบบรันไทม์ บทแนะนำนี้อธิบายถึงแนวคิดหลักของ SAP ABAP

1.รูปแบบโครงสร้าง

จากรูป
จะเป้นว่าโครงสร้างการทำงานจะแบ่งเป้น 3 ชั้น คือ ต้องมี sap gui   ก่อน เพื่อเข้าระบบ จากนั้นก็ชัน server กับ databese ส่วนที่ผมใช้ตอนนี้ ใช้ sybase

2. การเขียนโปรแกรม abap มีอะไรบ้าง

  2.1 เขียนพวก form เอกสารต่าง โดยใช้ smartforms (tcode  smartforms)
  2.2 เขียนพวกออกรายงาน  excel  ให้ user  (alv)
  2.3 เขียนโปรแกรมเสริม ตาม user ต้องการ โดยใช้ abap  tcode  se80  , table control abap ,Dialog programming


3. เริ่มต้นเขียน abap  ตัวอย่าง รูปแบบ ไวยากรณ์

เข้า tcode se38  

*&---------------------------------------------------------------------* *& Report ZHELLO1 *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* *& เรียกใช้โปรแกรม ที่เราสร้าง REPORT ZHELLO1.

*เรียกใช้ Subroutine PERFORM SUB_DISPLAY. *& ประการศ hello world WRITE 'Hello World'. ULINE. WRITE 'Hello'. WRITE 'ABAP'. WRITE 'World'. ULINE. DATA: W_NUR(10) TYPE N. MOVE 50 TO W_NUR. WRITE W_NUR NO-ZERO.ULINE.
* ship เว้นบรรทัด WRITE 'This is the 1st line'. SKIP. WRITE 'This is the 2nd line'. * จบ ship เว้นบรรทัด



*ขีดเส้นใต้ ULINE. WRITE 'This is Underlined'. ULINE.


*ประการศตัวแปร DATA TEXT_LINE TYPE C LENGTH 40. TEXT_LINE = 'A Chapter on Data Types'. WRITE TEXT_LINE. ULINE.


*ประการศตัวแปร / คือเว้นบรรทัด DATA TEXT_STRING TYPE STRING. TEXT_STRING = 'A Program in ABAP'. WRITE / TEXT_STRING. ULINE.


*ประการศตัวแปร SY-DATUM คือตัวแปร วันที่ ในระบบ DATA D_DATE TYPE D. D_DATE = SY-DATUM. WRITE / D_DATE. ULINE.


*บวกลบ คูณ หาร DATA: A TYPE I VALUE 150, B TYPE I VALUE 50, RESULT TYPE I. RESULT = A + B. WRITE / RESULT.

*แปลงเลข 20000 เป็น 20,000 DATA: CHARACTERS(200) TYPE C, INTS TYPE P DECIMALS 2 . INTS = '2000000000'.

*WRITE INTS TO CHARACTERS CURRENCY 'THB' DECIMALS 0. *CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT' * CHANGING * VALUE = CHARACTERS. *. WRITE: / 'example',INTS . ULINE. *สร้าง ช่องกรอก ข้อมูล PARAMETERS: NAME(10) TYPE C, CLASS TYPE I, SCORE TYPE P DECIMALS 2, CONNECT TYPE MARA-MATNR.


*ตัวแปร ระบบทั้งหมด WRITE:/'SY-ABCDE', SY-ABCDE, /'SY-DATUM', SY-DATUM, /'SY-DBSYS', SY-DBSYS, /'SY-HOST ', SY-HOST, /'SY-LANGU', SY-LANGU, /'SY-MANDT', SY-MANDT, /'SY-OPSYS', SY-OPSYS, /'SY-SAPRL', SY-SAPRL, /'SY-SYSID', SY-SYSID, /'SY-TCODE', SY-TCODE, /'SY-UNAME', SY-UNAME, /'SY-UZEIT', SY-UZEIT. ULINE.
*ประกาศตัวแปรคงที่ CONSTANTS PQR TYPE P DECIMALS 4 VALUE '1.2356'. WRITE: / 'The value of PQR is CONSTANTS :', PQR. ULINE.

*WHILE loop DATA: AAAA TYPE I. AAAA = 0. WHILE AAAA <> 8. WRITE: / 'This is the line:', AAAA. AAAA = AAAA + 1. ENDWHILE.

ULINE. * loop exit DO 5 TIMES. IF SY-INDEX = 3. EXIT. ENDIF. WRITE / SY-INDEX. ENDDO. ULINE. * ตัวอย่างใช้ if DATA TITLE_1(20) TYPE C. TITLE_1 = 'Tutorials'. IF TITLE_1 = 'Tutorials'. WRITE 'This is IF statement'. ENDIF. ULINE. * if elseif DATA TITLE_11(20) TYPE C. TITLE_11 = 'Tutorials'. IF TITLE_11 = 'Tutorial'. WRITE 'This is IF Statement'. ELSE. WRITE 'This is ELSE Statement'. ENDIF. ULINE. *if elseif else IF TITLE_11 = 'Tutorial'. WRITE 'This is IF Statement'. ELSEIF TITLE_11 = 'Tutorials' . WRITE 'This is ELSEif Statement'. ELSE. WRITE 'xxx'. ENDIF. ULINE.
*create string DATA MY_CHAR(5) VALUE 'Hello'. WRITE MY_CHAR. ULINE. *strstring หาความยาวของคำ DATA: TITLE_NONG(10) VALUE 'Tutorials', LENGTH_1 TYPE I. LENGTH_1 = STRLEN( TITLE_NONG ). WRITE: / 'The Length of the Title is:', LENGTH_1. ULINE.
*ต่อคำ DATA: TITLE_NONGTEST1(10) VALUE 'Tutorials', TITLE_NONGTEST2(10) VALUE 'Point', SPACED_TITLE(30) VALUE 'Tutorials Point Limited', SEP, DEST1(30), DEST2(30). CONCATENATE TITLE_NONGTEST1 TITLE_NONGTEST2 INTO DEST1. WRITE: / 'Concatenation:', DEST1. CONCATENATE TITLE_NONGTEST1 TITLE_NONGTEST2 INTO DEST2 SEPARATED BY SEP. WRITE: / 'Concatenation with Space:', DEST2. CONDENSE SPACED_TITLE. WRITE: / 'Condense with Gaps:', SPACED_TITLE. *ไม่ให้มีช่องว่าง CONDENSE SPACED_TITLE NO-GAPS. WRITE: / 'Condense with No Gaps:', SPACED_TITLE. ULINE. *Current Date and Time การกำหนด ค่า วันที่ DATA: DATE_1 TYPE D. DATE_1 = SY-DATUM. WRITE: / 'Present Date is:', DATE_1 DD/MM/YYYY.

* บวกวันที่ 6 จากวันที่ปัจจัุบัน DATE_1 = DATE_1 + 06. WRITE: / 'Date after 6 Days is:', DATE_1 DD/MM/YYYY. ULINE. *เรื่อง การใช้ timestamp DATA: STAMP_1 TYPE TIMESTAMP, STAMP_2 TYPE TIMESTAMPL. GET TIME STAMP FIELD STAMP_1. WRITE: / 'The short time stamp is:', STAMP_1 TIME ZONE SY-ZONLO. GET TIME STAMP FIELD STAMP_2. WRITE: / 'The long time stamp is:', STAMP_2 TIME ZONE SY-ZONLO. ULINE. * create Macros DEFINE MAC_TEST. WRITE: '&1'. END-OF-DEFINITION. PARAMETERS: S1 TYPE C AS CHECKBOX. PARAMETERS: S2 TYPE C AS CHECKBOX. PARAMETERS: S3 TYPE C AS CHECKBOX DEFAULT 'X'. START-OF-SELECTION. IF S1 = 'X'. MAC_TEST 44. ENDIF. IF S2 = 'X'. MAC_TEST 2. ENDIF. IF S3 = 'X'. MAC_TEST 3. ENDIF. *สร้าง เรียกใช้ function DATA RESULT22 LIKE SPELL. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(15) TEXT-001. PARAMETER NUM_1 TYPE I. SELECTION-SCREEN END OF LINE. CALL FUNCTION 'SPELL_AMOUNT' EXPORTING AMOUNT = NUM_1 IMPORTING IN_WORDS = RESULT22. IF SY-SUBRC <> 0. WRITE: 'Value returned is:', SY-SUBRC. ELSE. WRITE: 'ตัวหนังสือ ยอด', RESULT22-WORD. ENDIF.

*สร้าง internal table และเลือก คิวรี่ จากแบบ native sql และวนแสดง DATA: BEGIN OF WA, CONNID TYPE SPFLI-CONNID, CITYFROM TYPE SPFLI-CITYFROM, CITYTO TYPE SPFLI-CITYTO, AIRPTO TYPE SPFLI-AIRPTO, END OF WA. DATA C1 TYPE SPFLI-CARRID VALUE 'LH'. EXEC SQL PERFORMING LOOP_OUTPUT. SELECT connid, cityfrom,cityto,AIRPTO INTO :wa FROM SPFLI WHERE carrid = :c1 FETCH FIRST 10 ROWS ONLY ENDEXEC. FORM LOOP_OUTPUT. WRITE: / WA-CONNID, WA-CITYFROM, WA-CITYTO , WA-AIRPTO. ENDFORM. *การสร้าง obj class CLASS CLASS1 DEFINITION. PUBLIC SECTION. DATA: TEXT1(45) VALUE 'ABAP Objects.'. METHODS: DISPLAY1. ENDCLASS. CLASS CLASS1 IMPLEMENTATION. METHOD DISPLAY1. WRITE:/ 'This is the Display method.'. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA: CLASS1 TYPE REF TO CLASS1. CREATE OBJECT: CLASS1. WRITE:/ CLASS1->TEXT1. CALL METHOD: CLASS1->DISPLAY1. * Inheritance พ่อมัน CLASS SUPER_CLASS DEFINITION. PUBLIC SECTION. METHODS: ADDITION1 IMPORTING G_A TYPE I G_B TYPE I EXPORTING G_C TYPE I. ENDCLASS. CLASS SUPER_CLASS IMPLEMENTATION. METHOD ADDITION1. G_C = G_A + G_B. ENDMETHOD. ENDCLASS. *ลูกมันอ้างอิงหา พ่อมัน CLASS SUB_CLASS DEFINITION INHERITING FROM SUPER_CLASS. PUBLIC SECTION. METHODS: ADDITION1 REDEFINITION. ENDCLASS. CLASS SUB_CLASS IMPLEMENTATION. METHOD ADDITION1. G_C = G_A + G_B + 10. ENDMETHOD. ENDCLASS. START-OF-SELECTION. PARAMETERS: P_A TYPE I, P_B TYPE I. DATA: H_ADDITION1 TYPE I. DATA: H_SUB TYPE I. DATA: REF1 TYPE REF TO SUB_CLASS. CREATE OBJECT REF1. CALL METHOD REF1->ADDITION1 EXPORTING G_A = P_A G_B = P_B IMPORTING G_C = H_ADDITION1. WRITE:/ H_ADDITION1. **สร้าง Subroutine FORM SUB_DISPLAY. WRITE: 'This is Subroutine'. WRITE: / 'Subroutine created successfully'. ULINE. ENDFORM. " Sub_Display *ARAMETERS P_NONG1 LIKE VBAK-ERDAT.



4. tcode ที่ใช้พัฒนา


T-CODEคำอธิบาย
SE11ดูข้อมูล table
SE16ดูข้อมูล table
MM01สร้างรายการวัสดุเข้ามาใหม่
MM02แก้ไขและเปลี่ยนแปลง
MM03ดูรายการ
SCC3ตรวจสอบดูว่าทำงานหรือไม่
SCC4สร้าง clinent
SCC5Deleting client
SCC7import/export
SCC8import/export
SCCLcopy clinent
SU01สร้าง user
SU02authorizations
SU53ตรวจสอบสถานะ t-code ทำไม่เข้าไม่ได้
SU10ดู user ทั้งหมด
SM36define background job
SM37หยุดรันคอนจ็อบ ดูคอนจ็อบ ลบคอนจ็อบ
STMSจัดการ Transport
SM59RFC
SM51system Monitering
SM04ดู user ใช้โปรแกรมอะไร
SM13update process
SM21moniter system log
ST02ปรับแต่งข้อมูล
ST06ดู cpu
ST22ABAP Dump
SP01spool req
SM37moniter bach job
DB02Database admin
DB12Database backup logs
SE93ผูก T- code
smartformssmartforms
se10เอาไว้ รีลิส
SM12ลบ user dev lock
se73ปรับปรุง font css
SPATสร้างรูปแบบเอกสาร
se78upload รูปภาพ ลง sap
se16nดูข้อมูล table
se38เขียนโปรแกรม
SP01Spool Transaction
SPADสร้างรูปแบบเอกสาร
xd02แก้้ไข ข้อมูลลูกค้า
/nse16เพิ่มข้อมูล database
se30Run-time analysis
RZ11ปรับ runtime sap rdisp/max_wprun_time RZ11




5.ตัวอย่างสอน สร้าง table control  se80 

https://www.youtube.com/watch?v=9ZfuH24dEy0&t=162s


6.table หลัก ของ sap ครับ 

 เข้าดู tabe   tcode  - se16n 

































table  ควรจำไว้ หลัก ทาง ฝั่ง sd 

vbak  ขาย
vbap
vbpa


vbfa
vbuk
vbup

konv  เงื่อนไขการขาย

likp
lips

ตั้งหนี้

vbrk
vbrp



วันเสาร์ที่ 6 มิถุนายน พ.ศ. 2558

mysqldump ubuntu

mysqldump -udb_user -p123456 ERP_service parts| gzip -c > parts_20131130.sql.gz

scp -r bunyut@199.199.199.248:/www/BACKUP_DATABASE/parts_20131130.sql.gz /www/ERP_service/updb/

gunzip < parts_20131130.sql.gz | mysql -uroot -p123456 ERP_service


.ใช้การทำ dump databese mysql

TRIGGER

Fiวันที่เรื่องที่นำเสนอรายละเอียดตัวอย่างเรื่องที่จะนำเสนอครั้งถัดไปคำถาม
121/1/2015-อธิบายเกี่ยวกับ trigger และการทำงาน- Code คำสั่ง SQL ที่ถูกสร้างขึ้นให้ทำงานกับ Table หรือ View โดยที่คำสั่งเหล่านั้นจะทำงานโดยอัตโนมัติ เมื่อมีการเปลี่ยนแปลงอย่างใดอย่างหนึ่งกับ Table หรือ View (insert,update,delete)
-เมื่อเกิด Query ใน Mysql แล้ว Database จะทำการตรวจสอบว่ามี Trigger ไหนตรงตามเงื่อนไขบ้าง และเรียกใช้งาน
-ข้อดี-ทำงานอัตโนมัติเมื่อมีการเปลี่ยนแปลงข้อมูลในตารางที่กำหนด
-ทำงานเร็วกว่าการส่งข้อมูลไปมาระหว่าง Mysql กับ PHP
-ช่วยแบ่งเบา Process ของโปรแกรมไปได้มาก เพราะ Trigger จะทำงานบน Database Server
-ตรวจสอบความสมบูรณ์ของข้อมูล เช่น หลังจากแก้ไขข้อมูลแล้ว เก็บประวัติการแก้ไขในตาราง log ด้วย
-ตรวจสอบการเปลี่ยนแปลงของข้อมูลในตาราง เช่น ใช้เงื่อนไขเช็คข้อมูลก่อนบันทึกในตาราง
-ข้อเสีย-Debug ยาก
-การสร้างเงื่อนไขใน PHP มีความยืดหยุ่นกว่า
-อาจเกิดความยุ่งยากในการดูแลในระยะยาว หากต้องแก้ไขโปรแกรมที่มี trigger ผูกกับตารางต่างๆในโปรแกรม
-ข้อจำกัด-ในหนึ่งตารางไม่สามารถสร้างหลาย trigger ที่มี action time กับ event เหมือนกัน
-ไม่สามารถเปลี่ยนแปลงข้อมูลของตารางที่ถูกกำหนด event ใน trigger (สามารถ select ตารางนั้นได้) รวมถึงเรียก stored ให้เปลี่ยนแปลงข้อมูลก็ไม่สามารถทำได้
-ไม่สามารถ rollback ข้อมูลได้
-CREATE TRIGGER SyntaxCREATE TRIGGER trigger_name
trigger_time trigger_event
ON table_name
FOR EACH ROW
BEGIN
...
END

**trigger_time: { BEFORE | AFTER }
**trigger_event: { INSERT | UPDATE | DELETE }
DELIMITER //
CREATE TRIGGER TG_UPDATE_DATA
AFTER UPDATE
ON TG_SUM_EMP
FOR EACH ROW
BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = OLD.a1;
END;
//
DELIMITER ;

**OLD คือข้อมูลเก่าก่อนการแก้ไข (event INSERT จะไม่สามารถใช้ได้)
**NEW คือข้อมูลใหม่ (event DELETE จะไม่สามารถใช้ได้)
**การเขียน OLD|NEW.field_name
-การปรกาศตัวแปรDECLARE variable_name variable_type ;DECLARE count_emp INTEGER;
DECLARE sum INTEGER DEFAULT 0;
DECLARE comp_name VARCHAR(250) CHARACTER SET utf8;
229/1/2015-ความเชื่องโยงระหว่าง Triger และ Stored-stored ทำงานเมื่อมีการ call ส่วน trigger ทำงานอัตโนมัติตาม event ที่กำหนด
-การประกาศตัวแปร ,สร้างเงื่อนไข เหมือกัน
-trigger สามารถ call stored ได้
การ call stored :CALL stored_name();
-คำสั่งใน phpMyAdmin-แสดงทั้งหมด : SHOW TRIGGERS;
-ค้นหาจากชื่อtrigger : SHOW TRIGGERS LIKE '%update%';
-ลบ : DROP TRIGGER IF EXISTS trigger_name ;
-ตัวอย่างการ call storedDELIMITER //
CREATE TRIGGER TG_update_emp AFTER UPDATE ON emp_data
FOR EACH ROW
BEGIN
DECLARE count_emp INTEGER;
DECLARE check_TG_SUM_EMP INTEGER DEFAULT 0;DECLARE count_emp INTEGER;
DECLARE check_TG_SUM_EMP INTEGER DEFAULT 0;


SELECT COUNT(company_id) INTO check_TG_SUM_EMP FROM TG_SUM_EMP ;
IF check_TG_SUM_EMP = 0 THEN
CALL SP_add_newData();
ELSE
SELECT COUNT(DataNo) INTO count_emp FROM emp_data
WHERE Prosonnal_Being != 3
AND Working_Company = NEW.Working_Company;
UPDATE TG_SUM_EMP SET sum_emp = count_emp,date_update = NOW() WHERE company_id = NEW.Working_Company;
END IF;

END;
//
DELIMITER ;
-ตัวอย่างเงื่อนไข IFDELIMITER //
CREATE TRIGGER TG_UPDATE_working_company AFTER UPDATE ON working_company
FOR EACH ROW
BEGIN
IF NEW.status = 99 THEN
DELETE FROM ERP_easyhr_checktime.TG_SUM_EMP WHERE company_id = NEW.id;
ELSE
UPDATE ERP_easyhr_checktime.TG_SUM_EMP SET company_id = NEW.id,company_name = NEW.name ,date_update = NOW()
WHERE company_id = OLD.id;
END IF;
END;
//
DELIMITER ;
37/2/2015-MySQL Cursorการประกาศ:DECLARE cursor_name CURSOR FOR select_statement;
เช็คข้อมูลว่าง:DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
DELIMITER $$

CREATE PROCEDURE build_email_list (INOUT email_list varchar(4000))
BEGIN

DECLARE v_finished INTEGER DEFAULT 0;
DECLARE v_email varchar(100) DEFAULT "";

-- declare cursor for employee email
DEClARE email_cursor CURSOR FOR
SELECT email FROM employees;

-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET v_finished = 1;

OPEN email_cursor;

get_email: LOOP

FETCH email_cursor INTO v_email;

IF v_finished = 1 THEN
LEAVE get_email;
END IF;

-- build email list
SET email_list = CONCAT(v_email,";",email_list);

END LOOP get_email;

CLOSE email_cursor;

END$$

DELIMITER ;
ตัวอย่างการใช้ MySQL CursorDELIMITER //
CREATE TRIGGER TG_add_newData BEFORE INSERT ON emp_data
FOR EACH ROW
BEGIN
DECLARE loop_finish INTEGER DEFAULT 0;
DECLARE comp_id INTEGER;
DECLARE comp_name VARCHAR(250);
DECLARE count_emp INTEGER;

DECLARE GROUP_data CURSOR FOR SELECT id, name
FROM ERP_easyhr_OU.working_company
WHERE status != 99
order by id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET loop_finish = 1;

OPEN GROUP_data;
get_data:LOOP

FETCH GROUP_data INTO comp_id,comp_name;
IF loop_finish = 1 THEN
LEAVE get_data;
ELSE
SELECT COUNT(DataNo) INTO count_emp FROM emp_data
WHERE Prosonnal_Being != 3
AND Working_Company = comp_id;
INSERT INTO TG_SUM_EMP (company_id, company_name,sum_emp,date_update)
VALUES(comp_id,comp_name,count_emp,NOW());
END IF;
END LOOP get_data;
CLOSE GROUP_data;
END;
//
DELIMITER ;
-DECLARE ... HANDLER Syntax เพื่อการ debugDECLARE handler_action HANDLER
FOR condition_value [, condition_value] ...
statement

**
handler_action:
CONTINUE
| EXIT
| UNDO

condition_value:
mysql_error_code
| SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
DELIMITER //
CREATE TRIGGER TG_UPDATE_EMP AFTER UPDATE ON emp_data
FOR EACH ROW
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END;
INSERT INTO LOG_DATA (id, data,event) VALUES(NEW.id,NEW.data,'update');

END;
//
DELIMITER ;