วันอังคารที่ 30 มีนาคม พ.ศ. 2553

การพิมพ์ Label จาก Crystal report

การกำหนดขนาดกระดาษสำหรับ Print Label ใน Crystal report 
การพิมพ์ Label จาก Crystal report โดยใช้กระดาษต่อเนื่องที่มีขนาดเล็กนั้นอาจมีปัญหาว่า
สร้าง Form กระดาษให้ตรงตามจริงแล้ว ตอนสั่งพิมพ์ไม่สามารถเลือกฟอร์มกระดาษที่กำหนดขึ้นได้

กรณีที่เคยพบคือ ใช้เครื่องพิมพ์ EPSON LQ 2180i พิมพ์ Label แปะซองจดหมายถึงลูกค้า แต่ขนาดของ
Label มีขนาด Width : 11 cm  และ Height : 3.5 cm  ซึ่งเครื่องขนาดของฟอร์มกระดาษเล็กกว่าขนาดที่
เล็กที่สุดที่เครื่องพิมพ์รองรับทำให้เครื่อง Printer ไม่สามารถ Detect เจอ size กระดาษนั้นได้
จึงได้โทรไปสอบถามทาง Epson ถึงวิธีการแก้ไข จึงได้ทราบวิธีที่ง่ายมาก คือเพียงแต่เปลี่ยนไปใช้
Driver ของเครื่องพิมพ์รุ่นที่เก่ากว่า ก็จะทำให้สามารถสั่งพิมพ์ลงใน Form ที่มี ขนาดเล็กได้  แค่นี้เองครับ
ตัวอย่าง เครื่องพิมพ Epson LQ 2180i แทนที่จะใช้ Driver ของรุ่นนี้แต่เปลี่ยนไปใช้ Driver รุ่น
LQ-1170 ESC/P 2 แทน หวังว่า Blog นี้จะช่วยแก้ปัญหาให้หลาย ๆ ท่านได้ครับ

วันจันทร์ที่ 22 มีนาคม พ.ศ. 2553

Internal Error 2755. 1612, Microsoft Visual Studio 2005 SP 1

This error issued when your windows securities is not update
You need to download update for windows  Download Here

วันพฤหัสบดีที่ 18 มีนาคม พ.ศ. 2553

การใช้ SUB Query ใน SQL Command

Sub query คือ การดึงข้อมูลออกเป็นตารางเสมือน ตามเงื่อนไขที่ต้องการเพื่อจุดประสงค์ที่ต้องการ
ซึ่งต้องใช้ ( ) ในการ scope

ตัวอย่างการใช้งาน SUB Query

SELECT a.*
FROM (
  SELECT emp_id,emp_name
  FROM employee
  WHERE emp_id  >= '100111'
) as a

จากตัวอย่างหมายความว่า  เลือกข้อมูลทั้งหมดจากตารางที่มี Alias "a" ซึ่งเป็น Sub query จากการ
Select ข้อมูลจากตาราง employee ที่มี emp_id >= '100111'

การใช้คำสั่ง IN ใน SQL command

คำสั่ง IN ใน Sql หมายถึงการกรองข้อมูลด้วย column  โดยที่ค่าที่ต้องการกรองมีได้มากกว่า 1 ค่า ซึ่งแตกต่างจากการใช้เครื่องหมายเท่ากับ ("=")  และค่าที่ใช้กรองจะต้องอยู่ภายในวงเล็บ

ตัวอย่าง
SELECT *
FROM employee
WHERE emp_id IN ('100234','100235','100236')
ความหมายของ Query นี้คือ การเลือกพนักงานที่มีรหัสตามที่ระบุนั่นเอง ซึ่งผลลัพธ์จะได้ 3 Records

คำสั่ง JOIN ใน SQL

Join ก็คือ "ร่วมกัน" , "เชื่อมต่อ" ดังนั้นก็คือการเชื่อมโยงตารางเข้าด้วยกันนั่นเอง และการ join table
มีหลายรูปแบบซึ่งใช้งานแตกต่างกันออกไป

รูปแบบของการ JOIN ที่ใช้กันบ่อย ๆ มีดังนี้
INNER JOIN  คือ ค่าของ column ที่ใช้ในการ join จะต้องมีค่าตรงกันเท่านั้น แถวของข้อมูลที่ตรงตามเงื่อนไขนี้เท่านั้นที่จะแสดงผลออกมาจากการ Query

LEFT JOIN  คือ แถวจากตารางหลัก(ทางซ้าย)จะออกมาเสมอ แม้ว่าจะไม่มีข้อมูลที่ตรงกันในตารางที่เชื่อมโยงไป

RIGHT JOIN จริง ๆ แล้วเหมือนกับ LEFT JOIN เพียงแต่สลับตำแหน่งของตารางที่ใช้ในการเชื่อมโยงข้อมูลเท่านั้น
(ไม่แนะนำให้ใช้ ใช้ LEFT JOIN แทนดีกว่า จะได้ไม่สับสน)


ตัวอย่าง

/* INNER JOIN */
SELECT e.emp_id,e.emp_name,d.dept_name
FROM employee as e
INNER JOIN department as d ON e.dept_id = d.dept_idORDER BY d.dept_id,e.emp_id

ความหมายคือ  เลือกพนักงานทุกคนที่มีรหัสแผนกตรงกับในตารางแผนก
หากพนักงานคนใดยังไม่รหัสแผนกคือ dept_id  ข้อมูลพนักงานรายนั้นจะไม่แสดงใน Query นี้


/* LEFT JOIN */
SELECT e.emp_id,e.emp_name,d.dept_name
FROM employee as e
LEFT JOIN department as d ON e.dept_id = d.dept_id

ความหมายคือ เลือกพนักงานทุกคนที่มีรหัสแผนกตรง หรือ ไม่ตรงกับในตารางแผนกออกมาทั้งหมด
ถึงแม้ว่าพนักงานบางรายจะยังไม่มีรหัสแผนก ข้อมูลพนักงานรายนั้นก็จะยังแสดงออกมาด้วย
เพียงแต่ว่าค่าใน column "dept_name" จะเป็นค่า NULL เท่านั้นเอง

การใช้ Alias แทนชื่อคอลัมน์เดิมในคำสั่ง SQL

ลักษณะเช่นเดียวกับการใช้ Alias แทนชื่อตาราง เพียงแต่เปลี่ยนมาใช้แทนในส่วน column name
ตัวอย่าง

SELECT e.emp_id as   employee_id, e.emp_name as employee_name
FROM  employee as e

จากตัวอย่างคือ การตั้งชื่อ column ใหม่จาก SQL Query จากเดิม emp_id เป็น employee_id
และจาก emp_name เป็น employee_name

การใช้ Alias แทนชื่อตารางในคำสั่ง SQL

เปรียบเหมือนการตั้งชื่อเล่นให้กับบุคคล เช่นคนที่ชื่อยาว ๆ ก็มีชื่อเล่นให้เรียกง่าย ๆนั่นเอง

ตัวอย่างการใช้ Alias ในคำสั่ง SQL

SELECT e.emp_id,e.emp_name,e.salary 
FROM employee as e 

คำสั่ง Group By ใน SQL

คำสั่ง Group By ใน SQL คือคำสั่งที่ใช้จัดกลุ่ม column จากการ Select ข้อมูล ซึ่งต้องใช้ร่วมกับ Aggregate function เช่น
-Count , Sum , Max , Min , Avg

ตัวอย่างการใช้ Group by

SELECT dept_no,COUNT(emp_id) as emp_count,SUM(salary) as sum_salary,MAX(salary) as max_salary,MIN(salary) as min_salary,AVG(salary) as avg_salary
FROM emp
GROUP BY dept_no

ความหมายของ Query นี้คือ การ นับจำนวนพนักงาน,ยอม Summary ของเงินเดือน ,เงินสูงสุด , เงินเดือนต่ำสุด และเงินเดือนเฉี่ยของพนักงาน ตามรหัสแผนกนั่นเอง

คำสั่ง SQL , SQL Command

