Добро пожаловать к нам в гости! Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
Всё! Наконец-то разобрался с функцией создания поиска по базе. Но появилась следующая загвоздка-где прописывается счётчик записей dbfGetRecordCount и dbfGetRecordNumber (в справке указан только синтаксис команд), и почему при выводе базы в режиме таблицы, или при экспорте в Access или Excell содержиммое базы отображается на английском (при вводе данных в форму использую национальый шрифт)
При просмотре проекта в поле счётчика выдаётся запись 1/10 где 10 число записей в базе, при переходе на следующую запись не меняется номер записи [CurRec] Общее количество записей в базе [RecCount]изменяется только после перезапуска проекта Где же я что-то не дописал
Дело в том, что при переходе на новую строку должна срабатывать команда GoSub "count". При щелчке по объекту Rectangle в котором отображается таблица штатными средствами не возможно сделать, в плагине этого нет и в самой программе тоже. Можно воспользоваться плагином Petera zmFunctions (монитор мыши). Или же создать кнопки для навигации с командами dbfNext и dbfPrev и добавить в них команду GoSub "count". Ну или каким нибудь другим методом который Вы придумаете. Не хочешь читать хелп?
Всем привет. Создал многостраничный проект из 5 неидентичных форм. Для каждой формы создана своя база данных. Вопрос вот в чём, каким образом связать эти базы, чтобы поиск проходил по всем базам одновременно, т.е. на одной поисковой странице. В справке правда указана команда dbfDefineAlias, но непонятно, как она работает.
Code
dbfDefineAlias "[PubDir]sample.dbf" "base"
dbfOpen "base" ""
Как я понял создаётся одна база, но как тогда быть с различиями в формах.
Добавлено (09 Май 2010, 11:49) --------------------------------------------- И ещё, как быть с идентичными полями в формах, так как невозможно назначить 2 одинаковых имени, а один из критериумов поиска должен относиться именно к этому полю, где у меня фиксированный набор значений
Не совсем правильно поняли. Вы сначала создаете базЫ. Допустим, База1, База2. До конца я с этим Алиасом не разобрался, но объясню как я понимаю. Может быть и не верно. Так вот, В Базе1, создаете поля. Поле1, Поле2. Если собираетесь связать базы между собой, то Во второй базе нельзя присваивать имена, такие же как в первой. Тоесть можно Поле3, Поле4, но нельзя Поле1, Поле2. Объясню почему. После создания базы, получается к примеру База1.Поле1База2.Поле3После присвоения псевдонима получится Alias.Поле1 где Alias имя псевдонима, Alias.Поле3. Если же присвоить одинаковые имена полей, то получится конфликт. Перед тем как открыть базу вызывается команда dbfDefineAlias "[PubDir]База1.dbf" "Alias" dbfOpen "Alias" ""
Думаю что так, надо пробовать. Но нет времени. Попробуйте, потом расскажите.
Добавлено (11 Май 2010, 08:42) --------------------------------------------- Artex, А вообще, лучше пример, что вы делаете. Сейчас перечитал ваш вопрос, и совсем по другому его понимаю. Что бы провести поиск по всем базам и вывести на одной странице, совсем не обязательно использовать Alias. Есть еще импорт и экспорт. Все найденые записи экспортировать в один файл, потом импортировать в файл базы.
Вопрос вот в чём, каким образом связать эти базы, чтобы поиск проходил по всем базам одновременно
ПОСЛЕДОВАТЕЛЬНО! Открыл одну базу, нашел, вторую...потом вывел результаты куда надо. На сколько энтот ваш плагин поддерживает SQL не знаю, но раз вы уж взялись за бд то хотя бы получить элементарные понятия об SQL вам не помешает. Что такое ассоциации, объединения, связанные базы данных и прочая. К примеру, не понятна нужда Artex, что он хочет, провести поиск с одним и тем же условием по всех базах, или в условиях поиска задействованы поля из разных баз. И вообще, как то у вас странно, я к примеру, сначала составляю алгоритм работы, а уж затем ищу приемлимый механизм для реализации, но не наоборот.
mishem, Буду экспериментировать, посмотрю что получится
Quote (Alex3A)
И вообще, как то у вас странно, я к примеру, сначала составляю алгоритм работы, а уж затем ищу приемлемый механизм для реализации, но не наоборот.
алгоритм работы такой, ввод в разные формы данных по радиоаппаратуре и компьютерной технике, где основными полями являются данные пользователя, тип техники серийный номер и т.д. ряд из них повторяется в разных базах Затем при поиске необходимо вывести данные по одному из критериев из разных баз. Сейчас я создал отдельную базу на каждую форму, но вот связать их - увы
Сейчас я создал отдельную базу на каждую форму, но вот связать их - увы
Опять ты не понял вопроса, ладно растолкую. Есть связанные данные, они находятся в разных таблицах но описывают одно понятие, и поисковый запрос строится с учетом этого. Пример найти в таблицах 2 и 3 все записи цена которых 5руб, которые покупал товарищ по фамилии некто, описание которого находятся в таблице 1. В таблице 1 имя фамилия адрес... и номер покупателя, в таблицах 2 и 3 много всякой чихни, в том числе и номер покупателя. Вот подобные построения и являются связанными. Другое дело поиск по одному и тому же условию в нескольких таблицах, запросил одну, сохранил ответ, вторую, добавил к предидущему, это есть объединение. Еще раз повторяю, ну не знаю я работает ли сей плугин с sql, насколько мне известно, дбф формат не поддерживает его, возможно адо одбс имеет какую поддерку. (sql это язык запросов к базам данных) Возможно ты выбрал не то что тебе надо, к примеру mysql поддерживает sql в полном объеме, даже с транзакциями. В принципе, любой сложный запрос может быть разбит на ряд простых запросов. mishem, алиасы и псевдонимы энто разные вещи, алиас это так сказать, коробка с базами а псевдоним это просто другое имя чего либо, к примеру есть такой матюк as - База1.Поле1 as x1 База2.Поле1 as x2 и тому подобное, и не только, там может фигурировать и некий результат, к примеру сумма чего либо. Ну эт так, вообще, а на деле, хрен его, в конкретном случае, знает. Artex, запрос к базе данных содержит в себе вполне понятный любому человеку алгоритм, а ты дал такое его описание, что даже человек его не поймет, а уж куда той базе данных.
Добавлено (12 Май 2010, 00:30) --------------------------------------------- Artex, хоть алиас то и есть псевдоним, ну дословно, но в основном это интерпритируется на уровне баз, для их объединения в общую структуру, а вся остальная мелочь псевдонимы.
Добавлено (12 Май 2010, 01:27) --------------------------------------------- Посмотрел NeoBookDB Action Command Reference, понятие алиас тут как псевдоним базы данных, dbfDefineAlias "[PubDir]sample.dbf" "AddressBook" где "[PubDir]sample.dbf это путь и имя базы, а AddressBook это ее псевдоним, любое понравившееся имя, объединение баз пока не нашел, запрсы обладают некоторыми возможностями, сравнения, и операций и и или, интересны dbfVarToRecord и dbfRecordToVar, предположительно передача текущей записи из базы в переменную и наоборот. Типа выставил нужный номер записи, и считал в переменную все поля махом. Есть и матч, в общем довольно неплохо для баз дбф, на подавляющее число нужд вполне хватит того что есть, с головой Да и извращений всяких в асортименте. Запрос идет только к одной таблице , она же база данных, если вдруг сработает ухищрение типа описанного mishem, энто оч хорошо, но маловероятно. Если бы такое было возможно, то энто бы описали обязательно, ибо фича весьма полезная. В дбф база это таблица, в аксесе база это кучка таблиц+хрен знает какой код, формы там, запросы и проч. Все вроде описано нормально и понятно, вам с головой этого хватит. Запрос составляется типа так найти записи в которых поле х1=чему то и поле х3>чегото или поле х5 не равно чему то.( х1=24 and x3>5 or x5=ok)
Хоть я и не спец по "базам", но все же вынужден кое-что сказать...
Quote (Alex3A)
ну не знаю я работает ли сей плугин с sql
Значиться так.. В который раз уже приходится озвучивать: бесплатный плагин NeoBookDB может работать только с форматом .dbf! Pro-версия может и с sql, и со многими другими форматами, но этот плагин платный, и только к самой первой его версии есть рабочий ключик в сети. С момента выхода первой версии плагина прошло почти два (если не три) года, и плагин сильно оброс возможностями, но в наших "советских" условиях применение его весьма проблематично из-за высокой (99 американских рублей) стоимости. Потому говорить можно реально только о бесплатной версии, т.е. о формате dbf!
Давайте "отталкиваться" от этого факта!
Quote (Alex3A)
алиасы и псевдонимы энто разные вещи,
НЕТ! "Алиасы" и "псевдонимы" это ОДНО И ТО ЖЕ! Во всяком случае, когда речь идет о плагине NeoBookDB. Ктати, alias в переводе с английского и есть - кличка, псевдоним. И в случае с плагином именно такой смысл вкладывался в эту терминологию для обращения из одного и того же скрипта к разным базам!
Quote (Alex3A)
Artex, хоть алиас то и есть псевдоним, ну дословно, но в основном это интерпритируется на уровне баз, для их объединения в общую структуру, а вся остальная мелочь псевдонимы.
Очень долго думал над этой фразой.. Так ничего и не понял...
Что же касается алгоритма связанного поиска по разным базам...
Quote (Alex3A)
ПОСЛЕДОВАТЕЛЬНО! Открыл одну базу, нашел, вторую...потом вывел результаты куда надо.
Да, видимо так... Алекс, ты спец, тебе - виднее.
Добавлено (12 Май 2010, 01:53) ---------------------------------------------
Quote (Alex3A)
Посмотрел NeoBookDB Action Command Reference,
Ну вот, наконец-то: Алекс начал изучать NB и её плагины! Может хоть сейчас конструктив "пойдет"?
Добавлено (12 Май 2010, 02:01) ---------------------------------------------
Quote (mishem)
Все найденые записи экспортировать в один файл, потом импортировать в файл базы.
Quote (Alex3A)
если вдруг сработает ухищрение типа описанного mishem, энто оч хорошо, но маловероятно
А почему именно в файл? Не проще ли использовать переменные, или я чего-то недогоняю?
Добавлено (12 Май 2010, 02:16) ---------------------------------------------
Quote (mishem)
Что бы провести поиск по всем базам и вывести на одной странице, совсем не обязательно использовать Alias.
На всякий случай, из справки к плагину:
Quote
dbfDefineAlias
Назначение: Определить и присвоить базе данных псевдоним (alias), который затем будет использован в командах NeoBookDB и переменных, связанных с полем базы, вместо, собственно, имени файла базы данных. Как уже говорилось в разделе Разработка приложений с использоваинем Баз данных, при создании или открытии базы NeoBookDB автоматически генерирует переменные для каждого поля базы данных в рамках программы NeoBook. В обычном случае, имя переменной формируется как комбинация имен файла базы и поля, разделенных точкой (.). После исполнения команды "dbfDefineAlias" в этих переменных вместо имени файла базы будет фигурировать псевдоним. Это позволяет создавать приложения, которые можно использовать для вывода информации из нескольких связанных баз данных, включающих идентичные поля, но имеющих различные имена файлов баз. Команда "dbfDefineAlias" может быть вызвана до создания или открытия базы данных.
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Запрос идет только к одной таблице , она же база данных, если вдруг сработает ухищрение типа описанного mishem, энто оч хорошо, но маловероятно.
Да, в этом плагине получается работать только с одной таблицей. Но есть возможность работать одновременно с несколькими базами(не более 10) По этому "ухищрение" должно получится Не хочешь читать хелп?
В таблице 1 имя фамилия адрес... и номер покупателя, в таблицах 2 и 3 много всякой чихни, в том числе и номер покупателя. Вот подобные построения и являются связанными
значит я просто неправильно высказался, у меня точнее поиск по одному и тому же условию в разных базах
Вот с этим нужно будет по окуратней. У меня наблюдался такой баг, в таблице 300 строк(к примеру) , находит 150(к примеру). Команда dbfPack (Скомпрессировать/Упаковать базу данных и освободить пространство, занимаемое удаленными ранее записями) присутствует постоянно после удаления какой ли бо строки.
Добавлено (12 Май 2010, 09:19) --------------------------------------------- Artex, Я ж написал, нельзя присваивать одинаковые имена полям. Если же без этого ни как, открывай базы без псевдонима, и проводи поиск сначала в одной базе, потом в другой.
Добавлено (12 Май 2010, 09:22) ---------------------------------------------
Quote (Artex)
dbfOpen "[PubDir]all.dbf"
А откуда это брется? Если ты ее не создавал, как ее можно открыть? Не хочешь читать хелп?
открывай базы без псевдонима, и проводи поиск сначала в одной базе, потом в другой.
Это самый простой выход из ситуации, в этом случае на каждую базу нужна своя поисковая форма, что приводит к неудобству при переходе между базами и увеличению размера проекта
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Не получается Две базы слить, (объединить)не получается.Вообще, еще по началу я забросил этот алиас Но в принципе, организовать при помощи присвоения псевдонима поиск по нескольким базам с одинаковыми именами полей(столбцов) возможно. И конечно же удобно.Не надо для каждой базы прописывать свой поисковый запрос. Но не удобно то, что перед тем как открыть новый файл, нужно закрыть открытый. Artex, как открыть файл с псевдонимом
Ну вот, наконец-то: Алекс начал изучать NB и её плагины!
Да нет, просто просмотрел справку по нем
Quote (Artex)
значит я просто неправильно высказался, у меня точнее поиск по одному и тому же условию в разных базах
Ну тогда все делай последовательно, открыл одну базу нашел что надо, потом следующую. Или это тебя чем то смущает? Нб мож и медленный, но плагин это вовсе не нб.
Quote (mishem)
Команда dbfPack
Вся суть в том что при удалении или изменении записи в базе она из нее не удаляется, просто замещается новым вариантом(указатель в базе), это фича предусматривает возможность отката, то есть востановление предидущего значения записи. Практического применения этого отката я как то не видел. А упаковка удаляет старые записи и переделывает указатели, в результате размер базы уменьшается.
Quote (mishem)
в моем примере получался Alias
Quote (mishem)
Quote (Artex) dbfOpen "[PubDir]all.dbf"
А откуда это брется? Если ты ее не создавал, как ее можно открыть?
После назначения алиаса, имя файла равнозначно имени алиаса, то есть если была база all.dbf и назначен алиас "супер" то ее можно открыть двумя способами dbfOpen "[PubDir]all.dbf" - обратившись к файлу dbfOpen "супер", - обратившись к алиасу, но не dbfOpen "[PubDir]супер.dbf" ибо такого файла не существует. Алиас помогает в работе со связанными базами, к примеру можно составить такой запрос, открыв предварительно несколько баз и назанчив им алиасы - база1.поле1>4 and база2.имя=петя, по идее, даст все строки из база1 в поле поле1 которые больше 4, при условии что их номера в базе база2 в поле имя имеют значения петя. база1* and база2* дадут содержимое обоих баз. Плагин сделан на ада одбс, такая универсальная фича мелкософта, акумулирующая работу со всеми видами баз данных. Каждый вид баз имеет свои способы и методы работы, а так же свою архитектуру. К примеру дбф состоит из одного файла содержащего одну таблицу, аксес содержит файл содержащий не только множество таблиц но и кучу всего, мускул и мсскюель имеют свои архитектуру и методы. дбф формат не поддерживает непосредственно sql запросы, но это не значит того что не возможно работать с ним с его помощью. Делается надстройка которая адаптирует такие работы, сам движок дбф не имеет даже поиска, только переход на запись н, на следующую, предидущую, первую, последнюю. Все остальное делают надстройки. Аксесовский движок уже рулит с sql. Таким образом, мелкософтовая фича является унификатором работ с бд, насколь она толково сделана судить не будем. В результате, у формата не поддерживающего то или иное, появляются новые возможности и способы. Все это имеет как достоинства так и недостатки. Как работать с несколькими базами данных как с одной базой? Ну, способов немеряно, вернее дело не в базах а в их представлениях. Способ первый- создать новую базу данных, которая содержит все данные из всех баз, притом в нужной конфигурации, сделать это физически, с записью в файл. Второй способ сделать то же самое но в памяти, третий сделать только представление группы баз, то есть ссылки на все базы объединяются в нужной конфигурации и представляются как одна база. Все эти вещи вы можете делать сами, обвязав все своим кодом, под свои нужды. Или какой либо движок это может сделать для вас, но естественно, такие штуки расчитаны на некую универсальность, порой не давая вам того что вы хотите. В таких случаях вы обвязывая своим кодом добиваетесь нужного. Теперь, кроме логики, имеет значение таки вещи как скорость работы, сохранность данных и прочая нужда. Тут то вы и выбираете подходящий вам движок или формат базы, не все так просто, проектирование баз данных великая наука, и подводных камней немеряно, не буду вас грузить всякими парадоксами индексами и прочей заумностью. Что ж касаемо энтого плагина, то он дает вам кучу возможностей, как присущих дбф формату, так и надстроенных мелкими, так и доп фичей сделанных его автором.
Quote (Peter)
Ктати, alias в переводе с английского и есть - кличка, псевдоним.
Так оно и есть, все дело в представлении, в sql есть оператор as энто так же псевдоним, база1.поле3 as "петя", сума(база1.поле3)as "вася", а под алиасом, как то подразумевается пвсевдонимы верхнего уровня, вот это то я и хотел отметить. Типа так, создается алиас- контейнер, туда накидываются базы данных, таким образом мы получаем алиас.база1.таблица2.поле3. Ну конечно это все не применительно к конкретному плагину, а в прочем хрен его знает Когда то давно че то подобное я делал, но уж и не помню, ибо с адо одбс предпочитаю не связыватся. Artex, если плагин позволяет открыть одновременно несколько баз, то тебе не составит труда выполнить запросы к каждой последовательно, скажем в цикле, предварительно открыв их. И пусть тебя это не смущает, была бы возможность представления нескольких баз как одной, то просто то же самое сделал бы за тебя движок, вся разница в том что он это сделал бы наверное быстрее.
Переключение между базами создаёт ряд неудобств, уж наверно проще сделать одну базу, где будут совмещены все поля. Пока что я решил остановиться на этом варианте (время поджимает), а потом всё это создам в FoxPro, уж там то связывать базы проще
А вчем они заключаются? Неудобно сидеть, или что то чесатся начинает? Если базы открыты, то смена базы является просто сменой указателя. Надо смотреть на логику работы и скорость того иль иного, а не на кажущуюся корявость кода.
Artex, а что тут сложного? если лень писать многа строк, сделай это в цикле, да и отдельный то запрос не нужен, просто переписывай имя базы. Катит ли такой синтаксис dbfQuery "[bazaname]" "[zapros]"
А вчем они заключаются? Неудобно сидеть, или что то чесатся начинает?
Quote (Alex3A)
Artex, а что тут сложного?
Alex3A, ты, как всегда, бъешь в точку!
Я вот тоже читаю... Читаю... И никак не могу понять - в чем, собственно, заключена проблема?
Похоже, "камень преткновения" в понимании (точнее - непонимании) сути команды dbfDefineAlias, и вообще смысла переменных.
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться