Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.04.2009, 13:01
civicuu civicuu вне форума
Прохожий
 
Регистрация: 04.04.2009
Сообщения: 7
Репутация: 10
По умолчанию SQL запросы (для начинающих)

В общем, чтобы не создавать каждый раз новую тему открыл тему про 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;
2) как организовать запрос на запрет ввода одинакового имени???
то есть, если в таблице имеется запись 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  
Старый 08.04.2009, 15:15
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Поскольку вы работаете с 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  
Старый 08.04.2009, 15:15
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

как то так
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 08.04.2009, 18:23
civicuu civicuu вне форума
Прохожий
 
Регистрация: 04.04.2009
Сообщения: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от civicuu
В общем, чтобы не создавать каждый раз новую тему открыл тему про 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=1');
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;
в чем тут трабла?
при обработке ссылался на 'modify':
Код:
Error..
Token: Modify
in line 1
в виду сжатых сроков оставил эту затею, но все же хотелось узнать мнение более компетентных людей (так как все равно вернусь к етому "месту", но попозже)
альтернативный выход: при добавлении новой записи требуется указать номер, если номер существует, то "фейл".
Да и еще:
Код:
INSERT INTO table VALUES (col1,col2,...,colN) 
возможно ли арифметические операции в св-ве VALUES. например, если col1 типа Numeric(Integer), что-то вроде этого ...VALUES (col1=col1+1,col2,...,colN). Если да, то как правильно это оформить?
в моем примере не получается:
Код:
INSERT INTO MyTable Values (id=id+1,name)
//пробовал заключать в " " или "' '" или ' ', не выходит
//через параметр также не получается, ругается на "+", хотя с умножением "*" все ОК
//автоинкремент единственный выход?
Ответить с цитированием
  #5  
Старый 08.04.2009, 19:56
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

1.Формат DBF насколько я помню неимеет автоинкриментных полей, поэтому ваша попытка воспользоваться этим счастьем для DBF, непрокатывает. Для реализации этого алгоритма смотрите мой пример который я дал в прошлом посте.
2.INSERT INTO MyTable Values (id=id+1,name) - это небудет работать по трем причинам, первая - вы не указали в какие поля помещать id=id+1 и name, вторая - вычислять можно, но без присвоения т.к. результат итак поместиться в (см.причину 1), третье - нельзя использовать в инсерте в качестве параметров имена полей этой-же таблицы. Переменные внешние пожалуйста, константы - ради бога, результат чужого запроса тоже можно.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 08.04.2009, 21:40
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

1. Нет в dbf счетчиков
2. Если хотите автоинкремент - ручками... только ручками... (как сделать - могу объяснить)
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #7  
Старый 09.04.2009, 16:21
civicuu civicuu вне форума
Прохожий
 
Регистрация: 04.04.2009
Сообщения: 7
Репутация: 10
По умолчанию

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  
Старый 09.04.2009, 16:41
civicuu civicuu вне форума
Прохожий
 
Регистрация: 04.04.2009
Сообщения: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от civicuu
Код:
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;
ух все разобрался) с 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+'');
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:56.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025