2009-11-03 18 views
6

मेरे पास एक ऐसा फॉर्म है जिसमें डेटा शीट शामिल है। मैं उपयोगकर्ता को कई पंक्तियों का चयन करने के लिए संभव बनाना चाहता हूं, एक बटन पर क्लिक करें और कुछ एसक्यूएल क्वेरी चलाएं और उन पंक्तियों पर कुछ काम करें।मैं एक्सेस में चयनित पंक्तियों का उपयोग कैसे करूं?

मेरे वीबीए कोड के माध्यम से देखकर, मैं देखता हूं कि मैं CurrentRecord प्रॉपर्टी का उपयोग करके अंतिम चयनित रिकॉर्ड तक कैसे पहुंच सकता हूं। फिर भी मैं नहीं देखता कि मैं कैसे जान सकता हूं कि कई चयनों में कौन सी पंक्तियां चुनी गई थीं। (मुझे उम्मीद है कि मैं स्पष्ट हूं ...)

ऐसा करने का मानक तरीका क्या है? वीबीए दस्तावेज एक्सेस नेट पर कुछ हद तक अस्पष्ट है ...

धन्यवाद!

उत्तर

7

यह करने के लिए कोड है, लेकिन एक पकड़ है। कोड एक बटन को जोड़ा जाता है, जैसे ही उपयोगकर्ता है कि बटन पर क्लिक करता के रूप में, चयन (selheight शून्य हो जाएगा) ग्रिड में गुम हो गया है:

Private Sub Command1_Click() 
    Dim i As Long 
    Dim RS As Recordset 
    Dim F As Form 

    Set F = Me.sf.Form 
    Set RS = F.RecordsetClone 

    If F.SelHeight = 0 Then Exit Sub 

    ' Move to the first selected record. 
    RS.Move F.SelTop - 1 

    For i = 1 To F.SelHeight 
     MsgBox RS![myfield] 
     RS.MoveNext 
    Next i 

End Sub 

यहाँ पकड़ है। तो आपको उस जानकारी को कैप्चर करने और इसे एक मॉड्यूल लेवल वैरिएबल में सहेजने की ज़रूरत है, या तो फॉर्म पर टाइमर या अन्य घटनाओं के साथ।

यहां एक लेख है जो वर्णन करता है कि कुछ विस्तार में कैच के आसपास कैसे काम करना है।
http://www.mvps.org/access/forms/frm0033.htm

पकड़ने 2: यह केवल सन्निहित चयन के साथ काम करता है। वे ग्रिड में बहु-अनुक्रमिक पंक्तियों का चयन नहीं कर सकते हैं।

अद्यतन:
जाल को यह एक बेहतर घटना हो सकती है, लेकिन यहाँ एक काम कार्यान्वयन form.timerinterval संपत्ति है कि मैं परीक्षण किया है उपयोग कर रहा है (कम से कम पहुंच 2k3 में है, लेकिन 2K7 ठीक काम करना चाहिए)

यह कोड SUBFORM में जाता है, मास्टर फॉर्म में सेलेहाइट मान प्राप्त करने के लिए संपत्ति का उपयोग करें।

Public m_save_selheight As Integer 

Public Property Get save_selheight() As Integer 
    save_selheight = m_save_selheight 
End Property 

Private Sub Form_Open(Cancel As Integer) 
    Me.TimerInterval = 500 
End Sub 

Private Sub Form_Timer() 
    m_save_selheight = Me.selheight 
End Sub 
+0

आश्चर्यजनक ... यही कारण है कि मैं 0 पर सेल्हेइट प्राप्त कर रहा था ... बहुत बहुत धन्यवाद, मैं इसे तुरंत कोशिश करूँगा और अगर यह काम करता है तो आपका जवाब स्वीकार करें! – karlipoppins

+0

हम्म इसे काम नहीं कर सकता ... एक्सेस 2007 के साथ , selheight 0 पर रहता है ... – karlipoppins

+0

यह चाल फोकस खोने से पहले मूल्य को पकड़ रही है। आप किस घटना में सेल्हेइट वैल्यू को पकड़ रहे हैं? क्या आपने इसे सबफ़ॉर्म में टाइमर में आज़माया? तत्काल मूल्य को जांचने का प्रयास करें विंडो (ctrl-g) और देखें कि समस्या फोकस खोने के बाद चयन रीसेटिंग है या नहीं। – JohnFx

