Страница 1 из 3

Помогите разобраться - почему не работает конструкция

Добавлено: 23 дек 2011, 16:19
denisag
Добрый день.
В общем написал я вот такой скрипт

Код: Выделить всё

#param /linc:d:\viperprojekt\autoexec.vpp
#setcurenv "galnet" from 'c:\GAL810\exe\';
#define ComponentVersion
#include GALNET.CCM
#Component "L_SOPRDOC"
alter interface AKTREC;
tableEvent table SPSOPR
cmPick:
{
 var cmc:comp
 case curfield of
  #NAMEMCUSL:
  {
   if runinterface (L_MCU::GETMC,cmc) = cmdefault and cmc != 0
   {
   if spsopr.cmcusl = 0
   {
   spsopr.cmcusl:=cmc;
   insert current spsopr;
   }
    else
  {
    spsopr.cmcusl:=cmc;
    update current spsopr;
  }
   rereadrecord(#spsopr);
   stop;
   }
  } else if(inherited::HandleEvent(cmPick) = heOk)   {}
 end;
}
end;
end.  
Он работает но он не очень красив ;-)
Попробовал с оператором RecordExists

Код: Выделить всё

#param /linc:d:\viperprojekt\autoexec.vpp
#setcurenv "galnet" from 'c:\GAL810\exe\';
#define ComponentVersion
#include GALNET.CCM
#Component "L_SOPRDOC"
alter interface AKTREC;
tableEvent table SPSOPR
cmPick:
{
 var cmc:comp
 case curfield of
  #NAMEMCUSL:
  {
   if runinterface (L_MCU::GETMC,cmc) = cmdefault and cmc != 0
if spsopr.cmcusl = 0
    {
   spsopr.cmcusl:=cmc;
  if RecordExists spsopr !=tsOK
    then insert current spsopr;
   else
   update current spsopr;
   rereadrecord(#spsopr);
   stop;
   }
  else if(inherited::HandleEvent(cmPick) = heOk)   {}
  }
 end;
}
end;
end.   
Не работает. При попытке добавить товар который уже есть выдает ошибку "Отсутствует позиция. Таблица N1110"
Подскажите как можно доработать чтобы все было ок :?:

Re: Помогите разобраться - почему не работает конструкция

Добавлено: 23 дек 2011, 16:34
n0where

Код: Выделить всё

   spsopr.cmcusl:=cmc;
   insert current spsopr;
А кто будет заботится о связках с KATSOPR и прочем? и не забываем ClearBuffer

И проще наверно вставить стандартным способом через функцию InsertMcInAkt либо другую там...
типа стандартную по вставке позиции, а потом уже поменяйте МЦ.

Re: Помогите разобраться - почему не работает конструкция

Добавлено: 23 дек 2011, 17:16
denisag
А можно поподробнее про InsertMcInAkt? Где почитать и как используется?
Я начинающий и таких нюансов еще не знаю.
А кто будет заботится о связках с KATSOPR и прочем? и не забываем ClearBuffer
Это докомпиляция.

Re: Помогите разобраться - почему не работает конструкция

Добавлено: 26 дек 2011, 08:08
n0where
Это докомпиляция.
Это не значит что галактика за вас об этом позаботиться.
А можно поподробнее про InsertMcInAkt? Где почитать и как используется?
Я начинающий и таких нюансов еще не знаю.
Вы нигде не найдёте про такие нюансы )))

1. Есть стандартные процедуры к примеру для 201 документа

Код: Выделить всё

SpSopr201Default(1);
Это будет проще ))

2. Есть vih для вставки данных. Им пользоваться ещё лучше )

Re: Помогите разобраться - почему не работает конструкция

Добавлено: 26 дек 2011, 18:29
denisag
А вы не могли бы на моем примере показать конструкцию с этим самым vih? Я пока слабо понимаю о чем идет речь, а разобраться хочется ;-)
Все вставляется же более или менее правильно - нужно как то правильно описать: INSERT делать или UPDATE.

