Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Импорт из Excel в MSSQL посредством С++builder

19K
14 мая 2007 года
Levi
35 / / 11.05.2007
Импорт из Excel в MSSQL посредством С++builder
Каким образом реализовать?
Страницы:
263
14 мая 2007 года
koltaviy
816 / / 16.12.2004
Я бы сделал так:
1) Импортировал бы данные из MS Excel в MS Access - это делается без проблем по средствам самого офиса!!
2) Подключил бы два Connection'а: один на базу Access - другой на твою.
3) Ну а дальше - дело техники :)
19K
14 мая 2007 года
Levi
35 / / 11.05.2007
1)А каким образом тут задействовать Билдер?
2)А без использование Аксеса можно? У меня хранится очень много информации в базе, боюсь что Аксес будет тормозить (
263
14 мая 2007 года
koltaviy
816 / / 16.12.2004
Цитата: Levi
1)А каким образом тут задействовать Билдер?
2)А без использование Аксеса можно? У меня хранится очень много информации в базе, боюсь что Аксес будет тормозить (


Насколько я понял - это разовая операция: у тебя есть таблицы Excel, ты хочешь их импортировать в БД и работать уже с ней!! Так вот один раз это и сделай - потом будешь работать со своей БД - я не предлагаю тебе работать с Access - предлагаю перегнать через него: MS Excel->MS Access->MSSQL

7.8K
14 мая 2007 года
Hrew
185 / / 23.04.2007
Цитата: koltaviy
Насколько я понял - это разовая операция: у тебя есть таблицы Excel, ты хочешь их импортировать в БД и работать уже с ней!! Так вот один раз это и сделай - потом будешь работать со своей БД - я не предлагаю тебе работать с Access - предлагаю перегнать через него: MS Excel->MS Access->MSSQL


Зачем Access? Есть же Microsoft SQL Enterprise Manager, им можно импортировать данные непосредственно из xls в MSSQL.

Levi, билдер в данном случае - это какое-то необходимое условие или всего лишь средство переноса базы данных?

19K
15 мая 2007 года
Levi
35 / / 11.05.2007
Hrew
Все Билдера можно избежать, у меня теперь другая проблема....
Нужно информацию которая в Екселе полностью занести в готовую БД
Строки из Екселя сгруппированы большей своей частью и поэтому не совпдают с существующими таблицами в БД, т.к. там строки разделенны на каждую таблицу отдельно (например в екселе в одно строке хранятся улица, дом, офис, а в БД улица, дом и офис это отдельные таблицы), поэтому надо как то запихнуть данные из Екселя в эти таблицы...
Даже без помощи Билдера, просто сделать Импорт, подскажите как это реализовать?
P.S.
Если несложно объясните по пунктам что конкретно нужно сделать, я чо-то не понимаю (
1
15 мая 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Levi
Hrew
Все Билдера можно избежать, у меня теперь другая проблема....
Нужно информацию которая в Екселе полностью занести в готовую БД
Строки из Екселя сгруппированы большей своей частью и поэтому не совпдают с существующими таблицами в БД, т.к. там строки разделенны на каждую таблицу отдельно (например в екселе в одно строке хранятся улица, дом, офис, а в БД улица, дом и офис это отдельные таблицы), поэтому надо как то запихнуть данные из Екселя в эти таблицы...
Даже без помощи Билдера, просто сделать Импорт, подскажите как это реализовать?
P.S.
Если несложно объясните по пунктам что конкретно нужно сделать, я чо-то не понимаю (


Шаг 1. Получить данные из экселя в TClientDataSet (для этого можно использовать драйвер - т.е. работать с таблицей как с базой) или же считывать построчно. Или считывать построчно и помещать в датасет
Шаг 2. Обработать полученные данные.
Шаг 3. Установить соединение с базой
Шаг 4. Поместить полученные данные.
пример кода если будет время могу привести позже.

7.8K
15 мая 2007 года
Hrew
185 / / 23.04.2007
Цитата: Levi
Строки из Екселя сгруппированы большей своей частью и поэтому не совпдают с существующими таблицами в БД, т.к. там строки разделенны на каждую таблицу отдельно (например в екселе в одно строке хранятся улица, дом, офис, а в БД улица, дом и офис это отдельные таблицы), поэтому надо как то запихнуть данные из Екселя в эти таблицы...


вот с этого нужно было начать)) Вам нужно не просто данные импортировать, а реорганизовать базу данных. Можно ли это сделать с помощью Enterprise Manager, я не знаю. Проверить возможности не имею. Могу предложить два варианта:

1. использовать билдер.
а) получаем данные из excel. Сделать это можно разными способами (через OLE; или сохранить xls в формате txt и дальше работать с текстовым файлом; или зарегистрировать xls как базу данных и в билдере переводить данные из этой базы в базу mssql).
б)выделяем необходимые данные из строки. Если "улица, дом и офис" хранятся в разных ячейках, то дополнительной обработки не нужно. Если это все хранится в одной ячейке или Вы выберете работу с текстовым файлом, то нужно разбить эту строку на соответствующие части (в качестве разделителей можно использовать запятые или слова "ул.", "офис" и т.д.)
в) помещаем эти данные в mssql. Перед добавлением, например, названия улицы в отдельную таблицу проверяем - если такое название уже есть, то запоминаем его идентификатор, если нет - то добавляем название и запоминаем его идентификатор. Идентификатор помещаем в соответсвующий столбец основной таблицы.

2. использовать средства самого mssql.
Создать в нем вспомогательную таблицу, куда перенести данные из xls в том виде, в каком они есть (с помощью Enterprise Manager). Затем написать процедуру для копирования данных из вспомогат. таблицы в нужные по принципу пунктов 1б и 1в. Но это если улица, дом и офис изначально хранятся в различных ячейках.

P.S. Только Вы сначала все-таки посмотрите, может это можно и в Enterprise Manager сделать напрямую.

1
15 мая 2007 года
kot_
7.3K / / 20.01.2000
Рекомендации из разряда - я не знаю но скажу?
Цитата: Hrew
вот с этого нужно было начать)) Вам нужно не просто данные импортировать, а реорганизовать базу данных. Можно ли это сделать с помощью Enterprise Manager, я не знаю.


Можно. Подробнее здесь


По переносу данных. На форме кидешь 2 TADOQuery (один для екселя второй для вставки). В первом формируешь следующую строку подключения

 
Код:
"Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN=Excel Files;DBQ=D:\\ArchiveAccessBase\\Tvoy_file.xls;DefaultDir=D:\\ArchiveAccessBase;DriverId=790;MaxBufferSize=2048;PageTimeout=5;";Initial Catalog=D:\\ArchiveAccessBase\\Tvoy_file"

то что выделено болдом соответственно должно содержать твои параметры файла. Второй подключаешь с своему скульсерверу.
Далее код:
Код:
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("Select * from [Sheet1$]");
ADOQuery1->Active  = true;

ADOQuery2->SQL->Clear();
ADOQuery2->SQL->Add("Insert into cities (citiname) value (@citiname)");

while(!ADOQuery1->Eof){
 //Далее стандартная работа
 //Например у тебя в экселе идет первое поле улица затем город и  //фамилия.
ADOQuery2->Parameters->ParamByName("@citiname")->Value = ADOQuery1->Fields->Fields[1]->Value;
ADOQuery2->ExecSQL();
ADOQuery1->Next();
}

для реальной работы я бы использовал хранимые процедуры для вставки записей на сервер - но в качестве примера я думаю сгодится.
19K
15 мая 2007 года
Levi
35 / / 11.05.2007
Огромное вам спасибо...
Мне Диплом через неделю защищать, а я застопорился на импорте...никак не мог разобраться...чето через Оле пытался сделать 0 эмоций (
Если есть еще какие-нибудь добавление пждст напишите...у меня неделя на 100% работающую программу есть...А без Импорта ничего не примут...

А что еще за хранимые процедуры? На вставку определенного объекта в другую таблицу? Можно пример?
19K
15 мая 2007 года
Levi
35 / / 11.05.2007
Все данные импортировал в СКЛ, через встроенный в него функцию Импорт...
Там сформировалась одна большая таблица со множеством значений...
Как теперь разделить Строки из Екселя на отдельные составляющие (сейчас там такое творится в одной строке хранятся улица, дом, офис, и занести их в необходимые таблицы, т.к в БД улица, дом и офис это отдельные таблицы...
Можно пример?
1
15 мая 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Levi
Все данные импортировал в СКЛ, через встроенный в него функцию Импорт...
Там сформировалась одна большая таблица со множеством значений...
Как теперь разделить Строки из Екселя на отдельные составляющие (сейчас там такое творится в одной строке хранятся улица, дом, офис, и занести их в необходимые таблицы, т.к в БД улица, дом и офис это отдельные таблицы...
Можно пример?


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

263
16 мая 2007 года
koltaviy
816 / / 16.12.2004
Цитата: kot_
пример можно - но будет проще и понятней если будет пример данных которые хранятся в таблице - несколько строк. Потому как я не понимаю в чем состоит задача.


Могу я объяснить ;) :
К примеру, получилась такая таблица:
Жители: Код, Фамилия, Город;
Данные в таблице получились такие:
1 - Иванов - Орел
2 - Петров - Екатеринбург
3 - Сидоров - Москва
4 - Попов - Орел

А должно быть две таблицы:
1) Жители: Код, Фамилия, Города_Код
2) Города: Код, Наименование
А данные такие:
В первой таблице:
1 - Иванов - 1
2 - Петров - 3
3 - Сидоров - 2
4 - Попов - 1

Во второй:
1 Орел
2 Москва
3 Екатеринбург

19K
16 мая 2007 года
Levi
35 / / 11.05.2007
koltaviy
Почти, но тут не много посложнее )
1)При выгрузке из Экселя получилась такая таблица:
Адрес: индекс, город, улица, дом, квартира, офис, номер1, номер2, номер_сот, факс, е-майл
Данные записались в одну строку в виде:
650066 | Кемерово | пр.Ленина | 7 | 201 | 458934 | Нулл | Нулл | Нулл | редиска@rambler.ru