SQL คือ Simple Query Language (ย่อมาจาก) แปลตรง ๆ ก็คือ ภาษาพื้นฐานที่ใช้ในการสืบค้นข้อมูลนั่นเอง
SQL Query ส่วนใหญ่แล้วจะมี Syntax ที่คล้าย ๆ แตกต่างกันเพียงรายละเอียดปลีกย่อยเท่านั้น
การที่จะทำความเข้าใจกับ SQL ไม่ใช่เรื่องยาก เพียงแต่จะต้องมีความเข้าใจพื้นฐานสักเล็กน้อย
เกี่ยวกับฐานข้อมูล ซึ่งก็มีมากมายให้เลือกใช้ครับ ตั้งแต่ของฟรีไปยังที่ต้องจ่ายเงิน(มาก)
ตัวอย่าง Free Database ก็เช่น Mysql , SQL Server Express Edition,
ส่วนที่ต้องเสียเงินก็เช่น SQL Server 2005,2008 , Microsoft Access, ORACLE , DB2

คำสั่ง SQL พื้นฐาน 

SELECT  FROM WHERE ORDER BY

SELECT : คือ "การเลือก" ความหมายก็ตรงตัว
FROM : คือ "จาก"

WHERE : คือ "ที่ตรงตามเงื่อนไข"
ORDER BY : คือ "การเรียงลำดับข้อมูล"  ASC (Ascendant) คือจากน้อยไปหามาก , DESC (Descendant) คือ จากมากไปหาน้อย
หากไม่ใส่ ASC / DESC ค่า Default จะเป็น ASC


ดังนั้น SELECT FROM WHERE  + ORDER BY ก็คือ การเลือกข้อมูลจากแหล่งข้อมูล (ตาราง / Table,View) ที่ต้องการ
โดยสามารถระบุเงื่อนไขลงไปนั่นเอง

ตัวอย่างเช่น
SELECT * FROM employee ORDER BY emp_id ASC
ก็หมายความว่าเลือกทุกคอลัมน์จากตาราง employee โดยเรียงลำดับด้วยฟิลด์ emp_id จากน้อยไปหามาก

การใช้ WHERE ใน SQL
SELECT * FROM employee
WHERE emp_id ='100234'
หมายความว่า เลือกข้อมูลทุกคอลัมน์จากตาราง employee ที่ค่าในคอลัมน์ emp_id เท่ากับ '100234'

SELECT * FROM employee
WHERE emp_id LIKE '100%'
หมายความว่า เลือกข้อมูลทุกคอลัมน์จากตาราง employee ที่ค่าในคอลัมน์ emp ขึ้นต้นด้วย '100'
ค่าที่เหลือจะเป็นอะไรก็ได้

SELECT emp_id,emp_name,tel_no,salary,(salary *1.1) as new_salary
FROM employee
ORDER BY salary DESC
หมายความว่า เลือกข้อมูล ตาม column ที่ระบุ  และมีการคำนวนค่าจาก column เงินเดือนเพิ่มเติม
จากตาราง employee โดยขึ้นเงินเดือน 10% (salary *1.1)

วันจันทร์ที่ 15 มีนาคม พ.ศ. 2553

Error Restore database in sql server 2005 Express

RestoreContainer::ValidateTargetForCreation
ในกรณีที่เคยเจอว่าไม่สามารถ Restore database ที่ Backup จากเครื่องอื่นลงเครื่องเราได้
ให้ลอง Check ใน Configuration manager ดังนี้
- Open SQL Server configuration manager
- Choose SQL Server 2005 service
- Right click on your sql server instant and select properties
- On logon tab --> Select "build in account"
- Select "Local System" from drop down list

Site Ref : http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/7b259f06-e1e2-47f5-8303-77775ee80400

Error installation sql server 2005 express , MSXML 6.0

เกิดจากการที่ Version ของ MSXML6 ที่มีในเครื่องใหม่กว่า Version ที่กำลังจะ Install
ให้ Remove ของเดิมออกก่อน โดยใช้โปรแกรม Windows Install cleanup
รายละเอียดของวิธีการ
http://support.microsoft.com/kb/968749

