Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.036 c
2-1127583139
quadronik
2005-09-24 21:32
2005.10.23
Числовое вырожение прописью


3-1126642158
saNat
2005-09-14 00:09
2005.10.23
Создание БД с выборкой информации из существующей


3-1126686715
ZZZ
2005-09-14 12:31
2005.10.23
Как связать поле таблицы с компонентом DateTimePicker


1-1128086320
nikolas
2005-09-30 17:18
2005.10.23
Модуль не доступен для отладки


3-1126086871
Term
2005-09-07 13:54
2005.10.23
как в ХП для FB1.5 получить аналогичный результат





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский