AXForum  
Zurück   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 07.09.2005, 10:42   #1  
Константин! ist offline
Константин!
Участник
 
180 / 10 (1) +
Registriert seit: 13.04.2005
Ort: Казань
<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 одна запись, а в текущей фирме записей нет.
Кто знает, как это можно побороть?
Alt 07.09.2005, 10:50   #2  
DA_NEAL ist offline
DA_NEAL
Участник
Benutzerbild von DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Registriert seit: 05.08.2002
Ort: Королев
Попробуйте присвоить все поля по отдельности. Можно организовать цикл по всем полям в таблице и присваивать соответственно.

Можно еще какнибудь попробовать использовать TransferFields
__________________
Want to believe...
Alt 07.09.2005, 10:57   #3  
Константин! ist offline
Константин!
Участник
 
180 / 10 (1) +
Registriert seit: 13.04.2005
Ort: Казань
Да насчте переноса всех значений полей по отдельности я уже задумался наверное так и зделаю, а вот насчет TransferFields, что то не пойму как его использовать применительно к Recordref.
Alt 07.09.2005, 11:02   #4  
DA_NEAL ist offline
DA_NEAL
Участник
Benutzerbild von DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Registriert seit: 05.08.2002
Ort: Королев
сорри... я почему то подумал что известна табличка и тогда можно было бы использовать GetTable. Но так как табличка не известна то такой вариант не пойдет...
__________________
Want to believe...
Alt 07.09.2005, 11:10   #5  
Константин! ist offline
Константин!
Участник
 
180 / 10 (1) +
Registriert seit: 13.04.2005
Ort: Казань
<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>

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

Хотя это не туда ... .
__________________
Want to believe...
Alt 07.09.2005, 11:14   #7  
Константин! ist offline
Константин!
Участник
 
180 / 10 (1) +
Registriert seit: 13.04.2005
Ort: Казань
пробовал DUPLICATE, не помогло.
Alt 07.09.2005, 11:16   #8  
Alterant ist offline
Alterant
Участник
 
378 / 10 (1) +
Registriert seit: 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>
Alt 07.09.2005, 11:20   #9  
Константин! ist offline
Константин!
Участник
 
180 / 10 (1) +
Registriert seit: 13.04.2005
Ort: Казань
Спасибо за развернутый ответ, надо учится оптимизировать свой код.

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

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

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

хотя врятли поможет
__________________
Want to believe...
Alt 07.09.2005, 14:05   #15  
Alterant ist offline
Alterant
Участник
 
378 / 10 (1) +
Registriert seit: 31.03.2004
Zitat:
Zitat von 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. В справке есть примеры.
Alt 07.09.2005, 14:10   #16  
Kirvisniemi ist offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Registriert seit: 21.12.2004
А что

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

не помогает?
Alt 07.09.2005, 14:25   #17  
Kirvisniemi ist offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Registriert seit: 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>
Alt 07.09.2005, 14:41   #18  
IGG ist offline
IGG
Участник
 
665 / 29 (2) +++
Registriert seit: 24.08.2005
Ort: СПб/Москва
Пробую, пробую.... Но первый вариант не прокатил - файл Екселя отказывается выгружаться в скопированной таблице. То есть он как бы вставился но внутреннее содержание не очень. Попробую второй вариант сейчас
Alt 07.09.2005, 15:21   #19  
IGG ist offline
IGG
Участник
 
665 / 29 (2) +++
Registriert seit: 24.08.2005
Ort: СПб/Москва
Все катит.... Просто я поставил условие
IF table1.BLOB.HASVALUE THEN....
перед тем как делал CALCFIELDS

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


Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 12:19 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.