Конференция "Базы" » Указать путь в SELECT к БД. [D7, Access]
 
  • Alex_C (07.11.11 10:06) [0]
    Почему вот так

    SELECT * FROM Diplom AS Dpl IN awards.mdb


    и вот так

    SELECT * FROM [awards.mdb].Diplom AS Dpl


    работает, а при попытке указать полный путь к файлу БД нет?
  • Медвежонок Пятачок © (07.11.11 10:13) [1]
    потому что
    http://msdn.microsoft.com/en-us/library/bb177907(v=office.12).aspx
  • Inovet © (07.11.11 12:01) [2]
    Вот зачем ты в разные базы рассовываешь всё? Делай в одной. Лучше сделай экспорт импорт для обмена хоть в текстовом формате.
  • sniknik © (07.11.11 12:43) [3]
    > а при попытке указать полный путь к файлу БД нет?
    там наверняка двоеточие есть...
  • sniknik © (07.11.11 12:45) [4]
    а вообще это карма. не слушаешь, что тебе говорят о подобной логике... :)
  • Alex_C (07.11.11 13:43) [5]

    > разные базы рассовываешь всё? Делай в одной.


    Почему все в разные? у меня всего их 2 :) БД будет. И кстати по ТЗ только так и получается.


    > потому что


    Tnx!
  • Inovet © (07.11.11 16:55) [6]
    > [5] Alex_C   (07.11.11 13:43)
    > И кстати по ТЗ только так и получается.

    Зеачит ТЗ переделать.
  • Alex_C (10.11.11 09:51) [7]

    > Вот зачем ты в разные базы рассовываешь всё?


    Вот знаешь убедил ты меня :) Хочу теперь все что можно в одну БД засунуть.
    Однако появилась такая проблема: пользователь хочет завести себе новую отдельную БД (за чем это надо - уже в соседней ветке объяснял.) Вопрос: как при создании этой БД скопировать в нее "справочные" таблицы?

    Вот моя мысль какая: я создал некую template.mdb - где есть готовые справочные таблицы. Потом создаю новую БД и в нее копирую все справочные таблицы. Вот такой вариант нормально?
  • Anatoly Podgoretsky © (10.11.11 10:28) [8]
    > Alex_C  (10.11.2011 09:51:07)  [7]

    замучаешься ты с разными базами. Особенно с запросами.
  • Inovet © (10.11.11 10:53) [9]
    > [7] Alex_C   (10.11.11 09:51)
    > Вот моя мысль какая: я создал некую template.mdb - где есть
    > готовые справочные таблицы. Потом создаю новую БД и в нее
    > копирую все справочные таблицы. Вот такой вариант нормально?

    Нормально. Только зачем копировать: поставляй базу с некоторыми заполненными справочниками и пусть пользователь с ней дальше работает. А я бы сделал ещё экспорт импорт в какой-нибудь универсальный формат, в текстовый CSV например, или XML. Но это на потом можешь оставить, если понадобится такое.
  • Alex_C (10.11.11 11:06) [10]

    > поставляй базу с некоторыми заполненными справочниками


    Я не правильно написал. Имелось ввиду что я заранее сам создал БД со справочными таблицами и с этой БД я программу и буду поставлять пользователю. Вот и при создании новой БД из "исходной БД" буду копировать справочные таблицы.


    > замучаешься ты с разными базами. Особенно с запросами.


    Вот я и хочу: БД рабочая - будет одна. Просто пользователь сможет выбирать, от куда ее брать.
    А на счет запросов - конечно согласен! Сейчас уже в общем программу переделал под SQL - уже вникаю в суть понемногу!

    Большое спасибо всем за советы - очень помогают!
  • Alex_C (10.11.11 11:13) [11]
    Кстати: как я понял в SQL нет (?) оператора, позволяющего копировать таблицы? Или плохо искал? Интересует 2 варианта: копирование только структуры и копирование вместе с данными.
  • Inovet © (10.11.11 11:32) [12]
    > [10] Alex_C   (10.11.11 11:06)
    > Имелось ввиду что я заранее сам создал БД со справочными
    > таблицами и с этой БД я программу и буду поставлять пользователю.
    > Вот и при создании новой БД из "исходной БД" буду копировать
    > справочные таблицы.

    Я понял. Я говорю - зачем копировать записи из одной базы в другую, когда можно эту template.mdb скопировать как файл в Base1.mdb Petya.mdb Vasya.mdb, программе при запуске выбрать нужную или в коммандной строке указать, и сформировать строку подключения. Про экспор импорт уже дважды писал. И не храни их в "Program files", есть для этого профили пользователя и вних папки для данных.
  • Inovet © (10.11.11 11:34) [13]
    > [10] Alex_C   (10.11.11 11:06)
    > БД рабочая - будет одна. Просто пользователь сможет выбирать,
    > от куда ее брать.

    Это не понятно. Что значит одна, но брать её из другой.
  • Inovet © (10.11.11 11:42) [14]
    > [11] Alex_C   (10.11.11 11:13)
    > Кстати: как я понял в SQL нет (?) оператора, позволяющего
    > копировать таблицы?

    Потому что при правильном проектировании копировать таблицы не нужно. А при правильном есть
    INSERT INTO table_dst SELECT field1, field2 FROM table_src

  • Alex_C (10.11.11 13:17) [15]

    > при правильном проектировании


    Есть такая задача: в одной БД несколько таблиц лога.
    Вот задача: в этой же БД создать новую пустую таблицу. SELECT - это копирование. А вот пока до создания - не понял как.


    > Это не понятно. Что значит одна, но брать её из другой.


    Не понял меня: пользователь должен в случае необходимости выбирать ФАИЛ (именно фаил!!!) БД! А вот потом уже именно с ней и работать.
  • Alex_C (10.11.11 13:18) [16]

    > до создания


    Ну не делать же CREATE TABLE? Или все время делать?
  • Inovet © (10.11.11 13:55) [17]
    > [16] Alex_C   (10.11.11 13:18)
    > Ну не делать же CREATE TABLE? Или все время делать?

    Это как раз неправильное проектирование. Не надо плодить одинаковые по смыслу таблицы. Я не понял хачем надо несколько логов, но в любом случае это должна быть одна таблица с полем в простом случае Log_Num - номер журнала. Но вероятно ещё есть какой-то смысл кроме номера, тогда ещё справочник журналов завести.
  • Alex_C (10.11.11 14:06) [18]

    > Я не понял хачем надо несколько логов


    Поясню. Хем едет в экспедицию. Есть ноут и моя программа. Он по каким то соображениям хочет сделать новую отдельную БД (фаил!!!) у себя на флешке, чтоб потом ее сихронизировать с основным логом.
    База - не проблем - просто копирование из template. Теперь он хочет завести новую таблицу. Я вот пока чего не нашел: как сделать новую таблицу (пустую) с нужными полями? В БД "образец" таблицы есть - все что нужно - скопировать структуру таблицы в новую. Вот как то так)))
  • Inovet © (10.11.11 14:26) [19]
    > [18] Alex_C   (10.11.11 14:06)
    > Теперь он хочет завести новую таблицу.

    Вот этот момент не понятен. Польхователь не должен знать ни о каких таблицах и прочем внутреннем устройстве программы.

    Я пытаюсь объяснить, что изменение структуры БД должно быть только при изменениях функциональности, иначе это ошибка проектирования. Поэтому и команды нет такой на клонирование таблиц.

    Что до описанной ситуации. Пусть работает с пустой базой, дома импортирует в основную, сама задача импорта может оказаться не такой уж и простой, точно сложнее простого копирования. Соответсвующий функционал должен быть предусмотрен в программе.
  • Alex_C (10.11.11 18:03) [20]
    И все же вопрос открыт: как скопировать одну таблицу в другую при условии при копировании создать таблицу?
  • Inovet © (10.11.11 18:25) [21]
    SELECT INTO
  • Alex_C (10.11.11 18:29) [22]

    > SELECT INTO


    Я это еще не пробовал - пока и так переделок хватает - извини за еще раз тупой вопрос - даже если таблицы нет это сработает?
  • Alex_C (10.11.11 18:37) [23]
    Попробовал. Не работает

    'INSERT INTO NewTable SELECT * FROM ' + LogTable


    если NewTable  не существует.
  • Inovet © (10.11.11 18:45) [24]
    > [22] Alex_C   (10.11.11 18:29)
    > даже если таблицы нет это сработает?

    Про jet не знаю, а вообще да.
  • Inovet © (10.11.11 18:46) [25]
    > [23] Alex_C   (10.11.11 18:37)
    > INSERT INTO

    Это не то, читай внимательно.
  • Jeer © (10.11.11 21:39) [26]
    Бесперспективно..
  • Alex_C (11.11.11 11:13) [27]

    > Бесперспективно..


    Очень глубокая мысль :)


    > вообще да.


    В общем сделал проще - да бы ручками не описывать всю структуру таблицы сдал программку, которая это за меня делает.
    Однако вопрос: почему когда я делаю

     ADOCommand1.CommandText := 'CREATE INDEX Indx ON NewTbl (Call, DateQSO, TimeQSO,' +
       'Mode, BandADIF, State, County, Country)';
     ADOCommand1.Execute;


    открываю таблицу в Access'е - Конструктор - а поля у меня индексными не становятся?
  • sniknik © (11.11.11 11:31) [28]
    не знаю почему не становятся... может показанное не выполняешь, может ошиьбку игнорируеш, а может смотришь не там/не то, хотя оно становится...
    но!
    индекс по
    > Call, DateQSO, TimeQSO, Mode, BandADIF, State, County, Country
    такой куче полей, ИМХО, бесполезен.
  • Alex_C (11.11.11 14:40) [29]

    > не знаю почему не становятся...


    Комманда отрабатывает - если не верно указать - то ругается. Смотрю в самом Access'е в конструкторе таблиц.


    > Call, DateQSO, TimeQSO, Mode, BandADIF, State, County, Country


    Кстати вот тоже момент который мне интересен - по всем данным полям мне нужна и выборка и сортировка. А почему тогда не стоит их в индекс заносить?
  • Inovet © (11.11.11 15:32) [30]
    > [29] Alex_C   (11.11.11 14:40)
    > по всем данным полям мне нужна и выборка и сортировка

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

    ORDER BY Call, DateQSO, TimeQSO, Mode, BandADIF, State, County, Country
    ORDER BY Call, DateQSO, TimeQSO, Mode, BandADIF, State, County
    ...
    ORDER BY Call


    а вот для например

    ORDER BY DateQSO, TimeQSO, Mode


    уже не сможет. Поэтому делай индексы по последовательностям полей наиболее часто встречающиеся в сортировке. Лишние делать тоже ни к чему.

    Ещё. Зачем отдельно DateQSO, TimeQSO - надо бы одним полем, если действительно не нада отслеживать отдельно время от даты.
  • Inovet © (11.11.11 15:34) [31]
    > [27] Alex_C   (11.11.11 11:13)
    > В общем сделал проще - да бы ручками не описывать всю структуру
    > таблицы сдал программку, которая это за меня делает.

    Ну так что, в Jet не работает?
    SELECT * FROM table_src INTO table_dst

  • Alex_C (11.11.11 15:57) [32]
    Спасибо за разъяснение!
    Появился следующий момент - мне нужно узнать, есть ли такая страна в логе и если да, то на текущем диапазоне и с текущей модуляцией сработана и подтверждена ли.
    Есть несколько вариантов  реализации. Самый простой


     LogCommand.CommandText := 'SELECT Country, BandADIF, Mode FROM ' + LogName +
       ' WHERE Country = ' + QuotedStr(Country);
     LogCommand.Execute.RecordCount = 0 then
       Result := COUNTRY_NEW
     else
     begin
     // Здесь прохожусь по выбранным связям с данной страной, проверяя на диапазон, модуляцию и подтверждение
     end;



    Однако другой вариант - делать отдельно запросы

     LogCommand.CommandText := 'SELECT Country, BandADIF, Mode FROM ' + LogName +
       ' WHERE Country = ' + QuotedStr(Country) + ' AND Band = ' + QuotedStr(Band);


    Далее такой же запрос по модуляции и подтверждению.
    Вопрос: как более правильно сделать?
  • Anatoly Podgoretsky © (11.11.11 16:34) [33]
    > Alex_C  (11.11.2011 11:13:27)  [27]

    Если ошибки не выдает, то тогда индекс просто безумный и не нужный такой
    индекс
  • Anatoly Podgoretsky © (11.11.11 16:36) [34]
    Интересно, что скажет начальник транспортного цеха?
  • Alex_C (11.11.11 16:44) [35]

    > не нужный такой


    С этим разобрался - сделал 3 отдельных индекса по Country, Call, State
  • Inovet © (11.11.11 17:04) [36]
    > [32] Alex_C   (11.11.11 15:57)
    > Появился следующий момент - мне нужно узнать, есть ли такая
    > страна в логе и если да, то на текущем диапазоне и с текущей
    > модуляцией сработана и подтверждена ли.


    q.SQL.Text := 'SELECT COUNT(*) FROM log WHERE Country = ''Ямайка''';
    q.Open()
    if q.Fields[0].AsInteger > 1 then
    begin
     q.SQL.Text := 'SELECT BandADIF, Mode WHERE Country = ''Ямайка'' AND BandADIF = 3.5 AND Mode = 'SSB''
     // тут показываем
    end


    Вот не слушешь ты советы по нормализации и применению справочников... Ну кто страну хранит в логе её названием. Ладно там про диапазоны и модуляции тебя убедили отказаться от справочноиков, а зря.
    Читай вот хотя бы про страны
    http://ru.wikipedia.org/wiki/%CE%E1%F9%E5%F0%EE%F1%F1%E8%E9%F1%EA%E8%E9_%EA%EB%E0%F1%F1%E8%F4%E8%EA%E0%F2%EE%F0_%F1%F2%F0%E0%ED_%EC%E8%F0%E0
  • Anatoly Podgoretsky © (11.11.11 17:19) [37]
    > Alex_C  (11.11.2011 16:44:35)  [35]

    Заработало? Тогда слишком сложный индекс
  • Anatoly Podgoretsky © (11.11.11 17:41) [38]
    > Inovet  (11.11.2011 17:04:36)  [36]

    Как раз с диапазонами и модуляций все в порядке на справочник будет
    множество ссылок, в отличии от позывных где норма одна ссылка. Просто будут
    потери места и производительности.
  • Inovet © (11.11.11 17:45) [39]
    > [38] Anatoly Podgoretsky ©   (11.11.11 17:41)
    > Просто будут потери места и производительности.

    Я повторять не буду как сделать без потери. С хранением кода страны в логе и справочником стран мира ты, надеюсь, согласен?

    И таки автор плодит логи в одной базе.
  • Inovet © (11.11.11 17:47) [40]
    > [32] Alex_C   (11.11.11 15:57)

    Ну и параметры в запросе можно использовать. Это здесь не критично, а на будущее.
  • Alex_C (14.11.11 10:02) [41]

    > Ну кто страну хранит в логе её названием.


    "Название" страны - это максимум 4(!!!) буквы! Название России - R, США - W, Германии - DL. Согласить, куда как проще и быстрее в хранить в логе само название, чем ссылку на это название. А вот все остальные данные как раз по стране (а их там много) хранятся в отдельном справочнике. Так что тут как раз все весьма верно.


    > q.SQL.Text := 'SELECT COUNT(*) FROM log WHERE Country =
    > ''Ямайка''';
    > q.Open()
    > if q.Fields[0].AsInteger > 1 then
    > begin
    >  q.SQL.Text := 'SELECT BandADIF, Mode WHERE Country = ''Ямайка''
    > AND BandADIF = 3.5 AND Mode = 'SSB''
    >  // тут показываем
    > end


    Да я как раз так и предполагал. Думаю будет самый быстрый вариант. Хотя тут есть некоторый нюанс - но сегодня все испробую и потом про него напишу уже более подробно.


    > убедили отказаться от справочноиков


    Почему же? По диапазонам и модуляциям справочники остались. Только они не по ссылкам, а по названиям полей (не уверен , что правильно выразился.)
    Допустим в логе модуляция SSB, в справочнике
    SSB - PHONE ... там еще некоторые данные. Учитывая какие эти справочники маленькие, так самое простое получается.


    > не слушешь


    Зря. Очень даже слушаю.
  • Inovet © (14.11.11 11:30) [42]
    > [41] Alex_C   (14.11.11 10:02)
    > "Название" страны - это максимум 4(!!!) буквы! Название
    > России - R, США - W, Германии - DL. Согласить, куда как
    > проще и быстрее в хранить в логе само название, чем ссылку
    > на это название.

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

    Ну и уже хранить лучше общепринятые сокращения см справичник по ссылке выше. 2 или 3 символьный код, или, если хочется R W DL, то так закодировать, но это уже не относится к целостности данных.

    РОССИЯ Российская Федерация RU RUS 643
    СОЕДИНЕННЫЕ ШТАТЫ Соединенные Штаты Америки US USA 840
    ГЕРМАНИЯ Федеративная Республика Германия DE DEU 276

    Справочник, если что, можно прямо в Вики скопировать и имопртировать в базу или готовый взять в DBF и тоже имортировать.
  • Inovet © (14.11.11 11:33) [43]
    > [41] Alex_C   (14.11.11 10:02)
    > Только они не по ссылкам, а по названиям полей (не уверен
    > , что правильно выразился.)
    > Допустим в логе модуляция SSB, в справочнике
    > SSB - PHONE ... там еще некоторые данные.

    Это те же ссылки, принципиальной разницы нет - число там или строка.
  • Inovet © (14.11.11 11:37) [44]
    Если ещё не советовали, то рекомендуется пользоваться TADODataset для возвращающих набор запросов и TADOCommand для остальных вместо TADOQuery, и сосвем никогда не пользоваться TADOTable.
  • Alex_C (14.11.11 18:03) [45]

    > TADODataset для возвращающих набор запросов и TADOCommand


    Да только их и использую - это уже понял. :)

    Процесс переделки программы идет полным ходом. Возник очередной затык: есть абсолютно ничего не значащее поле - номер записи. Он у меня был вычисляемым полем


    procedure TDataMod.LogTableCalcFields(DataSet: TDataSet);
    begin
     if LogTable.RecNo <> -1 then
       LogTableNumer.AsInteger := LogTable.RecNo
     else
       LogTableNumer.AsInteger := LogTable.RecordCount + 1;
    end;



    И все было нормально, но теперь RecNo = -1 не только у первой записи, но и у последней. Это почему так? Это поле вроде как и не нужно - в зависимости от сортировки оно естественно тоже меняется, но иногда оно полезно!
  • Германн © (15.11.11 00:25) [46]

    > И все было нормально, но теперь RecNo = -1 не только у первой
    > записи

    А что раньше у "первой" записи всегда было RecNo = -1?
    Ну некоторые предпочитают считать от 0, некоторые от 1. Но не знаю таких, которые считают от "-1"! :)

    P.S. Забудь также про RecNo.
  • Alex_C (15.11.11 09:29) [47]

    > А что раньше у "первой" записи всегда было RecNo = -1?


    Я пользовался VolgaTable, и чтоб номер записи у последней записи высвечивался верно, приходилось вот так изголяться.

    Подошел сейчас к одной из ответственных задач в своей программе - работа Thread + ADO. По идее я так понимаю особых проблем быть не должно.

    И так: есть несколько тредов получающих данные из инета  и заносящих их в единую таблицу. Количество тредов в принципе не ограничено.
    Я думаю решить эту задачу так: для каждого треда создаю свой ADOCommand, с комощью которого заношу данные в таблицу. Все ADOCommand подсоединяются к единому ADOConnection. В принципе на такое использование ограничений быть не должно.
    Единственный момент, на который следует обратить внимание, что если уже такая запись в таблице есть, повторы не вносить.
  • Alex_C (15.11.11 10:10) [48]

    > для каждого треда создаю свой ADOCommand, с комощью которого
    > заношу данные в таблицу. Все ADOCommand подсоединяются к
    > единому ADOConnection.


    Однако не верно
    http://www.delphimaster.net/view/2-1277129198
    в [3] объяснено почему!
 
Конференция "Базы" » Указать путь в SELECT к БД. [D7, Access]
Есть новые Нет новых   [134431   +10][b:0.001][p:0.003]