วันพุธที่ 10 มีนาคม พ.ศ. 2553

Crystal report 2008 BUG , Service pack , Patch update

 -Crystal report 2008 problem : Can not refresh table schema / Storprocedure  selected field
  (คริสตัลรีพอร์ท ไม่ update field เมื่อมีการแก้ไข ตาราง หรือ storprocedure )
-Crystal report 2008 problem : Line can not drag or move to the end of paper when set to "Landscape"
  (คริสตัลรีพอร์ท ไม่สามารถลากเส้นสุดขอบด้านขวาได้ ถ้าเซ็ตกระดาษเป็นแนวนอน)

นอกเรื่องจาก SQL Server ,BI นิดนึงครับ แต่ยังคงเกี่ยวกับเรื่องการทำรีพอร์ท
จะขอพูดถึง Crystal report 2008 สักหน่อย  พอดีมีโอกาสได้ใช้งาน Tools version นี้ ซึ่งจริง ๆ ก็เคยใช้
version ก่อน ๆ มานิหน่อยครับ 
แต่ว่า ต้องเจอกับปัญหาที่ไม่น่าเชื่อ   ว่ามันจะมีอยู่จริงใน Software ระดับนี้ครับ (BO ซื้อมาทำ)
ตอนแรกก็งง ก่งก๊งกันไป ถามเพื่อน  เพื่อนก็ตอบไม่ได้  ผลสุดท้ายก็ Google ครับ อาจจะเริ่มงงว่าเกิดไรขึ้น
ตอนแรกที่ได้ใช้
ก็ Install ปกติ (เพื่อนเอาแผ่นมาให้) ก็ใช้ ๆ ไปครับปัญหาที่เจอตามนี้เลย


 1. field ในฐานข้อมูลเปลี่ยน Report ที่เคยทำไว้ก่อนหน้า Refresh ให้ตายก็ไม่เปลี่ยนตาม
   ไม่ว่าจะเป็น Field name , Data type , แม้กระทั่ง Field ที่เพิ่มมาใหม่ก็ไม่เห็นหัวมัน - -" คิดูแล้วกัน

 2.อยากทำรายงานขนาดกระดาษ A4 จาก แนวตั้ง (Portrait) เป็นแนวนอน (Landscape) ปรากฎว่า เส้นที่ลาก
   ไม่สามารถลากถึงสุดขอบกระดาษด้านขวาได้ครับพี่น้องงง  งงกันไปอีกสองสามวัน แม้จะมาปรึกษา
   ผู้รู้ที่ Office แล้ว ต่างตกตะลึงกับ Feature นี้ - - ฮ่า ๆ แล้วมันลากได้แค่ตำแหน่งของแนวตั้งอ่ะนะ
   เฮ้อ ทำไปได้เนอะ

3. Refresh parameter field แล้วจะ Save ไม่ได้นะ

เจอสองอันนี้เข้าไปก็ไม่ต้องทำไรกินแล้วครับ BUG แบบนี้  ดังนั้นจึงเริ่มคิดได้ว่า เอ๊ะ มันจะมี Service pack หรือ Patch update
เหมือน windows รึป่าวหว่า ไหนลอง Search ดูดิ๊  ก็ได้พบกับ Service pack ที่ออกมา Update ครับ
(ก่อนหน้านี้ Crystal ไม่เคยมี Service pack ไรแบบนี้) นอกจากนั้นก็ได้ลองหาข้อมูลผู้ที่เจอปัญหาคล้าย  ๆกัน
ก็พบว่ามันเป็น BUG ของ Software จริง ๆ อย่างที่เกริ่นตอนต้นครับ ว่าใครจะไปคิดว่า Software ระดับนี้จะมี BUG กากๆ แบบนี้ได้

เหมือนจะบ่นมากไป แต่ใครลองได้เจอแบบนี้คงปวดหัวอะนะ

