2008-11-03 5 views
7

मैं OpenArgs पैरामीटर का उपयोग कर रहा एक मूल्य भेजने के लिए जब DoCmd.OpenForm उपयोग कर रहा है:OpenArgs अशक्त त्रुटि

DoCmd.OpenForm "frmSetOther", acNormal, , , acFormAdd, acDialog, "value" 

मैं तो खोला प्रपत्र अंदर Me.OpenArgs का उपयोग मूल्य हड़पने के लिए। यह कभी-कभी मूल स्ट्रिंग के बजाय शून्य मान भेजता है। गलत क्या है?

उत्तर

1

इस "openArgs" तर्क का एक बहुत ही रोचक विकल्प currentProject.allforms ("myFormName") ऑब्जेक्ट के .properties संग्रह का उपयोग करना है। जब आपको किसी फॉर्म को मान पास करने की आवश्यकता होती है (जैसे किसी अन्य नियंत्रण से प्राप्त फ़िल्टर या उदाहरण के लिए, अन्य फॉर्म), तो बस अपने फॉर्म के लिए संबंधित प्रॉपर्टी जोड़ें, और इस प्रॉपर्टी में अपना वैल्यू जोड़ें।

उदाहरण:

addPropertyToForm "formFilter","Tbl_myTable.myField LIKE 'A*'",myFormName 

बुलाया समारोह वस्तु की "formFilter" संपत्ति के मूल्य को अद्यतन करने की कोशिश करेंगे। यदि संपत्ति मौजूद नहीं है (त्रुटि 2455 उठाई गई है), तो इसे त्रुटि प्रबंधन कोड में एक नई संपत्ति के रूप में जोड़ा जाएगा।

Function addPropertyToForm(_ 
    x_propertyName as string, _ 
    x_value As Variant, _ 
    x_formName As String) 
As Boolean 

On Error GoTo errManager 
CurrentProject.AllForms(x_formName).Properties(x_propertyName).Value = x_value 
addPropertyToForm = True 
On Error GoTo 0 

Exit Function 

errManager: 
If Err.Number = 2455 Then 
    CurrentProject.AllForms(x_formName).Properties.Add x_propertyName, Nz(x_value) 
    Resume Next 
Else 
    msgbox err.number & ". The property " & x_propertyName & "was not created" 
End If 

End Function 
+0

+1, क्योंकि यह OpenArgs जैसी कार्यक्षमता को निर्देशों के साथ अनुमति देता है जो OpenArgs (उदा। DoCmd.OutputTo) की अनुमति नहीं देते हैं। दूसरी ओर, यह निश्चित रूप से साझा डेटाबेस पर समस्याग्रस्त है, और मुझे संदेह है कि यह एक एमडीई के साथ काम नहीं करेगा? –

+0

डाउनवोट के लिए खेद है, लेकिन मैंने सोचा कि यह समस्या को हल नहीं कर रहा था। –

0

क्या उपयोगकर्ता द्वारा पूरा किया गया मूल्य पूरा हो गया है? क्या आप सुनिश्चित करते हैं कि ओपनफॉर्म लाइन चलाने से पहले फोकस नियंत्रण से ले जाया गया हो?

संपादित करें: नियंत्रण की मान संपत्ति पिछले मान के बराबर होगी, जो शून्य हो सकती है, जब तक कि आप ऐसा न करें।

0

मैं मैं अपने समस्या का जवाब मिल गया लगता है:

मेरे अनुभव में, OpenArgs प्रपत्र के उद्घाटन के अवसर पर तुरंत नियंत्रित किया गया है। (link)

मैं OpenArgs मान का उपयोग करने से पहले एक ब्रेक लगाकर इस जाँच की, और यह शून्य था। लेकिन जब मैं ब्रेक हटा देता हूं, तो प्रोग्राम कोई त्रुटि नहीं दिखाता है। यह केवल विकास के दौरान ही होना चाहिए।

+0

"फॉर्म खोलने के तुरंत बाद ओपनअर्स को संभालना होगा" मैंने कभी यह सत्य नहीं पाया है और मैं अक्सर OpenArgs का उपयोग करता हूं। – Fionnuala

+0

मैं रेमो –

+0

के साथ 100% सहमत हूं, फिर आप क्या करते हैं, Remou? – lamcro

