|
|
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
А зачем вам определять тип данных источника? Важен ведь тип данных в таблице получателя... Примеры: В столбце листа таблицы экзеля хранятся числовые значения. Есть и числа, записанные как текст, тем не менее, полностью соответствующие числовому формату. Тем не менее, применение Val() или CLong() вам поможет преобразовать все данные в числа и записать в конечную таблицу поле типа Numeric. Даты - отдельная песня. В экзеле тип дата - числовой, тем не менее, в ячейках могут быть и даты, представленные строками, например, вида "дд.мм.гггг" или "мм/дд/гг". Юзайте CDate() и получайте дату для последующей записи. --------------- Еще раз повторюсь - старайтесь не использовать "третьи" варианты языков для работы с форматами хранения данных, написанными на других языках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2008, 17:42 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
AndreTMА зачем вам определять тип данных источника? Важен ведь тип данных в таблице получателя... Примеры: В столбце листа таблицы экзеля хранятся числовые значения. Есть и числа, записанные как текст, тем не менее, полностью соответствующие числовому формату. Тем не менее, применение Val() или CLong() вам поможет преобразовать все данные в числа и записать в конечную таблицу поле типа Numeric. Даты - отдельная песня. В экзеле тип дата - числовой, тем не менее, в ячейках могут быть и даты, представленные строками, например, вида "дд.мм.гггг" или "мм/дд/гг". Юзайте CDate() и получайте дату для последующей записи. --------------- Еще раз повторюсь - старайтесь не использовать "третьи" варианты языков для работы с форматами хранения данных, написанными на других языках. Дело в том, что нужно проверить корректность данных в эксел файле, прежде, чем отправлять в базу. Например, в поле ИНН пользователь поставил букву (случайно или нет). Можно сделать так: брать все ячейки как строки, а затем пробовать каждую на StrTo.., а чтобы не словить ошибку - все это дело запихнуть в try catch? По поводу даты: она в формате дд.мм.гггг. Про "третьи" языки. Какой язык подходит для такой задачи? Фокспро? VC? CDate(), CLong() - это вроде VC. з.ы. Все таки не могу понять. Ведь чтобы поместить в переменную значение, нужно сначала выделить под нее место, а чтобы выделить место, нужно знать, какого она типа. В итоге тип ячейки должен быть известен. Или эксел это интерпретатор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 09:12 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
BananasКак определить тип ячейки эксел файла? у Varianta есть методы Type() и AsType(), почитай на него хэлп. Ориентироваться на "NumberFormat" в Экселе я бы не советовал, потому как он (эксель) сам его не очень-то соблюдает, а формат "@" - вообще может содержать всё, что угодно. Так что считывай из ячейки Value и проверяй какой у него тип. Типа как-то так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 10:51 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 1. цифры и текст 2. только цифры В обоих случаях выводит ""Это не целый тип". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 17:35 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
BananasПо поводу даты: она в формате дд.мм.гггг. Про "третьи" языки. Какой язык подходит для такой задачи? Фокспро? VC? CDate(), CLong() - это вроде VC. з.ы. Все таки не могу понять. Ведь чтобы поместить в переменную значение, нужно сначала выделить под нее место, а чтобы выделить место, нужно знать, какого она типа. В итоге тип ячейки должен быть известен. Или эксел это интерпретатор? VBA - интерпретатор. Кстати, как и FoxPro. У них все явно не типизированные переменные - динамические. А в фоксе так вообще - всегда динамические. CDate(), CLong() и т.д. есть в VB, означают перевод результата некоего выражения в указанный тип данных. По поводу языков - если считать, что в DBF данные корректны полностью, а исходные данные берутся из XLS, я бы написал приложение на VB или VBA. Другое дело, что могут настать такие тормоза на большом количестве записей (в исходниках). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2008, 18:54 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
AndreTM CDate(), CLong() и т.д. есть в VB, означают перевод результата некоего выражения в указанный тип данных. По поводу языков - если считать, что в DBF данные корректны полностью, а исходные данные берутся из XLS, я бы написал приложение на VB или VBA. Другое дело, что могут настать такие тормоза на большом количестве записей (в исходниках). А если все таки в в ячейке, где должны стоять одни цифры, поставили букву или символ (-=, они рядом). Эксел поставит, что в этой ячейке текст... Записей будет много - я в этом уверен. Если в ячейке цифры и текст - эксел их метит так же как и текст или по-другому? Похоже придется читать ячейку посимвольно и сравнивать на типы, вылавливая исключения (если не удастся преобразовать). Тогда, зная какие данные в ячейке (цифры/текст) и определив, какой тип присвоил ей эксел, можно сразу установить, что в ячейке ошибка. Чтобы сэкономить время на проверках. Как вариант? Или можно проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 14:20 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
если формат ячейки - текстовый, то эксель всё будет считать текстом, вне зависимости от того, что там конкретно написано. если формат ячейки - общий, то тогда цифры станут цифрами, даты - датами, а слова - словами. Упрощённо. читай из ячейки, преобразуй в строку, потом пытайся преобразовать в число. как-то так попробуй: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 15:33 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
egorychесли формат ячейки - текстовый, то эксель всё будет считать текстом, вне зависимости от того, что там конкретно написано. если формат ячейки - общий, то тогда цифры станут цифрами, даты - датами, а слова - словами. Упрощённо. читай из ячейки, преобразуй в строку, потом пытайся преобразовать в число. как-то так попробуй: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. По справке: взяли значение f и поменяли ему тип на varString, затем преобразовали в ToInt() и присвоили int som. В f скормил ячейку: 7707083895, а дебагер вывалил ошибку is not a valid integer value.:( egorychесли формат ячейки - текстовый, то эксель всё будет считать текстом, вне зависимости от того, что там конкретно написано. если формат ячейки - общий, то тогда цифры станут цифрами, даты - датами, а слова - словами. Я наверно жутко туплю, но у меня уже выражение "тип ячейки эксел" вызывает бурную реакцию. На Type внимания вообще не обращать? Т.е. предпроверку смысла делать не имеет? А как же Variant? Это не интерперетаторная переменая, а может получать что угодно. Или он это что угодно всегда в String ложет? (или там завернуты варианты всех типов... ?). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 16:49 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
Bananas(или там завернуты варианты всех типов... ?). чтоб без недопонимания: имел ввиду переменные всех типов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 16:52 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
сам мучаюсь с экселем этим, сочувствую. полного понимания так до сих пор и нет, как он там с Variant'ом этим обходится, по возможности стараюсь пользовать строки, остальные типы уж больно не стабильно работают. или оставляю всё в Variant, в запросы пихаю его. кстати, 7707083895 он в вариант запихивает как Double. З.Ы. в строку всегда можно запихнуть всё, ну или почти всё. З.Ы.Ы. Эксель - зло ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2008, 17:50 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
BananasА как же Variant? Это не интерперетаторная переменая, а может получать что угодно. Или он это что угодно всегда в String ложет? (или там завернуты варианты всех типов... ?). Variant - это Variant :) Динамический тип. Естественно, передается по ссылке. Память распределяется из кучи. В чем проблема-то? Если данные в Экзель, с отображением ячеек ничего не намудрено, нигде в ячейках не выдает ошибку - то данные либо нужного вам типа, либо Variant/String. Если уверены, что есть проблемы (юзер вписал 1ОО3 вместо 1003) - ну так перед выгрузкой включите свой обработчик ошибок и пройдитесь по всем столбцам, пытаясь использовать преобразование типов - как уже говорилось - CBool(expression), CByte(expression), CCur(expression), CDate(expression), CDbl(expression), CDec(expression), CInt(expression), CLng(expression), CSng(expression), CStr(expression), CVar(expression). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2008, 04:36 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
* по ссылке - только что заметил, конечно, через указатель... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2008, 08:09 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
AndreTMВ чем проблема-то? Если данные в Экзель, с отображением ячеек ничего не намудрено, нигде в ячейках не выдает ошибку - то данные либо нужного вам типа, либо Variant/String. Если уверены, что есть проблемы (юзер вписал 1ОО3 вместо 1003) - ну так перед выгрузкой включите свой обработчик ошибок и пройдитесь по всем столбцам, пытаясь использовать преобразование типов - как уже говорилось - CBool(expression), CByte(expression), CCur(expression), CDate(expression), CDbl(expression), CDec(expression), CInt(expression), CLng(expression), CSng(expression), CStr(expression), CVar(expression). Проблема в том, что у меня не преобразовывается. По коды выше (даже в ToDouble()) вываливает raised exception class EVariantOverflowError with message 'Overflow while converting variant of type (String) into type (Integer). ---чуть позже: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext Как происходит помещение в базу? Если поле одного типа, а положить в него пытаешься значение другого типа? Может таким образом можно проверять тип? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2008, 10:22 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
переклинило. Это не тип дабл. :( Вот с**а. Я уже не знаю. неужели в билдере проверку нельзя сделать? Либо придется пересаживаться, либо читать все как строку, а затем ее тупо брутфорсить на каждый символ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2008, 10:28 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
Я скоро начну выражаться непечатно... Тема продолжается уже месяц - работы было - на час. -------------------- 2moderators - флейм будет по теме раздела. Рассказываю притчу. В некоем году (ближе к концу девяностых) некая контора (ближе к государственным) возжелала (а, вернее, в приказном порядке по пилот-проекту) все-таки перейти на единый программный комплекс, соответственно, с единой БД, написанный на ФоксПро. До этого, хотя и были вполне нормальные БД, многое (если не все) являлось самописным. Построено было на FPD2.x, Клиппере, даже QuattroPro имелся. Имелся уже и незабвенный Офис. В полный рост встала задача - перенести как можно больше данных. На новый-то комплекс документация имелась вплоть до описания схемы данных, а вот на "своё" - ну, вы сами знаете, как программисты пишут документацию. "Специалисты" озаботились автоматизировать процесс переноса. Конечно, много было попорчено крови и зрения при разборе исходных схем хранения, но настал и тот самый момент, когда можно было приступить к главному - пробовать переносить данные. И тут выяснилось, что спецы отнюдь не едины во мнении, какими средствами это делать. Кто-то предлагал Бэйсик... Кто-то - Дельфи... Предпринимались попытки что-то писать... Время утекало. Когда же предложения достигли апогея (был предложен Форт, а также Си в качестве альтернативы) - я решил вмешаться в процесс, ибо писать операционку-СУБД как-то не было желания... При ближайшем рассмотрении оказалось, что все схемы данных укладываются в модель РБД (с некоторыми натяжками), и хранятся в форматах, поддерживаемых СУБД. Эрго: надо пользовать СУБД. Я уже достаточно знал возможности FP, чтобы выбрать его (хотя мог бы написать и на TPas, но смысл?). В результате всего через две недели появился даже не тупой конвертер, а оболочка для переноса схем. "Спецам" оставлена была "нетворческая" работа - забить соответствие баз-таблиц-полей... Слава Пану, когда спустя несколько лет потребовалось переводить все на SQL, "специалистов по паскалю" уже не оставалось... ------------- Не в обиду будь сказано, но с тех пор я со снисхождением отношусь к попыткам писать управление базами на Дельфи или Си. Конечно, ООП - это круто, конечно, все знают, что все серьезные системы пишутся на С. Правда, при этом не надо забывать, что вы не второй Вирт и не владеете фирмой в Силиконовой долине... Вот как только кто-нибудь сумеет мне доказать, что для работы с пятью таблицами и тремя запросами необходимо написание собственной системы управления базами данных - первым вольюсь в ряды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2008, 12:57 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
------------------------ Вопрос по существу: Вы пишете о том, что при совпадении исходных данных со "справочниками" необходимо что-то дописать в "справочники". Но ведь по сути "справочники" нужны для того, чтобы только контролировать эти исходные данные. Пример: взяли ИНН, Наименование. В "справочнике" тот же ИНН соответствует тому же Наименованию. Что дописывать-то еще? Опять же, вы получаете некие исходные данные, они не совпадают со "справочниками" и необходимо "исправить". Что? Исходные данные? Справочник? Судя по всему, либо вы изначально неправильно сформулировали техпроцессы, либо умалчиваете ключевые особенности предметной области. ------------------------ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2008, 13:38 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
AndreTM Не в обиду будь сказано, но с тех пор я со снисхождением отношусь к попыткам писать управление базами на Дельфи или Си. Конечно, ООП - это круто, конечно, все знают, что все серьезные системы пишутся на С. Правда, при этом не надо забывать, что вы не второй Вирт и не владеете фирмой в Силиконовой долине... Вот как только кто-нибудь сумеет мне доказать, что для работы с пятью таблицами и тремя запросами необходимо написание собственной системы управления базами данных - первым вольюсь в ряды. Кстати, о FoxPro: FoxPro написан на С++, развивается тремя программистами и успешно реализует управление небольшими базами данных... Для больших баз данных на нем можно написать клиента и работать, например, через ODBC... З.Ы. В остальном согласен с AndreTM... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2008, 14:36 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
AndreTM Не в обиду будь сказано, но с тех пор я со снисхождением отношусь к попыткам писать управление базами на Дельфи или Си. Конечно, ООП - это круто, конечно, все знают, что все серьезные системы пишутся на С. Правда, при этом не надо забывать, что вы не второй Вирт и не владеете фирмой в Силиконовой долине... Вот как только кто-нибудь сумеет мне доказать, что для работы с пятью таблицами и тремя запросами необходимо написание собственной системы управления базами данных - первым вольюсь в ряды. Задачи баз как вы и написали: 1. Считать из эксела словарну ячейку. 2. Проверить их по словарям dbf if(они совпадают) then взять соответствующую запись из эксела и поместить в dbf else вывести предупреждение и предложить исправить либо эксел либо добавить в словарь Относительно алгоритма проверки на тип. Обернуть его в функцию с аргументами (& ячейка, * тип_проверки), возвращает bool: 1 - ошибка, 0 - нормально. Указатель же может содержать любой тип? Проверкой новой ячейки инициализировать его типом, на который нужно проверить. Что скажут опытные программиты? З.Ы.Спасибо за снисхождение:) Реального опыта у меня мало, так что правило Питера в моем случае работает на полную катушку - стараюсь писать на том, что более-менее усвоил в универе.Знаю пару ребят, с кем учился. Оба пишут к базам на дельфи. Правда один пару лет назад в Москрву уехал. На чем правильнее писать к дбф? Про оракл тут читал про яву, про мс - полагаю их нет. Просто у нас реалий не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2008, 15:12 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
Bananas AndreTM Не в обиду будь сказано, но с тех пор я со снисхождением отношусь к попыткам писать управление базами на Дельфи или Си. Конечно, ООП - это круто, конечно, все знают, что все серьезные системы пишутся на С. Правда, при этом не надо забывать, что вы не второй Вирт и не владеете фирмой в Силиконовой долине... Вот как только кто-нибудь сумеет мне доказать, что для работы с пятью таблицами и тремя запросами необходимо написание собственной системы управления базами данных - первым вольюсь в ряды. Задачи баз как вы и написали: 1. Считать из эксела словарну ячейку. 2. Проверить их по словарям dbf if(они совпадают) then взять соответствующую запись из эксела и поместить в dbf else вывести предупреждение и предложить исправить либо эксел либо добавить в словарь Относительно алгоритма проверки на тип. Обернуть его в функцию с аргументами (& ячейка, * тип_проверки), возвращает bool: 1 - ошибка, 0 - нормально. Указатель же может содержать любой тип? Проверкой новой ячейки инициализировать его типом, на который нужно проверить. Что скажут опытные программиты? З.Ы.Спасибо за снисхождение:) Реального опыта у меня мало, так что правило Питера в моем случае работает на полную катушку - стараюсь писать на том, что более-менее усвоил в универе.Знаю пару ребят, с кем учился. Оба пишут к базам на дельфи. Правда один пару лет назад в Москрву уехал. На чем правильнее писать к дбф? Про оракл тут читал про яву, про мс - полагаю их нет. Просто у нас реалий не знаю. Для работы с dbf как правило используют языки семейства xBase (FoxPro, разные клоны Clipper'a, dBase и т.д.). Из всего этого разнообразия, самая заметная популярность у FoxPro. К тому же он интерпретатор и примерно 50% программы можно выполнить/отладить в командном окне... В Visual FoxPro есть возможность через интерфейс СОМ обратиться к Excel и заставлять выполнять его некоторые команды (например, открыть файл, прочитать значение из ячейки и т.д.)... Вместе с тем, Excel тоже позволяет работать в файлами dbf как с "родными" (можно их загружать и в них сохранять). Поэтому, можно написать макросы на Excel-VBA... Насчет указателей. В принципе, это правда. Указатель лишь указывает на некоторую область памяти. А вот уже ТИП (например,через длину данных (в байтах)) определяет как эти данные интерпретировать. Поэтому, есть особый указатель (void *), в который может быть преобразован любой указатель... Однако, здесь возможны различные трудноуловимые ошибки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2008, 09:03 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
Bananas , головушку бы вы нам не морочили :) Задачи нужно уметь ставить. И вообще, вашу задачу пора перенести либо в VFP, либо в VB. Рассказываю, как должно было быть поставлено задание: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. --------------------------- Посмотрел ваш файлик, со структурой примерно определился. Вопросы такие: действительно ли нужна реляционная база (то есть несколько связанных таблиц), или достаточно одной, куда помещаются документы? Плательщики-получатели у вас разные, или Плательщик может выступать и Получателем? Глубинные контрольные соотношения собираетесь проверять (типа контрольного разряда в ИНН или правильности заполнения ОКАТО)? --------------------------- В общем, обе ваших темы можно закрывать, ибо с Билдером можете завязывать, особенно если под базу будет потом еще писаться приложение на VFP. Свяжитесь со мной мэйлом или асей, проблемы будем решать, не разводя флейм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2008, 10:28 |
|
||
|
доступ к xls и bdf из своей утилитки?
|
|||
|---|---|---|---|
|
#18+
AndreTM Посмотрел ваш файлик, со структурой примерно определился. Вопросы такие: действительно ли нужна реляционная база (то есть несколько связанных таблиц), или достаточно одной, куда помещаются документы? Плательщики-получатели у вас разные, или Плательщик может выступать и Получателем? Глубинные контрольные соотношения собираетесь проверять (типа контрольного разряда в ИНН или правильности заполнения ОКАТО)? --------------------------- В общем, обе ваших темы можно закрывать, ибо с Билдером можете завязывать, особенно если под базу будет потом еще писаться приложение на VFP. Свяжитесь со мной мэйлом или асей, проблемы будем решать, не разводя флейм. По вопросам: 1. Нужны dbf; 2. Dbf, который я выложил - зеркальная копия эксел-файла, из которого будет идти выгрузка. 3. Никакого деления на сущности не будет - начальник это особо оговорил - чтобы отчеты из кристала удобно было делать. 4. Так же будут dbf-словари "Плательщик" и "Наименование платежа". По ним будет вестись проверки. 5. "Плательщик может быть Получателем". Такая проверка не нужна. Единственные проверки - сверка со словарями, чтобы в таблицу не проскочил неизвестный Плательщик.. Про "Глубинные контрольные соотношения собираетесь проверять (типа контрольного разряда в ИНН или правильности заполнения ОКАТО)?". Не уверен, что понял. Буду проверять только, чтобы не затесались буквы или другие нецифровые символы. У ИНН и ОКАТО коды стандартной длины? В ветке про фокс смотрел, там похоже действительно легко типы эксела перегонять... К сожалению переходить на фокс времени почти нет. Про мейл. На работе закрыт, так что выхожу по вечерам с домашнего. И то не часто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 10:35 |
|
||
|
|

start [/forum/topic.php?fid=16&gotonew=1&tid=1344957]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
190ms |
get topic data: |
9ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 268ms |
| total: | 560ms |

| 0 / 0 |
