Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RFpro.ru: Базы данных MySQL


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

solowey
Статус: Студент
Рейтинг: 88
∙ повысить рейтинг »
Megaloman
Статус: Академик
Рейтинг: 42
∙ повысить рейтинг »
Alexander Babich
Статус: Профессор
Рейтинг: 19
∙ повысить рейтинг »

∙ Базы данных

Номер выпуска:529
Дата выхода:01.07.2018, 15:45
Администратор рассылки:Коцюрбенко Алексей aka Жерар (Мастер-Эксперт)
Подписчиков / экспертов:20 / 15
Вопросов / ответов:3 / 8

Консультация # 90673: Здраствуйте! помогите пожалуйста!!! Как из ФИО (Иванов Иван Иванович) запросом сформировать 2 столбца(фамилия и имя отчество), и эти два столбца разбить по буквам. То есть в итоге должно быть: 1 столбец: И В А Н О В 2 столбец: И В А Н И В А Н О В И Ч...
Консультация # 79028: Здраствуйте! Как можно выбрать последний id из таблицы в MS Acces 2000 и, увеличив его на 1, вставить в поле формы, а затем, заполнив форму различными данными, вставить в таблицу как новую строку с этим ID (увеличенным на 1, т.е. следующим)....
Консультация # 34678: Здравствуйте уважаемые эксперты! У меня таблица состоит из двух колонок id и text Как мне лучше добовлять текст (ваше мнение, как бы вы сделали): 1 искать в id максимальный элемент и затем запрос "insert into table values (id_max+1,text)" тут есть возможность что другой скрипт вклинеться между запросами и два скрипта получат о...

Консультация # 90673:

Здраствуйте! помогите пожалуйста!!! Как из ФИО (Иванов Иван Иванович) запросом сформировать 2 столбца(фамилия и имя отчество), и эти два столбца разбить по буквам. То есть в итоге должно быть:

1 столбец: И В А Н О В
2 столбец: И В А Н И В А Н О В И Ч

Дата отправки: 09.06.2007, 10:16
Вопрос задал: Кунафина Гульназ Ильдаровна
Всего ответов: 3
Страница онлайн-консультации »


Консультирует Виктор Пырлик:

