v.korleone
Помогающий
Offline
|
|
« : 27-04-2009 13:27 » |
|
С SQL практически не знаком, не судите строго... Вводная информация: Есть одна база данных в ней 4 таблицы, в которых содержится информация отдела кадров предприятия (личные, семейные, служебные данные, данные об образовании). Зделать следующие запросы: Запрос_1: Поиск по фамилли.(желательно, чтобы можно было осуществлять как по целой фамилии так и по введеной букве или буквам, например показать все фамилии на букву "К"). Вывод осуществлять в таблицу на форме, в которой столбцы это некоторые столбцы из всех таблиц, которые дают наиболее важную информацию о человеке. Таким образом получается, свооеобразная зборная таблица в которой находится найденный человек или группа людей, но не только показуется его фамилия но и другие данные. Запрос_2: Подсчет общего количества сотрудников на работе. В таблице есть поле "служебный номер" (num) тип integer, который присваивается каждому сотруднику (как сделать этот процес автоматическим? Чтобы когда пользователь пишет в форме добавить инф. о новом сторуднике и переходит к форме заполнения, служебный номер генерировался сам, а потом пользователь спокойно себе запоняет остальные поля). Запрос_3: Подсчет количества работников которые находятся в отпуске. Есть поля в таблице, котрые показывают, когда сотрудник идет в отпуск (holiday_begin) и когда он у него заканчивается (holiday_end) типы полей Date. Запрос_4: Подсчет количества работников которые работают. (Не путать с общим числом рабочих!) Получается, что Общее_количество_рабочих (ОКР)- Количестов_работников_в отпуске (КВО)= Рабочие_котрые_работают (РКР). Запрос_5: Подсчет количества детей работников. Здесь сам должен разобраться, если покажете, как делать остальное.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #1 : 27-04-2009 13:31 » |
|
1. like 2,3,4,5 count
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #2 : 27-04-2009 13:33 » |
|
2. Табельный номер = автоинкремент
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #3 : 27-04-2009 13:34 » |
|
и покажи сами таблицы, если они существуют Если нет - то покажи, какими ты их видишь.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #4 : 27-04-2009 13:49 » |
|
Sla, каким образом показать таблицы? Кинуть в архив, а потом на форум? Как сюда отослать файл? У меня есть примитивный поиск, по перовмому запросу: surn=thisform.text1.Value SELECT DISTINCT personal_data.surname; FROM database!personal_data; WHERE personal_data.surname=surn; INTO CURSOR result &&Выбирается курсор, в котром сохраняются результаты поиска SELECT 'result' &&Результаты поиска показуются в таблице "Результаты поиска" thisform.grid1.RecordSource='result' &&Обновление таблицы "Результаты поиска" &&thisform.grid1.Refresh &&Подпись колонок в таблице отображения результатов поиска thisform.grid1.column1.header1.Caption='num' thisform.grid1.column2.header1.Caption='surname' thisform.grid1.column3.header1.Caption='name' thisform.grid1.column4.header1.Caption='patronymic' thisform.grid1.column5.header1.Caption='identifikation nom' thisform.grid1.column6.header1.Caption='year_birth' &&Задание ширины колонок в таблице отображения результатов поиска thisform.grid1.column1.Width=40 thisform.grid1.column2.Width=200 thisform.grid1.column3.Width=150 thisform.grid1.column4.Width=150 thisform.grid1.column5.Width=150 thisform.grid1.column6.Width=150
Куда ставить это "like"?
|
|
« Последнее редактирование: 27-04-2009 13:55 от v.korleone »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #5 : 27-04-2009 13:54 » |
|
показать таблицы: people id Surname FirstName SecondName Birthday INN sex
children id id_people Name sex Birthday
что-то тип такого
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #6 : 27-04-2009 14:02 » |
|
1. Personal Datanum | surname | name | patronymic | year_birth | identification_num | series_pasport | num_pasport | 2. Family Datanum | marital_status | quantity_children | sreet | num_house | num_kv | 3. Education datanum | name_education | speciality | type_education | year_ending | 4. Service_datanum | post | date_arrival | date_care | holiday_begin | holiday_end | servise_note | Сделал типа такого: surn=thisform.text1.Value SELECT DISTINCT personal_data.surname; FROM database!personal_data; WHERE personal_data.surname=surn; INTO CURSOR result &&обирається курсор, в якому зберігаються результати пошуку SELECT 'result' &&Результати пошуку відображаються в таблиці "Результати пошуку" thisform.grid1.RecordSource='result' &&оновлення таблиці "Результати пошуку" thisform.grid1.Refresh &&підпис колонок в таблиці відображення результатів пошуку thisform.grid1.column1.header1.Caption='num' thisform.grid1.column2.header1.Caption='surname' thisform.grid1.column3.header1.Caption='name' thisform.grid1.column4.header1.Caption='patronymic' thisform.grid1.column5.header1.Caption='identifikation nom' thisform.grid1.column6.header1.Caption='year_birth' &&задання ширини колонок в таблиці відображення результатів пошуку thisform.grid1.column1.Width=40 thisform.grid1.column2.Width=200 thisform.grid1.column3.Width=150 thisform.grid1.column4.Width=150 thisform.grid1.column5.Width=150 thisform.grid1.column6.Width=150
SET ANSI OFF Форма компилится, но в моей таблице всего лишь 2 столбца: 1-й активный "surname", 2-й неактивный т.е. подсвечивает серым. Когда ввожу поиск 2 первых буквы фамилии, то выдает ошибку типа: "Unknown member COLUMN2". Нажимаю Ignore, появляется такое же сообщение, но уже "Unknown member COLUMN3" и так до конца, т.е. до 6. Самое смешное, то что когда нажимаю Cancel, все работает т.е. выводит фамилию. Подскажите как избавится от ошибок, как сделать чтобы и другие столбцы были активными и в них была занесена инф. по искомому объекту. А также просьба с другими задачами помочь.
|
|
« Последнее редактирование: 28-04-2009 11:35 от v.korleone »
|
Записан
|
|
|
|
|
Sla
|
|
« Ответ #8 : 28-04-2009 12:55 » |
|
v.korleone, тише, попей водички давай попорядку, а вернее с конца Что ты делаешь в этом коде? thisform.grid1.column1.header1.Caption='num' thisform.grid1.column2.header1.Caption='surname' thisform.grid1.column3.header1.Caption='name' thisform.grid1.column4.header1.Caption='patronymic' thisform.grid1.column5.header1.Caption='identifikation nom' thisform.grid1.column6.header1.Caption='year_birth'
а теперь с начала а что в этом SELECT DISTINCT personal_data.surname; FROM database!personal_data; WHERE personal_data.surname=surn; INTO CURSOR result
синтаксиса я не знаю (крапка с комой обязательны?)
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #9 : 28-04-2009 13:04 » |
|
Что ты делаешь в этом коде? thisform.grid1.column1.header1.Caption='num' thisform.grid1.column2.header1.Caption='surname' thisform.grid1.column3.header1.Caption='name' thisform.grid1.column4.header1.Caption='patronymic' thisform.grid1.column5.header1.Caption='identifikation nom' thisform.grid1.column6.header1.Caption='year_birth' Подписую названия колонок. SELECT DISTINCT personal_data.surname; FROM database!personal_data; WHERE personal_data.surname=surn; INTO CURSOR result 1-я строчка как я думаю обращение к колоке "surname" таблицы "personal_data". 2-я строчка указания на базу данных которой принадлежит таблица 3-я присвоение колонке таблицы переменной "surn" 4-я вывод результатов в место курсора. Блин, я сам толком не знаю, что к чему, НО у паренька который дал мне этот код, он работает, но только с его данными, а у меня - нет. Вот в чем проблема... а не синтаксис и проча лабуда... версиии фоксов одинаковы....
|
|
« Последнее редактирование: 28-04-2009 13:10 от v.korleone »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #10 : 28-04-2009 13:33 » |
|
Блин, я сам толком не знаю, что к чему, НО у паренька который дал мне этот код, он работает, но только с его данными, а у меня - нет. Слушай байку Давным-давно, в далекой-далекой стране у самых синих гор жил да был молодой человек, который очень хотел стать Мастером меча. И по обычаям той земли, настоящим Мастером меча мог стать тот, у кого есть настоящий Меч мастера. Молодой человек очень хотел стать мастером, и он отправился по городам далекой страны у самых синих гор. Он хотел прийти к одному из старых Мастеров меча и попросить его: "Великий Мастер, слава о твоих подвигах идет по всей стране. Ты сражался во всех больших сражениях, ты всегда побеждал и заслужил славу и почет. И вот теперь ты живешь на покое. У тебя есть все. И тебе больше не нужен твой меч - Меч мастера. Продай его мне. Или подари". Молодой человек очень надеялся, что кто-то из старых мастеров откликнется на его просьбу.
И вот он пришел в дом настоящего Мастера меча, удалившегося на покой и обратился к нему: "Великий Мастер, слава о твоих подвигах идет по всей стране. Ты сражался во всех больших сражениях, ты всегда побеждал и заслужил славу и почет. И вот теперь ты живешь на покое. У тебя есть все. И тебе больше не нужен твой меч - Меч мастера. Продай его мне. Или подари". Мастер меча выслушал юношу, улыбнулся и ответил ему: "Я бы с радостью. Но знаешь, этот меч тебе не подойдет". Молодой человек поклонился мастеру и снова отправился в путь. И пришел в другой город и нашел дом старого Мастера меча. Он пришел в этот дом и обратился к мастеру: "Великий Мастер, слава о твоих подвигах идет по всей стране. Ты сражался во всех больших сражениях, ты всегда побеждал и заслужил славу и почет. Ты настоящий мастер, все это знают. И вот теперь ты живешь на покое. У тебя есть все. И тебе больше не нужен твой меч - Меч мастера. Продай его мне. Или подари". И старый Мастер меча выслушал юношу, улыбнулся и ответил ему: "Я бы с радостью отдал. Но ты знаешь, этот меч тебе не подойдет". И вновь отправился в путь юноша, который хотел стать настоящим Мастером меча, и находил старых мастеров и обращался к ним с одной и той же просьбой: "Великий Мастер, слава о твоих подвигах идет по всей стране. Ты сражался во всех больших сражениях, ты всегда побеждал и заслужил славу и почет. И вот теперь ты живешь на покое. У тебя есть все. И тебе больше не нужен твой меч - настоящий Меч мастера. Продай его мне. Или подари". И раз за разом выслушивали его старые мудрые мастера, вздыхали и отвечали одно и то же: "Я бы отдал. Но ты знаешь, этот меч тебе не подойдет".
И тогда молодой человек решил отправиться в горы на поиски тайных кузнецов. Он шел дни и ночи, вставал с восходом и ложился спать, когда солнце уже давно село. И вот, наконец, он нашел далеко в синих горах тайных кузнецов и рассказал им о своей просьбе. Он попросил выковать ему меч, который бы хотя бы казался настоящим Мечом мастера. Кузнецы выслушали его и ответили: "Ты хочешь стать мастером, и тебе нужен меч? Хорошо". И они выковали ему меч, который так же сверкал благородной сталью, одинаково легко рассекал железо и волос, был замечательно уравновешен и покрыт замысловатой чеканкой, как настоящий меч мастера. Радостно принял юноша свой новый меч и отправился назад.
И он сражался во многих битвах и побеждал. Слава о нем разносилась все дальше по далекой стране, опережая его появление, приводя в восторг друзей и вселяя уважение в сердца противников. Он прожил богатую и достойную жизнь и наконец ушел на покой.
Много лет жил он спокойно и счастливо. И лишь иногда, когда гости славили его - настоящего Мастера меча, ему становилось неловко. Ведь он-то знал, что у него так и не было настоящего Меча мастера. Однажды к нему пришел незнакомый юноша. Он поклонился пожилому мастеру и сказал: "Великий Мастер, слава о твоих подвигах идет по всей стране. Ты сражался во всех больших сражениях, ты всегда побеждал и заслужил славу и почет. Ты настоящий мастер, все это знают. И вот теперь ты живешь на покое. У тебя есть все. И тебе больше не нужен твой меч - Меч мастера. Продай его мне. Или подари". И старый мастер улыбнулся непонятной улыбкой и ответил: "Я бы с радостью. Но знаешь, этот меч тебе не подойдет".
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Sla
|
|
« Ответ #11 : 28-04-2009 13:37 » |
|
вот здесь ты вбираешь только один! столбец SELECT DISTINCT personal_data.surname; FROM database!personal_data; WHERE personal_data.surname=surn; INTO CURSOR result
а дальше пытаешься заполнить еще 5! Різницю почуваєш?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #12 : 28-04-2009 13:45 » |
|
Sla правильно, говорить "відчуваеш" но сейчас не об этом. Вот новая запарка, переделал код, исчет фамилию но если она вся введена, я же хочу чтобы можно было по введеной букве: SET ANSI OFF surn=thisform.text1.Value SELECT * FROM database!personal_data; WHERE Like(surn+'*',personal_data.surname) ; INTO CURSOR result
SELECT 'result'
thisform.grid1.RecordSource='result'
thisform.grid1.Refresh
thisform.grid1.column1.header1.Caption='num' thisform.grid1.column2.header1.Caption='surname' thisform.grid1.column3.header1.Caption='name' thisform.grid1.column4.header1.Caption='patronymic' thisform.grid1.column5.header1.Caption='identifikation nom' thisform.grid1.column6.header1.Caption='year_birth'
thisform.grid1.column1.Width=40 thisform.grid1.column2.Width=100 thisform.grid1.column3.Width=100 thisform.grid1.column4.Width=100 thisform.grid1.column5.Width=100 thisform.grid1.column6.Width=100
Теперь не исчет вообще... dimka, я серьезно без баек... Этот фокс достал уже, у него работает, а у меня нет... Хочешь верь, хочешь нет.
|
|
« Последнее редактирование: 28-04-2009 13:48 от v.korleone »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #13 : 28-04-2009 14:07 » |
|
я так понимаю, что тебе каким-то образом нужно связать поле "Поискового запроса" с гридом возможно, обрабатывая событие типа "keyup"
зы! відчуваєш?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #14 : 28-04-2009 14:17 » |
|
Опять неправильно! Правильно, в таком случае говорить "розумієш" На одном из форумов посоветовали прочитать подробно о функциях лайк и селект, может что-то с их синтаксисом.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #15 : 28-04-2009 14:18 » |
|
dimka, я серьезно без баек... Этот фокс достал уже, у него работает, а у меня нет... Хочешь верь, хочешь нет. Просто код того паренька "тебе не подойдёт" И тут совершенно прав Sla, показывая, почему он тебе не подойдёт. Потому что задачу надо решать, а не переделывать чужие решения под свою задачу без всякого понимания, что в этих чужих решениях содержится, что думал автор, и как работает та или иная технология. P.S. Желания помогать не имею до тех пор, пока не проявишь желание учиться.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #16 : 28-04-2009 14:23 » |
|
dimka, я серьезно без баек... Этот фокс достал уже, у него работает, а у меня нет... Хочешь верь, хочешь нет. Просто код того паренька "тебе не подойдёт" И тут совершенно прав Sla, показывая, почему он тебе не подойдёт. Потому что задачу надо решать, а не переделывать чужие решения под свою задачу без всякого понимания, что в этих чужих решениях содержится, что думал автор, и как работает та или иная технология. P.S. Желания помогать не имею до тех пор, пока не проявишь желание учиться. Но я ведь переделал код и понял что к чему, у паренька поди вызывался для нескольких параметров поиск, а у меня для одного. Уже все работает, но по одной букве не исчет, что весьма плохо. Посмотри, первые пять строк кода, по ним замечания есть?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #17 : 28-04-2009 14:34 » |
|
v.korleone, Еще раз У тебя есть поле ввода фамилии для поиска После каждого нажатия клавиши ты должен(жна) вызвать курсор с поиском
select * from table where table.столбец_поиска like "поле_поиска%"
и отобразить результат работы курсора в гриде
что-то мне подсказывает, что конструкция like в фоксе не совсем "правильная"
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #18 : 28-04-2009 14:40 » |
|
Как понять "поле поиска"? Сделал так: SELECT * FROM database!personal_data WHERE personal_data.surname LIKE "surname%"; Что написать вместо "surname%"?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #19 : 28-04-2009 14:43 » |
|
v.korleone, возьми какой нибудь справочник по фоксу я ФОКСА не знаю, вернее знал, но забыл.
Like насколько я понимаю в фоксе это функция, ты уже показывал как она используется
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #20 : 28-04-2009 14:45 » |
|
ясно
|
|
|
Записан
|
|
|
|
Oldy
|
|
« Ответ #21 : 28-04-2009 14:48 » |
|
Посмотри какое значение у surn. Возможно оно "N "+% тогда surn=ALLTRIM(thisform.text1.Value)+"%" или символы UPPER или LOWER и возможно WHERE Like(&surn). смотри что получается в переменной surn к сожалению синтаксис тоже уже забыт.
|
|
|
Записан
|
С уважением, Oldy.
|
|
|
Oldy
|
|
« Ответ #22 : 28-04-2009 15:32 » |
|
Откопал: Синтаксис
LIKE(cExpression1, cExpression2)
Параметры
cExpression1
Задает символьное выражение, которое функция LIKE( ) сравнивает с выражением cExpression2. В состав cExpression1 могут входить символы подстановки, такие как * и ?. Знак вопроса (?) при сравнении заменяет любой одиночный символ в cExpression2, а звездочка (*) ѕ любое число символов. В выражении cExpression1 можно задавать сколько угодно символов подстановки в любом сочетании.
cExpression2
Задает символьное выражение, которое LIKE( ) сравнивает с выражением cExpression1. Чтобы функция LIKE( ) возвратила значение "истина" (.T.), выражения cExpression2 и cExpression1 должны совпадать буква за буквой.
Результат
Логический
Комментарии
Функция LIKE( ) возвращает значение "истина" (.T.), если выражение cExpression1 совпадает с cExpression2; в противном случае возвращается "ложь" (.F.). Команда SET COMPATIBLE влияет на то, каким образом функция LIKE( ) трактует выражения cExpression1 и cExpression2. Если установка SET COMPATIBLE имеет значение ON или DB4, перед сравнением выражений cExpression1 и cExpression2 из них удаляются все конечные пробелы. Если установка SET COMPATIBLE равна OFF или FOXPLUS, все конечные пробелы в cExpression1 и cExpression2 участвуют в сравнении.
|
|
|
Записан
|
С уважением, Oldy.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #23 : 28-04-2009 15:52 » |
|
Oldy, благодарю за содействие и помощь. Я только что сделал этот пункт, но не через лайк Кто знает подскажите со 2-м,3-м запросом. 3-й вообще жесткий, так что буду рад, всем советам по этой теме.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #24 : 28-04-2009 17:55 » |
|
что-то мне подсказывает, что конструкция like в фоксе не совсем "правильная" Это обманчивое впечатление. Она там правильная. Синтаксическое отличие есть в JetSQL (Access). Там такой же синтаксик, как в упомянутой функции like. Однако в SQL like - не функция, а встроенная синтаксическая конструкция, и FoxPro её обрабатывает как положено.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #25 : 29-04-2009 04:23 » |
|
Ребята, давайте по теме Я ведь написал, что сделал не через лайк, зачем эти уточнения? Кто знает подскажите со 2-м,3-м запросом. 2-ю задачу делаю так: SET ANSI OFF thisform.text3.Refresh maks=ALLTRIM(thisform.text3.Value) SELECT * FROM database!personal_data; Where MAX(personal_data.num)=maks; INTO CURSOR result
Пишет ошибку "Too few arguments" и подсвечивает последние 4 строки, подскажите где натупил?
|
|
« Последнее редактирование: 29-04-2009 05:30 от v.korleone »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #26 : 29-04-2009 06:10 » |
|
v.korleone, потому что нельзя использовать агрегатные функции в теле where
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Oldy
|
|
« Ответ #27 : 29-04-2009 06:36 » |
|
maks=ALLTRIM(thisform.text3.Value) - maks строка. Where MAX(personal_data.num)=maks; personal_data.num - тоже строка или другой тип например numeric(X,Y)? совет прежний: привести переменную maks к виду и типу ожидаемому в поле personal_data.num.
|
|
« Последнее редактирование: 29-04-2009 06:38 от Oldy »
|
Записан
|
С уважением, Oldy.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #28 : 29-04-2009 11:51 » |
|
Условия по агрегатным функциям записываются в секции вторичного фильтра HAVING, а не первичного фильтра WHERE.
v.korleone, матчасть учить будем или как?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #29 : 29-04-2009 13:59 » |
|
У меня практически уже есть решение этой задачи. Подскажите как вывести результат чего либо, допустим ф-и, переменной в текст бокс?
|
|
|
Записан
|
|
|
|
|