2

मैंने पहले ऐसा कुछ करने की कोशिश की है, लेकिन मुझे किसी विधि का उपयोग करने में कोई सफलता नहीं मिली है जिसके लिए उपयोगकर्ता को विंडोज फ़ाइल डायलॉग बॉक्स (Ctrl, Shift, आदि दबाकर एक ही शैली में एकाधिक पंक्तियों का चयन करने की आवश्यकता होती है।)।

एक विधि जिसका मैंने उपयोग किया है वह दो सूची बॉक्स का उपयोग करना है। उपयोगकर्ता बाएं सूची बॉक्स में किसी आइटम पर डबल क्लिक कर सकता है या किसी आइटम का चयन होने पर बटन पर क्लिक कर सकता है, और यह सही सूची बॉक्स में स्थानांतरित हो जाएगा।

एक अन्य विकल्प स्थानीय स्रोत का उपयोग करना है जो आपके स्रोत डेटा प्लस बुलियन मानों के साथ पॉप्युलेट किया गया है जो सबफ़ॉर्म में चेकबॉक्स के रूप में दर्शाए जाते हैं। उपयोगकर्ता चेकबॉक्स पर क्लिक करके इच्छित डेटा चुनने के बाद, उपयोगकर्ता एक बटन (या कुछ अन्य घटना) दबाता है, जिस समय आप सीधे डेटा की अंतर्निहित तालिका में जाते हैं और केवल उन पंक्तियों को क्वेरी करते हैं जिन्हें चेक किया गया था। मुझे लगता है कि यह विकल्प सबसे अच्छा है, हालांकि इसे ठीक से काम करने के लिए थोड़ा सा कोड चाहिए।

यहां तक ​​कि एक्सेस में, मुझे कभी-कभी एक्सेस फॉर्म में अंतर्निहित टूल्स का उपयोग करने की बजाय टेबल और प्रश्नों के साथ काम करना आसान होता है। कभी-कभी अंतर्निहित उपकरण वही नहीं करते जो आप चाहते हैं।

+0

+1 आपके दूसरे विकल्प के लिए +1, हालांकि मैं संभवतः ऐसा नहीं करूँगा ... उम्मीद है कि माइक्रोसॉफ्ट उन चयनित पंक्तियों तक पहुंचने के लिए एक अस्पष्ट तरीके से आया है ...? – karlipoppins

+0

आप किस एक्सेस का उपयोग कर रहे हैं? मैं काम पर एक्सेस 2002 का उपयोग करता हूं। दिलचस्प बात यह है कि, मैंने "एक्सेस 2002 डेवलपर की हैंडबुक" (एक्सेस डेवलपर की बाइबिल माना जाता है) के माध्यम से फ़्लिप किया है और उनके पास एक वर्ग है जिसे उन्होंने मल्टीपिक कहा है। यह कक्षा * एक समय में कई वस्तुओं को चुनने की अनुमति देती है, लेकिन वे कहते हैं कि जब आपके पास बहुत सारी चीज़ें होती हैं तो वे धीमी होती हैं (वे कहते हैं कि 300 आइटम धीमे हैं)। यदि आप रुचि रखते हैं, तो मैं इस कक्षा के लिए स्टैक ओवरफ़्लो पर कोड पोस्ट करने की वैधता देख सकता हूं। मुझे बताएं। –

+0

अच्छी तरह से मैं 2007 का उपयोग कर रहा हूं और मेरी तालिका में 10k से अधिक प्रविष्टियां हैं ताकि शायद अच्छी तरह से काम न करे .. – karlipoppins

6

मैं तकनीक JohnFx

जाल करने के लिए

चयन ऊंचाई से पहले ही गायब हो जाता है मैं मुख्य रूप में उप-प्रपत्र नियंत्रण से बाहर निकलें घटना का इस्तेमाल किया के लिए इसी तरह इस्तेमाल किया।

तो मुख्य रूप में:

Private Sub MySubForm_Exit(Cancel As Integer) 

    With MySubForm.Form 
    m_SelNumRecs = .SelHeight 
    m_SelTopRec = .SelTop 
    m_CurrentRec = .CurrentRecord 
    End With 

End Sub 
+1