อันนี้เป็น Link สำหรับ Download crystal report 2008 Patch update นะครับ
บอกได้คำเดียวว่าต้องลง ไม่ลงคุณใช้งานไม่ได้แน่  ๆ เหอ ๆ

Crystal report 2008 : Service pack download link
http://www.sdn.sap.com/irj/boc/crystalreports-dotnet?rid=/webcontent/uuid/90d7dc4e-36ce-2b10-d2b3-d5d72d067e21

Microsoft SQL Server 2008 "BCP" is not support UTF-8 encoding ????

ลองดูที่นี่ครับ คนด่ากันระงม ฮ่า ๆ 
เป็นไปได้ไงที่ใน Version ก่อน คือ 2005 Support แล้วตอนนี้ 2008 ไม่ Support
Codepage ของ UTF-8 คือ 65001 นะ

SQL Server 2008 : BCP document
https://connect.microsoft.com/SQLServer/feedback/details/370419/bulk-insert-and-bcp-does-not-recognize-codepage-65001

SQL Server 2005 : BCP document
http://msdn.microsoft.com/en-us/library/ms162802(SQL.90).aspx

How to copy data between difference collations
http://msdn.microsoft.com/en-us/library/ms190657.aspx

วันอังคารที่ 9 มีนาคม พ.ศ. 2553

Export text file from sql server using BCP and SQL Script

- How to use bcp in sql server ?
- Export text file,csv file from sql server via sql script 
- Export ข้อมูลจาก SQL Server เป็น Text file,csv file ด้วย SQL Script

การ Export ไฟล์จากฐานข้อมูล Sql server เป็น Text file / CSV file
BCP เป็น Utility ตัวหนึ่งของ SQL Server ที่ใช้สำหรับ Bulk insert/ Export ไฟล์ในรูปแบบต่าง ๆ

How to use BCP in SQL Server, (วิธีการใช้งาน BCP ใน SQL Server )
1 Enabling  sys.xp_cmdshell   (เปิดใช้งาน xp_cmdshell)

sp_configure 'show advanced options',1
GO
RECONFIGURE
GO
sp_configure xp_cmdshell,1
GO
RECONFIGURE

If xp_cmdshell is disable this error will occure "SQL Server blocked access to procedure 'sys.xp_cmdshell"

2 Check  xp_cmdshell value
Exec sp_configure
GO
go to last line and check config_value of xp_cmdshell , value need to be "1"

(ไปที่บรรทัดสุดท้ายเพื่อตรวจสอบค่า หากเป็น "0" ต้อง set เป็น "1" ในขั้นตอนที่ 2)

 3 Create test sript to export data to text file (ตัวอย่าง BCP Script สำหรับ Export text file)
This example will show How to export data from table delimited by comman (",")
ในตัวอย่างจะแสดงวิธีการ Export ข้อมูลออกเป็น text file โดยคั่น Columns ด้วย  comma
USE AdventureWorks

Declare @Headers varchar(1000),@sql varchar(8000), @data_file varchar(100),
@x varchar(300),@file_name varchar(100)
BEGIN
SET @file_name = 'C:\test_bcp.txt'
---------------- HEADER ROWS GENERATE ----------------
Select @Headers = IsNull(@Headers + ',', '') + Column_Name
From INFORMATION_SCHEMA.COLUMNS
Where Table_Name = 'CreditCard' ORDER BY ORDINAL_POSITION ASC

print @Headers

set @sql = 'bcp "select ''' + @Headers + '''" queryout "'+@file_name+'" -U "sa" -P "1234" -c -C 65001 -t "," -r \n'


print @sql
exec master..xp_cmdshell @sql
set @sql = 'exec master..xp_cmdshell ' + @sql
print @sql

-----------------DATA SECTION ------------------------
select @data_file=substring(@file_name,1,len(@file_name)-charindex('\',reverse(@file_name)))+'\data_file.csv'
print @data_file


set @sql = 'bcp "select * from [AdventureWorks].sales.CreditCard '+' " queryout "'+@data_file+'" -U "sa" -P "1234" -c -C 65001 -t "," -r \n'


print @sql
exec master..xp_cmdshell @sql
--Copy dummy file to passed CSV file


set @sql= 'exec master..xp_cmdshell ''type '+@data_file+' >> "'+@file_name+'"'''
print @sql
exec(@sql)
--Delete dummy file
set @sql= 'exec master..xp_cmdshell ''del '+@data_file+''''
print @sql
exec(@sql)
---------------- END DATA SECTION -------------------
END


- Dont forget to change sa password in script.
- Exported file will store in server side! Not client.

วันจันทร์ที่ 8 มีนาคม พ.ศ. 2553

Tracking dimensions member in specify time periods with filter function (MDX QUERY)

Tracking dimensions member in specify time periods with filter function(MDX Query)
- MDX ,Population sampling data
-

ตัวอย่างของการ Tracking ข้อมูลจาก Dimension Members
ในกรณีนี้คือการหาว่าสินค้าที่เคยขายได้ในเดือน January 2003
ยังคงขายได้ในเดือนถัดไป มีตัวเลขเป็นเท่าไร


Example data : AdventureWork
----------------------------------------------------------------------
WITH
SET [SellingProducts] as
Filter (
[Product].[Product].[Product].MEMBERS
,([Date].[Calendar].[Month].&[2003]&[1] /* January 2003*/
, [Measures].[Sales Amount]) >=1500
)


SELECT
{ [Measures].[Sales Amount]} ON Columns
,
NON EMPTY
[Product].[Category].[Category] *
[SellingProducts] *
{
[Date].[Calendar].[Month].&[2003]&[1], /* January 2003*/
[Date].[Calendar].[Month].&[2003]&[2], /* February 2003*/
[Date].[Calendar].[Month].&[2003]&[3] /* March 2003*/
} ON Rows
FROM [Adventure Works]

-------------------------------------------

MDX Description (คำอธิบาย MDX Query)
1. Create set of members for exampling. In this case I want to track which products has sold in January 2003
    and sales amount  is >= 80,000 US.
    -สร้าง Member set ที่ต้องการ Track ขึ้นมา โดยส่วนนี้ใช้ Filter ในการกรองข้อมูลที่ต้องการคื
     หาสินค้าที่ขายได้ตั้งแต่ 80,000 US ขึ้นไปในเดือน January 2003
2. Use defined member set in select section.

---------------- Result -------------------

Bikes Mountain-200 Silver, 38 January 2003 $106,885.25
Bikes Mountain-200 Silver, 38 February 2003 $127,185.17
Bikes Mountain-200 Silver, 38 March 2003 $116,828.07
Bikes Mountain-200 Silver, 42 January 2003 $85,451.03
Bikes Mountain-200 Silver, 42 February 2003 $125,528.03
Bikes Mountain-200 Silver, 42 March 2003 $91,556.75
Bikes Mountain-200 Silver, 46 January 2003 $83,271.07
Bikes Mountain-200 Silver, 46 February 2003 $131,328.01
Bikes Mountain-200 Silver, 46 March 2003 $120,970.91
Bikes Mountain-200 Black, 38 January 2003 $98,356.71
Bikes Mountain-200 Black, 38 February 2003 $180,320.64
Bikes Mountain-200 Black, 38 March 2003 $128,273.55
Bikes Mountain-200 Black, 42 January 2003 $106,962.92
Bikes Mountain-200 Black, 42 February 2003 $158,707.57
Bikes Mountain-200 Black, 42 March 2003 $100,815.63
Bikes Mountain-200 Black, 46 January 2003 $94,668.34
Bikes Mountain-200 Black, 46 February 2003 $135,650.30
Bikes Mountain-200 Black, 46 March 2003 $101,225.45
Bikes Road-250 Red, 44 January 2003 $84,539.91
Bikes Road-250 Red, 44 February 2003 $135,850.26
Bikes Road-250 Red, 44 March 2003 $111,416.76
Bikes Road-250 Red, 48 January 2003 $85,028.58
Bikes Road-250 Red, 48 February 2003 $152,465.04
Bikes Road-250 Red, 48 March 2003 $64,015.77
------------------------------------------------------------