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

import|export to dbf из випа

Добавлено: 08 апр 2010, 10:28
Alexander
Нужно некоторые выбранные записи таблиц экспортить в dbf, можно ли как-то сделать по типу:
select * from katmc to dbf test;
пытался написать так:

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

SQL select * from katmc to dbf test;
выдает ошибку, так:

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

SQL select * from katmc dbf test;
компилит, но при выполнении летят непонятные ошибки...
полный текст:

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

interface ifctest;
   create view select * from katmc;
browse b1;
fields
   katmc.name;
end;
handleevent
   cmInit:{
      SQL select * from katmc dbf test;   
   }
end;   
end;   
причем ошибки валятся даже так:

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

SQL select * from katmc;   
При выполнении пишет: "Неизвестная ошибка. код 30003"

Таблицы разные, очень не хочется описывать все поля для всех таблиц. как быть?

Добавлено: 08 апр 2010, 10:44
edward_K
1.поиском в vipprogr.chm PutTableToDBF, это метод вьюхи.
2.есть функции по работе с dbf , медленно, но надежно если не забыть проверить что файл открылся.
3. Есть "прямой sql" - на форуме обсуждалось. Там могете запрос построить и выполнить.
4. Можно еще порыскать насчет компиляции lot файлов из галки.
ну и так далее.

Добавлено: 08 апр 2010, 10:48
Alexander
нашел PutTableToDBF, все работает, а вот с импортом вопрос...

Добавлено: 14 апр 2010, 12:04
Alexander
1. Можно ли описать временную таблицу как дубликат существующей?
2. Можно ли как-нибудь дернуть всю строчку из dbf в Эту временную таблицу?

Порыскал по форуму, подобные вопросы нашел, но ответов нет... :-(

P.S. Прямой SQL не подходит. Должно работать в том числе и на первазиве :-(

Добавлено: 14 апр 2010, 12:27
edward_K
"Прямой" вроде уже на первасиве пашет.

Добавлено: 14 апр 2010, 13:21
Alexander
может с какими-то патчами и работает...
Только что проверил на том, что стоит у нас: на оракле норм, на первазиве-балалайка... :-(

Добавлено: 26 апр 2010, 11:21
Alexander
возник вопрос по PutTableToDBF, точнее флагам.
Этафункция перезависывает дбф, т.е.

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

view 
   MyTable.nrec == myTableChild.cmytable
далее

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

_loop MyTable
   PutTableToDBF(#myTableChild, 'mydbf.dbf', 0);
в дбф получаем записи только по последнему MyTable.
Может есть какой флаг, чтобы дбф не пересоздавалось, а дописываись записи?

Добавлено: 26 апр 2010, 12:20
Vik
По-моему, только два флага. 0 - выгружать с текущими ограничениями, ptfFullTable - выгружать без учета ограничений.

Добавлено: 28 апр 2010, 15:17
RAJAH
А коды ошибок PutTableToDBF что означают? Вот у меня, например, 4, файл DBF не создаётся.

Добавлено: 05 май 2010, 12:07
RAJAH
Неужели все отдыхают или в отпуске?

Добавлено: 05 май 2010, 19:31
Vik
Может стандартные коды вам помогут:

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

const tsOk                                =  0;
const tsInvalidOperation                  =  1;
const tsIOError                           =  2;
const tsFileNotOpen                       =  3;
const tsNotFound                          =  4;
const tsDuplicateKey                      =  5;
const tsInvalidKeyNumber                  =  6;
const tsDifferentKeyNumber                =  7;
const tsInvalidPositioning                =  8;
const tsEndOfFile                         =  9;

Добавлено: 06 май 2010, 09:31
RAJAH
Хм... Получается, надо пустую заготовку сделать? Мне казалось, что в случае отсутствия файла, он должен создаваться...

Добавлено: 06 май 2010, 10:55
Vik
Вам правильно кажется. Файл создается, если отсутствует. Я никогда его не создаю заранее. И еще ни разу не получал какой-либо ошибки, используя данный метод, хотя очень часто им пользуюсь.

Добавлено: 06 май 2010, 16:13
Vik
Тут, скорее всего, не файл не найден, а узел вьюхи. Вы во вьюху таблицу добавили? В select as добавили поля, которые хотите увидеть в дбф? Может стоит на валидность проверить перед использованием метода?

Добавлено: 11 май 2010, 10:15
RAJAH
Всё добавил. Вот фрагмент кода:

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

.create view vmol as
select katmol.nrec, attrval.vdate
from attrval, katmol
where
((
katmol.nrec    /== attrval.crec and
10000000000A1h  == attrval.cattrnam and
1424            == attrval.wtable
));
.create view ost as
select katmc.nrec, saldomc.kol, saldomc.dsaldo, saldomc.cparty, saldomc.nrec
from katmc, saldomc, katpodr
where
((
nrmol                /== saldomc.cmol and
1                    /== saldomc.sp and
saldomc.cmc          /== katmc.nrec and
katpodr.nrec         /== saldomc.cpodr and
add_day(cur_date, 1) >>= saldomc.dsaldo
))
order sortost by katmc.nrec, saldomc.cparty, saldomc.nrec;
...
.{table 'vmol'
.begin
   nrmol:=vmol.katmol.nrec;
   dzakr:=vmol.attrval.vdate;
   nrmc:=0; 
   SetOrder(ost.tisortost);
   if nrmol = 100000000031Fh then
   begin
     kodosh:=ost.PutTableToDBF(-1, 'D:\1.dbf', 0);
     if kodosh <> 0 then message(kodosh);
   end;
end.
.{table 'ost' by ost.katmc.nrec
.begin
...
Сообщение выдаёт код "4".