My app was working fine with Version 1.99.2. I upgrade to Version 2.1.1 and
it shows this error.
I'm using DB2 for my database. PDTFF is new table defined by web2py so it
has id field but the others are existing and doesn't have id field.
*Traceback (most recent call last):*
File "C:\web2py\gluon\restricted.py", line 209, in restricted
exec ccode in environment
File "C:/web2py/applications/fedex/controllers/default.py", line 205, in
<module>
File "C:\web2py\gluon\globals.py", line 187, in <lambda>
self._caller = lambda f: f()
File "C:\web2py\gluon\tools.py", line 2838, in f
return action(*a, **b)
File "C:/web2py/applications/fedex/controllers/default.py", line 116, in
next
form = SQLFORM(db.PDTFF,record)
File "C:\web2py\gluon\sqlhtml.py", line 1038, in __init__
inp = self.widgets.options.widget(field, default)
File "C:\web2py\gluon\sqlhtml.py", line 226, in widget
options = requires[0].options()
File "C:\web2py\gluon\validators.py", line 2500, in _options
options = self.other.options()
File "C:\web2py\gluon\validators.py", line 484, in options
self.build_set()
File "C:\web2py\gluon\validators.py", line 471, in build_set
records = self.dbset(table).select(*fields, **dd)
File "C:\web2py\gluon\dal.py", line 8726, in __call__
query = self.db._adapter.id_query(query)
File "C:\web2py\gluon\dal.py", line 631, in id_query
return table._id != None
File "C:\web2py\gluon\dal.py", line 7636, in __getitem__
return ogetattr(self, str(key))
AttributeError: 'Table' object has no attribute '_id'
*Function argument list*
(self=<Table TDMKNP00 (KNCTCD,KNKNCD,KNKNNM)>, key='_id')
*Model*
# coding: utf8
# Employee info table on HELPDESK
dbh.define_table('tbluser',
Field('name', length=255),
Field('location', length=255),
Field('emailaddress', length=255))
# Dept Master
db.define_table('TDMBUP01',
Field('BUSEC1', length=3),
Field('BUBURK', length=12),
primarykey=['BUSEC1'])
# Country Master
db.define_table('TDMCNP00',
Field('CNCNCD', length=3),
Field('CNCNNM', length=30),
primarykey=['CNCNCD'])
# Area 2 Master
db.define_table('TDMKNP00',
Field('KNCTCD', length=3),
Field('KNKNCD', length=2),
Field('KNKNNM', length=30),
primarykey=['KNCTCD','KNKNCD'])
# Purchase Order
db.define_table('SDTH2P01',
Field('H2DNO', length=8),
Field('H2TRD1', 'integer'),
Field('H2JJDN', length=8),
Field('H2JJGN', 'integer'),
Field('H2JDNO', length=8),
Field('H2JGNO', 'integer'),
Field('H2JCSC', length=3),
Field('H2HSKB', length=1),
Field('H2KSM', length=3),
Field('H2PRCD', length=15),
Field('H2PRKJ', length=50),
Field('H2TRS', 'integer'),
Field('H2HZS', 'integer'),
primarykey=['H2DNO'])
# Open FedEx Purchase Order
db.define_table('SDTH2PF1',
Field('H2DNO', length=8),
Field('H2TRD1', 'integer'),
Field('H2JJDN', length=8),
Field('H2JJGN', 'integer'),
Field('H2JDNO', length=8),
Field('H2JGNO', 'integer'),
Field('H2JCSC', length=3),
Field('H2HSKB', length=1),
Field('H2KSM', length=3),
Field('H2PRCD', length=15),
Field('H2PRKJ', length=50),
Field('H2TRS', 'integer'),
Field('H2HZS', 'integer'),
primarykey=['H2DNO'])
# Received Order
db.define_table('SDTJ2P00',
Field('J2DNO', length=8),
Field('J2GNO', 'integer'),
Field('J2TSCD',length=8),
Field('J2TSK1',length=35),
Field('J2TSK2',length=35),
Field('J2TSPE',length=22),
Field('J2ODA1',length=30),
Field('J2ODA2',length=30),
Field('J2ODA7',length=20),
Field('J2KNCD',length=2),
Field('J2CNCD',length=3),
Field('J2OYUB',length=10),
Field('J2OTEL',length=20),
Field('J2KYSC',length=12),
Field('J2NSD','integer'),
primarykey=['J2DNO','J2GNO'])
# FedEx Request Output file
db.define_table('PDTFF',
Field('FFDNO', length=8, label='HJ#'),
Field('FFTRD', 'date', label="Requested"),
Field('FFJCSC', length=3, label="Dept"),
Field('FFBURK', length=12, label="Dept Name"),
Field('FFJDNO', length=8, label="JJ#"),
Field('FFJGNO', 'integer', label="JJ line#"),
Field('FFJJDN', length=8, label="J# (JP)"),
Field('FFJJGN', 'integer', label="J line# (JP)"),
Field('FFACCT', length=9, label="FedEx Acct #"),
Field('FFCUST', length=30, label="Company Name"),
Field('FFNSD', 'date',label="Delivery Due"),
Field('FFPRCD', length=15,label="Product Code"),
Field('FFPRKJ', length=50,label="Part Number"),
Field('FFTRS', 'integer',label="Quantity"),
Field('FFTSK1',length=35,label="Name 1"),
Field('FFTSK2',length=35,label="Name 2"),
Field('FFTSPE',length=22,label="Attn:"),
Field('FFODA1',length=30,label="Address 1"),
Field('FFODA2',length=30,label="Adderss 2"),
Field('FFODA7',length=20,label="City"),
Field('FFKNCD',length=2,label="State"),
Field('FFCNCD',length=3,label="Country"),
Field('FFOYUB',length=10,label="Zip"),
Field('FFOTEL',length=20,label="Phone"),
Field('FFKYSC',length=12,label="Customer Order#"),
Field('FFSPCL','boolean',label="Special Instruction"),
Field('FFJPKB','boolean',label="JP Confirmed"),
Field('FFRMKS',length=128,label="Remarks"),
Field('FFCUSR',length=128,label="Created by"),
Field('FFCDAT','datetime',label="Created on"),
Field('FFUUSR',length=128,label="Updated by"),
Field('FFUDAT','datetime',label="Updated on"),
)
db.PDTFF.FFDNO.writable = False
db.PDTFF.FFTRD.writable = False
db.PDTFF.FFTRD.requires=IS_DATE(format='%m/%d/%y')
db.PDTFF.FFJCSC.writable = False
db.PDTFF.FFBURK.writable = False
db.PDTFF.FFJDNO.writable = False
db.PDTFF.FFJGNO.writable = False
db.PDTFF.FFJJDN.writable = False
db.PDTFF.FFJJGN.writable = False
db.PDTFF.FFPRCD.writable = False
db.PDTFF.FFPRKJ.writable = False
db.PDTFF.FFACCT.requires=[IS_NOT_EMPTY(),IS_UPPER(),IS_LENGTH(9,9,error_message='enter
9 characters'),IS_UPPER()]
db.PDTFF.FFCUST.requires=[IS_NOT_EMPTY(),IS_LENGTH(30,1),IS_UPPER()]
db.PDTFF.FFNSD.requires=IS_DATE(format='%m/%d/%y',error_message='enter date
as mm/dd/yy')
db.PDTFF.FFTRS.requires=IS_INT_IN_RANGE(1,99999999,error_message='Cannot
exceed 99,999,999')
db.PDTFF.FFTSK1.requires=[IS_NOT_EMPTY(),IS_LENGTH(35,1),IS_UPPER()]
db.PDTFF.FFTSK2.requires=IS_NULL_OR([IS_LENGTH(35,1),IS_UPPER()])
db.PDTFF.FFTSPE.requires=IS_NULL_OR([IS_LENGTH(22,1),IS_UPPER()])
db.PDTFF.FFODA1.requires=[IS_NOT_EMPTY(),IS_LENGTH(30,1),IS_UPPER()]
db.PDTFF.FFODA2.requires=IS_NULL_OR([IS_LENGTH(30,1),IS_UPPER()])
db.PDTFF.FFODA7.requires=[IS_NOT_EMPTY(),IS_LENGTH(20,1),IS_UPPER()]
# Dropdown list from Area 2 Master
db.PDTFF.FFKNCD.requires=IS_NULL_OR(IS_IN_DB(db,'TDMKNP00.KNKNCD','%(KNKNNM)s'))
db.PDTFF.FFOYUB.requires=[IS_NOT_EMPTY(),IS_LENGTH(20,1),IS_UPPER()]
# Dropdown list from Country Master
db.PDTFF.FFCNCD.requires=IS_IN_DB(db,'TDMCNP00.CNCNCD','%(CNCNNM)s')
db.PDTFF.FFOTEL.requires=[IS_NOT_EMPTY(),IS_LENGTH(20,1),IS_UPPER()]
db.PDTFF.FFKYSC.requires=[IS_NOT_EMPTY(),IS_LENGTH(12,1),IS_UPPER()]
db.PDTFF.FFJPKB.writable = False
db.PDTFF.FFRMKS.requires=IS_NULL_OR([IS_LENGTH(128,1),IS_UPPER()])
db.PDTFF.FFCUSR.writable = False
db.PDTFF.FFCDAT.writable = False
db.PDTFF.FFCDAT.requires=IS_DATETIME(format='%m/%d/%y %H:%M:%S')
db.PDTFF.FFUUSR.writable = False
db.PDTFF.FFUDAT.writable = False
db.PDTFF.FFUDAT.requires=IS_DATETIME(format='%m/%d/%y %H:%M:%S')
*Controller*
def next():
keyHJ = request.args(0) or redirect(URL('index'))
record = db.PDTFF(db.PDTFF.FFDNO==keyHJ)
hj = db.SDTH2P01(db.SDTH2P01.H2DNO==keyHJ)
# Get information from purcharse order transaction
db.PDTFF.FFDNO.default = hj.H2DNO.strip()
db.PDTFF.FFPRCD.default = hj.H2PRCD.strip()
db.PDTFF.FFPRKJ.default = hj.H2PRKJ.strip()
db.PDTFF.FFTRS.default = int(hj.H2TRS)
db.PDTFF.FFJJDN.default = hj.H2JJDN.strip()
db.PDTFF.FFJJGN.default = hj.H2JJGN
db.PDTFF.FFJDNO.default = hj.H2JDNO.strip()
db.PDTFF.FFJGNO.default = hj.H2JGNO
db.PDTFF.FFJCSC.default = hj.H2JCSC.strip()
# Get Dept name
if hj.H2JCSC<>"":
bu = db.TDMBUP01(db.TDMBUP01.BUSEC1==hj.H2JCSC)
db.PDTFF.FFBURK.default = bu.BUBURK.strip() or None
key1 = hj.H2JDNO
key2 = hj.H2JGNO
jj = db.SDTJ2P00((db.SDTJ2P00.J2DNO==key1) & (db.SDTJ2P00.J2GNO==key2))
# Get Received Order information if exist
if jj <> None:
db.PDTFF.FFKYSC.default = jj.J2KYSC.strip()
db.PDTFF.FFTSK1.default = jj.J2TSK1.strip()
db.PDTFF.FFTSK2.default = jj.J2TSK2.strip()
db.PDTFF.FFTSPE.default = jj.J2TSPE.strip()
db.PDTFF.FFODA1.default = jj.J2ODA1.strip()
db.PDTFF.FFODA2.default = jj.J2ODA2.strip()
db.PDTFF.FFODA7.default = jj.J2ODA7.strip()
db.PDTFF.FFKNCD.default = jj.J2KNCD.strip()
db.PDTFF.FFOYUB.default = jj.J2OYUB.strip()
db.PDTFF.FFCNCD.default = jj.J2CNCD.strip()
db.PDTFF.FFOTEL.default = jj.J2OTEL.strip()
import datetime
y = int(str(jj.J2NSD)[0:4])
m = int(str(jj.J2NSD)[4:6])
d = int(str(jj.J2NSD)[6:8])
db.PDTFF.FFNSD.default = datetime.date(y, m, d)
# Login User and current date
user = dba.auth_user(auth.user_id)
db.PDTFF.FFCUSR.default = user.username.upper()
db.PDTFF.FFCDAT.default = request.now
db.PDTFF.FFTRD.default = request.now.date
# Form editable or readonly
if record == None and hj.H2HZS>0: # New entry
form = SQLFORM(db.PDTFF,record)
form.vars.FFUUSR = user.username.upper()
form.vars.FFUDAT = request.now
if request.vars.FFSPCL == 'on': # Automatically set JP Checked if
not Special Instruction
form.vars.FFJPKB = False
else:
form.vars.FFJPKB = True
elif record <> None and record.FFJPKB<>True and hj.H2HZS>0: # Update
when JP Chcked is unchcked
# Only editable by Admin
if auth.has_membership(role = 'admin'):
db.PDTFF.FFJPKB.writable = True
form = SQLFORM(db.PDTFF,record)
form.vars.FFUUSR = user.username.upper()
form.vars.FFUDAT = request.now
elif record <> None and record.FFJPKB==True and hj.H2HZS>0 and
auth.has_membership(role = 'admin'): # Update when JP Chcked is chcked.
Only Admin can edit the form
db.PDTFF.FFJPKB.writable = True
form = SQLFORM(db.PDTFF,record)
form.vars.FFUUSR = user.username.upper()
form.vars.FFUDAT = request.now
else:
form = SQLFORM(db.PDTFF,record, readonly=True) # Read only
if form.process(onvalidation=spcheck).accepted:
session.flash = 'Form accepted'
redirect(URL(request.args(1)))
elif form.errors:
response.flash = 'Form has errors'
return dict(form=form)
--