2)А в СКЛ должно быть 7 таблиц:
1)Индекс (содержит ид_таблицы, индекс)
2)Город (содержит ид_таблицы, город)
3)Улица (содержит ид_таблицы, улицу)
4)Дом (содержит ид_таблицы, номер дома)
5)Офис (содержит ид_таблицы, номер офиса)
6)Телефон (содержит ид_таблицы, телефон1, телефон2, номер_сот, факс, е-майл)
Они должны соединяться в таблице АДРЕС, которая содержит только их ИД (ключи)
А данные такие:
Первая таблица:
1 - 650066
2 - 650067
Вторая таблица:
3 - Кемерово
4 - Москва
Третья таблица:
5 - Кирова
6 - пр.Ленина
Четвертая таблица:
7 - 101
8 - 24
Пятая таблица:
9 - 305
10 - 501
Шестая таблица:
11 - 658934 | 457834 | NULL | NULL | NULL
12 - 348923 | NULL | NULL | NULL | редиска@rambler.ru
Седьмая таблица: (только ИД)
13 - 1 | 3 | 5| 7| 9| 11
14 - 2 | 4 | 6| 8| 10| 12

Нужно данные расскидать, с сохранением строки по ИД
1
16 мая 2007 года
kot_
7.3K / / 20.01.2000
koltaviy
если мне нужно будет что бы что либо объяснил - я обращусь лично к тебе. А сейчас мне нужно что бы объяснил автор что он хочет.

Цитата: Levi
koltaviy
Почти, но тут не много посложнее )
...
Нужно данные расскидать, с сохранением строки по ИД


Сложного особо ничего нет. Коды в справочниках - все идентити-значения? Что произойдет если человек имеет к примеру 2 мобильных или 5 адресов электронной почты? Или два адреса? Я бы советовал структуру базы переработать - она у тебя слишком жесткая и громоздкая:). Скрипт вечером напишу. Если таблицы уже в базе есть - скинь структуру в ПМ или сюда - тогда тебе прийдется меньше переделывать. В MSSQL - правой клавишей мыши по таблице - Script Table As - Create Table.

19K
16 мая 2007 года
Levi
35 / / 11.05.2007
Еще вопрос, у меня очень много нулевых значений получается.
Например в Екселе хранится информация в одной ячейки:
Должность, ФИО, индекс, город, улица, дом, офис, тел1, тел2, сот_тел, факс, е-майл, ИНН, КПП, ОГРН, ОКПК
Так вот эти значения могут быть нулями в различном порядке: тел1, тел2, со_тел, факс, е-майл, ИНН, КПП, ОГРН.
Получается мне все нужно будет вручную делать? Автоматически нельзя будет реализовать?
Щас вставлю структуру Базы, она уже готова...
P.S.
Сотовый телефон и е-майл только один, т.к. это значения предприятия а не одного конректного человека...
К сожалению структуру Базы нежелательно переделавыть т.к. под нее написаны уже Процедуры и их не мало, начиная от сортировки и кончая автоматическим удалением
19K
16 мая 2007 года
Levi
35 / / 11.05.2007
http://cp.liveofan.jino-net.ru./Excel and SQL.rar
Все находится тут Есель документ и структура БД
1
16 мая 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Levi
Еще вопрос, у меня очень много нулевых значений получается.
Например в Екселе хранится информация в одной ячейки:
Должность, ФИО, индекс, город, улица, дом, офис, тел1, тел2, сот_тел, факс, е-майл, ИНН, КПП, ОГРН, ОКПК
Так вот эти значения могут быть нулями в различном порядке: тел1, тел2, со_тел, факс, е-майл, ИНН, КПП, ОГРН.
Получается мне все нужно будет вручную делать? Автоматически нельзя будет реализовать?
Щас вставлю структуру Базы, она уже готова...
P.S.
Сотовый телефон и е-майл только один, т.к. это значения предприятия а не одного конректного человека...
К сожалению структуру Базы нежелательно переделавыть т.к. под нее написаны уже Процедуры и их не мало, начиная от сортировки и кончая автоматическим удалением


Я не зря спросил у тебя о структуре базы (кстати, архив битый - структура базы не разархивируется).
1. Насколько я понял в структуре присутствует как минимум три сущности - поставщик, договор и контактное лицо поставщика (директор). Из этого надо собственно строить базу.
2. Второе по поводу связей между таблицами - они в принципе неверно выстроены. Какой смысл хранить в справочнике номер квартиры или офиса? Смысл хранить индекс!!!! города!!!! и ссылаться на него по ключу? Почему вместо того что бы создавать кучу полей под телефоны и емайл не создать таблицу - в которой просто присутствует справочный признак типа данных - ты сразу уберешь ограничение на количество телефонов и адресов? Ну и так далее. Я не знаю какие процедуры якобы написаны и работают - но могу основываясь на своем опыте спрогнозировать массу ошибок и ограничений для данной структуры. Проще структуру переделать.
Если же это дипломная работа - то ее надо переделать однозначно.
По поводу нормализации данных в адресе - я думаю автоматизация возможна - но во первых если данных действительно много - если же это весь объем - то естественно проще сделать это руками.

19K
16 мая 2007 года
Levi
35 / / 11.05.2007
И еще у меня возник вопросы:
1)
Цитата:
По переносу данных. На форме кидешь 2 TADOQuery (один для екселя второй для вставки). В первом формируешь следующую строку подключения


