AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.09.2005, 10:42   #1  
Константин! is offline
Константин!
Участник
 
180 / 10 (1) +
Регистрация: 13.04.2005
Адрес: Казань
<div class='CALtop'>C/AL</div><div class='CAL'>
var
FromTable,ToTable - recordref
TableId - integer
NewCompanyName - text 30

ToTable.OPEN(TableID,FALSE,COMPANYNAME);
FromTable.OPEN(TableID,FALSE,NewCompanyName);
IF ToTable.FIND('-') THEN;
IF FromTable.FIND('-') THEN BEGIN
REPEAT
  ToTable:=FromTable;
  ToTable.INSERT(TRUE);
UNTIL FromTable.NEXT = 0;
END;</div>

При выполнение Оператора ToTable.INSERT(TRUE); появляется ошибка попытки вставить дублирующею запись, и если с подошью fieldref поменять первичный ключик
<div class='CALtop'>C/AL</div><div class='CAL'>
filds:=ToTable.FIELD(1);
filds.VALUE:='1';
</div>
то запись вставляется не в текущею фирму, а в NewCompanyName.
Экспериментировал с таблицей, 312 в которой в фирме NewCompanyName одна запись, а в текущей фирме записей нет.
Кто знает, как это можно побороть?
Старый 07.09.2005, 10:50   #2  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
Попробуйте присвоить все поля по отдельности. Можно организовать цикл по всем полям в таблице и присваивать соответственно.

Можно еще какнибудь попробовать использовать TransferFields
__________________
Want to believe...
Старый 07.09.2005, 10:57   #3  
Константин! is offline
Константин!
Участник
 
180 / 10 (1) +
Регистрация: 13.04.2005
Адрес: Казань
Да насчте переноса всех значений полей по отдельности я уже задумался наверное так и зделаю, а вот насчет TransferFields, что то не пойму как его использовать применительно к Recordref.
Старый 07.09.2005, 11:02   #4  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
сорри... я почему то подумал что известна табличка и тогда можно было бы использовать GetTable. Но так как табличка не известна то такой вариант не пойдет...
__________________
Want to believe...
Старый 07.09.2005, 11:10   #5  
Константин! is offline
Константин!
Участник
 
180 / 10 (1) +
Регистрация: 13.04.2005
Адрес: Казань
<div class='CALtop'>C/AL</div><div class='CAL'>
var
   TableID                    Integer        
   NewCompanyName    Text        30
   CopyTable                    Boolean        
               FromTable                    RecordRef        
               ToTable                    RecordRef        
               FromFilds                    FieldRef        
               ToFields                    FieldRef        
               FieldTable                    Record    Field    

 FromTable.OPEN(TableID,FALSE,NewCompanyName);
 ToTable.OPEN(TableID,FALSE,COMPANYNAME);
 IF FromTable.FIND('-') THEN BEGIN
   REPEAT
    FieldTable.RESET;
    FieldTable.SETRANGE(TableNo,TableID);
    IF FieldTable.FIND('-') THEN BEGIN
      REPEAT
        FromFilds:= FromTable.FIELD(FieldTable."No.");
        ToFields:=ToTable.FIELD(FieldTable."No.");
        ToFields.VALUE:=FromFilds.VALUE;
      UNTIL FieldTable.NEXT=0;
    END;
     ToTable.INSERT();
   UNTIL FromTable.NEXT = 0;
 END;
END;
</div>

такая конструкция работает железно. Теперь можно любую табличку между фирмами на лету копировать. Думаю будет удобна при создание новой фирмы и копирование настроек из текушей.
Спасибо.
Старый 07.09.2005, 11:12   #6  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
а функцию DUPLICATE не пробовал. Самому лень проверять

Хотя это не туда ... .
__________________
Want to believe...
Старый 07.09.2005, 11:14   #7  
Константин! is offline
Константин!
Участник
 
180 / 10 (1) +
Регистрация: 13.04.2005
Адрес: Казань
пробовал DUPLICATE, не помогло.
Старый 07.09.2005, 11:16   #8  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
RecordRef является указателем. При присваивании одного RecordRef другому они начинают указывать на одну и ту же таблицу (переменную типа Record), естественно в одной и той же фирме.
Копировать RecordRef можно только по полям.

DUPLICATE создает новую переменную типа Record в той же фирме и делает на нее указатель.

Вместо
<div class='CALtop'>C/AL</div><div class='CAL'>
FieldTable.RESET;
   FieldTable.SETRANGE(TableNo,TableID);
   IF FieldTable.FIND('-') THEN BEGIN
     REPEAT
       FromFilds:= FromTable.FIELD(FieldTable."No.");
       ToFields:=ToTable.FIELD(FieldTable."No.");
       ToFields.VALUE:=FromFilds.VALUE;
     UNTIL FieldTable.NEXT=0;
   END;
</div>

мне кажется лучше использовать:
<div class='CALtop'>C/AL</div><div class='CAL'>
for i := 1 to FromTable.FIELDCOUNT do begin
 FromFilds := FromTable.FIELDINDEX(i);
 ToFields := ToTable.FIELDINDEX(i);
 ToFields.VALUE := FromFilds.VALUE;
end;
</div>
Старый 07.09.2005, 11:20   #9  
Константин! is offline
Константин!
Участник
 
180 / 10 (1) +
Регистрация: 13.04.2005
Адрес: Казань
Спасибо за развернутый ответ, надо учится оптимизировать свой код.

При тесте возникла ошибка с переносом Blob полей- "Выражение BLOB не может быть преобразовано в значение BLOB" ?
Старый 07.09.2005, 11:40   #10  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
С блобами походу попадос. Можно попробовать объявить переменную типа blob и присвоить ей поле, как это делается для Fieldref и посмотреть что получится.
Старый 07.09.2005, 12:48   #11  
IGG is offline
IGG
Участник
 
665 / 29 (2) +++
Регистрация: 24.08.2005
Адрес: СПб/Москва
С блобами вообще интересный вопрос. Как вообще перетащить BLOB из таблицы в таблицу?
Механизм Table2.BLOB := Table1.BLOB явно не пойдет.
Никто не пробовал без всяких импортов в файл?
(или отдельно выделить вопрос в ветку?)
Старый 07.09.2005, 13:27   #12  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Цитата:
Сообщение от Igor528
С блобами вообще интересный вопрос. Как вообще перетащить BLOB из таблицы в таблицу?
Механизм Table2.BLOB := Table1.BLOB явно не пойдет.
Никто не пробовал без всяких импортов в файл?
(или отдельно выделить вопрос в ветку?)
Это можно сделать с помошью потоков. Почитайте описание функций CreateInStream и CreateOutStream.
Старый 07.09.2005, 13:44   #13  
IGG is offline
IGG
Участник
 
665 / 29 (2) +++
Регистрация: 24.08.2005
Адрес: СПб/Москва
Делал я выражение типа
Table1.BLOB.CREATEOUTSTREAM(Table2.BLOB);
Не катит
Делал наоборот
Table2.BLOB.CREATEINSTREAM(Table1.BLOB);
Не катит
Делал даже
Table2.BLOB.CREATEINSTREAM(Table1.BLOB.CREATEOUTSTREAM);

Делал переменные - Instream и OutStream - тоже не катит
BLOB переменная это и есть тип Binary?
И никто не знает....
Задача простая - перенаправить поток их одного BLOB поля в другой реализовать не смог. Задача - синхронизация регламентной отчетности между компаниями где поля blob - отчеты XLS
Старый 07.09.2005, 13:55   #14  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
так пробовали ?

Table1.CALCFIELDS(BLOB);
Table2.BLOB := Table1.BLOB ;

хотя врятли поможет
__________________
Want to believe...
Старый 07.09.2005, 14:05   #15  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Цитата:
Сообщение от Igor528
Делал я выражение типа
Table1.BLOB.CREATEOUTSTREAM(Table2.BLOB);
Не катит
Делал наоборот
Table2.BLOB.CREATEINSTREAM(Table1.BLOB);
Не катит
Делал даже
Table2.BLOB.CREATEINSTREAM(Table1.BLOB.CREATEOUTSTREAM);

Делал переменные - Instream и OutStream - тоже не катит
BLOB переменная это и есть тип Binary?
И никто не знает....
Задача простая - перенаправить поток их одного BLOB поля в другой реализовать не смог. Задача - синхронизация регламентной отчетности между компаниями где поля blob - отчеты  XLS
Обработка потоков осуществляется, как работа с файлами, с помощью специальных функций READ, WRITE и т.д.. Простым присваиванием или передачей параметра тут не обойтись. Вам нужно создать два потока - входящий и исходящий, и в цикле пока не достигните конца исходящего потока читать из него данные и писать во входящий.
Рекомендую вам внимательно прочитать документацию (справку) по работе с потоками, особенно функции: Read и Write. В справке есть примеры.
Старый 07.09.2005, 14:10   #16  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
А что

Table1.CALCFIELDS(BLOB);
Table2.BLOB := Table1.BLOB ;
Table2.INSERT;

не помогает?
Старый 07.09.2005, 14:25   #17  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Для тех кто хочет извращаться с потоками - тоже просто:

<div class='CALtop'>C/AL</div><div class='CAL'>VAR
     Ins : InStream;
     Outs : OutStream;
     Bin : Binary[1];

CODE

table1.CALCFIELDS(BLOB);

table1.BLOB.CREATEINSTREAM(Ins);
table2.BLOB.CREATEOUTSTREAM(Outs);

table2.INIT;
WHILE NOT Ins.EOS DO BEGIN
 Ins.READ(Bin,1);
 Outs.WRITE(Bin);
END;
table2.INSERT;</div>
Старый 07.09.2005, 14:41   #18  
IGG is offline
IGG
Участник
 
665 / 29 (2) +++
Регистрация: 24.08.2005
Адрес: СПб/Москва
Пробую, пробую.... Но первый вариант не прокатил - файл Екселя отказывается выгружаться в скопированной таблице. То есть он как бы вставился но внутреннее содержание не очень. Попробую второй вариант сейчас
Старый 07.09.2005, 15:21   #19  
IGG is offline
IGG
Участник
 
665 / 29 (2) +++
Регистрация: 24.08.2005
Адрес: СПб/Москва
Все катит.... Просто я поставил условие
IF table1.BLOB.HASVALUE THEN....
перед тем как делал CALCFIELDS

Оба варианта работоспособны...
Как благодарить?????
А то я искомые файлы грузил в каждой фирме руками
Старый 07.09.2005, 15:24   #20  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
можно людям респекты добавить. Плюсики такие .
__________________
Want to believe...
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 10:02.