मैं वर्तमान में एक समस्या में फंस गया हूं और उम्मीद कर रहा था कि यहां कोई मेरी मदद कर सकता है। मुझे निश्चित रूप से उम्मीद है कि यह पूछने के लिए यह सही जगह है।

मैं एक घटना को फायर करने पर अपने संबंधित चालान लाइन रिकॉर्ड के साथ एक कस्टम चालान रिकॉर्ड बनाने की कोशिश कर रहा हूं। जेएस में चयनित पंक्तियों की आईडी इकट्ठा करने के लिए मेरे पास पहले से ही कुछ तर्क हैं।

मैं अब तक चालान रिकॉर्ड (एलडीएस का उपयोग करके) और चालान लाइन रिकॉर्ड (एपेक्स का उपयोग करके) बनाने में सक्षम होने के लिए चला गया हूं, लेकिन चालान लाइन रिकॉर्ड के लिए चालान आईडी पास नहीं कर सकता। मुझे पता है कि मैं रिकॉर्ड बनाने में सक्षम हूं क्योंकि यह तब काम करता है जब मैंने हार्डकोडेड इनवॉइस आईडी के साथ इसका परीक्षण किया।

क्या एलडब्ल्यूसी में एक शीर्ष विधि में सूची और स्ट्रिंग के कई मापदंडों को पारित करना संभव होगा?

किसी भी सहायता के लिए धन्यवाद। अग्रिम में धन्यवाद!

जेएस

    selectedRowsEvent(event) {

    ...some codes here...

    this.selectedRecords = Array.from(conIds);
    }


    handleSave() {

         **invId;**

         ...some codes here...

        createRecord(recordInput)
        .then(invoice => {
            **this.invId = invoice.Id;**  
            **createInvLines({ lstConIds : this.selectedRecords, invoiceId : this.invId})**
        }).catch(error => {

          ...some codes here...

          });
    }

नियंत्रक

@AuraEnabled
    public static void createInvLines(list<Id> lstConIds, string invoiceId){
        if(lstConIds.size() > 0){
            List<OpportunityLine__c> oppLst = new List<OpportunityLine__c>([SELECT Id, Description__c FROM OpportunityLine__c WHERE Id = :lstConIds]);
            try {
                List<InvoiceLine__c> lstInvLinesToInsert = new List<InvoiceLine__c>();
                for(OpportunityLine__c idCon : oppLst) {
                    lstInvLinesToInsert.add(new InvoiceLine__c(**InvoiceId__c = invoiceId**, Description__c = idCon.Description__c));
                }
                if(!lstInvLinesToInsert.isEmpty()) {
                    insert lstInvLinesToInsert;
                }
            }
            catch(Exception ex) {
                throw new AuraHandledException(ex.getMessage());
            }
        }
    }  
2
Sid Fortunato 29 अप्रैल 2020, 07:12

2 जवाब

सबसे बढ़िया उत्तर

हां, आप @AuraEnabled के रूप में चिह्नित विधियों के लिए जटिल पैरामीटर पास कर सकते हैं। क्लाइंट साइड पर यह एक JSON ऑब्जेक्ट होगा जिसमें सही फ़ील्ड नाम होंगे, जैसे आपके पास पहले से { lstConIds : this.selectedRecords, invoiceId : this.invId} है। शीर्ष पक्ष पर यह कई तर्कों या सिर्फ 1 तर्क (कुछ सहायक आवरण वर्ग, फिर से सही फ़ील्ड नामों के साथ) के साथ एक फ़ंक्शन हो सकता है। सेल्सफोर्स आपके लिए उस JSON को "अनपैक" करेगा और आपके कोड को कॉल करने से पहले सही फ़ील्ड में डाल देगा।

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

(आपके परिदृश्य में मैं निश्चित रूप से 1 कॉल के रूप में चालान और लाइन आइटम बनाने की कोशिश करूंगा ताकि अगर कुछ भी विफल हो जाए - सामान्य लेनदेन रोलबैक आपकी मदद करेगा। यदि कोई आइटम विफल हो जाता है - आप केवल चालान शीर्षलेख के साथ नहीं रहना चाहते हैं, अधिकार?)

क्या आपने देखा है https://developer.salesforce.com /docs/component-library/documentation/en/lwc/lwc.apex ? यह पाठ की एक दीवार है लेकिन इसमें दिलचस्प उदाहरण का उल्लेख है, वहां "apexImperativeMethodWithParams" खोजें।

JS फ़ाइल यहाँ देखें: https: //github.com/trailheadapps/lwc-recipes/tree/master/force-app/main/default/lwc/apexImperativeMethodWithComplexParams और देखें कि यह कैसे कॉल करता है

ApexTypesController {
    @AuraEnabled(cacheable=true)
    public static String checkApexTypes(CustomWrapper wrapper) {
...

जहां CustomWrapper है

public with sharing class CustomWrapper {
    class InnerWrapper {
        @AuraEnabled
        public Integer someInnerInteger { get; set; }
        @AuraEnabled
        public String someInnerString { get; set; }
    }

    @AuraEnabled
    public Integer someInteger { get; set; }
    @AuraEnabled
    public String someString { get; set; }
    @AuraEnabled
    public List<InnerWrapper> someList { get; set; }
}
1
eyescream 29 अप्रैल 2020, 12:46

मुद्दा यह है कि आवेषण अतुल्यकालिक हैं और आप उन्हें समकालिक रूप से फायर कर रहे हैं। तो, इसका मतलब है कि आप पैरेंट रिकॉर्ड पूरा होने से पहले लाइनों को सम्मिलित करने का प्रयास कर रहे हैं।

// CREATE THE INVOICE RECORD
    createRecord(recordInput)
        .then(invoice => {
                **this.invId = invoice.Id;**
                // Call the next function here

                   // CREATE THE INVOICE LINE RECORDS
                **createInvLines({ lstConIds : this.selectedRecords, invoiceId : this.invId})**
                 .then(result => {
                   ...some codes here...
                  })
                 .catch(error => {
                   ...some codes here...

                 }); 
              );
            }
0
Vince 29 अप्रैल 2020, 09:21