Форум: "Начинающим";
Текущий архив: 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) - установить ширину соответствующей полю колонки в ExcelworkSheet.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