![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Цитата:
) с ORDER BYзабыл про '+<строка>+' (опыта мало, практически нету )Код:
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+''); |