VIP, копирование строки таблицы

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

ecasoft
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г.Королев МО ООО "Эффективная Комплексная Автоматизация- СОФТ"

Сообщение ecasoft »

человек просто спросил - есть ли в ВИПе функция для копирования строки (записи, если я понял) :) а тут ему навешали лапши :)

ответ -

да есть - функция копирования буфера

CopyTablesFields(#Tab1,#Tab2).
Johny
Местный житель
Сообщения: 291
Зарегистрирован: 29 мар 2005, 17:49
Откуда: С-Петербург
Контактная информация:

Сообщение Johny »

тааак, ну началось, теперь еще и на вопросы начали на форуме отвечать :grin: Так и совсем с катушек слететь можно :o

А теперь по существу.
Вот эти вот #Tab1 и #Tab2 это о чем.
Как ф-я работает?

Откуда и куда и чего копирует? Из одной таблицы в другую? а смысл?
Безвыходных ситуаций не бывает: DO LOOP WHILE TRUE
Johny
Местный житель
Сообщения: 291
Зарегистрирован: 29 мар 2005, 17:49
Откуда: С-Петербург
Контактная информация:

Сообщение Johny »

Мне кажеться подошел первый предложенный вариант. Но может этот и лучше. Хочу сразу неск. строк в буфер загнать, а потом их оттуда вставить.

Если эта функция в эту степь, то вопрос, как буфер сделать?
Безвыходных ситуаций не бывает: DO LOOP WHILE TRUE
ecasoft
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г.Королев МО ООО "Эффективная Комплексная Автоматизация- СОФТ"

Сообщение ecasoft »

:))))))))))))

"А смысл" :) Наверное я тогда не понял вопроса. :))) Смысл думал Вы написали в вопросе.

Как работает.

Когда Вы описываете таблицу, то у нее всегда есть буфер записи.

Если таблица не участвует в секции where (()),
то в буфер помещается первая запись табоицы. Если Вы позиционируетесь - то текущая.

К примеру, Вам надо скопировать строку спецификации накладной (katsopr) из одной накладной в другую (katsopr1 - синоним katsopr).

Для этого:

1. Описываете таблицу синоним для spsopr - spsoprNew.

2. делаете

CopyTablesFields(#spsopr.#spsoprnew);
spsoprnew.Nrec := 0;
Spsoprnew.cSopr = KatSopr2.Nrec;
insert current SpSoprNew;

В спецификации накладной katsopr2 появится новая строка - копия строки из katsopr1.

....

Вообще-то, чаще всего функция используется для прямого копирования записей таблиц между двумя базами данных, т.к. в одной базе можно выкрутиться и без использования этой функции путем

if getfirst Spsoprnew where ((SpSopr.Nrec ==SpSoprNew.Nrec)) = tsOk
{
spsoprnew.Nrec := 0;
Spsoprnew.cSopr = KatSopr2.Nrec;
insert current SpSoprNew;
};
ecasoft
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г.Королев МО ООО "Эффективная Комплексная Автоматизация- СОФТ"

Сообщение ecasoft »

да...не только Nrec в таблицах Галактики может быть уникальным!!!
Мы обнуляем Nrec, для того, чтобы система сама дала нам уникальный при вводе. Но с другими полями - хуже. Нужно будет самому поддерживать уникальность, т.е. думать, чем заполнить поля, объявленные уникальными в словаре.

Удачи
Johny
Местный житель
Сообщения: 291
Зарегистрирован: 29 мар 2005, 17:49
Откуда: С-Петербург
Контактная информация:

Сообщение Johny »

там про
а смысл?
это не важно. Просто само как-то приписалось, а-ля мысли вслух.

А ответ ваш в самую тему попал.
Я совсем забыл что есть такая штука как синонимы. И сидел парился как бы выкрутиться :-?
Все прочитал, вроде даже понял, делаю ctrl+shift, ctrl+ins и чуток правлю.

PS: А то я тут уже в цикле навставлял одну и ту же запись кучу раз :-D
Безвыходных ситуаций не бывает: DO LOOP WHILE TRUE
Johny
Местный житель
Сообщения: 291
Зарегистрирован: 29 мар 2005, 17:49
Откуда: С-Петербург
Контактная информация:

Сообщение Johny »

Хожу вокруг да около, а не получается. Суть такая, пишу код, и не могу выйти из цикла:

interface copy_spmnlan;
var
oldNrec : comp; //передаю Nrec шапки (Mnplan.nrec)
newNrec : comp; //и Nrec новой строки MnPlan

create view as select * from spmnplan,spmnplan spmnplanNew where spmnplan.cmnplan=oldNrec;

parameters oldNrec,newNrec;

handleevent
cmInit:{
if getfirst spmnplanNew where ((spmnplan.Nrec==spmnplanNew.Nrec)) = tsOk
{
do
{
getfirst spmnplanNew where ((spmnplan.Nrec==spmnplanNew.Nrec))
spmnplanNew.nrec:=0;
spmnplanNew.cmnplan:=newNrec;
insert current spmnplanNew;
}while (modifier getnext spmnplan where ((oldNrec==spmnplan.cmnplan))=tsOk); // вот тута циклимся и все
};
}
end;
end.
Безвыходных ситуаций не бывает: DO LOOP WHILE TRUE
WiRuc
Местный житель
Сообщения: 414
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж

Сообщение WiRuc »

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

interface copy_spmnlan; 
var 
oldNrec : comp; //передаю Nrec шапки (Mnplan.nrec) 
newNrec : comp; //и Nrec новой строки MnPlan 

create view 
from spmnplan,spmnplan spmnplanNew
where 
((oldNrec == spmnplan.cmnplan); 

parameters oldNrec,newNrec; 

handleevent 
cmInit:{ 
_loop spmnplan
{
   if getfirst spmnplanNew where ((spmnplan.Nrec==spmnplanNew.Nrec)) = tsOk
  {
     spmnplanNew.nrec:=0; 
     spmnplanNew.cmnplan:=newNrec; 
     insert current spmnplanNew; 
  }
}; 
} 
end; 
end.
Johny
Местный житель
Сообщения: 291
Зарегистрирован: 29 мар 2005, 17:49
Откуда: С-Петербург
Контактная информация:

Сообщение Johny »

я уже тоже только что дотумкал, только у меня более деревянно.
[/quote]
if getfirst spmnplanNew where ((spmnplan.Nrec==spmnplanNew.Nrec)) = tsOk
{
//сюда вот добавил такую строку и нормально стало
modifier getfirst spmnplan;
do
{
getfirst spmnplanNew where ((spmnplan.Nrec==spmnplanNew.Nrec))
spmnplanNew.nrec:=0; ..... [quote][/quote]
Безвыходных ситуаций не бывает: DO LOOP WHILE TRUE
Ответить