Страница 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
Спасибо! Буду пробовать!!!