Re: Помогите разобраться - почему не работает конструкция

Добавлено: 27 дек 2011, 12:02
RAJAH
denisag
А вы уверены, что докомпиляция - это то, что вам нужно? :-) Может, что попроще для начала?

Re: Помогите разобраться - почему не работает конструкция

Добавлено: 27 дек 2011, 12:16
denisag
Уверен - так как функционал надо будет постепенно расширять 8-)

Re: Помогите разобраться - почему не работает конструкция

Добавлено: 27 дек 2011, 12:53
KATZ
denisag писал(а):нужно как то правильно описать: INSERT делать или UPDATE.
Посмотрите в документации про функцию

Код: Выделить всё

function IsNew : boolean;

Re: Помогите разобраться - почему не работает конструкция

Добавлено: 27 дек 2011, 18:57
denisag
KATZ писал(а):
denisag писал(а):нужно как то правильно описать: INSERT делать или UPDATE.
Посмотрите в документации про функцию

Код: Выделить всё

function IsNew : boolean;
Большое спасибо - помогло

Re: Помогите разобраться - почему не работает конструкция

Добавлено: 28 дек 2011, 13:06
denisag
В общем продолжил усложнять и получилось что-то такое:

Код: Выделить всё

#param /linc:d:\viperprojekt\autoexec.vpp
#setcurenv "galnet" from 'c:\GAL810\exe\';
#define ComponentVersion
#include GALNET.CCM
#Component "L_SOPRDOC"
alter interface AKTREC;
tableEvent table SPSOPR
cmPick:
{
 var cmc:comp
 case curfield of
  #NAMEMCUSL:
  {
   if runinterface (L_MCU::GETMC,cmc) = cmdefault and cmc != 0
    spsopr.cmcusl:=cmc;
    if isnew()
    insert current spsopr;
    else
    update current spsopr;
    rereadrecord(#spsopr);
  runinterface (L_SOPRDOC::Example, katsopr.corgbase, spsopr.cmcusl)
  }
   else if(inherited::HandleEvent(cmPick) = heOk)   {}
 end;
}
end;
end.
Interface Example 'TEST' doAccept;
var _corg, _cmc:comp
parameters _corg, _cmc
  create view as select * from katsopr, spsopr, katorg
where
 ((
   _corg == katsopr.corgbase and
   201 == katsopr.vidsopr and
   _cmc == spsopr.cmcusl and
   katsopr.nrec == spsopr.csopr   and
   spsopr.cmcusl == katmc.nrec and
   katsopr.corgbase == katorg.nrec and
   1>>=spsopr.prmc
 ));
  browse EmployeeBrowse;
//  table KATSOPR;
  Fields
    katsopr.nsopr:protect;
    katsopr.dsopr:protect;
    katsopr.vidsopr:protect;
    katmc.name:protect;
    katorg.name:protect;
  end;
end.
Что это дает:
при редактировании накладной на возврат в продаже при добавлении(изменении) товара вываливается окно с таким же товаром на данного контрагента приобретенного(возвращенного) ранее.
НО почему то если такого товара нет то окно показывается не пустое - отсутствует только название товара (Должно быть пустое полностью).
Подскажите пожалуйста что я делаю не так.

Re: Помогите разобраться - почему не работает конструкция

Добавлено: 29 дек 2011, 05:52
Алексей
ну это значит что покупки ранее у этого контрагента были, а вот конкретно именно этой МЦ ещё не закупалось.
сделайте жёсткую подцепку katsopr.nrec /== spsopr.csopr

Re: Помогите разобраться - почему не работает конструкция

Добавлено: 29 дек 2011, 12:43
denisag
Алексей писал(а):ну это значит что покупки ранее у этого контрагента были, а вот конкретно именно этой МЦ ещё не закупалось.
сделайте жёсткую подцепку katsopr.nrec /== spsopr.csopr
Не помогло. Все равно показывает наименование контрагентов.

Re: Помогите разобраться - почему не работает конструкция

Добавлено: 29 дек 2011, 14:54
Den
А зачем убрали
// table KATSOPR;
сделайте все же бравсе с корнем + katsopr.corgbase /== katorg.nrec

Re: Помогите разобраться - почему не работает конструкция

Добавлено: 29 дек 2011, 15:13
denisag
Тоже не помогло!
Код на данный момент такой:

Код: Выделить всё

#param /linc:d:\viperprojekt\autoexec.vpp
#setcurenv "galnet" from 'c:\GAL810\exe\';
#define ComponentVersion
#include GALNET.CCM
#Component "L_SOPRDOC"
alter interface AKTREC;
tableEvent table SPSOPR
cmPick:
{
 case curfield of
  #NAMEMCUSL:
  {
   if runinterface (L_MCU::GETMC,spsopr.cmcusl) = cmdefault and spsopr.cmcusl != 0
    if isnew()
    insert current spsopr;
    else
    update current spsopr;
    rereadrecord(#spsopr);
    runinterface (L_SOPRDOC::Example, katsopr.corgbase, spsopr.cmcusl,spsopr.kolfact,spsopr.price,spsopr.csporder)
    spsopr.rprice:=spsopr.price;
    update current spsopr;
    PutCommand(cmRefreshBDdata)
  }
   else if(inherited::HandleEvent(cmPick) = heOk)   {}
 end;
}
end;
end.
Interface Example 'TEST' , escClose, cyan,doAccept;
var _corg, _cmc, _csporder, _gruz:comp
var _kol,_price:double;
parameters _corg, _cmc, _kol,_price,_csporder
  create view as select * from katsopr, spsopr, katorg, katparty, sklorder, sporder, katpodr
where
 ((
   _corg == katsopr.corgbase and
   201 == katsopr.vidsopr and
   _cmc == spsopr.cmcusl and
   katsopr.nrec /== spsopr.csopr   and
   katsopr.corgbase /== katorg.nrec and
   spsopr.cmcusl == katmc.nrec and
   katsopr.corgbase == katorg.nrec and
   1>>=spsopr.prmc and
   spsopr.cparty == katparty.nrec and
   spsopr.nrec == sporder.cspsopr and
   sporder.csklorder == sklorder.nrec and
   sklorder.cpodr == katpodr.nrec
 ))
 bounds filGruz = _gruz == katsopr.cgruzto(noindex)
 ;
  browse EmployeeBrowse;
  table KATSOPR;
  Fields
    katsopr.nsopr '№ сопроводительного документа':[30], protect;
    katsopr.dsopr 'Дата':[10], protect;
//    katsopr.vidsopr:protect;
    katmc.name 'Наименование товара':[25], protect;
    katorg.name 'Наименование контрагента':[25], protect;
    katparty.name 'Название партии':[25], protect;
    sklorder.norder '№ Ордера':[10], protect;
  end;
handleevent
cmInit :
{

}
cmDefault:
{
 _kol:=spsopr.kolfact;
 _price:=spsopr.price;
 _csporder:=sporder.nrec;
}
cmpick:
{
_gruz:=0;
runinterface(L_KATORG::GetKatOr,_gruz,0,false,0,0);
if _gruz !=0
{
 subbounds(tbfilGruz);
 addbounds(tbfilGruz);
}
else
subbounds(tbfilGruz)
PutCommand(cmRefreshBDdata)
}
end;
end.
Хочу сделать еще проверку по складу, чтобы показало товар только отпущенный со слада который у нас сейчас в поле 'склад' в
"Редактирование накладной на возврат" но никак не додумаю как это сделать - готов выслушать предложения ;-)

Re: Помогите разобраться - почему не работает конструкция

Добавлено: 29 дек 2011, 15:38
Den
..
katsopr.corgbase /== katorg.nrec and
spsopr.cmcusl == katmc.nrec and
katsopr.corgbase == katorg.nrec and
..
так и задумано ?