从 CloudKit 和 Swift 3 中的表/RecordType 计算字段的总和,例如特定 Customer_Name 的 Bill_Amount

Posted

技术标签:

【中文标题】从 CloudKit 和 Swift 3 中的表/RecordType 计算字段的总和,例如特定 Customer_Name 的 Bill_Amount【英文标题】:Calculate Sum of a Field, say, Bill_Amount for a particular Customer_Name from a table/RecordType in CloudKit and Swift 3 【发布时间】:2017-07-26 15:42:11 【问题描述】:

我在 Cloudkit 中有一个 Sales 表,其中 Customer_Name 和 Bill_Amount 作为单独的字段。如何计算所有客户的 Bill_Amount 值的总和并将其显示在 UITableView 中,像这样?

    Sales from Customer
    ------------------------------------
    Customer_Name            Sales Amount
    ------------------------------------                        
    Customer A.               50,000                          
    Customer B.               30,000                
    Customer C.               60,000            
    Customer D.               50,000

在 CloudKit 中,我有两个表:a) Transactions b) PartyAccounts。 PartyAccounts 包含所有派对详细信息。 Transactions 包含 Txn_ID、Txn_Date、Party、Amount、Remarks。

我想像上面那样在 UITableView 中显示摘要,直到现在哪一方有什么余额。我尝试了很多方法,比如添加两个不同的数组,[String] 用于派对名称,[Double] 用于 PartyBalances,当我单击为 UITableView 重新加载而点击的 viewAllTapped 按钮时,所有数据都会加载,而不是在 viewLoad 事件上。

我的代码是:

//
//  ViewController4.swift
//  General Ledger
//
//  Created by Aakash Vijay on 21/07/17.
//  Copyright © 2017 Aakash Vijay. All rights reserved.
//

    import UIKit
    import CloudKit
    import MobileCoreServices

    class ViewController4: UIViewController, UITableViewDelegate, UITableViewDataSource 
        var loadTransactionData = [CKRecord]()
        var partyAccountsData = [CKRecord]()
        let publicDB = CKContainer.default().publicCloudDatabase
        let cntr = CKContainer.default()
        typealias finshedFunction = () -> ()
        @IBOutlet weak var tableView: UITableView!
        @IBOutlet weak var view1: UIView!
        var partyNames : [String] = []
        var partyBalances : [Double] = []


        //viewAllTapped is Button That Reloads UITableView
        @IBAction func viewAllTapped(_ sender: UIButton)         
            print(self.partyAccountsData.count)
            print(self.loadTransactionData.count)
            print(partyBalances.count)
            self.tableView.reloadData()
        

        var ptyAmt : Double = 0.0
        var ptyNam : String = ""
        var tmpPty : String = ""


        override func viewDidLoad() 
            super.viewDidLoad()
            view1.layer.borderWidth = 1
            view1.layer.cornerRadius = 10
            tableView.layer.borderWidth = 1
            tableView.layer.cornerRadius = 10
            self.loadNewData()    /// Data Loaded(But Now Shown in TableView) i Don't know Why Sometimes executes full code and sometimes shows error.
        

        override func didReceiveMemoryWarning() 
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        


        func numberOfSections(in tableView: UITableView) -> Int 
            return 1
        


        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
            return self.partyAccountsData.count
        

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ViewPartyBalanceTVC
            cell.view2.layer.borderWidth = 1
            cell.view2.layer.cornerRadius = 10
            cell.nameLabel.text = String(self.partyAccountsData[indexPath.row].value(forKey: "Party_Name") as! String)
            cell.amountLabel.text = String(self.partyBalances[indexPath.row])
            return cell
        
    /// Now partyAccountsData refers to all party