Т.е. по переносу, куда что переносить? Не понял (
У меня есть Ексель документ и есть бд на СКЛ и все, по пунктам можно?

2)

Цитата:
"Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN=Excel Files;DBQ=D:\\ArchiveAccessBase\\Tvoy_file.xls;DefaultDir=D:\\ArchiveAccessBase;DriverId=790;MaxBufferSize=2048;PageTimeout=5;";Initial Catalog=D:\\ArchiveAccessBase\\Tvoy_file"


Что означает эта строка и где ее писать? На самой форме?

3)

Цитата:
D:\\ArchiveAccessBase\\Tvoy_file.xls


что это за путь?

1
17 мая 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Levi
И еще у меня возник вопросы:
1)

Т.е. по переносу, куда что переносить? Не понял (
У меня есть Ексель документ и есть бд на СКЛ и все, по пунктам можно?


имеется ввиду импорт из экселя в сиквел с обработкой в собственной программе.

Цитата: Levi

2)

Что означает эта строка и где ее писать? На самой форме?


в стороке подлючения компонента или в програмном коде.
например вот так

 
Код:
ADOQuery1->ConnectionString = WideString("Provider=MSDASQL.1;Persist Security Info=False;Extended Properties=\"DSN=Excel Files;DBQ=D:\\1\\Перечень договоров 2006.xls;DefaultDir=D:\\1;DriverId=790;MaxBufferSize=2048;PageTimeout=5;\";Initial Catalog=D:\\1\\Перечень договоров 2006");

ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("Select * from [Поставка$]");
 ADOQuery1->Active = true;

Выполнив этот код(естественно тебе необходимо установить ту директорию в которой ИМЕННО у тебя находится твой файл. Так же могут быть глюки с русскими именами и пробелами - вобщем разбирайся, у меня все отрабатывает) ты получишь выборку из листа. Но тут у тебя появятся проблемы (точней уже появились - так как вне зависимости как ты импортируешь данные - механизм один)- так как в твоем листе экселя присутствуют объединеные ячейки, у тебя появится масса пустых строк в результирующей таблице - в частности на этом листе за счет доп.соглашений по договорам. Для того что бы с этим разобраться тебе необходимо определить что будет уникально идентифицировать каждую конкретноую запись (например это может быть наименование поставщика) и проходясь по всем выполнить импорт данных в промежуточную таблицу на сиквеле, например так (предполагаю что ты установишь сам соединение с сервером и создашь таблицу):
Код:
ADOQuery2->SQL->Clear();
ADOQuery2->SQL->Add("Insert into tmp_supplier (supplier_name,doc_date,address,source,subject,condition_delivery,condition_payment,doc_summ) value (@supplier_name,@doc_date,@address,@source,@subject,@condition_delivery,@condition_payment,@doc_summ)");
AnsiString tmp_supplier_name="", tmp_address=""; //Здесь создаешь
//временные переменные для всех полей которые не должны быть
//(NB!!!)пустыми
 while(!ADOQuery1->Eof){
//Далее получаем значение.
//Те параметры что не должны быть пусты
//мы сохраняем во временную переменную
//и в запрос передаем ПЕРЕМЕННУЮ
//если же параметр может быть пуст -
//просто передавай ему значения в выборке.
if(!ADOQuery1->Fields->Fields[0]->Value.IsNull())
  tmp_supplier_name = ADOQuery1->Fields->Fields[0]->Value;
if(!ADOQuery1->Fields->Fields[2]->Value.IsNull())
tmp_address = ADOQuery1->Fields->Fields[2]->Value;
ADOQuery2->Parameters->ParamByName("@supplier_name")->Value = tmp_supplier_name;
ADOQuery2->Parameters->ParamByName("@address")->Value = tmp_address;
ADOQuery2->Parameters->ParamByName("@source")->Value =ADOQuery1->Fields->Fields[3]->Value;

//заполняешь все параметры
...
//и выполняешь запрос
ADOQuery2->ExecSQL();
ADOQuery1->Next(); }

в результате у тебя должна появится таблица содержащая адекватные значения. Затем уже из нее можно выбрать конкретные значения для справочника а вместо них подставить идентификаторы. Остальные листы обрабатываешь таким же образом.
Фсе. заипался. пошел спать.
19K
17 мая 2007 года
Levi
35 / / 11.05.2007
Спасибо
Вот база, на это раз не битая сам проверял
http://cp.liveofan.jino-net.ru./SQL.rar
Извини я наверное тебе уже надоел, но твоя помощи по истине не оценима...
1
17 мая 2007 года
kot_
7.3K / / 20.01.2000
Я бы посоветовал переделать структуру и изменить процедуры. Долго рассказывать почему - проще будет вечером буду посвободней нарисую примерную структуру и процедуры вставки и модификации. Заодно попытаюсь объяснить почему так делать не стоит.
19K
17 мая 2007 года
Levi
35 / / 11.05.2007
Хорошо буду ждать...
А можно как нить словится и по Асе пообщаться?
У меня разница с Москвой +4 часа
1
17 мая 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Levi
Хорошо буду ждать...
А можно как нить словится и по Асе пообщаться?
У меня разница с Москвой +4 часа