20

इस बार developpment दौरान होता है whem रूप में पहले से ही (उदाहरण के लिए संपादन मोड में) oppened है और आप docmd.OpenForm समारोह आह्वान। इस मामले में, फॉर्म सामान्य (दृश्य) मोड में रखा जाता है और ओनपेन और ऑनलोड घटनाएं उठाई जाती हैं, लेकिन ओपनअर्ग प्रॉपर्टी को डॉकमड.ऑनफ़ॉर्म पर पारित करने के लिए सेट नहीं किया जाता है।

समाधान स्पष्ट रूप से docmd.OpenForm के साथ इसे आमंत्रित करने से पहले फ़ॉर्म को बंद करना है। हालांकि मैं एक कामकाज का उपयोग करना पसंद करता हूं। ऑन ओपन इवेंट में मैं जांचता हूं कि मुझे क्या है। ओपनआर्ग शून्य है और यदि मैं इसे कुछ डीबग मानों से बदलता हूं।

if not isnull(me.OpenArgs) then 
    myvalue = me.OpenArgs 
else 
    msgbox "Debug mode" 
    myValue = "foo" 
endif 
+0

यह स्पष्ट रूप से एक बग है, क्योंकि दस्तावेज़ स्पष्ट रूप से बताता है कि OpenArgs एक * स्ट्रिंग * देता है। मुझे एक रिपोर्ट के साथ आज भी यही समस्या थी, और यह पहली बार मैंने देखा। आम तौर पर मैं हमेशा लेन (Me.openArgs) और हमेशा ठीक काम किया। –

+1

धन्यवाद, मेरा सिर वास्तव में यह सोचने के लिए शुरू कर रहा था कि धरती पर ओपनअर्स हमेशा मेरे रूप में शून्य क्यों था। फॉर्म डिज़ाइन मोड में खुला था। वास्तव में व्यवहार की तरह मैं उम्मीद नहीं करता ... –

8

मुझे बस यह समस्या थी। Arg स्ट्रिंग पास नहीं हुई, क्योंकि रिपोर्ट पहले से ही खुली थी, लेकिन दिखाई नहीं दे रही थी। कोड को Null string error के साथ क्रैश होने पर यह खुला छोड़ दिया गया था।

समाधान के साथ

Docmd.Close acReport, "myReport" 

यह मेरी बग को ठीक तत्काल विंडो में रिपोर्ट बंद करने के लिए किया गया था, और आर्ग ठीक से पारित किए गए।

+0

+1, उत्कृष्ट! –

1

यह हो सकता है कि आपका फॉर्म पहले से ही खुला हो (जैसा कि सुझाव दिया गया हो), लेकिन केवल शून्य के लिए जांचें और फॉर्म लापता तर्कों के साथ भी खुल जाएगा।

यदि तर्क महत्वपूर्ण नहीं हैं तो यह एक त्वरित चोटी (आपके द्वारा या उपयोगकर्ताओं द्वारा) के लिए फॉर्म खोलने की अनुमति देगा।

Private Sub Form_Open(Cancel As Integer) 
    If Not IsNull(Me.OpenArgs) Then 
     Me.lblHeading.Caption = Me.OpenArgs 
    End If 
End Sub 

एक शून्य मान को डबल क्लिक करके Access में प्रपत्र ऑब्जेक्ट्स साइडबार द्वारा OpenForm कॉल में मूल्य को छोड़ते हुए द्वारा OpenArgs के लिए पारित किया जा सकता है, या।


यदि यह एक modal रूप है, तो आप स्पष्ट रूप से जांच होनी चाहिए यदि यह खुला है और यदि ऐसा है तो इसके खुलने से पहले उसे बंद करें। यह एक आम गोचा है।

वही सामान्य रूप से सभी रूपों के लिए किया जा सकता है, न केवल मोडल वाले, और फिर आपको शून्य जांच की आवश्यकता नहीं होगी (बशर्ते आप इसे कभी भी पास न करें)। लेकिन प्रायः प्रोजेक्ट में बहुत से फॉर्म होते हैं, और फॉर्मों की तुलना में और भी ओपनफॉर्म कॉल ...

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

  • कोई संबंधित समस्या नहीं^_^