BMS-HOSxP Community
HOSxP => Report Exchange => ข้อความที่เริ่มโดย: panus_t ที่ กรกฎาคม 07, 2011, 16:08:32 PM
-
ถ้าต้องการแสดงค่า
lab_order_result
หรือ
lab_items_name
ต้องทำไงครับ
การใช้ getsqlintegerdata และ getsqlstringdata หรือตัวอื่น ๆ ผมยังไม่เข้าใจครับ
value:=getsqlintegerdata('select lo.lab_order_result from lab_head lh '+
' left outer join lab_order lo on lo.lab_order_number=lh.lab_order_number '+
' left outer join lab_items li on li.lab_items_code=lo.lab_items_code '+
' where lh.vn="'+dbpipeline['vn']+'" and lo.lab_items_code="78" ');
??? ??? ;D
-
อันที่เรียนมา รู้ มาที่ใช้บ่อยๆ ก็ ChangeReportSQL(sql); ----> ใช้ใน Oncreate เป็นการใช้ดึงรายงานทั่วไปที่แสดงผลหลายค่า พูดง่ายก็คือ เหมือนกะว่าแสดงอะไรออกมาหมด select { } from xxxx ตรง { } จะแสดงค่าหมด
ส่วนการเขียนใน Variable ก็ส่วนใหญ่ใช้แต่ Value := GetSQLStringData(sql); ---> เป็นการดึงรายงานที่แสดงผลเพียงแค่ค่าเด่ว เอามาวางใน report แสดงค่าเด๋ว นะคับ เช่น ของท่าน ให้แสดงผล
เป็น ผลแลป
ใช้
Value := GetSQLStringData(' select lo.lab_order_result from lab_head lh '
+ ' left outer join lab_order lo on lo.lab_order_number=lh.lab_order_number '
+ ' left outer join lab_items li on li.lab_items_code=lo.lab_items_code '
+ ' where lh.vn="'+dbpipeline['vn']+'" and lo.lab_items_code="275" ');
แสดง ชื่อแลป
Value := GetSQLStringData(' select li.lab_items_name from lab_head lh '
+ ' left outer join lab_order lo on lo.lab_order_number=lh.lab_order_number '
+ ' left outer join lab_items li on li.lab_items_code=lo.lab_items_code '
+ ' where lh.vn="'+dbpipeline['vn']+'" and lo.lab_items_code="275" ');
แสดง 2 อย่างก็ concat ไปเลย
Value := GetSQLStringData(' select concat(li.lab_items_name," ",lo.lab_order_result) as ' + 'labname_result from lab_head lh '
+ ' left outer join lab_order lo on lo.lab_order_number=lh.lab_order_number '
+ ' left outer join lab_items li on li.lab_items_code=lo.lab_items_code '
+ ' where lh.vn="'+dbpipeline['vn']+'" and lo.lab_items_code="275" ');
-
ดูจากข้อมูลของเราเป็นหลักครับ ว่าข้อมูลของเราเป็นข้อมูลประเภทไหน
Integer
Float
String
แล้วใช้ฟังก์ชันตามนั้นครับ ถ้าใช้แค่แสดงผลอย่างเดียว อาจจะใช้แค่ GetSQLStringData ก็ได้
แต่ถ้าต้องการนำค่าใน Variable ไปทำอย่างอื่นต่อ ควรจะใช้ฟังก์ชันให้ตรงกับ Datatype ครับ
เช่น ดึงค่าตัวเลขออกมา แต่ดึงมาเป็น string พอเอาตัวเลขมาบวกกันก็จะกลายเป็นเอาตัวเลขมาต่อกัน
ประมาณนี้ครับ
-
ฟิลด์ lab_order_result มี datatype เป็นอะไร ก็ใช้ตามนั้น
-
นุก อันนี้ใช้อย่างไง อ่ะ เพิ่งเคยเห็น Getsqlintegerdata ใช่ เปลี่ยนชนิด ตัวแปร ป่าว อ่ะ หน้าตามันแปลกๆ
มะเคยเห็น 555 ไม่เคยเล่นแหะ
เรียนต่อที่ไหน อ่ะ เงียบไปเลยเน้อะ
-
นุก อันนี้ใช้อย่างไง อ่ะ เพิ่งเคยเห็น Getsqlintegerdata ใช่ เปลี่ยนชนิด ตัวแปร ป่าว อ่ะ หน้าตามันแปลกๆ
มะเคยเห็น 555 ไม่เคยเล่นแหะ
เรียนต่อที่ไหน อ่ะ เงียบไปเลยเน้อะ
เหมือน GetSQLStringData แต่ใช้กับข้อมูลที่เป็น Integer
ยังมี GetSQLDateData, GetSQLDoubleData อีกนะ
-
นุก อันนี้ใช้อย่างไง อ่ะ เพิ่งเคยเห็น Getsqlintegerdata ใช่ เปลี่ยนชนิด ตัวแปร ป่าว อ่ะ หน้าตามันแปลกๆ
มะเคยเห็น 555 ไม่เคยเล่นแหะ
เรียนต่อที่ไหน อ่ะ เงียบไปเลยเน้อะ
ตามที่ผมเข้าใจนะครับ ถูกผิดยังไง ขออภัยด้วยครับ
GetSQLStringData
GetSQLIntegerData
GetSQLDateData
GetSQLDoubleData
มันต่างกันที่ประเภทของตัวแปรที่มัน return ออกมา
ดังนั้นตัวแปรที่จะเอามารับข้อมูลจากฟังก์ชันพวกนี้ก็ต้องมี datatype เดียวกับมันด้วย
แต่ที่เราใช้ ๆ กันอยู่ เราจับใส่ Variable ได้เลย (Value := GetSQL.......) เพราะ Variable มันมี parameter ชื่อว่า Value เป็น Variant มาให้
procedure Variable2OnCalc(var Value: Variant);
begin
Value := 'xxxx';
end;
การที่เราจะเลือกใช้ฟังก์ชันไหนนั้นนอกจากจะดูที่ datatype ของฟิลที่เราจะดึงแล้ว เราต้องดูจุดประสงค์ด้วย
เช่น field lab_order_result เป็น varchar(25) เพราะว่า ผล Lab ไม่ได้มีเฉพาะตัวเลข ยังมีผล lab ที่ตัวหนังสือ หรือ อื่น ๆ อีก ก็เลขต้องกำหนดเป็น varchar
ถ้าดูจาก datatype แล้วเราก็อาจจะใช้เป็น GetSQLStringData ได้เลย แต่ถ้าเราต้องการเอาผล lab ไปคำนวณอย่างอื่นต่อหละ (ซึ่งอาจจะไม่ค่อยเจอบ่อยนัก) ไป + - * / ..... มันก็จะคำนวณไม่ได้ เพราะมันไม่ใช่ตัวเลข
ดังนั้นเราควรจะใช้ GetSQLIntergetData แทน เพื่อดึงค่ามาใส่ตัวแปรที่เป็น Integer เพื่อจะเอาค่านั้นไปคำนวณต่อ ผมถึงบอกว่า "เราต้องดูจุดประสงค์ของการใช้งานด้วย"
บางท่านอาจจะบอกว่าก็ใช้ StrToInt() แปลงค่าเป็น Integer เอาดิแล้วค่อยคำนวณ => ก็ถูกครับ สามารถทำได้เหมือนกัน ประกาศตัวแปรเพิ่มนิด เขียนโค้ดเพิ่มหน่อย ก็ได้แล้ว ฮ่า ๆ
อันนี้ก็แล้วแต่คนเขียนแหละครับ เค้าทำทางลัดมาให้แล้ว อยู่ที่เราจะใช้หรือเปล่าแค่นั้นเอง
-
ถ้าผม เขียน SQL ได้ผลลัพธ์ มากกว่า 1 เรคคอร์ด variable จะแสดงผลได้หรือเปล่าครับ
Value := GetSQLStringData('select concat ("¨Ó¹Ç¹ ",ot.qty," ÇÔ¸Õãªé ",du.shortlist) as txt '
+' from opitemrece ot '
+' left outer join drugusage du on du.drugusage=ot.drugusage '
+' where ot.vn="'+dbpipeline['vn']+'" and ot.icode in ("1500801" ,"1460327") ');
-
ถ้าผม เขียน SQL ได้ผลลัพธ์ มากกว่า 1 เรคคอร์ด variable จะแสดงผลได้หรือเปล่าครับ
Value := GetSQLStringData('select concat ("¨Ó¹Ç¹ ",ot.qty," ÇÔ¸Õãªé ",du.shortlist) as txt '
+' from opitemrece ot '
+' left outer join drugusage du on du.drugusage=ot.drugusage '
+' where ot.vn="'+dbpipeline['vn']+'" and ot.icode in ("1500801" ,"1460327") ');
ได้ โดยแต่ละ แถว ของรายงาน จะเปลี่ยนค่าไปเรื่อยซึ่งขึ้นกับ ค่าของ dbpipeline['vn']
-
หมายความว่า คนไข้ 1 คนมียาหลายตัว ต้องการแสดง ยาหลายตัวนั้นใน Variable อันเดียวได้หรือเปล่าครับ
และทำยังไง... ;D
-
เขียนแบบ memo ครับ ลองดูได้ชัวร์ ได้หลายบรรทัดครับ
-
เขียนแบบ memo ครับ ลองดูได้ชัวร์ ได้หลายบรรทัดครับ
เขียนยังไงครับ ใช้ memo ไม่เป็น ;D
-
เลือก memo และ variable มาอย่างละ 1 ตัว
แล้วเขียนว่าใน variable
ตัว อย่าง
Value :=;
memo1.lines.text:=GetListFromQuery('select * from sex limit 10 ');
ส่วน sql ปรับตามความเหมาะสม ครับ ทดลองดู
-
เลือก memo และ variable มาอย่างละ 1 ตัว
แล้วเขียนว่าใน variable
ตัว อย่าง
Value :=;
memo1.lines.text:=GetListFromQuery('select * from sex limit 10 ');
ส่วน sql ปรับตามความเหมาะสม ครับ ทดลองดู
มันแสดงแค่เรคคอร์ดแรก เหมือนเดิมครับ
-
ขอดู sql หน่อยครับ
-
Value := GetSQLStringData('select concat ("¨Ó¹Ç¹ ",ot.qty," ÇÔ¸Õãªé ",du.shortlist) as txt '
+' from opitemrece ot '
+' left outer join drugusage du on du.drugusage=ot.drugusage '
+' where ot.vn="'+dbpipeline['vn']+'" and ot.icode in ("1500801" ,"1460327") ');
ถ้าเป็น code นี้ออกไม่เกิน 2 ค่า เพราะถูกกำหนดที่ icode เลือก 1500801 และ 1460327 เท่านั้นครับ
-
function GetSQLStringData,GetSQLIntegerData,GetSQLDateData,GetSQLDoubleData
จะดึงข้อมูลเฉพาะ fieldแรก ของ recordแรกเท่านั้น ถึงแม้ sql ที่ใส่เข้าไป
จะได้ผลหลายrecords
ต่างจาก GetListFromQuery จะแสดง fieldแรก ของ ทุกrecords
มาเรียงกัน
-
ขอดู sql หน่อยครับ
Value := GetSQLStringData('select concat ("¨Ó¹Ç¹ ",ot.qty," ÇÔ¸Õãªé ",du.shortlist) as txt '
+' from opitemrece ot '
+' left outer join drugusage du on du.drugusage=ot.drugusage '
+' where ot.vn="'+dbpipeline['vn']+'" and ot.icode in ("1500801","1460327") ');
-
function GetSQLStringData,GetSQLIntegerData,GetSQLDateData,GetSQLDoubleData
จะดึงข้อมูลเฉพาะ fieldแรก ของ recordแรกเท่านั้น ถึงแม้ sql ที่ใส่เข้าไป
จะได้ผลหลายrecords
ต่างจาก GetListFromQuery จะแสดง fieldแรก ของ ทุกrecords
มาเรียงกัน
ขอบคุณครับ แล้วทำไง Memo จึงจะตัดข้อความให้อยู่ภายในกรอบ ตอนนี้มันเป็น 1 บรรทัด ยาว มาก เอา AutoSize ออกแล้วนะครับ
ได้แล้วครับ ต้องเลือก Wordwrap ;D
ถ้าต้องการให้ขึ้นบรรทัดใหม่ทุกครั้งที่เป็นเรคคอร์ดใหม่ ทำได้หรือเปล่าครับ
ลองแล้วมันขึ้นบรรทัดใหม่ให้เองครับ 55