пробуй, :) у меня +2 вечером как правило я в аське но это может и в 22 по нашему и позже

19K
17 мая 2007 года
Levi
35 / / 11.05.2007
Дамс видать не судьба, что же буду на форуме ждать помощи...
А структура у меня действительно ни к черту?
Вроде оптимально нормализовывал, недавно еще хотел в отдельные таблички выделить Название организации и вид работ...
19K
17 мая 2007 года
Levi
35 / / 11.05.2007
А на выходных, тебя не ждать?
Извини за мою назойливость ((
1
18 мая 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Levi
А на выходных, тебя не ждать?
Извини за мою назойливость ((


Да не переживай. Этот раздел форума в принципе предназначен для поиска помощи, кода и т.п. - это если бы в разделе по билдеру ты его задал - вот там бы тебе был бы писец :). Если я здесь отвечаю - значит время у меня пока есть.
По структуре. В целом диаграмма выстроена у тебя верно. Почти.
Почему почти? Давай по пунктам
1. При проектировании базы всегда надо держать в голове что ты работаешь с объектами, процессами и прочей фигней. Излагать теорию особо не буду - но смысл в том что - договора, контрагенты (подрядчики или как они там у тебя) - это объекты, которые обладают своими свойствами. Каждое свойство может быть разложено в свою очередь на объекты - а может быть и простым. Так вот - свойствами например подрядчика есть наименование, уникальный код, и прочие ИНН - но НЕ ЯВЛЯЕТСЯ наименование работ(один подрядчик может выполнять несколько наименований) и тем более вид адреса - это вообще нонсес.
Так же не стоит включать в свойства подрядчика идентификатор директора - директор это сотрудник подрядчика и сотрудников может быть много - это может быть и просто менеджер которых просто дох%я. Ты для каждого будешь выделять поле? - это глупость.
Т.е. понятно - каждое поле для порядчика - это или поле которое уникально для него или уникально его характеризует. То есть ид, наименование, ИНН, ОКПО, КПП, ОРГН. Все. Остальные характеристики если они присутствуют - добавляем потом. НИКАКИХ ид адреса и прочей х%йни тут быть не должно.
Далее - сделка. Не верное понятие или неверное проектирование? чем характеризуется сделка? В моем понимании - сумой датой и (возможно ) контрагентом. Номер договора - это свойство сделки? В большинстве случаев нет. Дата договора - свойство сделки - тоже как правило нет. Свойства сделки могут выступать как пртомежуточное звено. Вобщем на сегодня досить если говорить по украински. если по русски - надо переделывать то что есть, я по возможности буду на форуме и в аське - все вопросы можно задать туда. Я побрел спать. Может завтра с утра будет время - коснусь бдолее подробных вопросов. на сегодня я уже слишком пьяный.

19K
18 мая 2007 года
Levi
35 / / 11.05.2007
1)Понятно, т.е. в целом компоновка должна происходить по объектам, которые не уникальны по своей структуре, а потом эти объекты выделять в общую таблицу, где будут собраны все ключи? Соответственно БЛОК АДРЕС выполнен, верно?
2)Про директора понял, нужно было его вставить в таблицу с ФИО, т.к. вдруг к тому списку добавится новая должность, например я вообще с секретаршей буду договор подписывать :) (грубо говоря)
3)Вид работ у меня уникален, которые есть, новые не появятся - это своего рода СПРАВОЧНИК, как и АДРЕСА (наверное, кроме телефонов, с ними я не знал что делать, может их привязать к конкретному человеку, т.е. записать в таблице ФИО?)
3а)Наименование работ тоже можно считать за справочник, т.к. действия могут повторяться и чтобы вновь не заносит определенное наименование, мы можем воспользоваться справочником.
4)В отдельную таблицу надо выделить Название предприятия, вид_адреса с его ИНН и т.д.
5)Теперь нам нужно узнать, где находится предприятие, и с кем конкретно мы будем заключать договор, для этого создаем таблицу, где будут находиться следующие ИД (Адрес, ФИО, Название предприятия)
6)Далее номер_договора на предприятии как я понял есть стандартные бланки заключения договоров и у каждого из них есть свой номер...т.е. таблица номер_договора выступает тоже в виде СПРАВОЧНИКА
7)После того как мы узнали, где находится предприятие нужно назначить ему наименование работ и вид, к которым оно принадлежит, а также номер_договора, чтобы знать какой бланк нам нужно заполнить будет примерно следующие ИД (ИД ОРГ(6 пункт), ИД наименование, ИД вид, ИД номер_договора)
Теперь Сделка:
1)Начнем с конца, для каждого конкретного случая будет своя цена и соответственно условия выполнения, при котором сумма будет оплачена, значит, эти 2 таблицы надо объединить, т.е. будет сформирована таблица с полями Сумма и Условие, а не 2 разные таблицы как было ранее
2)Хранить даты в отдельной таблице не имеет смысла, т.к. сначала мы выбираем бланк договора, назначаем по нему оплату и организацию, которая выполнит заданную работу, а уж потом назначаем Сроки, т.е. Даты исполнения и вступления договора в силу.
А т.к. Даты уникальны для каждого наименования работ и договора, то их можно включить в таблицу СДЕЛКА, как они есть, а не создавать отдельную таблицу для хранения дат – это просто тупо )
3)Таблица Сделка будет хранить в себе следующее (Даты_работ, ИД ИНФ(7 пункт), ИД Сумма)
В итоге мы получим, что №1 был заключен 3 мая с подрядной организацией Коместра ее директором ИИИ, которая находится там-то, там-то и заключен на следующий вид работ ремонт холодильника..
Думаю, будет нечто вроде этого, сейчас переработаю и выложу на форуме, что вышло…
P.S.
Как считаешь, может вид адреса вообще стоит убрать? юр или физ лицо вообще нужно здесь определять?