यह टाइमर घटना के रूप में अधिक सुरुचिपूर्ण और कुशल है! यदि सबफॉर्म पर चलाने के लिए आवश्यक कोड है, तो सबफॉर्म की सार्वजनिक विधि को उसी फ़ॉर्म से बाहर निकलने वाले ईवेंट हैंडलर: MySubForm.Form.PublicMethod में पैरेंट फॉर्म से कॉल किया जा सकता है। SelHeight और SelTop मान अभी भी उस विधि के निष्पादन के दौरान मान्य होंगे। इस पैटर्न का लाभ यह है कि क्योंकि वर्किंग कोड सबफॉर्म मॉड्यूल में है, यदि उपफॉर्म एकाधिक मूल रूपों पर है तो यह पुन: प्रयोज्य होगा ... इसलिए मूल रूपों पर डुप्लिकेट कोड न्यूनतम है। –

2

चयन नुकसान जब उप प्रपत्र फोकस खो देता है के लिए एक वैकल्पिक हल (पहले से ही दूसरों के द्वारा उल्लेख किया) से बाहर निकलें स्थिति में चयन को बचाने के लिए है।

टाइमर का उपयोग करके तुरंत इसे पुनर्स्थापित करना एक अच्छा जोड़ा है, ताकि उपयोगकर्ता अभी भी चयन को देख सके।

नोट: यदि आप बटन हैंडलर में चयन का उपयोग करना चाहते हैं, तो चयन निष्पादित होने पर पहले से ही पुनर्स्थापित नहीं किया जा सकता है। टाइमर हैंडलर को पहले निष्पादित करने के लिए बटन हैंडलर की शुरुआत में सहेजे गए मानों का उपयोग करना सुनिश्चित करें या बटन हैंडलर की शुरुआत में एक DoEvents जोड़ें।

Dim m_iOperSelLeft As Integer 
Dim m_iSelTop As Integer 
Dim m_iSelWidth As Integer 
Dim m_iSelHeight As Integer 

Private Sub MySubForm_Exit(Cancel As Integer) 

    m_iSelLeft = MySubForm.Form.SelLeft 
    m_iSelTop = MySubForm.Form.SelTop 
    m_iSelWidth = MySubForm.Form.SelWidth 
    m_iSelHeight = MySubForm.Form.SelHeight 

    TimerInterval = 1 

End Sub 

Private Sub Form_Timer() 

    TimerInterval = 0 

    MySubForm.Form.SelLeft = m_iSelLeft - 1 
    MySubForm.Form.SelTop = m_iSelTop 
    MySubForm.Form.SelWidth = m_iSelWidth 
    MySubForm.Form.SelHeight = m_iSelHeight 

End Sub 
1

फॉर्म में एक वैश्विक चर का उपयोग करें, फिर उसे बटन कोड में देखें।

Dim g_numSelectedRecords as long 

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) 
    g_numSelectedRecords = Me.SelHeight 
End Sub 


Dim formRecords As DAO.Recordset 
Dim i As Long 

Set formRecords = Me.RecordsetClone 

' Move to the first record in the recordset. 
formRecords.MoveFirst 

' Move to the first selected record. 
formRecords.Move Me.SelTop - 1 

For i = 1 To numSelectedRecords 
    formRecords.Edit 
    formRecords.Fields("Archived") = True 
    formRecords.Update 
    formRecords.MoveNext 
Next i 
2

एक और समाधान है।

नीचे दिया गया कोड माउस बटन को जारी करने के तुरंत बाद चयनित पंक्तियों की संख्या दिखाएगा। इस मूल्य को सहेजना चाल करेगा।

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) 

     MsgBox Me.SelHeight 

End Sub 
+0

अरे, आप अपने कोड के स्वरूपण को ठीक करना चाहते हैं, शुरुआत और अंत इंडेंट नहीं हैं। – cpburnz

+0

यह अच्छी तरह से काम करता है लेकिन केवल माउस संचालन तक ही सीमित है। कुंजीपटल का उपयोग कई कॉलम और पंक्तियों का चयन करने के लिए भी किया जा सकता है, लेकिन यह उन पर कब्जा नहीं करेगा। अफसोस की बात है, डेटाशिप के चारों ओर नेविगेट करते समय, KeyPress और KeyUp ईवेंट नियंत्रण और तीर कुंजियों को कैप्चर नहीं करते हैं। अभिभावक निकास कार्यक्रम से जुड़े अन्य पोस्ट समाधान अधिक सामान्य हैं और चयन विधि पर निर्भर नहीं हैं। –

