Tricks with Virtual Fields

From Dabo Wiki
Jump to: navigation, search

I'm posting this because without this small trick I was stumped and it caused me to think how to best use Dabo to solve the problem. Keep in mind that there are other solutions.

Most of us have either seen or worked with the common ledger grid. Where you have to provide line payments with description, date received and payment received. Normally, you see this as either as a running balance or per invoice on a grid. In my case I needed to provide the second. That is I had to track payments received from students for courses they took. I am NOT going describe the general UI but I do want to discuss the way I handled determining the total amount received and the balance due at the bizobject level.

The relationship is as follows:

payments is a child of enrollment.

class Public_esenroll_Bizobj(dabo.biz.dBizobj):
    def initProperties(self):
        self.DataSource = "public.esenroll"

    def afterInit(self):
        self.addFrom( "public.esenroll")
        self.addField("pkid")
        self.KeyField = "pkid"

...

class Public_escoursepayments_Bizobj(dabo.biz.dBizobj):
    def initProperties(self):
        self.DataSource = "public.escoursepayments"
        self._balance = 0

    def afterInit(self):
        self.addFrom( "public.escoursepayments")
        self.addField("pkid")
        self.addField("fk_enroll")
        self.ParentLinkField ="pkid"
        self.LinkField = "fk_enroll"
        self.FillLinkFromParent? = True
        self.VirtualFields={totalrec}


    def gettotalRec(self):
        tempCur = self.getTempCursor()
        tempCur.execute("Select sum(amt_rec) as totalrec from escoursepayments where fk_enroll = %s",
                self.Parent.Record.pkid)

        try:
            myret = tempCur.Record.totalrec
            self._totalrec = myret
            self._balance = self.Parent.Record.course_cost - myret
        except:
            myret = 0
            self._totalrec = myret
            self._balance = self.Parent.Record.course_cost
        return myret

    def getBalance(self):
        try:
            myret = self._balance
        except:
            myret = 0
        return myret

On the form I had a control that used the virtual field totalrec. Which fired the bizobj method gettotalRec() to set the bizobj attribute self._balance. Then on the form I had a control that set the following:

DataSource = the course payment table
DataField = getBalance

Dabo then used the method getBalance to fill in the balance.