Вот новая версия базы, лучше?http://cp.liveofan.jino-net.ru./SQL1.rar
1
18 мая 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Levi
1)Понятно, т.е. в целом компоновка должна происходить по объектам, которые не уникальны по своей структуре, а потом эти объекты выделять в общую таблицу, где будут собраны все ключи? Соответственно БЛОК АДРЕС выполнен, верно?


Даже после бутылки абсента понять тебя трудно. :) Нет не верно. Точнее не совсем верно. Это общая проблема с твоими таблицами - ты не верно организовывашь связи. Необходимо помещать идентификатор подрядчика в запись об адресе - а не наоборот. Проектирование баз - это своеобразный тест роршаха :) И судя по нему ты живешь в странном мире :) По поводу дальнейших твоих рассуждений - запомни раз и навсегда - и заруби себе на носу - номер договора и другая подобная информация - НИКОГДА НЕ МОЖЕТ БЫТЬ СПРАВОЧНИКОМ. Это свойство объекта документ. Справочник - это относительно постоянная информация которая может быть использована для множества объектов.
У тебя предполагается что один и тот же номер будет использоваться множество раз? Тоже касается и номеров домов и квартир. Подобная информация как правило сама является идентификатором - и ты дополнительно даешь еще один. Зачем?

19K
18 мая 2007 года
Levi
35 / / 11.05.2007
Ты смотрел файл Эксель?
Номера договора могут быть использованны неоднократно для разных моментов, тоже самое касается и номера дома, офиса и т.п.
Насчет Адреса, получается что адрес принадлежит подрядчику а не подрядчик адресу? Т.е. индефикаторы название орг и ее директора, должны содержаться в таблице Адрес а не наоборот, так?

Насчет кода программы по пунктам:
1)Создаю подключение к СКЛ через Адоконекшен, 2 Квери
2)На форме пишу код
Цитата:
ADOQuery1->ConnectionString = WideString("Provider=MSDASQL.1;Persist Security Info=False;Extended Properties=\"DSN=Excel Files;DBQ=D:\\1\\Перечень договоров 2006.xls;DefaultDir=D:\\1;DriverId=790;MaxBufferSize=2048;PageTimeout=5;\";Initial Catalog=D:\\1\\Перечень договоров 2006");

ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("Select * from [Поставка$]");
ADOQuery1->Active = true;


Где [Поставка$] - это таблица в которую я выгружаю все данные...
Ее я создаю в СКЛ ручками и пустыми полями...
Возникает вопрос - в Екселе у меня документ разделен на 5 закладок, каким образом он будет выгружаться? Нужно создать еще подключения и выгружать в другие таблицы?(Смотреть документ Ексель)

2)Создаю список всех полей, которые мне необходимы, в моем случае это индекс,город,улица,дом,офис,номера телефонов(некоторые из них могут быть нулевыми),ФИО,должность,название орг,ее ИНН,КПП,ОГРН,ОКПО(тоже могу быть нулями), наименование работ, вид работ,номер договора,даты, условие оплаты, сумма и объявляю для них переменные...
И тут у меня возникает проблема, ни одно поле у меня не может быть уникально (
Есть возможность создать искуственный индефикатор? Например в таблице в которую я выгружаю, я ручкаим сразу пропишу какой нить ИД, так можно сделать?

3)

Цитата:
Insert into tmp_supplier (supplier_name


tmp_supplier - что это значит?

4)

Цитата:
if(!ADOQuery1->Fields->Fields[0]->Value.IsNull())
tmp_supplier_name = ADOQuery1->Fields->Fields[0]->Value;
if(!ADOQuery1->Fields->Fields[2]->Value.IsNull())


Если какое-то значение у меня может быть нулевым я пишу эту часть кода, верно?

5)

Цитата:
ADOQuery2->Parameters->ParamByName("@supplier_name")->Value = tmp_supplier_name;
ADOQuery2->Parameters->ParamByName("@address")->Value = tmp_address;
ADOQuery2->Parameters->ParamByName("@source")->Value =ADOQuery1->Fields->Fields


Это часть кода передает значения в порядке следования, но как видно из ексель документа, у меня это не очень получится т.к. там присутствует объединение ячеек и пропуск некоторых значений.
Т.е. в одной строке у меня может содержаться: Должность, ФИО, Адрес, ИНН,КПП,тел1,тел2 (тут отсутствуют ОГРН,ОКПО,сот_тел, факс и е-майл)
А вдругой Должность, ФИО, Адрес,тел1
Получается надо сразу каким то образом делать выборку значений через условия...

