Skip to main content

Dynamic Report in Microsoft Access

ေမာင္လွေရ... မွတ္ထားဦးကြယ့္...

Microsoft Access မွာ Crosstab Query ကို Report ထုတ္မယ္ဆုိရင္ ဒီလုိေလး ထုတ္ရတယ္...

Table ေတြ ရွိၿပီးသား ဆုိရင္ေတာ့ ပထမဆုံးလုပ္ရမယ့္ အလုပ္က Crosstab Query တစ္ခု တည္ေဆာက္ရမယ္... ေဟာ့ဒီမွာ crosstab query design ကို နမူနာၾကည့္ပါဦး...

အဲဒီမွာ OutletID, OutletName, VrNo, NetAmt ေတြက Row Heading လုိ႔ေရြးထားတယ္... Stock ဆုိတဲ့ field ကိုေတာ့ Column Heading ဆုိၿပီး ေရြးထားလုိက္တယ္... NetQty ကိုေတာ့ Value လုိ႔ေရြးလုိက္တယ္... ရက္အလိုက္ေရြးၾကည့္လုိ႔ ရေအာင္ Date ကို Where ဆုိၿပီး ေရြးထားတယ္...

အဲဒီ query ကို run ၾကည့္မယ္ဆုိရင္ ေအာက္က ပုံစံမ်ဳိးေပၚလိမ့္မယ္... အဲဒီမွာ Date တစ္ခု လာေတာင္းလိမ့္မယ္... 6/27/2007 ဆုိၿပီး ႐ိုက္ထည့္လုိက္တယ္... အဲဒီေန႔ဟာေတြပဲ ေဖာ္ျပေပးပါတယ္...

query ကို ပိတ္ၿပီး ေနာက္တစ္ေခါက္ ျပန္ run ၾကည့္ပါဦး... ဒီတစ္ခါ 6/28/2007 လုိ႔႐ုိက္ထည့္ၾကည့္ပါ... ဘာေတြ႕ရမလဲဆုိေတာ့ Row Heading လုိ႔ေျပာထားတဲ့ OutletID, OutletName, VrNo, NetAmt ေတြက data ေတြ မတူႏုိင္ေပမယ့္ ပုံေသ column ေတြ အေနနဲ႔ ေဖာ္ျပေပးၿပီး Column Heading လုိ႔ ေရြးထားတဲ့ Stock ကေတာ့ အဲဒီေန႔မွာ ၁၀-မ်ဳိးေရာင္းရရင္ ေကာ္လံ ၁၀-ခု ေဖာ္ျပေပးမွာ ျဖစ္ၿပီး ၅-မ်ဳိးေရာင္းရင္ ေကာ္လံ ၅-ခု ေဖာ္ျပေပးတာကို ေတြ႕ရပါလိမ့္မယ္... value လုိ႔ ေရြးထားတဲ့ NetQty က ဘယ္နား ေရာက္သြားလဲ ဆုိေတာ့ သက္ဆုိင္ရာ Stock ေကာ္လံထဲမွာ ေဖာ္ျပေပးတာကို ေတြ႕ရပါလိမ့္မယ္...

Report အပုိင္းကို သြားရေအာင္...
Report အသစ္ တည္ေဆာက္ဖုိ႔ Create Report in Design နဲ႔ ဝင္စရာလုိပါတယ္... ေအာက္က ပုံမွာ ျပထားတဲ့ အတုိင္း ဒါမွမဟုတ္ ကိုယ္လုိခ်င္တဲ့ ပုံအတုိင္း Report Design လုပ္ပါ... က်ေတာ္ အခုသုံးထားတဲ့ coding ေတြအတုိင္း သုံးမယ္ဆုိရင္ေတာ့ Label နဲ႔ Text box ေတြ name ေပးတဲ့ ေနရာမွာ Page Header မွာရွိတဲ့ဟာေတြဆုိရင္ lblstk1, lblstk2, lblstk3 ပုံစံနဲ႔ ေပးရပါမယ္... က်ေတာ့္ report မွာ column ၃၀-အထိ ေဖာ္ျပႏုိင္လုိ႔ lblstk30 အထိ ေပးထားတယ္... Detail ထဲမွာ ရွိတဲ့ Text box ေတြကိုေတာ့ က်ေတာ္က stk1, stk2, stk3, ..., stk30 အထိ name ေတြ ေပးထားပါတယ္... Report footer ထဲမွာရွိတဲ့ text box ေတြကိုေတာ့ tot1 ကေန tot30 ဆုိၿပီး name ေတြ သတ္မွတ္ေပးလုိက္ပါတယ္...