0

किसी सरणी या recordset और फिर हर बार क्यों उपयोग नहीं एक पंक्ति पर उपयोगकर्ता क्लिक करता है (या तो सन्निहित है या नहीं, उस पंक्ति या recordset में कुछ पहचानकर्ता सहेजें। फिर जब वे बटन माता पिता प्रपत्र पर क्लिक करें , बस रिकॉर्सेट को फिर से सक्रिय करें जो आप चाहते हैं कि वह करने के लिए सहेजा गया था। बटन क्लिक करने के बाद सरणी या रिकॉर्डसेट को साफ़ करना न भूलें।

0

प्रक्रिया को निष्पादित करने का प्रयास करते समय चयन को रखने के लिए एक और कामकाज - इसके बजाए बटन को सक्रिय करने के लिए डेटाशीट को छोड़ने के लिए, केवल ऑनकेडाउन ईवेंट का उपयोग करें और अपने कोड को निष्पादित करने के लिए एक विशिष्ट कीकोड और शिफ्ट संयोजन को परिभाषित करें।

-1

जॉनएफएक्स द्वारा प्रदान किया गया कोड अच्छी तरह से काम करता है। मैं इसे एक टाइमर के बिना इस तरह से लागू किया (एमएस एक्सेस 2003):
1- फार्म की कुंजी पूर्वावलोकन सेट हाँ
2- एक समारोह में कोड डालने के लिए
3 समारोह कॉल करने के लिए घटना onkeyup और OnMouseUp सेट ।

Option Compare Database 
Option Explicit 

Dim rowSelected() As String 

Private Sub Form_Load() 
'initialize array 
ReDim rowSelected(0, 2) 
End Sub 

Private Sub Form_Current() 
' if cursor place on a different record after a selection was made 
' the selection is no longer valid 
If "" <> rowSelected(0, 2) Then 
    If Me.Recordset.AbsolutePosition <> rowSelected(0, 2) Then 
    rowSelected(0, 0) = "" 
    rowSelected(0, 1) = "" 
    rowSelected(0, 2) = "" 
    End If 
End If 
End Sub 

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) 
rowsSelected 
If KeyCode = vbKeyDelete And Me.SelHeight > 0 Then 
    removeRows 
End If 
End Sub 

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) 
rowsSelected 
End Sub 

Sub rowsSelected() 
Dim i As Long, rs As DAO.Recordset, selH As Long, selT As Long 
selH = Me.SelHeight 
selT = Me.SelTop - 1 
If selH = 0 Then 
    ReDim rowSelected(0, 2) 
    Exit Sub 
Else 
    ReDim rowSelected(selH, 2) 
    rowSelected(0, 0) = selT 
    rowSelected(0, 1) = selH 
    rowSelected(0, 2) = Me.Recordset.AbsolutePosition ' for repositioning 
    Set rs = Me.RecordsetClone 
    rs.MoveFirst ' other key touched caused the pointer to shift 
    rs.Move selT 
    For i = 1 To selH 
     rowSelected(i, 0) = rs!PositionNumber 
     rowSelected(i, 1) = Nz(rs!CurrentMbr) 
     rowSelected(i, 2) = Nz(rs!FutureMbr) 
     rs.MoveNext 
    Next 
    Set rs = Nothing 
    Debug.Print selH & " rows selected starting at " & selT 
End If 
End Sub 

Sub removeRows() 
' remove rows in underlying table using collected criteria in rowSelected() 
    Me.Requery 
' reposition cursor 
End Sub 

Private Sub cmdRemRows_Click() 
If Val(rowSelected(0, 1)) > 0 Then 
    removeRows 
Else 
    MsgBox "To remove row(s) select one or more sequential records using the record selector on the left side." 
End If 
End Sub 
+0

उल्लेख करने के लिए भूल गए: मेरे परिदृश्य में एक ऐसे फॉर्म में रिकॉर्ड चुनना शामिल है जहां स्रोत क्वेरी अद्यतन करने योग्य नहीं है और उपयोगकर्ताओं को रिकॉर्ड को हटाने की आवश्यकता है; एक सबफॉर्म नहीं। –

संबंधित मुद्दे

 संबंधित मुद्दे