5)Возникает вопрос, как я выберу конкретное значение и перенесу его в нужную таблицу с сохранением индефикатора?
Т.е. чтобы каждая строка переносилась с охранением своего ид, чтобы потом из таблиц можо было сформировать запрос в нормальном виде?

6)Какие условия можно ставить?
Примером можно?

P/S/
Щас попробую 3 вариант стуктуры БД сделать, блин че же я не понимаю (
Укажи мои конкретные ошибки в формировании структуры

1
18 мая 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Levi
Ты смотрел файл Эксель?
Номера договора могут быть использованны неоднократно для разных моментов, тоже самое касается и номера дома, офиса и т.п.
Насчет Адреса, получается что адрес принадлежит подрядчику а не подрядчик адресу? Т.е. индефикаторы название орг и ее директора, должны содержаться в таблице Адрес а не наоборот, так?


Если бы я несмотрел файл экселя я бы тебе ничего не советовал. Русским языком тебе повторяю - номер договора - это свойство документа, выносить его в справочник - архинеправильно. ТОже относится к номерам домов и т.п. Как это делать - решение за тобой.
Адрес действительно пренадлежит подрядчику :) Ведь квартира в которой ты живешь - пренадлежит тебе - а не ты квартире. Но в адресе должен содержаться только идентификатор организации - и все. Директора я бы вынес в отдельную таблицу - сотрудников подрядчика - опять же со ссылкой на идентификатор организации.

Цитата: Levi

Насчет кода программы по пунктам:
1)Создаю подключение к СКЛ через Адоконекшен, 2 Квери
2)На форме пишу код

Где [Поставка$] - это таблица в которую я выгружаю все данные...
Ее я создаю в СКЛ ручками и пустыми полями...
Возникает вопрос - в Екселе у меня документ разделен на 5 закладок, каким образом он будет выгружаться? Нужно создать еще подключения и выгружать в другие таблицы?(Смотреть документ Ексель)


[Поставка$] - это таблица ИЗ которой ты выгружаешь свои данные. А затем необходимо провести анализ и загрузить в базу. Как обработать постараюсь сегодня показать.

Цитата:
2)Создаю список всех полей, которые мне необходимы, в моем случае это индекс,город,улица,дом,офис,номера телефонов(некоторые из них могут быть нулевыми),ФИО,должность,название орг,ее ИНН,КПП,ОГРН,ОКПО(тоже могу быть нулями), наименование работ, вид работ,номер договора,даты, условие оплаты, сумма и объявляю для них переменные...
И тут у меня возникает проблема, ни одно поле у меня не может быть уникально (
Есть возможность создать искуственный индефикатор? Например в таблице в которую я выгружаю, я ручкаим сразу пропишу какой нить ИД, так можно сделать?


Постараюсь показать как это сделать.

Цитата:
3)
tmp_supplier - что это значит?


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

19K
18 мая 2007 года
Levi
35 / / 11.05.2007
И если в таблице уже есть такое значение, чтобы не заполнял заново, а плясал от него...
Ведь те закладки, которые у меня в Ексель, на СКЛ отображенны в виде отдельной таблицы
19K
18 мая 2007 года
Levi
35 / / 11.05.2007
По поводу процедур, что в них неверно?
Они вроде работают, как ты имел ввиду их переработать...в каком направлении?
19K
18 мая 2007 года
Levi
35 / / 11.05.2007
Все еще раз базу переделал, на этот раз как, лучше?
http://cp.liveofan.jino-net.ru./SQL2.rar
1
18 мая 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Levi
Все еще раз базу переделал, на этот раз как, лучше?
http://cp.liveofan.jino-net.ru./SQL2.rar



Это уже лучше. По ней следующиие замечания:
1. Из таблицы Название_орг убери ид фамилии, в таблицу ФИО добавь ид организации. Сотрудник входит в организацию - а не наоборот. :) Так же я бы на рабочей базе ввел справочник сотрудников - и в место должности поставил идентификатор. По поводу телефонов - в принципе годится - но опять же будь я на твоем месте я бы убрал телефоны из таблицы ФИО и создал бы отдельную таблицу телефонов в которой бы содержадся ид телефона, ид сотрудника, номер, примечания, и идентификатор типа контакта. В справочник поместил бы идентификатор типа, описание типа (напр. рабочий, домашний, мобильный, и т.д.)
2. Таблицу Информация о подрядчике необходимо связывать напосредственно с названием организации. Т.е. вместо ид адрес использовать ид организации. Кроме того - не очень понятен смысл вынесения в отдельную таблицу, но об этом далее.
3. Не понятна роль таблицы наименование работ. Почему она завязана на таблицу Информация о подрядчике а не наоборот? У меня такое впечатление что ты сам не понимаешь основных процессов и взаимосвязей системы. Почему сюда вынесен номер договора? Что он описывает?
4. Почему отсутствует таблица с параметрами договора? Ведь насколько я понял у тебя работы должны проводится на основании чегото? Что описывает таблица Сделка? Если я верно проанализировал твой экселевский файл - она должна опираться на договор - а никак на информацию о подрядчике.