ၿပီးရင္ Report design tool bar မွာ code ဆုိတဲ့ button ကိုရွာၿပီး ႏွိပ္ပါ... Option Compare Database ဆုိတဲ့ စာေၾကာင္းနဲ႔ windows ေပၚလာရင္ ေအာက္က ကုဒ္ေတြ ေကာ္ပီကူးၿပီး ထည့္လုိက္ပါ... ေဘးက က်ေတာ္ သိသေလာက္ ရွင္းျပထားတဲ့ ရွင္းလင္း ခ်က္ေတြကိုေတာ့ ဖ်က္ၿပီးထည့္ပါ...
Const conTotalColumns = 30 ' အခု က်ေတာ့္ report မွာ column ၃၀ အထိ အမ်ားဆုံး ရလုိ႔ ၃၀ ဆုိၿပီး ထည့္ထားတာပါ... ေကာ္လံ ၁၅-ခု အမ်ားဆုံးရရင္ 15 လုိ႔ျပင္ေပးပါ...

Dim dbsReport As Database
Dim rstReport As Recordset

Dim intColumnCount As Integer
Dim lngRgColumnTotal(1 To conTotalColumns) As Long
Dim lngReportTotal As Long

Private Sub InitVars()
Dim intX As Integer

lngReportTotal = 0
For intX = 1 To conTotalColumns
lngRgColumnTotal(intX) = 0
Next intX
End Sub

Private Function xtabCnulls(varX As Variant)
If IsNull(varX) Then
xtabCnulls = 0
Else
xtabCnulls = varX
End If
End Function

Private Sub Detail_format(Cancel As Integer, FormatCount As Integer)
Dim intX As Integer

If Not rstReport.EOF Then
If Me.FormatCount = 1 Then
For intX = 6 To intColumnCount ' intX = 6 ဆုိၿပီး 6 ကေန ဘာျဖစ္လုိ႔ စထားလဲဆုိေတာ့ ပထမဆုံး ေကာ္လံ ၅-ခုက အၿမဲတမ္း ေပၚေနမွာ ျဖစ္လုိ႔ပါ... နမူနာမွာေတာ့ ေကာ္လံ တစ္ခုကို က်ေတာ္ blank ဆုိၿပီးေပးထားပါတယ္...
Me("stk" + Format(intX)) = xtabCnulls(rstReport(intX - 1))
Next intX

For intX = intColumnCount + 2 To conTotalColumns
Me("stk" + Format(intX)).Visible = False
Next intX

rstReport.MoveNext
End If
End If
End Sub

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
Dim intX As Integer
Dim lngRowTotal As Integer

If Me.PrintCount = 1 Then
lngRowTotal = 0

For intX = 6 To intColumnCount ' intX = 6 မွာ လုိအပ္ရင္ ဂဏန္းျပင္ေပးရပါမယ္...
lngRowTotal = lngRowTotal + Me("stk" + Format(intX))

lngRgColumnTotal(intX) = lngRgColumnTotal(intX) + Me("stk" + Format(intX))
Next intX

'Me("stk" + Format(intColumnCount + 1)) = lngRowTotal
Me("stk" + Format(intColumnCount + 1)) = Null
'lngReportTotal = lngReportTotal + lngRowTotal
End If
End Sub

Private Sub Detail_Retreat()

' Always back up to previous record when "Detail" section retreats.
rstReport.MovePrevious

End Sub

