Posted: 30 Aug 2004 17:14 Post subject: народ помогите, пожалуйста
Мне нужно проставить даты проводок в зависимости от значения поля таблицы SPR_PART. Как аккуратно связать MAIN.dbf->MDOC.dbf->MDOCM.dbf->SPR_PART.dbf. У меня ничего не получается. Желательно кусок кода. PLEASE. Заранее спасибочки.
Joined: 24 May 2004 Posts: 317 Location: Andre Occupation: albumin (programmer) Interests: Новосибирск
Posted: 31 Aug 2004 09:06 Post subject:
с кусочком кода врятли помогу а вот в теории предложение внесу
в базе mdoc и базе mdocm и безе main нет одного ключевого поля, но базы mdoc и mdocm связанны между собой по полю numdoc(это только одно из трех полей по которым я рекомендую создать индекс, другие два vid, sclad) а база mdoc связанна с базой main по полю pro, которое есть main.nnoper, ну а дальше дело техники(легко сказанно ,
DBGOTOP()
DO WHILE !EOF()
IF (Spr_par->Sertificat=="Оплачено")
IF ((Main->DataOper)>Date())
Spr_part->(RecLock())
Main->User_date:=Spr_part->DataOper
Spr_part->(F_DbUnlock())
ELSE
Spr_part->(RecLock())
Main->User_date:=Date()
Spr_part->(F_DbUnlock())
ENDIF
SayAndWait(User_date)
ENDIF
DBSKIP()
ENDDO
Joined: 24 May 2004 Posts: 317 Location: Andre Occupation: albumin (programmer) Interests: Новосибирск
Posted: 31 Aug 2004 11:57 Post subject:
если тебе нуно подставить в дату проводки дату партии я бы попробовал вот как
1.Берем справочник партий, х=номер_партии,а=дата
2.переключаемся в мдокм и сканим там на наличие документов с этим номером партии
3.Нашол? z=summa,переключаешься на мдок у=про и для этого у в майн ставишь дату_документа=а
*-*-*-*
а вот во внутреннем языке БЭСТа я не силен, если есть что почитать, кунь плиз на мыло, буду благодар
Joined: 26 Jul 2002 Posts: 975 Location: Титов Александр Александрович Occupation: Компания БЭСТ Interests: Москва
Posted: 31 Aug 2004 16:54 Post subject: Re: народ помогите, пожалуйста
SLS wrote:
Мне нужно проставить даты проводок в зависимости от значения поля таблицы SPR_PART. Как аккуратно связать MAIN.dbf->MDOC.dbf->MDOCM.dbf->SPR_PART.dbf. У меня ничего не получается. Желательно кусок кода. PLEASE. Заранее спасибочки.
Совокупность проводок по документу относится ко всему документу в целом и не детализируется по строкам. В БЭСТе как раз связка идет наоборот: в документе есть ссылка на группу проводок. А при такой постановке задачи сразу возникают вопросы:
1. Что делать, если в документе несколько партий или не одной?
2. Что делать с проводками, не связанными c накладными?
3. Во все ли проводки по документу надо проставлять одну и ту же дату? _________________ С уважением, Александр Титов, Компания БЭСТ, Москва, отдел разрабо
Posted: 01 Sep 2004 15:23 Post subject: Продолжение обсуждения
1. Что делать, если в документе несколько партий или не одной?
Если в документе не одной нужной партии то дату в main.dbf оставлять без изменений.
2. Что делать с проводками, не связанными c накладными?
Оставлять без изменений.
3. Во все ли проводки по документу надо проставлять одну и ту же дату?
Нет не во все, только Дт 68 кт 19.
Вообще задача стояла так.
Зачесть НДС можно только в момент списания материалла в производство, если этот материал оплачен, или в момент оплаты если этот материал уже списан.(наличие сч./ф. считаем по умолчанию= истина)
Мы пошли по такому пути:
1.Открыли партионный учет.
2.В момент оплаты в реестре документов прихода по Ctrl/F5 <Специальные функции> мы проставляем в справочнике партий в поле сертификат строку "Оплачено", а в поле срок.годности дату оплаты.
3. Потом в момент расхода (списание в производство), хотели бы сделать следующее:
3.1 если данная партия товара не оплачена, то проводку Дт 68 Кт 19 не делать совсем.
3.2 если дата оплаты раньше даты списания то сделать Дт 68 кт 19 датой списания.
3.3. если дата оплаты позже даты списания то сделать Дт 68 кт 19 датой оплаты.
Joined: 26 Jul 2002 Posts: 975 Location: Титов Александр Александрович Occupation: Компания БЭСТ Interests: Москва
Posted: 01 Sep 2004 16:37 Post subject: Re: Продолжение обсуждения
SLS wrote:
1. Что делать, если в документе несколько партий или не одной?
Если в документе не одной нужной партии то дату в main.dbf оставлять без изменений.
2. Что делать с проводками, не связанными c накладными?
Оставлять без изменений.
3. Во все ли проводки по документу надо проставлять одну и ту же дату?
Нет не во все, только Дт 68 кт 19.
Вообще задача стояла так.
Зачесть НДС можно только в момент списания материалла в производство, если этот материал оплачен, или в момент оплаты если этот материал уже списан.(наличие сч./ф. считаем по умолчанию= истина)
Мы пошли по такому пути:
1.Открыли партионный учет.
2.В момент оплаты в реестре документов прихода по Ctrl/F5 <Специальные функции> мы проставляем в справочнике партий в поле сертификат строку "Оплачено", а в поле срок.годности дату оплаты.
3. Потом в момент расхода (списание в производство), хотели бы сделать следующее:
3.1 если данная партия товара не оплачена, то проводку Дт 68 Кт 19 не делать совсем.
3.2 если дата оплаты раньше даты списания то сделать Дт 68 кт 19 датой списания.
3.3. если дата оплаты позже даты списания то сделать Дт 68 кт 19 датой оплаты.
Возможно есть другой способ решения.
Если мы правильно поняли, то где-то примерно так:
Code:
PRIVATE lEnd
dbPush('Spr_Part','Tag_Num')
dbPush('MDoc','MDoc')
DO WHILE !EOF()
dbPush('MDocM','MDocM',,{'UPPER(Sclad+Vid+Type+CodeDoc+NumDoc+DTOS(Date))',MDoc->(UPPER(Sclad+Vid+Type+CodeDoc+NumDoc+DTOS(Date)))})
lEnd:=.F
DO WHILE !EOF() .AND. !lEnd
IF !EMPTY(MDocM->Partia).AND.SPR_PART->(dbSEEK(UPPER(MDOCM->(GRUP+NNUM+Partia)))) .AND. SPR_PART->Sertificat=="Оплачено"
dbPush('MAIN','Tag_NNOper',,{'NNOper',MDoc->Pro})
DO WHILE !EOF() .AND. !lEnd
IF <нужная проводка> .AND. RecLock()
Main->User_date:=Spr_part->DataOper
F_DbUnlock()
lEnd:= .T.
ENDIF
dbSKIP()
ENDDO
dbPop()
ENDIF
dbSKIP()
ENDDO
dbPop()
dbSKIP()
ENDDO
dbPop()
dbPop()
_________________ С уважением, Александр Титов, Компания БЭСТ, Москва, отдел разрабо
Posted: 12 Sep 2004 18:27 Post subject: снова не работает
Здравствуйте, это снова мы, посмотрели только сейчас:
программа заканчивается успешно, но действие после этой строчки не производится: dbPush('MAIN','Tag_NNOper',,{'NNOper',MDoc->Pro})
программа:
PRIVATE lEnd
dbPush('Spr_Part','Tag_Num')
dbPush('MDoc','MDoc')
DO WHILE !EOF()
dbPush('MDocM','MDocM',,{'UPPER(Sclad+Vid+Type+CodeDoc+NumDoc+DTOS(Date))',MDoc->(UPPER(Sclad+Vid+Type+CodeDoc+NumDoc+DTOS(Date)))})
lEnd:=.F
DO WHILE !EOF() .AND. !lEnd
IF !EMPTY(MDocM->Partia).AND.SPR_PART->(dbSEEK(UPPER(MDOCM->(GRUP+NNUM+Partia)))) .AND. SPR_PART->Sertificat=="Оплачено"
dbPush('MAIN','Tag_NNOper',,{'NNOper',MDoc->Pro})
DO WHILE !EOF() .AND. !lEnd
IF <нужная проводка> .AND. RecLock()
Main->User_date:=Spr_part->DataOper
F_DbUnlock()
lEnd:= .T.
ENDIF
dbSKIP()
ENDDO
dbPop()
ENDIF
dbSKIP()
ENDDO
dbPop()
dbSKIP()
ENDDO
dbPop()
dbPop()
Joined: 26 Jul 2002 Posts: 975 Location: Титов Александр Александрович Occupation: Компания БЭСТ Interests: Москва
Posted: 13 Sep 2004 07:51 Post subject: Re: снова не работает
SLS wrote:
Здравствуйте, это снова мы, посмотрели только сейчас:
программа заканчивается успешно, но действие после этой строчки не производится: dbPush('MAIN','Tag_NNOper',,{'NNOper',MDoc->Pro})
программа:
PRIVATE lEnd
dbPush('Spr_Part','Tag_Num')
dbPush('MDoc','MDoc')
DO WHILE !EOF()
dbPush('MDocM','MDocM',,{'UPPER(Sclad+Vid+Type+CodeDoc+NumDoc+DTOS(Date))',MDoc->(UPPER(Sclad+Vid+Type+CodeDoc+NumDoc+DTOS(Date)))})
lEnd:=.F
DO WHILE !EOF() .AND. !lEnd
IF !EMPTY(MDocM->Partia).AND.SPR_PART->(dbSEEK(UPPER(MDOCM->(GRUP+NNUM+Partia)))) .AND. SPR_PART->Sertificat=="Оплачено"
dbPush('MAIN','Tag_NNOper',,{'NNOper',MDoc->Pro})
DO WHILE !EOF() .AND. !lEnd
IF <нужная проводка> .AND. RecLock()
Main->User_date:=Spr_part->DataOper
F_DbUnlock()
lEnd:= .T.
ENDIF
dbSKIP()
ENDDO
dbPop()
ENDIF
dbSKIP()
ENDDO
dbPop()
dbSKIP()
ENDDO
dbPop()
dbPop()
Так Вы приведите точный текст программы. Вам дана была заготовка, на основе которой надо было прописать программу, по крайней мере вместо слов <нужная проводка> надо написать логические условия принадлежности проводки к нужному множеству, например TRIM(Main->Dt_Schet) == "68".AND. TRIM(Main->Kt_Schet)="19"
Если это и есть точный текст программы, то конечно работать не будет. _________________ С уважением, Александр Титов, Компания БЭСТ, Москва, отдел разрабо
PRIVATE lEnd, dbName
dbName="MAIN"
dbPush('Spr_Part','Tag_Num')
dbPush('MDoc','MDoc')
DO WHILE !EOF()
dbPush('MDocM','MDocM',,{'UPPER(Sclad+Vid+Type+CodeDoc+NumDoc+DTOS(Date))',MDoc->(UPPER(Sclad+Vid+Type+CodeDoc+NumDoc+DTOS(Date)))})
lEnd:=.F.
DO WHILE !EOF() .AND. !lEnd
SayAndWait("1")
IF EMPTY(MDocM->Partia).AND.IF SPR_PART->(dbSEEK(UPPER(MDOCM->(GRUP+NNUM+Partia)))).AND.ALLTRIM(SPR_PART->Sertificat)=="Оплачено"
SayAndWait("2")
// После этого программа идет на ENDIF
dbName="MAIN"
NETUSE(dbName)
SayAndWait("3")
dbPush('MAIN','Tag_NNOper',,{'NNOper',MDoc->Pro})
SayAndWait("4")
DO WHILE !EOF() .AND. !lEnd
IF LEFT(Main->Dt_schet,2)=="68" .AND. LEFT(Main->Kt_schet,2)=="19" .AND. (Spr_part->DataEnd>Mdoc->Date)
RecLock()
Main->DataOper:=Spr_part->DataEnd
F_DbUnlock()
lEnd:= .T.
ENDIF
dbSKIP()
ENDDO
dbPop()
ENDIF
dbSKIP()
ENDDO
dbPop()
dbSKIP()
ENDDO
dbPop()
dbPop()
В о п р о с
SayAndWait("1")-проходит
SayAndWait("2")-тожэ
SayAndWait("3")- НЕТ
SayAndWait("3")- ТОЖЭ НЕТ
пробовали и NETUSE(Main) и
dbPush('MAIN','Tag_NNOper',,{'NNOper',MDoc->Pro})
Мне кажется что просто не видит MAIN.DBF или доступ к нему закрыт.
происходит как будто стоит
"On Error GoTo endIf". Что дела
Joined: 26 Jul 2002 Posts: 975 Location: Титов Александр Александрович Occupation: Компания БЭСТ Interests: Москва
Posted: 14 Sep 2004 08:03 Post subject:
*Andrey wrote:
п р о г р а м м а:
PRIVATE lEnd, dbName
dbName="MAIN"
dbPush('Spr_Part','Tag_Num')
dbPush('MDoc','MDoc')
DO WHILE !EOF()
dbPush('MDocM','MDocM',,{'UPPER(Sclad+Vid+Type+CodeDoc+NumDoc+DTOS(Date))',MDoc->(UPPER(Sclad+Vid+Type+CodeDoc+NumDoc+DTOS(Date)))})
lEnd:=.F.
DO WHILE !EOF() .AND. !lEnd
SayAndWait("1")
IF EMPTY(MDocM->Partia).AND.IF SPR_PART->(dbSEEK(UPPER(MDOCM->(GRUP+NNUM+Partia)))).AND.ALLTRIM(SPR_PART->Sertificat)=="Оплачено"
SayAndWait("2")
// После этого программа идет на ENDIF
dbName="MAIN"
NETUSE(dbName)
SayAndWait("3")
dbPush('MAIN','Tag_NNOper',,{'NNOper',MDoc->Pro})
SayAndWait("4")
DO WHILE !EOF() .AND. !lEnd
IF LEFT(Main->Dt_schet,2)=="68" .AND. LEFT(Main->Kt_schet,2)=="19" .AND. (Spr_part->DataEnd>Mdoc->Date)
RecLock()
Main->DataOper:=Spr_part->DataEnd
F_DbUnlock()
lEnd:= .T.
ENDIF
dbSKIP()
ENDDO
dbPop()
ENDIF
dbSKIP()
ENDDO
dbPop()
dbSKIP()
ENDDO
dbPop()
dbPop()
В о п р о с
SayAndWait("1")-проходит
SayAndWait("2")-тожэ
SayAndWait("3")- НЕТ
SayAndWait("3")- ТОЖЭ НЕТ
пробовали и NETUSE(Main) и
dbPush('MAIN','Tag_NNOper',,{'NNOper',MDoc->Pro})
Мне кажется что просто не видит MAIN.DBF или доступ к нему закрыт.
происходит как будто стоит
"On Error GoTo endIf". Что делать?
Зачем писать во все места?
Мы же с Вами общаемся личными сообщениями. В течение часа Вам будет выслан рабочий вариан _________________ С уважением, Александр Титов, Компания БЭСТ, Москва, отдел разрабо
Posted: 14 Sep 2004 09:48 Post subject: Re: Продолжение обсуждения
SLS wrote:
Зачесть НДС можно только в момент списания материалла в производство, если этот материал оплачен, или в момент оплаты если этот материал уже списан.
Я могу ошибаться, но кажется этот порядок уже не действует.
И НДС по оплаченным материалам можно зачесть по моменту оприходования на склад, а не по факту "списания в производство".
Или это строительство?
Last edited by Яков on 15 Sep 2004 03:29; edited 1 time in total
Ну все, вопрос решили хотя и как то не красиво получилось но работает.
Теперь в типовых операциях ставим проводку на забалансовый аналитический счет скажем "МТ" с кодом аналитики
равным "0"+pPart, это чтобы разбить суммы проводок по партиям, т.к. в документе расхода могут быть партии с разными датами оплаты.
Потом программой меняем дату, Дтсчет и КтСчет в зависимости от ситуации.(или уже оплатили потом спмсали, или списали потом оплатили и т.д.)
Один вопрос остался как быть с частичной оплатой? Но заниматься уже некокда время поджимает (да и как сделать не придумал еще). Попробуем так поработать, а там видно будет.
Спасибо за поддержку сам бы не осилил.
Вот код:
PRIVATE lEnd,Mdata,n
n:=0
DBPUSH()
MDOC->(dbPush())
MDOCM->(dbPush())
SPR_PART->(dbPush())
NetUse("MAIN",LoadPath()+"MAIN")
MAIN->(OrdSetFocus("TAG_NNOPER"))
MDOCM->(OrdSetFocus("MDOCM"))
//MDOC->(SetScope()) --- если нужно пройтись по всем складам - это строчку надо раскомментировать
MDOC->(dbGoTop())
WHILE !MDOC->(EOF().OR.BOF())
MDOCM->(SetScope())
MDOCM->(SetScope('UPPER(Sclad+Vid+Type+CodeDoc+NumDoc+DTOS(Date))',MDoc->(UPPER(Sclad+Vid+Type+CodeDoc+NumDoc+DTOS(Date)))))
MDOCM->(dbGoTop())
lEnd:=.F.
MDOCM->(dbGoTop())
WHILE !MDOCM->(EOF().OR.BOF()) .AND. !lEnd
IF !EMPTY(MDocM->Partia).AND.SPR_PART->(dbSEEK(UPPER(MDOCM->(GRUP+NNUM+Partia)))) .AND. AllTrim(SPR_PART->Sertificat)=="ЋЇ« 祮".AND. (Spr_part->Data_End>Mdoc->Date)
MAIN->(SetScope())
MAIN->(SetScope("NNOPER",MDOC->PRO))
MAIN->(dbGoTop())
WHILE !MAIN->(EOF().OR.BOF()) .AND. !lEnd
// IF ALLTRIM(Main->Dt_Schet) == "6803".AND. ALLTRIM(Main->Kt_Schet)=="193".AND. RecLock()
IF ALLTRIM(Main->Dt_Schet) == "MT".AND. ALLTRIM(Main->Dt_Code)=="0"+MDocM->Partia.AND. RecLock()
//SayAndWait("Ок")
F_DbUnlock()
//lEnd:= .T. // если комментарии проводок одинаковые, эту строчку можно раскомментировать. А можно не раскомментировать.
ENDIF
MAIN->(dbSKIP())
ENDDO
ENDIF
MDOCM->(dbSKIP())
ENDDO
MDOC->(dbSKIP())
ENDDO
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