Delphi и Mssql

  • Автор темы Arcangel
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

Arcangel

#1
Посмотрел по форуму, ничего подобного ненашел, решил завести тему. НУ жна помощь в доработке уже существующей и почти написанной программы.
1. Есть файл MSExcel необходимо его открыть и вставить данные. Если кто может помочь по коду . Буду очень благодарен. Так как я сам с офисом работал мало.
2. Есть таблица на сервере MSSQL в которой храняться предметы каждой специальности и время отведенное для них. НЕобходимо при выборе студента и двойном клике по записи, показать его успеваемость и предметы со временем. Причем, ID_studenta, ID_Predmeta, Time, Ocenka, должны будут храниться в другой талбице, причем одна таблиу=ца успеваемости для всех спеиальностей.
 
S

SMitty

#2
На первый вопрос можно ответить примерно так:
Код:
procedure SaveExcelFile(filename: String;SG: TStringGrid);
var WorkBk : _WorkBook;
WorkSheet : _WorkSheet;
I, J, R, C : Integer;
IIndex : OleVariant;
TabGrid : Variant;
begin
IIndex := 1;
R := SG.RowCount;
C := SG.ColCount;

if FileExists(filename) then DeleteFile(filename);

TabGrid := VarArrayCreate([0,(R - 1),0,(C - 1)],VarOleStr);
I := 0;
repeat
for J := 0 to (C - 1) do
TabGrid[I,J] := SG.Cells[J,I];
Inc(I,1);
until I > (R - 1);

DataModule1.ExcelApplication1.Connect;
DataModule1.ExcelApplication1.WorkBooks.Add(xlWBatWorkSheet,0);
WorkBk := DataModule1.ExcelApplication1.WorkBooks.Item[IIndex];
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
Worksheet.Range['A1',Worksheet.Cells.Item[R,C]].Value := TabGrid;
WorkSheet.Name := 'from My Delphi Application';
Worksheet.Columns.HorizontalAlignment := xlLeft;
WorkSheet.Columns.ColumnWidth := 14;
WorkSheet.Range['A' + IntToStr(1),'A' + IntToStr(R)].ColumnWidth := 31;
DataModule1.ExcelApplication1.Visible[0] := False;

WorkBk.Close(True, filename, 0, 0);

DataModule1.ExcelApplication1.Disconnect;
TabGrid := Unassigned;
end;
А со вторым вопросом не очень понятно в чем проблема. Получить ID студента из первой таблицы? Или вытянуть из MSSQL данные по этому ID?
 
A

Arcangel

#3
Спасибо за помощь по первой части. Теперь что касается второй, надо не просто получить ID студента, а этот ID вставить в талбицу в Поле id_studenta и перенести IDшники каждого из предметов данной специальности и соспоставить с ID студента. чтобы по запросу из делфи:

ADOQuery.SQL.Text:= 'select PREDM.Predmet, '''+d+'''.Kodspecialnosti from '''+d+''', PREDM,YSPEV where '''+d+'''.Kodspecialnosti=PREDM.Kodspecialnosti and PREDM.Id = YSPEV.id_predm and BAHK.Id = YSPEV.id_studenta' ;

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

Arcangel

#4
Цитата(Arcangel @ 25:04:2008 - 19:18)
ADOQuery.SQL.Text:= 'select PREDM.Predmet, '''+d+'''.Kodspecialnosti from '''+d+''', PREDM,YSPEV where '''+d+'''.Kodspecialnosti=PREDM.Kodspecialnosti and PREDM.Id = YSPEV.id_predm and BAHK.Id = YSPEV.id_studenta' ;
За такое надо пожизненный ецих с гвоздями.
За что именно?
 
A

Arcangel

#5
1. А что тогда использовать? БЕз компонентов производить запрос на клиент -сервеную БД?
2 - за такую вот ужасную строку (и тут есть вопросы: зачем вы ее собираете, у вас что таких таблиц много? даже если собирать, то про существование функции Format в курсе?)
2. Как я обычно говорю, критиковать может каждый. Для примера взял бы и написал запрос подходящий для сборки. Но только для 13 таблиц которые
1. Никак не привязаны и формируются запросо
2. Соответственно все действия с ними производяться аналогично не как с таблицами а как с результатами запроса.
3 - за название переменны (ну это так - по большому счету)
3. Каждый программирует по своему кому то переменные ти па "tyktykmoidrug" мало а кому то "d" вполне хватает чтобы машина обработала и выполнила запрос.
 
A

Arcangel

#6
нет не ошибаетесь, таблиц 13. Теперь по порядку попробую ответить на все выше перечисленное. с ВАНК я промахнулся, там должно быть '''+d+''. Проблема в том что тот запрос что я написал выполняется напрямую из программы клиента написанном в делфи. d - это не таблица а переменная которой в зависимости от выбора специальности присваивается соответствующая таблица. Поэтому если я напишу p.Kodspecialnosti=d.Kodspecialnosti язык делфи поймет это как имена таблиц и соответственно выдаст ошибку компиляции. По поводу
в) зачем делать так "select PREDM.Predmet, '''+d+'''.Kodspecialnosti" если логичнее было бы так : select PREDM.Predmet, PREDM.Kodspecialnosti, зачем выкрутасы такие?
PREDM.Predmet это столбец талицы с предметами а вот PREDM.Kodspecialnosti он нам нужен косвено только для сверки, в какой таблице мы сейчас находимся если они совпадают то соответственно выводится список предметов этой специальности и поставляются оценки студента. INNER JOIN да можно использовать но в данном случае можно обойтись и без него. Под сборкой я подразумевал запрос по нескольким таблицам и вывод нужных столбцов. Говоря что каждый программирует по своему я имел ввиду что каждый программист использует переменные и компоненты с которыми он привык работать и которые ему удобны. По поводу ADODataSet и ADOCommand возможно они и удобные я не отрицаю но я привык уже к ADOOuery и мне намного быстрее написать что то через него чем через что то мне не известное тем более когда время поджимает.
 
A

Arcangel

#7
Все-таки почему 13, почему не одна? У них структуры разные или тождественны?
Структуры тождественные, просто изначально не продумал структуру как следует и сделал 13, и под эти 13 всю структуру клиента поставил, а теперь если менять базу надо весь клиент переписывать снова, а времени нет уже.
С алиасами я честно говорю, работать пробовал и потм от них отказался, эти алиасы на таблицы по карйней мере на локальных БД, надо созавать на всех ПК изнова как базу переносим. А это марока лишняя, значит надо человеку кто этим будеит пользоваться еще и про создание алиасов обьяснять. Возможно и существует способ по созанию переносимых алиасов но я таких незнаю.
 
A

Arcangel

#8
ок. спс за разьяснения попробую, может что и получиться, хотя я уже частично обошел запрос, реализовав через Edit'ы
спс за помощь.
 
Статус
Закрыто для дальнейших ответов.