![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() В общем, чтобы не создавать каждый раз новую тему открыл тему про SQL запросы.
1) При создании БД застрял на автоинкрементах. таблица: dBase IV, поля: id, name (number и character) требуется: увеличение значения id при вводе name и отображение внесенной записи. в приложении организован диалог через Edit ("Введите имя") и Button ("ОК"). Код:
procedure TForm1.Button1Click(Sender: TObject); begin Query1.close; Query1.SQL.Clear; Query1.sql.Text:=('ALTER TABLE tbl.dbf MODIFY id not null auto_increment=#'); Query1.ExecSQL; Query1.SQL.Clear; Query1.SQL.Text:=('insert into tbl.dbf values(id,"'+edit1.text+'")'); Query1.ExecSQL; Query1.SQL.Clear; Query1.SQL.Text:=('select * from tbl.dbf'); Query1.open; end; то есть, если в таблице имеется запись name1, то при вводе в edit`e имени name1 сообщало об ошибке??? как на счет такого пути: записываем в переменную val1 значение Edit1 и затем сравниваем с записью в таблице: Код:
procedure TForm_edit_mag.Edit1KeyPress(Sender: TObject; var Key: Char); var val1:string; begin {repeat val1:=edit1.text until Edit1KeyPress('');} //не то :) val1:=edit1.text; query1.close; query1.sql.clear; query1.sql.text:=('<??????>');{вот тут хз пока не разобрался, с помощью чего сравнивать???} query1.execsql; end; Admin: Пользуемся тегами! Последний раз редактировалось civicuu, 08.04.2009 в 15:07. |
#2
|
||||
|
||||
![]() Поскольку вы работаете с dbf, то мне кажеться вам лучше всего для запрета ввода повторов использовать запрос к таблице. Вот примерчик такой реализации:
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, Grids, DBGrids, ADODB, StdCtrls; type TForm1 = class(TForm) AppDB: TADOConnection; Edit1: TEdit; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin AppDB.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;'+ 'Data Source=%s;Mode=Share Deny None;Jet OLEDB:Database Password="";'+ 'Jet OLEDB:Engine Type=17'; AppDB.ConnectionString := Format(AppDB.ConnectionString,[ExtractFilePath(Application.ExeName)]); AppDB.Open; end; procedure TForm1.Button1Click(Sender: TObject); Var Q: TAdoQuery; MaxID: Integer; begin Q := TAdoQuery.Create(nil); Q.Connection := AppDB; Q.SQL.Text := 'select * from test.dbf where name=:name'; Q.Parameters.ParamValues['name'] := Edit1.Text; Q.Open; if Q.IsEmpty then begin Q.SQL.Text := 'select max(id) as MaxID from test.dbf'; Q.Open; if Q.FieldValues['MaxID'] = null then MaxID := 1 else MaxID := Q.FieldValues['MaxID'] + 1; Q.SQL.Text := 'insert into test.dbf (id,name) values(:id,:name)'; Q.Parameters.ParamValues['id'] := MaxID; Q.Parameters.ParamValues['name'] := Edit1.Text; Q.ExecSQL; end; Q.Close; Q.Free; end; end. Код:
object Form1: TForm1 Left = 294 Top = 113 Width = 870 Height = 640 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object Edit1: TEdit Left = 64 Top = 16 Width = 121 Height = 21 TabOrder = 0 Text = 'Edit1' end object Button1: TButton Left = 192 Top = 16 Width = 41 Height = 25 Caption = 'Add' TabOrder = 1 OnClick = Button1Click end object AppDB: TADOConnection LoginPrompt = False Mode = cmShareDenyNone Provider = 'Microsoft.Jet.OLEDB.4.0' Left = 16 Top = 16 end end Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
||||
|
||||
![]() как то так
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#4
|
|||
|
|||
![]() Цитата:
при обработке ссылался на 'modify': Код:
Error.. Token: Modify in line 1 ![]() альтернативный выход: при добавлении новой записи требуется указать номер, если номер существует, то "фейл". Да и еще: Код:
INSERT INTO table VALUES (col1,col2,...,colN) в моем примере не получается: Код:
INSERT INTO MyTable Values (id=id+1,name) //пробовал заключать в " " или "' '" или ' ', не выходит //через параметр также не получается, ругается на "+", хотя с умножением "*" все ОК //автоинкремент единственный выход? |
#5
|
||||
|
||||
![]() 1.Формат DBF насколько я помню неимеет автоинкриментных полей, поэтому ваша попытка воспользоваться этим счастьем для DBF, непрокатывает. Для реализации этого алгоритма смотрите мой пример который я дал в прошлом посте.
2.INSERT INTO MyTable Values (id=id+1,name) - это небудет работать по трем причинам, первая - вы не указали в какие поля помещать id=id+1 и name, вторая - вычислять можно, но без присвоения т.к. результат итак поместиться в (см.причину 1), третье - нельзя использовать в инсерте в качестве параметров имена полей этой-же таблицы. Переменные внешние пожалуйста, константы - ради бога, результат чужого запроса тоже можно. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
||||
|
||||
![]() 1. Нет в dbf счетчиков
2. Если хотите автоинкремент - ручками... только ручками... (как сделать - могу объяснить) Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#7
|
|||
|
|||
![]() 2 Aristarh Dark: объясните, очень интересно
![]() Какие типы таблиц поддерживают автоинкремент? Читал на sql(тчк)ру или в "королевстве делфи", что не всегда авто_инкременты в цене, когда дело доходит до удаления записей ![]() И вообще какие таблицы щас в "моде" (напр., для предприятия нестесненного финансово и для бедной конторы) добавлено: назрел еще 1 вопрос ![]() интересует именно ORDER BY. возможно ли использовать переменные в ORDER BY? или через параметры? Если да, то как? ![]() Код:
procedure Tform_mag.sort_t(radio_by:integer); var sort_by:string; begin if radio_by=0 then sort_by:='name'; if radio_by=1 then sort_by:='gorod'; if radio_by=2 then sort_by:='id'; with Query1 do begin Close; SQL.Clear; SQL.Add('SELECT id,name,gorod,ulica,dom,telefon FROM mag,adres'); SQL.Add('WHERE id=id_adres'); SQL.Add('ORDER BY "sort_by"'); Open; end; end; Последний раз редактировалось civicuu, 09.04.2009 в 16:29. |
#8
|
|||
|
|||
![]() Цитата:
![]() забыл про '+<строка>+' (опыта мало, практически нету ![]() Код:
Close; SQL.Clear; SQL.Add('SELECT id,name,gorod,ulica,dom,telefon FROM mag,adres'); SQL.Add('WHERE id=id_adres'); SQL.Add('ORDER BY '+sort_by+''); |