从 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