1
18 мая 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Levi
По поводу процедур, что в них неверно?
Они вроде работают, как ты имел ввиду их переработать...в каком направлении?


Во первых. Так делать не надо

 
Код:
insert into Улица (улица)
       values (@ulica)
select @IDulica=(Select id_ulica from Улица where  улица=@ulica)
end

особенно то что выделено жирным.
делают так:
 
Код:
insert into Улица (улица)
       values (@ulica)
set @IDulica=IDENT_CURRENT('Улица')

Второе - это в принципе не ошибка - а хороший совет. Не стоит выполнять все в одной куче. Для каждой операции создай отдельную процедуру - т.е. например вставка параметров клиента - отдельно, адреса отдельно и т.д. Тем более отдельной процедурой должно быть работа со справочниками.
Третье - используй каскадное удаление и обновление записей.
19K
19 мая 2007 года
Levi
35 / / 11.05.2007
Так более или менее понятны мои ошибки, по поводу стурктуры, щас пойду переделывать )
Процедуры:
1)
set @IDulica=IDENT_CURRENT('Улица')
Как я понял - это означает вставить значения в таблицу Улица?
Так можно описать все мои параметры?
2)
Так насчет вставки отдельно, в принципе ты прав, у меня же есть элементы которые соединяются вместе и затем уже передают свой ИД дальше...После того как Стурктуру обновлю займусь процедурами...
3)
Каскадное удаление, т.е. после каждого объявления нужной переменной писать удалить тот то элемент?А не как у меня сначало объявил все переменные а потом выбрал то, что мне необходимо удалить... Примером можно?
4)
Что в обновлении не так, там вроде все по порядку и так идет...
19K
19 мая 2007 года
Levi
35 / / 11.05.2007
Вот очередная версия БД, вроде теперь все норм:
http://cp.liveofan.jino-net.ru./SQL3.rar
1
19 мая 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Levi
Так более или менее понятны мои ошибки, по поводу стурктуры, щас пойду переделывать )
Процедуры:
1)
set @IDulica=IDENT_CURRENT('Улица')
Как я понял - это означает вставить значения в таблицу Улица?


Боже. И ты говоришь у тебя защита диплома? :):) мда.
Нет это получение последнего вставленного идентити. Просто селектом, как делаешь ты, выбирать его нельзя.

Цитата: Levi

3)
Каскадное удаление, т.е. после каждого объявления нужной переменной писать удалить тот то элемент?А не как у меня сначало объявил все переменные а потом выбрал то, что мне необходимо удалить... Примером можно?
4)
Что в обновлении не так, там вроде все по порядку и так идет...


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

19K
19 мая 2007 года
Levi
35 / / 11.05.2007
Странно но добавление при этом работает идеально )
Ну да ладно не суть дело...
Цитата:
ты выполняешь делит только по одной записи - и все связанные с ней записи удаляются автоматически.


Как его провернуть? Мне нужно удалить договор..
Чтобы провести каскадное мне нужно удалить конечное значение, которое связанно со всеми таблицами и тогда пойдет цепная реакция?
2)
Как новая версия базы?
3)
Что там с Екселем то делать (((
P.S.
Не поверишь я действительно защищаю в это году диплом, но если бы ты знал как у нас препадают, ты наверное удивился, что я так много знаю... ( у меня еще и красный диплом выходит с такими познаниями )
Вот выпущусь и не знаю, что делать, нужно выбрать какую то одну программу и заниматься по ней...
Щас пошел 1С изучать, чтобы на работу мог устроиться..
P.S.S.
Отучивщись в Политехе я понял одно - преподаватели ничего не дадут - надо самому все изучать...

1
20 мая 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Levi

Как новая версия базы?
3)
Что там с Екселем то делать (((
P.S.
Не поверишь я действительно защищаю в это году диплом, но если бы ты знал как у нас препадают, ты наверное удивился, что я так много знаю... ( у меня еще и красный диплом выходит с такими познаниями )
Вот выпущусь и не знаю, что делать, нужно выбрать какую то одну программу и заниматься по ней...
Щас пошел 1С изучать, чтобы на работу мог устроиться..
P.S.S.
Отучивщись в Политехе я понял одно - преподаватели ничего не дадут - надо самому все изучать...



Ноавя версия не плоха - но - зачем связь договора с адресом? Просвети плиз. Может я туплю - но идентификатор договора долже5н взаимодействовать только с базой Название _орг - и то через промежуточную таблицу. Не ужели это не видно на схеме? Зачем завязка адреса на договор? Я конечно не в курсе но договор заключает организация - а не улица. хотя возможно у вас все по другому. :) У меня такое впечатление что ты или не умеешь думать или не хочешь этого делать. В любом случае тебе это делать прийдется. я не могу написать за тебя диплом - я могу помочь но мозги прийдется тебе включать самому. Туда же - сотрудники - это сотрудники организации а не адреса. Зачем на него завязывать? Почему такие черезжопу ссылки? Повторяю еще раз - выдели основные объекты в своей системе - и устанавливай между ними связи. адрес - это не основной объект системы. Через него не нужно делать связи.
С экселем надо считывать данные и передавать - но мне нужна структура базы - что бы ты мог хотябы пониамать почему так

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог