Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.23;
Скачать: CL | DM;

Вниз

DBF   Найти похожие ветки 

 
Annet ©   (2005-09-16 08:16) [0]

Подскажите пожалуйста, как скинуть в dbf - файл данные в правильном формате (ну там поля разных типов и длин) из Delphi6.Ну никак не получается :-(


 
alex_***   (2005-09-16 09:01) [1]

через ADO или ком. прямого доступа напр. TVKDBF. В чем конкр. проблема?


 
Max Zyuzin ©   (2005-09-16 09:10) [2]

Надо забраться повыше, взять в руки побольше данных, и как только внизу появится dbf-файл метнуть в него все что у тебя в руках :-)


 
alex_***   (2005-09-16 09:13) [3]

Copy+Paste ;)


 
Anatoly Podgoretsky ©   (2005-09-16 10:44) [4]

Annet ©   (16.09.05 08:16)  
Что такое dbf?


 
Annet ©   (2005-09-16 12:08) [5]

*.dbf - это DBase IV (сохранение из Еxcel). Просто так я копирую туда данные все видно и все ОК, но если их посмотреть хотя бы тем же DBFDesk"ом, то типы и длины полей не те. А файл передается на обработку дальше и нужен конкретный формат. Как с этим воевать?


 
Anatoly Podgoretsky ©   (2005-09-16 12:30) [6]

Почему думаешь, что не те?
Этому нужно подтверждение, я тоже пользуюсь иногда Экселем, подобного рода претензий у меня нет.

Аня, надеюсь имя не исказил? Для получения помощи надо более подробно описывать проблему, с указанием всех необходимых потребностей, иначе толку не будет, максимум чего можно добиться, так это насмешек и намеков кое на что.

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


 
Annet ©   (2005-09-16 12:47) [7]

Неправильным результат я считаю  потому, что когда я открываю полученную таблицу с помощью программы DBFDesk, вижу форматы полей. Так, когда мне нужен столбец типа Character(4) получается Numeric(9),  вместо Character(12) - Character(9),   Date(8) - Character(14) , Numeric(2) - Numeric(9)/ Тут  еще фишка в том, что все эти данные  я сперва получаю из SQL Server"a 2000:                 ADOQuery1.SQL.Add("select ..."); затем идет код типа:
                 ExcelApp.Connect;
                 WorkBK:=ExcelApp.Workbooks.Item[1];
                 WorkSheet:=WorkBK.Worksheets.get_item(1) as _worksheet;
                 IRange := WorkSheet.UsedRange[0];

while not ADOQuery1.Eof do
 begin
                 workSheet.Cells.Item[i,1].value:="Servlognum";
                 workSheet.Cells.Item[i,2].value:="callednum";
                 ...............
                 ADOQuery1.Next; i:=i+1;
 end

Потом Excel сам спрашивает: "Сохраняем?" я говорю сохраняем, ручками задаю имя файла и формат dbf4, смотрю DBFDesk"ом и вижу не совсем тот результат......


 
Annet ©   (2005-09-16 12:52) [8]

И еще одно. В SQL все типы - какие и должны быть а то ли Delphi, то ли   Excel все искажает...


 
Anatoly Podgoretsky ©   (2005-09-16 13:20) [9]

Annet ©   (16.09.05 12:47) [7]
Вопрос - ты задала жестко тип полей в Экселе, если нет то Эксель будет определять тип по содержимому. И задание типа не снимает проблемы с несответсвием содержимого.
Ну и программу надо так написать, чтобы не зависить от типов и размеров полей. Учитываем все таки, что Эксельн это не СУБД.
Потом можно подумать, а зачем нужен Эксель, не проще ли с помощью DTS сразу получать dBase таблицу должного формата и содержания. Может потом ее немного подработать в Дельфи, если полностью нужное достигнуть не удается.


 
Max Zyuzin ©   (2005-09-16 13:33) [10]

>Annet ©   (16.09.05 08:16)
Я извиняюсь за свою шутку. и присоединяюсь к Anatoly Podgoretsky ©   (16.09.05 13:20) [9]. Для чего использовать Excel если можно сразу перегонять в нужный тебе формат?


 
Annet ©   (2005-09-16 13:50) [11]

Нет. несоответствия содержимого точно нет. Там все правильно
А вот насчет DTS и dbase я не знаю. Что это за пакет и как им пользлваться? Или где по ним хелп почитать можно русский какой-нидь?
Только ведь дело в том, что задача конкретно поставлена!  Dbf4, конкретные поля и точка :-(


 
Annet ©   (2005-09-16 13:50) [12]

Удалено модератором


 
Annet ©   (2005-09-16 13:54) [13]

Максу: "Для чего использовать Excel если можно сразу перегонять в нужный тебе формат?" Так вот я и не знаю как сразу - поэтому и прошу здесь помощи......  Задание есть, а посоветоваться не с кем :-(


 
alex_***   (2005-09-16 14:58) [14]

если этот разовая работа может через Enterprize экспорт данных сразу в dbf сделать?


 
Max Zyuzin ©   (2005-09-16 15:05) [15]

>Annet ©   (16.09.05 13:54) [13]
Ок, давай задачу уточним. Тебе необходимо каждый раз новую таблицу, или у тебя есть уже фиксированая таблица dBase в которую периодически необходимо сбрасывать некоторую таблицу из MSSQL? или там результать какой то выборки из MSSQL?
Или просто необходимо отфанаруную таблицу перекачать в dBase? Это операция единовременная или необходимо там раз в минуту перекачивать информацию?


 
Annet ©   (2005-09-16 15:54) [16]

Задача следующая: раз в день таблицу (т.е  выборка из таблицы  в БД (где-то по 5000 новых записей каждый день) ) из MS SQL Server перекидывать в dbf4 и передавать эти данные уже в другой отдел... поэтому разовый экспорт не подходит: этим не я, а другой персонал занимается. Скидываем  не в фиксированную таблицу dBase, а каждый день создаем новую.


 
Max Zyuzin ©   (2005-09-16 16:04) [17]

>Annet ©   (16.09.05 15:54) [16]
Я имел ввиду что структура таблицы фиксированая? В которые вы это все сбрасываете?


 
msguns ©   (2005-09-16 16:16) [18]

А что, простым запросом нельзя данные из скалы просто вставить в двф ?
Типа
DELETE FROM <.dbf>

INSERT INTO <.dbf>
  (P1,P2,P3..)
SELECT P1,P2,P3.. FROM <таблица в скл>


 
Max Zyuzin ©   (2005-09-16 16:21) [19]

Правильный вариант, скорее всего, разобраться с такой штукой как Data Transformation Services (DTS) Это у MSSQL и написать правильный скрипт, который будет стартоваться в нужное время, делать запрос в Базу MSSQL и потом результат сбрасывать сразу в табличку dBase.
Но с этим нужно разбираться может какие нить монстры MSSQL ные тебе помогут, я сам с этим не разбирался.
2-й вариант напиасть на Delphi програмку которая будет делать запрос в базу MSSQL а потом все это переписывать непосредственно в файлик dBase


 
Anatoly Podgoretsky ©   (2005-09-16 17:01) [20]

Max Zyuzin ©   (16.09.05 16:21) [19]
Там можно весь процесс сделать визуально, а полученый скрипт сохранить, при необходимости изменить. Далее вызывать по запросу или с мощью MS SQL Agent - это встроеный планировщик.


 
Anatoly Podgoretsky ©   (2005-09-16 17:07) [21]

Annet ©   (16.09.05 13:54) [13]
А специалит по серверу есть, если есть то скоперировать и создать DTS пакет. Если нет, то самой разобраться, это одна из функций EM

alex_***   (16.09.05 14:58) [14]
Это замаскированый DTS


 
Annet ©   (2005-09-22 08:36) [22]

Я болела, только сегодня вышла.... Спасибо за советы.
По поводу DTS - он не подходит, т.к. все данные лежат во вьюшке и есть два пути:
1. делать вьюшку за конкретный день  и выбирать dts - пакетом, но тогда если что - пользователи не смогут взять данные например недельной давности
2. делать выборку из вьюшки с помощью делфей за конкретный любой день (это может сделать сам пользователь) - тут и возникают сложности с типами полей dbf4....


 
Max Zyuzin ©   (2005-09-22 09:21) [23]

>Annet ©   (22.09.05 08:36) [22]
Опять же не сяно тогда... у тебя каждый раз разные по структуре таблицы что ли получаются?


 
Annet ©   (2005-09-22 12:35) [24]

Нет, структура одинаковая, просто существует несколько услуг, по ним идет статистика каждый день (до 10000) записей по каждой. Все это в одной вьюшке. А выбрать надо допустим по одной или по двум из них. И не только за сегодня, но может быть за неделю назад. Как эту логику вынести в DTS я не знаю... А в делфи пользователь сам забивает дату и ставит галочки у нужных услуг, затем идет выборка по заданным параметрам. А потом все должно скинуться в dbf табличку с полями заданных типов. Тут и загвоздка получается :-(


 
evvcom ©   (2005-09-22 13:24) [25]

Да разве это загвоздка? Если предыдущие dbf-ки нужны, то копируем пустую из шаблонов с нужным именем, если не нужны, можно старую Empty. Потом вьюха.Open; dbf-ка.Open; и в циклах dbf-ка.Fields[i].value := вьюха.Fields[i].value;с Next-ами. Никаких проблем. Только раз уж с параметрами, то лучше сделать хранимку на основе вьюхи.


 
isasa ©   (2005-09-22 15:40) [26]

Если оставить Excel, то:
1.При преобразовании данных учитывается формат ячейки, чтобы не было такого
>мне нужен столбец типа Character(4) получается Numeric(9)
для строковой ставить в начале данный одинарный апостроф(  "12345   ), достаточно в первой строке, очень помогает.
2.Ширина поля данных берется по ширине столбша в пикселях, по крайней мере для PRN файлов это так, поэтому можно попробовать варьировать шириной колонки с данными(в Excel).


 
evvcom ©   (2005-09-23 12:20) [27]


> isasa ©   (22.09.05 15:40) [26]

Ну и зачем весь этот геморрой? А есть уверенность в том, что данная подгонка не собьется на другой версии Excel? Зачем завязываться на третий инструмент, если легко можно обойтись без него?


 
isasa ©   (2005-09-23 13:51) [28]

>Ну и зачем весь этот геморрой?
А кто его знает.
Но ...
> Если оставить Excel, то:


 
Annet ©   (2005-09-23 14:15) [29]

isasa! геморрой ачальство заказывает, а мне для них надо прогу доделать :-( Если честно, мне понятно не все, что ты написал в своем совете.... Может быть, есть время объяснить немного подробнее?


 
isasa ©   (2005-09-23 14:50) [30]

1. Если в ячейку Excel пишем число, а нам надо это поле представлять как Character, то используя правила Excel лучше
workSheet.Cells.Item[i,2].value:="""1234";
Конвертер это поймет и интерпретирует выражение 1234 как строку "1234", а не число. """ - в начале, потому что надо вставить одинарную кавычку в строку Delphi.

2.Для установки размера поля, например Character(50),
можно попробовать(здесь я не уверен для DBF, проверено только для PRN) - установить ширину соответствующей полю колонки в Excel
workSheet.Columns[<индекс нужной колонки(столбца)>].ColumnWidth = 50;


 
isasa ©   (2005-09-23 15:01) [31]

Удивительно, не поленился, проверил, в пятницу!

Конвертер XLS -> DBF, для полей Character выставляет размер поля по ширине соответствующей колонки в таблице Excel.
Другими словами, если ширина колонки 8.43(у меня так по умолчанию), то будет 9. Если 50, то поле в DBF будет Character(50).


 
evvcom ©   (2005-09-23 15:16) [32]

Annet, ты гораздо меньше времени потратишь, если не будешь пользовать для непонятной конвертации Excel. Прочти еще раз [25]



Страницы: 1 вся ветка

Текущий архив: 2005.10.23;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.045 c
14-1128076085
Андрей Жук
2005-09-30 14:28
2005.10.23
Составил бюджет на следующий месяц...


2-1127504501
ForsXT
2005-09-23 23:41
2005.10.23
Звук


1-1128084529
Андрей Жук
2005-09-30 16:48
2005.10.23
Директивы компилятора Delphi


1-1128261565
SergP.
2005-10-02 17:59
2005.10.23
Разные результаты компрессии CompressBuf и TCompressionStream


14-1128094551
Копир
2005-09-30 19:35
2005.10.23
Две пятничных задачи по эстетике.