Як перевірити чи є потрібне поле в таблиці, і якщо його немає додати?
Дуже цікава постановка питання проте
Сенс ось у чому. Оновлюю стареньку програмку. В існуючій таблиці потрібно додати додаткове поле. Ось і потрібно перед тим як відкрити таблицю, перевірити чи є воно чи ні, якщо ні - додати, а після цього відкрити всі потрібні таблиці і почати роботу
Тобто виходить, що проге можуть підсунути 2 варіанти таблиць: стару (без поля) і нову (з полем), а вона сама повинна типу розібратися і, якщо що, зі старої таблиці зробити нову?
Якщо так, то отримати інформацію про полях вхідний таблиці (до моменту старту проги неясно який: нової або старої) можна просто відкривши запит Select * from Table і перебрати колекція Філд датасета.
Хоча сама ідея каламутна, тому що непонятки, що робити з інфою, доданої в це нове поле в попередньому сеансі роботи з прогой. ІМХО, треба какашки відокремити від сорочки. Тобто окремою процедурою (не обов'язково писати для цього програму) зробити перевірку і реструктуризацію (якщо треба) таблиці і запускати її або ручками (одноразово?), або безпосередньо перед запуском проги. А сама прога вже працює з незмінною структурою. Інакше, ІМХО, буде каша.
В тому-то й суть, що програмою може бути підсунути стара таблиця і в будь-який момент часу. Тому руками робити не вихід, програма сама повинна розібратися і якщо що, то додати поле, природно в старих записах дані цього нового поля будуть нульові. Після цієї операції відкриваються датасета заточені на роботу з цим полем
1. Відкриваємо БД
2. Запускаємо запит на вибірку за все з завідомо неправдивими умовою (тому що нам потрібні не дані, а інфа про Філд)
3. Шукаємо в колекції Філд відкритого датасета поле-фантом і виставляємо ознака є / немає
4. Закриваємо запит
5. Якщо ознака "немає фантома", то
# XA0; 5.1. Переводимо таблицю в Еклюз
# XA0; 5.2. Малюємо динамічний DDL-запит типу ALTER, який повинен додати поле в таблицю
# XA0; 5.3. Запускаємо запит і перевіряємо результат. Якщо Фалс, то ченить дзявкали і термініруем прогу.
# XA0; 5.4. Знімаємо з табли ексклюзив
6. Основна робота проги (таблиця вже з потрібним полем)
Треба розуміти, що прожка виключно розрахована на одного?
м.б. так?
if Table1.FindField ( "SomeField") = nil then Query1.Execute
Соотв. в Query1 міститься запит ALTER TABLE.
А як бути з екслюзивно?
Серьога. ти хочеш побачити переказ / повтор того, що сам уже написав про неї. )))
З Paradox я не працюю, для DBF я дивлюся структуру по шапці бази даних. Думаю що можна порівняти дві шапки таблиці. І додати відсутні поля.
Можна ще по чоботях. Або шубі. Зустрічаємо по одягу?
У сабже треба програмно;)
По-перше, де тут "шапка". Тема, тобто частина файлу ДБФ, де записана інфа про структуру таблиці (в.ч.дескріптори полів) назвати шапкою.
Так і взагалі. дивний код. Має якийсь ДОСовскіх душок
Шапкою взагалі-то називаеться то, що видно вгорі (на початку) чогось: звіту, наприклад. У гріді взагалі-то те, що Ви називаєте шапкою, обзивається титулом або, але робітничо-селянському, заголовком. # XA0; З структурою (по-Вашому "шапкою") таблиць даних, який цей грід відображає, цей заголовок може мати дуже мало спільного.
> Ще раз зазначу - я працюю тільки з DBF
Мені сумно за Вас.
> Я навів, код тільки для визначення структури БД. На початку заголовка приведена вся інформація про БД.
По-перше, не про БД. а лише про таблиці, а по-друге, не вся.
> Запропонуйте як ви ще хочете точно визначити довжину полів типу Num розміру 18,3? У типу флоат немає адже реального розміру, це плаавющая точка.
Я нічого пропонувати не буду. Крім того, що можу відіслати Вас до численних доків за різними форматами, движкам і серверів БД
з метою усвідомлення фізичного способу зберігання і способів інтерпретації та відображення чисел в таблицях баз даних.
У ДБФ, по-моєму, все завжди зберігається в символьному вигляді, або я не правий?
2. Запускаємо запит на вибірку за все з завідомо неправдивими умовою (тому що нам потрібні не дані, а інфа про Філд)
Навіщо такі збочення?
Fielddefs.Update - і всі метадані у вас в кишені.
Для цього треба відкрити таблицю. Запит же її не відчиняє, - в цьому і різниця. До речі, відкриття таблицю за часом довше буде (для парокса у всякому разі). Запит же виконається практично миттєво, навіть якщо на іншому комп'ютері.
Для цього треба відкрити таблицю.
Для цього не треба відкривати таблицю
Мається на увазі, що метод Open ми не повинні викликати.
Сама таблиця зрозуміло буде відкрита як файл, так само як і у випадку з select * from table where 0 = 1
Згоден. Просто я так користуюся іншими засобами. До речі, якщо глянути TDataSet, то, можливо, він сам і пускає подібні запити, а?
Пам'ять: 0.78 MB
Час: 0.084 c