Private Sub PageHeaderSection_Format(Cancel As Integer, FormatCount As Integer)
Dim intX As Integer
For intX = 6 To intColumnCount ' intX = 6 မွာ လုိအပ္ရင္ ဂဏန္းျပင္ေပးရပါမယ္...
Me("lblstk" + Format(intX)).Caption = rstReport(intX - 1).Name
Next intX

'Me("lblstk" + Format(intColumnCount + 1)).Caption = "Totals"

For intX = (intColumnCount + 2) To conTotalColumns
Me("lblstk" + Format(intX)).Visible = False
Next intX
End Sub

Private Sub Report_Close()

On Error Resume Next

' Close recordset.
rstReport.Close
DoCmd.Close acForm, "dailyRpt43"
End Sub

Private Sub Report_NoData(Cancel As Integer)

MsgBox "No records match the criteria you entered.", vbExclamation, "No Records Found"
rstReport.Close
Cancel = True

End Sub

Private Sub Report_Open(Cancel As Integer)
Dim intX As Integer
Dim qdf As QueryDef
Dim frm As Form

DoCmd.OpenForm "DailyRpt43", , , , , acDialog ' ဒါ ကေတာ့ criteria ေမးမယ့္ form ကို ဖြင့္ခုိင္းတာပါ...

If Not IsLoaded("DailyRpt43") Then
Cancel = True
Report_Close
Else
Set dbsReport = CurrentDb
Set frm = [Forms]![dailyRpt43]
Set qdf = dbsReport.QueryDefs("rpt_43DSR")

qdf.Parameters("[Forms]![dailyRpt43]![Date]") = frm!Date ' query မွာ ေတာင္းထားတဲ့ criteria ဆုိတာ form ထဲက သက္ဆုိင္ရာ field ျဖစ္ေၾကာင္း သတ္မွတ္ေပးလုိက္တာပါ...

Set rstReport = qdf.OpenRecordset()

intColumnCount = rstReport.Fields.Count

End If

DoCmd.Maximize

End Sub

Private Sub ReportFooter_Print(Cancel As Integer, PrintCount As Integer)
Dim intX As Integer
For intX = 6 To intColumnCount
Me("Tot" + Format(intX)).Value = lngRgColumnTotal(intX)
Next intX

'Me("Tot" + Format(intColumnCount + 1)) = lngReportTotal
Me("Tot" + Format(intColumnCount + 1)) = Null

For intX = intColumnCount + 2 To conTotalColumns
Me("Tot" + Format(intX)).Visible = False
Next intX
End Sub

Private Sub ReportHeader_Format(Cancel As Integer, FormatCount As Integer)

rstReport.MoveFirst
InitVars

End Sub


က်န္တာတြေတာ့ မရွင္းတတ္ေတာ့ဘူးဗ်ာ... လုိအပ္ရင္ ကုိယ့္အားကုိယ္ကုိးၿပီး ေရးသားၾကည့္ၾကပါ... ဒီဟာေလးက microsoft.com ကေနရွာေတြ႕ထားတာပါ... ဒီလုိမ်ဳိး ေရးလုိ႔ရတယ္ဆုိတာကို ေျပာျပေပးတဲ့ နားခုိရာ ဘေလာ့ ပုိင္ရွင္ႀကီး ကို Little Moon နဲ႔ မွ NativeMyanmar မွေဘာ္ဒါမ်ားကို အထူး ေက်းဇူးတင္ရွိပါတယ္...

နမူနာ ဖုိင္ေလးပါ ...
http://maunghla.googlepages.com/DynamicReport.mdb

My Label: Access, how to, Crosstab query Report, Dynamic Report

Comments

KhunMoung said…
ေမာင္လွေရ...မွတ္ထားဦးကြယ္႔ အစျပဳတဲ႔ ပို႔စ္ေတြကို ကၽြန္ေတာ္သေဘာက်ပါတယ္။ ကိုေမာင္လွရဲ႔ကိုယ္႔ကိုယ္ကို ႏွိမ္႔ခ်သလိုနဲ႔ တျခားသူေတြကိုလည္း ပညာရေစတဲ႔ အေတြ႔အၾကံဳအေျခခံတဲ႔ပို႔စ္ေတြ ျဖစ္ပါတယ္။ ကၽြန္ေတာ္လည္း မွတ္ထားလိုက္ပါျပီ။ :) Cheers ကိုေမာင္လွ။
MgHla said…
ေက်းဇူးပါ ကိုခြန္ေမာင္ေရ...
ဒါမ်ဳိးေလးေတြကို စာအုပ္ထဲမွာ ေရးထားရင္ စာအုပ္ေပ်ာက္သြားရင္ က်န္ခဲ့ရင္ က်ေတာ္ မလုပ္တတ္ေတာ့လုိ႔ အင္တာနက္ေပၚမွာ မွတ္တမ္းေလးက်န္ ျဖစ္ေအာင္ ေရးတာပါ...

Popular posts from this blog

ေဇာ္ဂ်ီစနစ္သုံးျမန္မာစာစနစ္ ႏွင့္ Gtalk Myanmar addin CD

မေန႔က ျပပြဲမွာ Alpha Computer က ကိုရဲနဲ႔ေတြ႕ေတာ့ “ေဇာ္ဂ်ီစနစ္သုံးျမန္မာစာစနစ္ ႏွင့္ Gtalk Myanmar addin” CD တစ္ခ်ပ္ လက္ေဆာင္ေပးလုိက္ပါတယ္... ဒီ CD ထဲမွာ Zawgyi Installer, Gtalk Myanmar Addin installer ၂-မ်ဳိး , Myanmar1 & Myanmar2 unicode fonts, Alpha ကေရးတဲ့ Win2Zawgyi ေျပာင္းတဲ့ program , Lil Master ေရးတဲ့ Win2Zawgyi, Win2Zawgyi က်ေတာ္ ျပင္ေရးထားတဲ့ Zawgyi2Win ႏွင့္ အျခား အေထာက္အကူျပဳ video ဖုိင္ေတြနဲ႔ နမူနာ ဘေလာ့ စာမ်က္ႏွာေတြပါပါတယ္... ၿပီေတာ့ အသုံးျပဳနည္း စာအုပ္ငယ္ တစ္အုပ္ပါဝင္ပါတယ္... download လုပ္ရမွာ ပ်င္းသူမ်ား Alpha မွာ တစ္ခ်ပ္လွ်င္ ၁၀၀၀-က်ပ္ႏႈန္းျဖင့္ ေစ်းႏႈန္းခ်ဳိသာစြာျဖင့္ ဝယ္ယူႏုိင္ပါၿပီ... ေဇာ္ဂ်ီ keyboard layout ေတာင္းေနသူမ်ား ဒီေနရာ မွ ရယူပါ... Zawgyi-One Myanmar Unicode font နဲ႔ စာ႐ိုက္ဖုိ႔ အသုံးျပဳတဲ့ program ပါ... ေဇာ္ဂ်ီ font သီးသန္႔ ရယူလုိသူမ်ား ဒီေနရာမွ ယူႏုိင္ပါၿပီ...

မေန႔က...

