Страница 1 из 1
					
				Заполнение партий в накладной
				Добавлено: 10 окт 2005, 22:43
				 hope
				Добрый день!
В накладной на отпуск ввели: с какого склада она будет списана, с какого МОЛ, какие МЦ и количество. Не введена только партия МЦ.
Нужно автоматически заполнить партию для каждой позиции МЦ, по которой есть наличие на складе на дату накладной.
Нужно как-то узнать на какой партии есть наличие на конкретную дату по конкретной МЦ на конкретном складе и конкретном МОЛ.
Как это можно сделать? Использовать функцию NalT? Но это надо будет для каждой МЦ пробегать цикл по всем партиям? (партии не привязываются к МЦ).
Или есть другие варианты?
Может быть есть стандарные функции типа "автозаполнение партий по наличию"?
Спасибо!
			 
			
					
				
				Добавлено: 11 окт 2005, 07:06
				 san
				стандартная ф-ция ctrl-f2 ,выбрать партию из текущих остатков.
			 
			
					
				
				Добавлено: 11 окт 2005, 10:11
				 hope
				в накладной м.б. около 1000 позиций - не нажимаешься CTRL+F2.
			 
			
					
				
				Добавлено: 11 окт 2005, 11:10
				 Diman
				Нету, по крайней мере в 7.1, писали сами.
			 
			
					
				
				Добавлено: 11 окт 2005, 11:11
				 san
				а наличие что тебе даст, будешь бегать по таблице партий и для каждой мц узнавать если на этой партии по ней остаток или нет. такой алгоритм может работать медленее чем вы руками все заколотите. я бы воспользовался ф-цей store_run из оборотной ведомости, которая сбрасывает данные в tmpsaldo  и по tmpsaldo подбирал бы партию с подходящим количеством....
			 
			
					
				
				Добавлено: 11 окт 2005, 15:07
				 hope
				Diman!  вы писали сами - какая у вас логика поиска партий?
San! каждый день сидеть и подбирать вручную партии? хочется упростить жизнь, хоть немножко.
Ведь формируется же оборотка по остаткам на складе! 
Что за функция store_run ? Можно поподробнее?
			 
			
					
				
				Добавлено: 12 окт 2005, 22:36
				 Diman
				Вычисляем остатки МЦ по партиям, кладем во временную таблицу, затем по этим данным подбираем партии. Могу попробовать отыскать в  своих старых исходниках интерфейсу поиска остатков. Интерфейса вычисляет все остатки, но если влепить несколько условий будет работать по конкретным МЦ, и даже наверное быстрее.
			 
			
					
				
				Добавлено: 13 окт 2005, 08:05
				 hope
				Если несложно - поищите ваш интерфейс, плз!
Может по таблице SaldoMc быстрее будет поискать остатки?
			 
			
					
				
				Добавлено: 13 окт 2005, 09:32
				 san
				┌───────────────────────────────────────────────────┐
│  расчет входящего/исходящего сальдо по разрезам   │
└───────────────────────────────────────────────────┘
f_saldo.pas
 выгружает в таблицу TmpSaldo1 текущие остатки по разрезам
 со сворачивание и без - в зависимости от параметров
 при построении отчетов - иногда удобнее и быстрее выгрузить
 во временную таблицу все наличие в указанном разрезе,
 а затем построить на основании этих данных отчет
{ инициализация }
function Store_Init : boolean ; far ;
{ удаляет все записи из TmpSaldo1 и очищает переменные }
function Store_ReInit : boolean ; far ;
{ Расчет в складском учете(0) или производстве(1). }
{ По умолчанию - расчет в складском учете }
function Store_SkaldProizv(word); far ;
{ выгружает во временную таблицу TmpSaldo входящие остатки по разрезу }
{ склад мол партия }
{ три последних параметра при значении TRUE выгружают в TmpSaldo }
{ все записи не зависимо от соответствующего разреза }
{ при значении FALSE - производится группировка }
{ -1 означает работу с таблицей Pick }
procedure Store_Run(dDate : longint; cMC, cPodr, cMol, cParty : comp;
                    TakePodr, TakeMol, TakeParty : boolean);  far ;
{ рассчитывает переменные Store_NalSum, Store_NalKol }
{ по сформированной таблице TmpSaldo1 }
{ Возращает TRUE если кол или сумма не ноль }
{ -1 означает работа с НУЛЕВЫМ значением }
function Store_Calc(cMC, cPodr, cMol, cParty, cVal : comp) : boolean ;  far ;
{ вызывает последовательно Run и Calc }
{ автоматически заполняя поля типа boolean используемые в Run }
{ Возвращает TRUE если кол или сумма не ноль }
{ ЛУЧШЕ НЕ ПОЛЬЗОВАТЬСЯ, т.к. перепутаны определения -1 }
function Store_ReCalc(dDate : longint;
                      cMC, cPodr, cMol, cParty, cVal : comp) : boolean ;  far ;
{ переключает тип остатков TRUE-входящие/FALSE-исходящие }
procedure Store_TypeOstatki (typ: boolean) ;  far ;
{ закрытие таблиц, удаление объектов }
procedure Store_Done ; far ;
{ TRUE если прервали }
function Store_WasStopped : boolean ; far ;
{ возращает сумму в НДЕ}
function Store_Summa  : double ; far ;
{ возвращает валютную сумму в базовой валюте }
{ !!! всегда в базовой валюте  }
{     пересчет производится на дату расчета наличия Store_Run(dDate... }
function Store_SummaV : double ; far ;
{ возвращает количество }
function Store_Kol : double ; far ;
{ для много-валютного учета - в валюте разреза }
procedure Store_ForceInVal( Value_:boolean ) ; far ;
{ если не было движения по МЦ после указ. даты, то формир. записи со старыми значениями }
procedure Store_DoSpace( Value_:boolean ) ; far ;
{ отключить включить диагностику: контроль курсов валют }
procedure Store_DiagnosticOn ; far ;
procedure Store_DiagnosticOff ; far ;
			 
			
					
				
				Добавлено: 14 окт 2005, 10:48
				 hope
				Еще бы примерчик - как это дело использовать на практике! 

)
 
			 
			
					
				
				Добавлено: 14 окт 2005, 12:26
				 san
				Store_Init;
  Store_DiagnosticOff ;
  Store_ReInit ; // удаление таблицы TmpSaldo1
  Store_TypeOstatki(TRUE) ; // входящие остатки
  Store_SkladProizv(0);
  Store_Run ( add_day(cur_date,1), nrecmc,
nrecpodr или 0,
nrecmol или 0,
nrecparty или 0,
TRUE, TRUE, TRUE ) ;
 _loop tmpsaldo1
{
работаем с остатками
}
Store_Done ;
			 
			
					
				
				Добавлено: 14 окт 2005, 13:04
				 Diman
				НУ вот как-то так:
!==============================================================================================
!Интерфейсина выцепляет все возможные разрезы и делает запросы с этими разрезами к СальдоМЦ
INTERFACE Asn_PutOstatki_02;
create view T1
var
spprz, vnp, wr1, wr2: integer;
ddate: date;
podrnrec, molnrec, tempnrec, mcnrec, partynrec, grnrec: comp;
mcname, podrname, molname, fld1, fld2, pname: string;
gp1kol, gp2kol, realkol, otherkol:  double;
      as select
           saldofnd.*
         , katmc.name
         , katparty.name
         from
           saldofnd
         , katmc
         , katparty
         where
           ((
                 spprz           == saldofnd.sp
             and podrnrec        == saldofnd.cpodr
             and saldofnd.cmc    == katmc.nrec
             and saldofnd.cparty == katparty.nrec
           ))
         condition byMol = molnrec = saldofnd.cmol
         ;
Parameters
     spprz, podrnrec, molnrec, ddate, podrname, fld1, fld2;
HandleEvent
    cmInit:
      {
      if molnrec <> 0
        {
        PushCondition(tcbyMol);
        }
      StartNewVisual(vtNumericVisual, vfBreak, 'Выгрузка остатков в '+podrname, 1);
      _loop saldofnd
        {
        mcnrec    := saldofnd.cmc;
        podrnrec  := saldofnd.cpodr;
        molnrec   := saldofnd.cmol;
        partynrec := saldofnd.cparty;
        mcname    := katmc.name;
        pname     := katparty.name;
        grnrec    := katmc.cgroupmc;
        wr1        := 0;
        wr2        := 0;
        gp1kol:=0;
        gp2kol:=0;
        realkol:=0;
        if fld1<>''
          {
          if ((modifier getfirst pick where ((7 == pick.wlist and mcnrec == pick.crec))) = tsOK)
            {
            wr1:=1;
            }
          }
        else
          {
          wr1:=1;
          }
        if fld2<>''
          {
          if ((modifier getfirst pick where ((2 == pick.wlist and grnrec == pick.crec))) = tsOK)
            {
            wr2:=1;
            }
          }
        else
          {
          wr2:=1;
          }
        if wr1=1 and wr2=1
          {
          if ((modifier getlast 
                          saldomc 
                      where 
                          ((
                                spprz             == saldomc.sp
                            and mcnrec            == saldomc.cmc
                            and podrnrec          == saldomc.cpodr
                            and molnrec           == saldomc.cmol
                            and partynrec         == saldomc.cparty
                            and add_day(ddate,1) >>= saldomc.dsaldo
                          ))
            ) = tsOK)
            {
            case podrnrec of
              281474976710659    :    // GP1
                                 {
                                 gp1kol:=saldomc.kol;
                                 }
              0002000000000073h  :    // GP2
                                 {
                                 gp2kol:=saldomc.kol;
                                 }
              4612041215855254253:    //скл. отд. Реализации
                                 {
                                 realkol:=saldomc.kol;
                                 }
            end;
            otherkol:=saldomc.kol;  //Просто поиск остатков
            if ((modifier getfirst temprt where (( mcname == temprt.namesort1
                                               and pname  == temprt.namesort2   ))) = tsOK)
              {
              case podrnrec of
                281474976710659    :    // GP1
                                   {
                                   update temprt where (( mcname == temprt.namesort1
                                                      and pname  == temprt.namesort2 )) set kol1:=kol1+gp1kol;
                                   }
                0002000000000073h  :    // GP2
                                   {
                                   update temprt where (( mcname == temprt.namesort1
                                                      and pname  == temprt.namesort2 )) set kol1:=kol1+gp2kol;
                                   }
                4612041215855254253:    //скл. отд. Реализации
                                   {
                                   update temprt where (( mcname == temprt.namesort1
                                                      and pname  == temprt.namesort2 )) set kol3:=kol3+realkol;                                   
                                   }
              end;
              update temprt where (( mcname == temprt.namesort1
                                 and pname  == temprt.namesort2 )) set sum1v:=sum1v+otherkol;                                   
              }
            else
              {
              if saldomc.kol<>0 
                {
                insert temprt set 
                          cmc       := MCNREC
                        , kol1      := gp1kol+gp2kol
                        , kol3      := realkol
                        , price1    := saldomc.srprice
                        , sum1v     := otherkol
                        , namesort1 := mcname
                        , namesort2 := pname
                        ;
                }
              }
            }
          }
          NextVisual;
        }
      StopVisual('',0);
      CloseInterface(0);
      }
end;
end.
			 
			
					
				
				Добавлено: 14 окт 2005, 14:53
				 hope
				Спасибо! Буду пробовать!!!