все примитивно
вот например расчет износа по карточкам ОС
вся эта байда вызывается из из меню ДЕЙСТВИЯ грида к карточками
сам грид в том коде присутствует как переменная
memтаблица БД, отображаемая этим гридом, доступна через
mem.tв свою очередь объект таблица имеет:
методы навигации (last, first, next, prev)
объект
r для доступа к текущей записи
т.е. строка
zzMess(mem.t.r.name) выведет модальное окно с содержимым поля
nameкусок в конце организует окно диалога с запросом даты и двумя кнопками
на кнопки прицеплены обработчики
внутри обработчика как раз видно, как можно обратиться к содержимому окна
acnt.s.edв данном случае получаем текст даты
можно и присвоить
acnt.s.ed='2012-01-08'примерно так же получаем widget со всеми потрохами
acnt.w.edнапример acnt.w.ed.setFocus()
MyApp.myDataBase.setrow записывает запись в таблицу
MyApp.myDataBase знает все о ссылочной целостности и не допустит фигни
кстати, надо вписать обработчик неудачной записи ( MyApp.myDataBase.setrow вернет False)
def amcnt(mem,acnt):
def realcnt():
if int(acnt.s.ed[-2:])!=1:
zzMess(u"Начисление амортизации производится только <b>первым</b> числом месяца!")
return
kuos=MyApp.myDataBase.kuos
kuos.setFilter(mem.t.filter())
kuos.refresh()
pb=zzProgressBar(barText=u"Расчет амортизации",barMax=kuos.rowCount())
pb.show()
counted=0
while not kuos.eof():
if zzYearM(kuos.r.date_out)>=zzYearM(acnt.s.ed) or kuos.r.date_out=="" or \
(kuos.r.year_acnt and zzYear(kuos.r.date_out)>zzYear(acnt.s.ed)):#не выбыло еще
makeAcnt=False
kuos_a=zzCursor("select * from kuos_a where os=%s order by date" % kuos.r.os)
kuos_i=zzCursor("select * from kuos_i where os=%s and date<'%s' order by date" % (kuos.r.os,acnt.s.ed))
kuos_i.last()
if kuos_a.eof():#объект только что переступил, или это первый расчет
if zzYearM(kuos.r.date_in)<zzYearM(acnt.s.ed):
makeAcnt=True
a_iznos=kuos.r.beg_amrt
a_cost=kuos.r.beg_cost
else:
kuos_a.last()
if kuos_a.r.date>=acnt.s.ed:#уже есть строки
pass
elif (int(zzMonth(acnt.s.ed))+int(zzYear(acnt.s.ed))*12)- (int(zzMonth(kuos_a.r.date))+int(zzYear(kuos_a.r.date))*12) >1 \
and not kuos.r.year_acnt:
zzMess(u"""Нарушена последовательность расчета по карточке №<b>%s</b><br>
Дата последней операции <b>%s</b><br>
Расчет будет прерван!!!""" % \
(kuos.r.os,dtoc(kuos_a.r.date)))
break
elif kuos.r.year_acnt and int(zzMonth(acnt.s.ed))!=12:#годовой расчет только в декабре
pass
elif (int(zzYear(acnt.s.ed))-int(zzYear(kuos_a.r.date))) >1 \
and kuos.r.year_acnt and int(zzMonth(acnt.s.ed))==12:#годовой расчет
zzMess(u"""Нарушена последовательность расчета по карточке №<b>%s</b><br>
Дата последней операции <b>%s</b><br>
Расчет будет прерван!!!""" % \
(kuos.r.os,dtoc(kuos_a.r.date)))
break
else:
makeAcnt=True
a_iznos=kuos_a.r.amrt_sum
a_cost=kuos_a.r.cost
if makeAcnt:#сам расчет
counted+=1
if kuos.r.year_acnt:
srok=int(kuos.r.srok_2012y)
srok_rl=int(zzYear(acnt.s.ed))-(int(zzYear(kuos.r.date_vv)))
iznos=round((num(a_cost)-num(a_iznos))/(srok-srok_rl),0)
pass
else:
te_vv))*12+int(zzMonth(kuos.r.date_vv))))-1
srok=int(kuos.r.srok_2012y)*12+int(kuos.r.srok_2012m)
if srok-srok_rl>0:
iznos=round((num(a_cost)-num(a_iznos))/(srok-srok_rl),0)
else:
iznos=0
if num(iznos)!=0:#пробуем применить поправочный коэффициент
kuos_ga=zzCursor("""select *
from kuos_ga
where os=%s and date1<='%s ' and (date2>'%s' or date2<='0000-00-00')
order by date1""" % (kuos.r.os,acnt.s.ed,acnt.s.ed))
if not kuos_ga.eof():
if num(kuos_ga.r.amrt)!=0:
iznos=kuos_ga.r.amrt
else:
iznos=num(round(num(iznos)*num(kuos_ga.r.kof),0))
MyApp.myDataBase.setrow("kuos_a",\
{'OS':kuos.r.os,
'DATE':acnt.s.ed,
'COST':a_cost,
'AMRT_SUM':num(a_iznos)+num(iznos),
'AMRT':num(iznos),
'AMRT_DB':kuos_i.r.amrt_db,
'AMRT_CR':kuos_i.r.amrt_cr,
'RECTYPE':1,
},append=True)
kuos.next()
pb.step()
pb.close()
zzMess(u"Расчитано карточек: <b>%s</b>" % counted)
if counted:
mem.refresh()
return realcnt
def dmcnt(mem,acnt):
def realcnt():
kuos=MyApp.myDataBase.kuos
kuos.setFilter(mem.t.filter())
kuos.refresh()
pb=zzProgressBar(barText=u"Удаление расчета",barMax=kuos.rowCount())
pb.show()
counted=0
while not kuos.eof():
pb.step()
counted+=1
zzCursor("delete from kuos_a where os=%s and date='%s' and rectype=1" % (kuos.r.os,acnt.s.ed))
kuos.next()
pb.close()
zzMess(u"Обработано карточек: <b>%s</b>" % counted)
mem.refresh()
return realcnt
acnt=sc()
acnt.addLine("ed",u"Расчет на дату",type="DATE",value="%s-01" % today()[:7])
acnt.addClose()
acnt.addHorz()
acnt.addLine("<S")
acnt.addLine("go1",u"",pic=u"B Рассчитать",len=15,valid=amcnt(mem,acnt))
acnt.addLine("go1",u"",pic=u"B Удалить расчет",len=15,valid=dmcnt(mem,acnt))
acnt.addLine("<S")
acnt.addClose()
acnt.runForm(u"Расчет амортизации",buttons="!q")