႐ုံးကေန ည ၇-နာရီေလာက္မွျပန္ျဖစ္တယ္... FMI ထဲဝင္ၿပီး ထမင္းဝင္စားၿပီးမွ တည္းတဲ့ ဟုိတယ္ကို ၈-နာရီေက်ာ္မွ ျပန္ေရာက္တယ္... အမ်ဳိးသမီးက ဖုန္းဆက္လာတယ္... သမီးက သူေျပာခ်င္လုိ႔ဆုိၿပီး ဖုန္းဝင္ေျပာတယ္... မူႀကိဳတက္ေနတာ ၂-ပတ္နီးနီးပဲရွိေသးတာ ေတာ္ေတာ္ေလး စကားေတြ ေျပာတတ္လာၿပီ... ဖုန္းဆက္တုိင္း သမီးမွာတတ္တာက J Donuts ဝယ္ခဲ့ေပးဖုိ႔ပဲ... သမီးက J Donuts ႀကိဳက္တယ္ေလ... မႏၲေလးမွာ J Donuts မရွိဘူး... ရွိတဲ့ M Donuts ကိုက်ေတာ့ သမီးက မႀကိဳက္ဘူးေလ... ႐ုံးက ဝယ္ထားေပးတဲ့ laptop မွာ လုိတဲ့ drivers ေတြတင္ရင္း ၁၁း၃၀-နာရီေလာက္မွ အိပ္ျဖစ္တယ္... ေၾသာ္ ... ဘာလုိလုိနဲ႔ ... ဒီေန႔ဆုိ ရန္ကုန္ ႐ုံးကို ေရာက္ေနတာ ၂၇-ရက္ေတာင္ ရွိေနၿပီ... ဒါနဲ႔ စကားမစပ္ web cam ပါတဲ့ laptop ေတြမွာ login လုပ္တဲ့ေနရာမွာ Face Recognition နဲ႔ လုပ္ခ်င္တယ္ဆုိရင္ Lenovo က သူ႕ laptop ေတြအတြက္ ေရးထားတဲ့ Lenovo VeriFace recognition ေလးကို ရွာၿပီး သုံးၾကည့္ပါ... acer, dell, hp laptop ေတြမွာ သုံးၾကည့္တာ အဆင္ေျပေၾကာင္းပါ...

ျမန္မာလုိ ဘေလာ့စေရးမယ္ဆုိရင္...

ပထမဆုံး က်ေတာ္ ေရးခဲ့ဖူးတဲ့ Blog မွာ ျမန္မာလုိ ေရးရတာ အဆင္ ေျပေအာင္... ကို အရင္ဖတ္ၿပီး စမ္းၾကည့္ပါ... post အသစ္ေရးဖုိ႔ အတြက္ compose လုပ္တဲ့ေနရာေရာက္သြားရင္ “ဒီစာကုိ Select ေပးၿပီးေရးပါ...” လုိ႔ျမင္ရရင္၊ ဖတ္လို႔ရရင္ လုပ္ထားတာမွန္တယ္... စာကို select ေပးၿပီး ကုိယ္ေရးခ်င္တာေရးေပေတာ့... select ေပးထားတဲ့အခ်ိန္ delete မလုပ္ပါနဲ႔၊ backspace မႏွိပ္ပါနဲ႔... ဒါက post ေတြကိုပဲ ျမန္မာလုိ ျမင္ရေအာင္ လုပ္ေပးတာပါ... title ေတြ၊ heading ေတြ၊ ဘာညာေတြကို ျမန္မာလုိ ျမင္ရေအာင္ မလုပ္ေပးပါဘူး... ဒါနဲ႔ အဆင္မေျပဘူးဆုိရင္ ကိုယ္ေရးခ်င္တဲ့စာေတြကို notepad (သို႔မဟုတ္) Word ထဲမွာ ႐ုိက္ copy ကူးၿပီး post အသစ္တင္တဲ့ထဲမွာ လာၿပီး paste လုပ္... blog စာမ်က္ႏွာ တစ္ခုလုံးကို Zawgyi-One font နဲ႔ ေပၚေစခ်င္တယ္ ဆုိရင္ How to Assign Zawgyi-One font in Blog [NLS] ကို ေလ့လာပါ... ဒီအေပၚ ၂-ခုကို အရင္ေလ့လာပါ... အဲဒီ ၂-ခုရရင္ ဘေလာ့စာမ်က္ႏွာ တစ္ခုလုံး ျမန္မာလုိ အဆင္ေျပေျပနဲ႔ ေပၚပါလိမ့္မယ္... မရေသးဘူးဆုိရင္လည္း ျပင္ၾကည့္ပါ... အႀကိမ္ႀကိမ္ႀကိဳးစားၾကည့္ပါ... ေခါင္းေတြ ေသရည္ ေသရက္ မေသာက္ရဘဲ ေခါင္းေတြ ခ်ာခ်ာလည္မူးေနာက္လိမ့္မည္... က်ေတာ္လည္...