Здравствуйте, Кунафина Гульназ Ильдаровна!
Возможно так:
select
substring(fio_pers,1,CHARINDEX(\' \',fio_pers,1))as FAM_PERS,
substring(fio_pers,CHARINDEX(\' \',fio_pers,1),len(fio_pers)) as NAME_PERS
from pers

где fio_pers - поле ФИО
pers - таблица персонала
FAM_PERS - результат фамилия
NAME_PERS - результат имя отчество

Консультировал: Виктор Пырлик
Дата отправки: 09.06.2007, 11:15
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Sergey T:

Здравствуйте, Кунафина Гульназ Ильдаровна!

Этот вариант более точен.
1. Не будет выводится фамилия в поле с именем и отчеством если есть только фамилия.
2. Ну и обрезаются лишние пробелы и вообще не выводится лишняя информация.
3. Не помню уже будет-ли работать такая конструкция в стандарте SQL-92, но на SQL Server 2000 работать будет.

SELECT
LTRIM(SUBSTRING(ФИО, 1, CASE ISNULL(CHARINDEX(\' \', LTRIM(ФИО)), 0)
WHEN 0 THEN LEN(ФИО)
ELSE CHARINDEX(\' \', LTRIM(ФИО))
END)) AS \'Фамилия\',
SUBSTRING(ФИО, ISNULL(CHARINDEX(\' \', LTRIM(ФИО)), 0)+1,
CASE ISNULL(CHARINDEX(\' \', LTRIM(ФИО)), 0)
WHEN 0 THEN 0
ELSE LEN(ФИО)-CHARINDEX(\' \', LTRIM(ФИО))
END) AS \'Имя Отчество\'
FROM Таблица

По второму вопросу можно использовать ту же функцию SUBSTRING, но в запросе это сделать невозможно - так как вы не будете знать сколько букв у вас в каждой фамилии. Это делается в циклах WHILE или с помощью курсора.
Удачи.

Консультировал: Sergey T
Дата отправки: 09.06.2007, 12:21
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Игорь Елизаров:

Здравствуйте, Кунафина Гульназ Ильдаровна!
не совсем понятна вторая часть вопроса...
зачем надо разбивать по буквам ?
наверное чтобы осуществлять поиск, но это можно сделать командой Like
например select * from table where fio like \'Ан%"
отбирает все фио, которые начинаются на Ан

Консультировал: Игорь Елизаров
Дата отправки: 09.06.2007, 22:03
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 79028:

Здраствуйте! Как можно выбрать последний id из таблицы в MS Acces 2000 и, увеличив его на 1, вставить в поле формы, а затем, заполнив форму различными данными, вставить в таблицу как новую строку с этим ID (увеличенным на 1, т.е. следующим).

Дата отправки: 20.03.2007, 08:29
Вопрос задал: Попов Николай
Всего ответов: 2
Страница онлайн-консультации »


Консультирует Филатов Евгений Геннадьевич:

Здравствуйте, Попов Николай!
Я не пишу программы в Access - базу использую только для хранения данных, а пользовательская программа написана на VB, поэтому не могу подсказать, в какую процедуру встроить обработчик ( наверное Form_Activate ), но по принципу получения последнего ID и обработки в программе на VB напишу.
Как я понял, ID - ключевое уникальное поле имеет тип длинное целое ( LONG ).
Пример для DAO :
Public dbf As Database
Public r_2 As Recordset
Public nomer As Long
Set dbf = CurrentDB ( )
\'если запуск не из модуля текущей базы, то поставить путь к базе, например
\' Set dbf = wrk.OpenDatabase( "c:\Maslo\Maslo.mdb", False )
Set r_2 = dbf.OpenRecordset( "select max ( ID ) as nom from BASE" , dbOpenDynaset )
If r_2.RecordCount > 0 Then
If IsNull ( r_2!nom ) Then
nomer = 1
Else
If IsEmpty( r_2!nom ) Then
nomer = 1
Else
nomer = r_2!nom + 1
End If
End If
Else
nomer = 1
End If
Form.Text1 = nomer
\'на форме поле номера не редактируется - свойство Enabled = False
Form.Text2 = ""
\'какое-то текстовое значение
Form.Show vbmodal
dbf.execute "insert into BASE ( ID , Pole1 ) values ( " & nomer & ",\'" & Form.Text2 & "\' ) "

Для ADO немного по другому :
Dim dbf As ADODB.Connection
Dim r_2 As ADODB.Recordset
Dim nomer As Long
Set dbf = CurrentProject.Connection
\'если запуск не из модуля текущей базы, то поставить путь к базе, например
\' dbf.Open "Persist Security Info=False;DSN=База данных MS Access ;DBQ=Pr.mdb ;DefaultDir= ;DriverId=25 ;FIL=MS Access ;MaxBufferSize=2048 ;PageTimeout=300 ;UID=admin;"

nomer = 1
r_2.Open "select max ( ID ) as nom from BASE" , dbf
If NOT ( r_2.EOF or r_2.BOF ) Then
If NOT IsNull ( r_2!nom ) Then
If NOT IsEmpty( r_2!nom ) Then
nomer = r_2!nom + 1
End If
End If
End If
r_2.Close
Form.Text1 = nomer
Form.Text2 = ""
Form.Show vbmodal
dbf.execute "insert into BASE ( ID , Pole1 ) values ( " & nomer & ",\'" & Form.Text2 & "\' ) "
dbf.Close

Если есть вопросы, пишите jones@hte.vl.net.ua
С уважением.

Консультировал: Филатов Евгений Геннадьевич
Дата отправки: 20.03.2007, 12:11
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Игорь Елизаров:

Здравствуйте, Попов Николай!
Подобные вещи делать совсем даже и не рекомендуется.
представьте, что с базой работают двое.
последний ID = 15
первый прочитал его и заполняет потихоньку форму,
подошем второй юзер, и тоже прочитал id = 15
ну и при сохранении данных получится каша.

можно предложить следующий вариант.
заводите пустую запись
после этого запускается форма и эта запись заполняете в форме
но она уже последняя, и если даже сейчас придет следующий сотрудник, записи уже не пересекутся.
но !
если в форме отказаться от сохранения данных, то надо будет сделать удаление записи (или отметить запись на удаление)

вот и все

с уважением, Игорь

Консультировал: Игорь Елизаров
Дата отправки: 20.03.2007, 23:13
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 34678:

Здравствуйте уважаемые эксперты!
У меня таблица состоит из двух колонок id и text
Как мне лучше добовлять текст (ваше мнение, как бы вы сделали):
1 искать в id максимальный элемент и затем запрос "insert into table values (id_max+1,text)" тут есть возможность что другой скрипт вклинеться между запросами и два скрипта получат один и тот же макс. элемент ну и ...
2 вставить сначала text а потом с помощью поиска найти какой id ему соответствуе, но поиск может много времени, т.к. текст может быть внушительным, да и количество записей тоже
Что посоветуете? (может есть еще способ)

Дата отправки: 03.02.2006, 16:15
Вопрос задал: DRS
Всего ответов: 3
Страница онлайн-консультации »


Консультирует Jadd:

Здравствуйте, DRS!
Сделать поле как autoincrement (identity и тд..зависит от платформы) и вставлять только текст, тогда проблемы с приращением id будет решать сервер.

Консультировал: Jadd
Дата отправки: 03.02.2006, 16:23
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует LanK:

Здравствуйте, DRS!

Хмм. Не зная что за База Данных сложно ответить :(

В MSSQL есть спец поле например у меня объявлено так:
MyID int identity (1,1)

В Access оно называется "автоинкримент".

Можно еще повесить "тригер" на вставку записей.

Напишите что за базу Вы используете или поищите у себя в справке по типу, как я Вам описал.

P.S. А вариант 2 совсем не правильный - время, как Вы сами написали на вставку будет колосальным :(

Консультировал: LanK
Дата отправки: 03.02.2006, 16:39
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Doctor013:

Здравствуйте, DRS!
Используй автоинкремент, а для того, чтобы узнать id есть стандартная функция:
" LAST_INSERT_ID([expr])

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

mysql> SELECT LAST_INSERT_ID();
-> 195
"
Это первый подход, который используется в MySQL, неудобен тем, что этот запрос надо делать сразу после вставки - то есть если обновлять несколько таблиц, то last_insert_id() покажет значение id для последней вставки.

Еще я использую последовательности, аналогичные их тезкам в Oracle.
На нужную таблицу создается счетчик с заданным начальным значением и приращенем и две функции, возвращающие текущее (curval) и следующее(nextval)
значение.

Консультировал: Doctor013
Дата отправки: 04.02.2006, 13:02
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное