Well, you still haven't shown your models. My guess is one of your fields 
is a reference field, which stores long int values representing the record 
ID of the referenced record, but you are attempting to insert a string 
value.

Anyway, your approach won't work because SQLFORM only does a single insert, 
which happens after the onvalidation callback runs. So, only the last set 
of form.vars values assigned in the onvalidation for loop will end up being 
inserted in the database.

Anthony

On Monday, September 26, 2016 at 9:56:34 AM UTC-4, Oasis Agano wrote:
>
> TRACEBACK
>
> Traceback (most recent call last):
>   File "D:\lab\PycharmProjects\Smartwork\web2py\gluon\restricted.py", line 
> 227, in restricted
>     exec ccode in environment
>   File 
> "D:/lab/PycharmProjects/Smartwork/web2py/applications/smartwork/controllers/default.py"
>  <http://127.0.0.1:8000/admin/default/edit/smartwork/controllers/default.py>, 
> line 708, in <module>
>   File "D:\lab\PycharmProjects\Smartwork\web2py\gluon\globals.py", line 417, 
> in <lambda>
>     self._caller = lambda f: f()
>   File 
> "D:/lab/PycharmProjects/Smartwork/web2py/applications/smartwork/controllers/default.py"
>  <http://127.0.0.1:8000/admin/default/edit/smartwork/controllers/default.py>, 
> line 300, in batch_payslip
>     if form.process(onvalidation=check_batch).accepted:
>   File "D:\lab\PycharmProjects\Smartwork\web2py\gluon\html.py", line 2298, in 
> process
>     self.validate(**kwargs)
>   File "D:\lab\PycharmProjects\Smartwork\web2py\gluon\html.py", line 2236, in 
> validate
>     if self.accepts(**kwargs):
>   File "D:\lab\PycharmProjects\Smartwork\web2py\gluon\sqlhtml.py", line 1746, 
> in accepts
>     self.vars.id = self.table.insert(**fields)
>   File 
> "D:\lab\PycharmProjects\Smartwork\web2py\gluon\packages\dal\pydal\objects.py",
>  line 726, in insert
>     ret = self._db._adapter.insert(self, self._listify(fields))
>   File 
> "D:\lab\PycharmProjects\Smartwork\web2py\gluon\packages\dal\pydal\adapters\base.py",
>  line 739, in insert
>     query = self._insert(table,fields)
>   File 
> "D:\lab\PycharmProjects\Smartwork\web2py\gluon\packages\dal\pydal\adapters\base.py",
>  line 730, in _insert
>     values = ','.join(self.expand(v, f.type) for f, v in fields)
>   File 
> "D:\lab\PycharmProjects\Smartwork\web2py\gluon\packages\dal\pydal\adapters\base.py",
>  line 730, in <genexpr>
>     values = ','.join(self.expand(v, f.type) for f, v in fields)
>   File 
> "D:\lab\PycharmProjects\Smartwork\web2py\gluon\packages\dal\pydal\adapters\base.py",
>  line 962, in expand
>     rv = self.represent(expression, field_type)
>   File 
> "D:\lab\PycharmProjects\Smartwork\web2py\gluon\packages\dal\pydal\adapters\base.py",
>  line 1442, in represent
>     return str(long(obj))
> ValueError: invalid literal for long() with base 10: 'Jul Contract'
>
>
> Note that this contract is the second in the database
>
>
> Basically what im trying to do is create a loop(from a form) that will create 
> payslips for all running contracts
>
>
> On Monday, September 26, 2016 at 4:21:56 PM UTC+3, Anthony wrote:
>>
>> Hard to say what the problem is without seeing the full traceback as well 
>> as your models.
>>
>> Also, what are you trying to do in the check_batch function? You are 
>> looping through some records and making assignments to form.vars, but only 
>> the final run of the loop will end up taking effect -- so what is the point 
>> of the loop?
>>
>> Anthony
>>
>> On Monday, September 26, 2016 at 8:29:35 AM UTC-4, Oasis Agano wrote:
>>>
>>> Greetings
>>> im creating a payroll app and i need a to create a batch of payslips
>>>
>>> i want to create payslips for all contracts in the database within the 
>>> running state
>>>  the code
>>>
>>> def check_batch(form):
>>>
>>>     contraaa = db(db.contract.state == 'Running').select(db.contract.ALL)
>>>     for contraa in contraaa:
>>>
>>>         if contraa.salary_structure == 'Less than 30000':
>>>             totgross=contraa.wage+contraa.allowances
>>>
>>>             form.vars.employee=contraa.employee.fullname
>>>             form.vars.payslip_name=contraa.employee.fullname
>>>             form.vars.contract=contraa.contract_name
>>>
>>>             form.vars.gross=totgross
>>>             form.vars.rssb_emp = totgross*0.03
>>>             form.vars.rssb_comp = totgross*0.05
>>>             form.vars.paye = 0
>>>             totrssb=form.vars.rssb_emp+form.vars.rssb_comp
>>>             form.vars.rssb_tot=form.vars.rssb_emp+form.vars.rssb_comp
>>>             if type(form.vars.loan) !=int :
>>>
>>>                 form.vars.net = totgross-form.vars.rssb_emp
>>>             else:
>>>                 payy=db(db.loanpayment.id == 
>>> form.vars.loan).select(db.loanpayment.ALL)
>>>                 for pay in payy:
>>>                     loanpay=int(pay.amount_payed)
>>>                     form.vars.net = totgross-form.vars.rssb_emp-loanpay
>>>
>>>         elif contraa.salary_structure == 'Between 30000 and 100000':
>>>
>>>             form.vars.employee=contraa.employee.fullname
>>>             form.vars.payslip_name=contraa.employee.fullname
>>>             form.vars.contract=contraa.contract_name
>>>
>>>             totgross=contraa.wage+contraa.allowances
>>>             form.vars.gross=totgross
>>>             form.vars.rssb_emp = totgross*0.03
>>>             form.vars.rssb_comp = totgross*0.05
>>>             varia =totgross-30000
>>>             form.vars.paye = varia*0.2
>>>             totrssb=form.vars.rssb_emp+form.vars.rssb_comp
>>>             form.vars.rssb_tot=form.vars.rssb_emp+form.vars.rssb_comp
>>>             if type(form.vars.loan) !=int :
>>>                 form.vars.net = totgross-form.vars.rssb_emp-form.vars.paye
>>>             else:
>>>                 payy=db(db.loanpayment.id == 
>>> form.vars.loan).select(db.loanpayment.ALL)
>>>                 for pay in payy:
>>>                     loanpay=int(pay.amount_payed)
>>>                     form.vars.net = 
>>> totgross-form.vars.rssb_emp-form.vars.paye-loanpay
>>>
>>>
>>>             #form = SQLFORM(db.payslip)
>>>
>>>
>>>
>>>         elif contraa.salary_structure=='Great than 100000':
>>>
>>>             form.vars.employee=contraa.employee
>>>             form.vars.payslip_name=contraa.employee
>>>             form.vars.contract=contraa.contract_name
>>>
>>>             totgross=contraa.wage+contraa.allowances
>>>             form.vars.gross=totgross
>>>             form.vars.rssb_emp = totgross*0.03
>>>             form.vars.rssb_comp = totgross*0.05
>>>             varia2 =totgross-100000
>>>             variah = varia2*0.3
>>>             varia3 =70000*0.2
>>>             form.vars.paye = variah+varia3
>>>             totrssb=form.vars.rssb_emp+form.vars.rssb_comp
>>>             form.vars.rssb_tot=form.vars.rssb_emp+form.vars.rssb_comp
>>>             if type(form.vars.loan) !=int :
>>>                 form.vars.net = totgross-form.vars.rssb_emp-form.vars.paye
>>>             else:
>>>                 payy=db(db.loanpayment.id == 
>>> form.vars.loan).select(db.loanpayment.ALL)
>>>                 for pay in payy:
>>>                     loanpay=int(pay.amount_payed)
>>>                     form.vars.net = 
>>> totgross-form.vars.rssb_emp-form.vars.paye-loanpay
>>>
>>>             #form = SQLFORM(db.payslip)
>>>
>>>         else:
>>>             response.flash=T('Select a salary structure and contract')
>>>
>>>
>>> def batch_payslip():
>>>        db.payslip.gross.readonly =True
>>>        db.payslip.net.readable =False
>>>        db.payslip.rssb_emp.readable =False
>>>        #db.payslip.salary_structure.readable =False
>>>        db.payslip.rssb_comp.readable =False
>>>        db.payslip.paye.readable =False
>>>        db.payslip.employee.readable =False
>>>        db.payslip.employee.writable =False
>>>        db.payslip.contract.readable =False
>>>        db.payslip.contract.writable =False
>>>        db.payslip.payslip_name.readable =False
>>>        db.payslip.payslip_name.writable =False
>>>        db.payslip.loan.readable =False
>>>        db.payslip.loan.writable =False
>>>        db.payslip.user.readable =False
>>>        db.payslip.user.writable =False
>>>        form = SQLFORM(db.payslip)
>>>
>>>        if form.process(onvalidation=check_batch).accepted:
>>>            response.flash=T('Payslip Added')
>>>        return dict(form=form)
>>>
>>>
>>> im getting this error
>>>
>>> ValueError: invalid literal for long() with base 10: 'with a contract name'
>>>
>>>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to