//////// loadNewData fills partyAccountsData with PartyAccounts Table's Data
        func loadNewData() 
            let qry = CKQuery(recordType: "PartyAccounts", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil))
            qry.sortDescriptors = [NSSortDescriptor(key: "Party_ID", ascending: true)]
            publicDB.perform(qry, inZoneWith: nil)  (results, error) in
                DispatchQueue.main.async 
                    if let rcds = results 
                        self.partyAccountsData = rcds
                        //self.tableView.reloadData()
                    
                
                if error != nil 
                    self.showAlert(msg: (error?.localizedDescription)!)
                
            

            let qry2 = CKQuery(recordType: "Transactions", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil))
            qry2.sortDescriptors = [NSSortDescriptor(key: "Party", ascending: true)]
            publicDB.perform(qry2, inZoneWith: nil)  (results, error) in
           ///// following code adds partyBalance ptyAmt to an array
                DispatchQueue.main.async 
                    if let rcds = results 
                        self.ptyAmt = 0
                        for i in 0..<self.partyAccountsData.count 
                            var str1 : String = ""
                            var str2 : String = ""
                            for z in 0..<rcds.count 
                                str1 = self.partyAccountsData[i].value(forKey: "Party_Name") as! String
                                str2 = rcds[z].value(forKey: "Party") as! String
                                if str1 == str2 
                                    self.ptyAmt = self.ptyAmt + Double(rcds[i].value(forKey: "Amount") as! Double)
                                
                            
                            self.partyBalances.append(self.ptyAmt)
                            self.ptyAmt = 0
                        
                        self.loadTransactionData = rcds
                        self.tableView.reloadData()
                    
                    if error != nil 
                        self.showAlert(msg: (error?.localizedDescription)!)
                    
                
            
        
    /////// Code to show Alert
        func showAlert(msg: String)
        
            let alert = UIAlertController(title: "CloudKit", message: msg, preferredStyle: .alert)
            let okButton = UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil)
            alert.addAction(okButton)
            self.present(alert, animated: true, completion: nil)
        
        var tData = [CKRecord]()

        func allDataFill() 
            let qry = CKQuery(recordType: "PartyLedger", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil))
            qry.sortDescriptors = [NSSortDescriptor(key: "Party_Name", ascending: true)]
            publicDB.perform(qry, inZoneWith: nil)  (results, error) in
                DispatchQueue.main.async 
                    if let rcds = results 
                        self.tData = rcds
                    
                
                if error != nil 
                    self.showAlert(msg: (error?.localizedDescription)!)
                
            
        
    

【问题讨论】:

请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。 Questions asking for homework help must include a summary of the work you've done so far to solve the problem, and a detailed description of the difficulty you are having solving it. 不起作用请帮帮我是不可接受的。 How much research effort is expected of Stack Overflow users? 答案,“很多。一个荒谬的数量。超过你认为你的能力。在你到达你的绳索的尽头和没有的痛苦之后答案超过了发布您的问题所带来的大量耻辱,那时您可以继续提问。因为到那时,您将完成任何必要的研究,使其成为一个值得提出的好问题。”跨度> 在尝试提出更多问题之前,请阅读How do I ask a good question?。 @Aakash 你的问题的第一个版本,你没有表现出你的努力,绝对是要求别人做你的工作。也许这不是你的意图,但这就是发生的事情。如果你不表现出你的努力,我们就无法知道你尝试了什么...... 【参考方案1】:

我刚刚找到了解决方案。我和以前一样,但使用完成处理程序,它工作得很好。

【讨论】:

以上是关于从 CloudKit 和 Swift 3 中的表/RecordType 计算字段的总和,例如特定 Customer_Name 的 Bill_Amount的主要内容,如果未能解决你的问题,请参考以下文章

无法从应用程序扩展访问我的“CKContainer”中的任何数据 - CloudKit,Swift

从 Cloudkit 加载空属性时代码崩溃 - 使用 Swift

Swift - 从 Cloudkit 公共数据库中获取所有记录

使用 CloudKit 和 Swift 检索图像

swift Swift - CloudKit订阅 - 3

swift Swift - CloudKit - 关系中的引用类型