07.09.2005, 10:42 | #1 |
Участник
|
<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 |
Участник
|
Попробуйте присвоить все поля по отдельности. Можно организовать цикл по всем полям в таблице и присваивать соответственно.
Можно еще какнибудь попробовать использовать TransferFields
__________________
Want to believe... |
|
07.09.2005, 10:57 | #3 |
Участник
|
Да насчте переноса всех значений полей по отдельности я уже задумался наверное так и зделаю, а вот насчет TransferFields, что то не пойму как его использовать применительно к Recordref.
|
|
07.09.2005, 11:02 | #4 |
Участник
|
сорри... я почему то подумал что известна табличка и тогда можно было бы использовать GetTable. Но так как табличка не известна то такой вариант не пойдет...
__________________
Want to believe... |
|
07.09.2005, 11:10 | #5 |
Участник
|
<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 |
Участник
|
а функцию DUPLICATE не пробовал. Самому лень проверять
Хотя это не туда ... .
__________________
Want to believe... |
|
07.09.2005, 11:14 | #7 |
Участник
|
пробовал DUPLICATE, не помогло.
|
|
07.09.2005, 11:16 | #8 |
Участник
|
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 |
Участник
|
Спасибо за развернутый ответ, надо учится оптимизировать свой код.
При тесте возникла ошибка с переносом Blob полей- "Выражение BLOB не может быть преобразовано в значение BLOB" ? |
|
07.09.2005, 11:40 | #10 |
Участник
|
С блобами походу попадос. Можно попробовать объявить переменную типа blob и присвоить ей поле, как это делается для Fieldref и посмотреть что получится.
|
|
07.09.2005, 12:48 | #11 |
Участник
|
С блобами вообще интересный вопрос. Как вообще перетащить BLOB из таблицы в таблицу?
Механизм Table2.BLOB := Table1.BLOB явно не пойдет. Никто не пробовал без всяких импортов в файл? (или отдельно выделить вопрос в ветку?) |
|
07.09.2005, 13:27 | #12 |
Участник
|
Цитата:
Сообщение от Igor528
С блобами вообще интересный вопрос. Как вообще перетащить BLOB из таблицы в таблицу?
Механизм Table2.BLOB := Table1.BLOB явно не пойдет. Никто не пробовал без всяких импортов в файл? (или отдельно выделить вопрос в ветку?) |
|
07.09.2005, 13:44 | #13 |
Участник
|
Делал я выражение типа
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 |
Участник
|
так пробовали ?
Table1.CALCFIELDS(BLOB); Table2.BLOB := Table1.BLOB ; хотя врятли поможет
__________________
Want to believe... |
|
07.09.2005, 14:05 | #15 |
Участник
|
Цитата:
Сообщение от 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. В справке есть примеры. |
|
07.09.2005, 14:10 | #16 |
Moderator
|
А что
Table1.CALCFIELDS(BLOB); Table2.BLOB := Table1.BLOB ; Table2.INSERT; не помогает? |
|
07.09.2005, 14:25 | #17 |
Moderator
|
Для тех кто хочет извращаться с потоками - тоже просто:
<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 |
Участник
|
Пробую, пробую.... Но первый вариант не прокатил - файл Екселя отказывается выгружаться в скопированной таблице. То есть он как бы вставился но внутреннее содержание не очень. Попробую второй вариант сейчас
|
|
07.09.2005, 15:21 | #19 |
Участник
|
Все катит.... Просто я поставил условие
IF table1.BLOB.HASVALUE THEN.... перед тем как делал CALCFIELDS Оба варианта работоспособны... Как благодарить????? А то я искомые файлы грузил в каждой фирме руками |
|
07.09.2005, 15:24 | #20 |
Участник
|
можно людям респекты добавить. Плюсики такие .
__________________
Want to believe... |
|