Joined: 15 Mar 2005 Posts: 60 Location: Гаклин Владимир Ильич Occupation: ООО БэстСиб, консультант Interests: Новосибирск
Posted: 14 Sep 2005 07:32 Post subject: Проблема с заполнением многомерного массива
Делаю спецфункцию для пакетного формирования записей в книгу продаж. При переборе строк счет-фактуры у меня получается трехуровневый массив, где количество элементов первого уровня соответствует количеству ставок НДС в счет-фактуре.
Но КАК потом записать этот массив в BOOK->SUM_DATA как один элемент четырехуровневого массива - уже второй день голову ломаю. Подскажите, pls.
Попутно еще вопрос - поставив скоб на BOOK по одному индексу и не найдя записи, нужно поставить скоб по другому индексу для NEXT(новый номер) - у меня получается совсем некрасиво, внутри IF. А как правильнее сделать?
Code:
function main
//вызов из реестра счет-фактур
local Mnds1,Mnds2,ln,x,x2,x3,a,b
//размер поля nnoper (до 12-й версии д.б. 7, с нее и выше - 17)
ln:=17
//для
altd()
//массив с кодами ставок НДС
Mnds1:={}
//массив с кодами и суммами по ставкам НДС
Mnds2:={}
//накопим суммы по строкам счет-фактуры (по ставкам НДС)
dbpush("sh_op","tag_type","",{"STR(NNOPER_,ln,0)",str(sh_fact->nnoper,ln,0)})
do while sh_op->(!eof())
x:=ascan(Mnds1,sh_op->oper_nds)
if x>0
Mnds2[x][1][1]:=Mnds2[x][1][1]+sh_op->summa_fact
Mnds2[x][3][1]:=Mnds2[x][3][1]+sh_op->summa_nds
else
aADD(Mnds1,sh_op->oper_nds)
aADD(Mnds2,{{sh_op->summa_fact,.F.},{sh_op->oper_nds,.F.},{sh_op->summa_nds,.F.}})
endif
sh_op->(dbskip())
enddo
dbpop("sh_op")
//теперь книга продаж ...
dbpush("book","tag_fact","",{"str(oper_fact,ln,0)",str(sh_fact->nnoper,ln,0)})
if book->(eof())
//если нет-получаем порядковый номер
dbpop("book")
dbpush("book","tag_num","left(dtos(tek_data),4)=left(dtos(sh_fact->tek_data),4)")
dbgobottom()
x2:=next(tek_nomer)
dbpop("book")
dbpush("book","tag_fact","",{"str(oper_fact,ln,0)",str(sh_fact->nnoper,ln,0)})
//и создаем новую
x:=IncStep("BOOKOPER")
book->(addrec())
book->nnoper:=x
book->oper_fact:=sh_fact->nnoper
book->oper_st:=-1
book->tek_data:=sh_fact->tek_data
book->tek_nomer:=x2
book->type:='1'
book->summa_fact:=sh_fact->summa_fact
book->summa_nds:=sh_fact->summa_nds
book->arxiv:=.f.
book->summa_csh:=sh_fact->summa_csh
book->l_cs:=.f.
//book->sum_data:=???
book->(f_dbunlock())
else
//если есть запись в книге продаж - правим
endif
dbpop("book")
return
//теперь книга продаж ...
dbpush("book","tag_fact","",{"str(oper_fact,ln,0)",str(sh_fact->nnoper,ln,0)})
if book->(eof())
Здесь бы я просто
BOOK->( ORDSETFOCUS("tag_fact"))
IF BOOK->( DBSEEK(.........) )
А дальше бы обходился просто SETSCOPE() или DBSEEK()
Вообще слишком часто DBPUSH на мой взгляд не есть гуд - я вообще очень редко применяю, может оно и не правильно, конечно но как правило в начале и в конце программы разумно и в начале и в конце отдельных внутренних функций. Это моя точка зрения
Да со строением я "научным тыком" разобрался, но у меня получается трехуровневый массив, а в SUM_DATA он должен встать как один элемент четырехуровневого. Вот с этим проблема...
Здесь бы я просто
BOOK->( ORDSETFOCUS("tag_fact"))
IF BOOK->( DBSEEK(.........) )
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum