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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.08.2008, 19:02
Аватар для artemavd
artemavd artemavd вне форума
Начинающий
 
Регистрация: 05.08.2008
Сообщения: 115
Репутация: 12
По умолчанию Осваиваю SQL запросы

Осваиваю SQL запросы). Помогите мне записать пожалуйста SQL-запрос. У меня есть БД, в которой хранитится мобильный номер какого-то человека, его фамилия и имя, которая называется nomera.db. Мне надо, чтобы по моему запросу выводилась фамилия, имя и мобильный номер нужного мне человека. Как мне правильно организовать работу компонента Query, чтобы он работал? Что мне надо прописать в его свойстве SQL strings? Напишите пожалуйста код, чтобы я понял как правильно составлять запросы) Заранее благодарю))
Ответить с цитированием
  #2  
Старый 01.09.2008, 11:55
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Во-первых, нужно привести пример своей логики (напр.: известны фамилия и имя, найти телефон; или известен телефон, найти фамилию и имя).
Во-вторых, куда выводить: в отдельные поля (часть данных уже известна и её можно не искать) или в таблицу? Что делать если ответ не единственный?
Вообще, лучше дать определение таблицы (какие поля, есть ли Primary Key).
Нужно ли использовать параметры?
Ответить с цитированием
  #3  
Старый 01.09.2008, 14:01
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,020
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

В общем случае:

SELECT * FROM nomera

далее, в зависимости от задачи к этому запросу добавляются модификаторы:
[LEFT|RIGHT|INNER] JOIN ON - соединение таблиц
WHERE - условия фильтрации
ORDER BY [ASC|DESC] - сортировка
GROU BY - группировка
остальные, типа HAVING, используются реже.

Если нужны не все поля таблицы (таблиц), то вместо '*' можно просто их перечислить через запятую.

А вообще в интернете есть вполне приличные учебники по SQL для новичков.

По поводу использования в Delphi.
Как ты введешь запрос в соотв. свойстве SQL никого, кроме тебя, не волнует. Главное, что бы он был синтаксически правильным, а как ты будешь бить его на строки все равно. TQuery работает абсолютно так же, как TTable за исключением того, что для все операций используются соотв. запросы, которые надо указать самому.
Ответить с цитированием
  #4  
Старый 01.09.2008, 15:02
Аватар для artemavd
artemavd artemavd вне форума
Начинающий
 
Регистрация: 05.08.2008
Сообщения: 115
Репутация: 12
По умолчанию

AlexSKu, задача логики простая). Нужно зная фамилию (или имя) человека найти в БД его номер телефона. Выводить можно либо в Label, либо в DBEdit, либо в StringGrid, либо показывать просто messagebox с номером телефона. Как угодно. Поля в таблице следующие: Фамилия, Имя, Мобильный телефон. Первичного ключа нет. Imikle, а можно пожалуйста к моей задаче применительно написать? Задача: есть фамилия и имя, нужно узнать мобильный номер человека. И если можно, то напишите плиз куда прописывать: в свойство TStrings компонента Query или в процедуру кнопки?)
Ответить с цитированием
  #5  
Старый 01.09.2008, 15:54
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,020
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

прописывать в свойство SQL

Сведем задачу к такой:
Пользователь вводит строку, которая является именем или фамилией. Тогда в SQL надо прописать такую строку:

Код:
SELECT * FROM numbers WHERE firstname = :SearchString OR lastname = :SearchString

Далее при нажатии кнопки пишется что-то типа этого:

Код:
var
  S : String;
begin
  If InputQuery('Поиск','Кого ищем',S) Then
    Begin
      Query1.ParamByName('SearchString').AsString = S;
      Query1.Open;
      Query1.First;
      If Query1.Eof 
        Then ShowMessage('Такой не найден!') 
        Else ShowMessage('Номер: ' + Query1.FieldByName('number'));
      Query1.Close;
...
Ответить с цитированием
  #6  
Старый 01.09.2008, 17:59
Аватар для artemavd
artemavd artemavd вне форума
Начинающий
 
Регистрация: 05.08.2008
Сообщения: 115
Репутация: 12
По умолчанию

А что здесь означает "*"?)

Код:
SELECT * FROM numbers WHERE firstname = :SearchString OR lastname = :SearchString


Код:
var
  S : String;
begin
  If InputQuery('Поиск','Кого ищем',S) Then
    Begin
      Query1.ParamByName('SearchString').AsString = S;
      Query1.Open;
      Query1.First;
      If Query1.Eof 
        Then ShowMessage('Такой не найден!') 
        Else ShowMessage('Номер: ' + Query1.FieldByName('number'));
      Query1.Close;
...
Я записал процедуру, которую ты предложил. Но при компиляции компилятор не компилирует программу и выделяет строчку:
Код:
 Else ShowMessage ('Номер: ' + Query1.FieldByName ('number')); 
А внизу пишет ошибку типа:
Код:
Incompatible types: ‘String’ and ‘TField’
Что значит эта ошибка? Как с ней бороться? Если я комментирую строчку
Код:
 Else ShowMessage ('Номер: ' + Query1.FieldByName ('number')); 
и запускаю программу, то когда я ввожу фамилию или имя и нажимаю на кнопке "ОК" мне выдается такаю ошибка:
Код:
 Query1: Parameter ‘SearchString’ not found
Что делать?)
Ответить с цитированием
  #7  
Старый 01.09.2008, 18:44
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,020
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1) * означает - вернуть все поля таблицы.
2) По поводу ошибки, да, мысль убежала дпльше, чуть-чуть не дописал. Надо:
Код:
Else ShowMessage ('Номер: ' + Query1.FieldByName ('number').AsString); 
3) Parameter not found. попробуй у TQuery щткрыть редактор свойства Params (как-то так). Должны появиться параметры. Ну и проверь сам запрос, что там есть эти параметры (начинаются с двоеточия (.
Ответить с цитированием
  #8  
Старый 02.09.2008, 06:41
Аватар для artemavd
artemavd artemavd вне форума
Начинающий
 
Регистрация: 05.08.2008
Сообщения: 115
Репутация: 12
По умолчанию

Я открыл свойство Param компонента Query, выбрал строку "SearchString" и прописал так ее свойства:
DataType=ftString
Name=:SearchString
NumericScale=0
ParamType=ptInputOutput
Precision=0
Size=0
Value.Type=Строка
У второй строки, которая до изменения была "TParam" я поменял название на "ParamByName" и ее свойства прописал так:
DataType=ftString
Name=ParamByName
NumericScale=0
ParamType=ptInputOutput
Precision=0
Size=0
Value.Type=Unassigned
И если я запускаю программу и в строке поиска ничего не ввожу или ввожу какую-нибудь фамилию и имя (они имеются в БД), нажимаю на "ОК", то появляется ошибка:
"Invalid use of keyword.
Token:SearchString
Line Number: 1."
Может где-то я неправильно прописал в свойствах Query?
Ответить с цитированием
  #9  
Старый 02.09.2008, 14:12
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

У меня всё работает после небольших исправлений:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  S : String;
begin
  if InputQuery('Поиск','Кого ищем',S) then
  begin
    Query1.ParamByName('SearchString').AsString:= S;
    Query1.Open;
    Query1.First;
    if Query1.Eof then
      ShowMessage('Такой не найден!')
    else
      ShowMessage('Номер: ' + Query1.FieldByName('number').AsString);

    Query1.Close;
  end;
end;

Параметр "SearchString" :
DataType=ftString
( оставить без двоеточия: Name=SearchString)
ParamType=ptInput
Ответить с цитированием
  #10  
Старый 02.09.2008, 17:57
Аватар для artemavd
artemavd artemavd вне форума
Начинающий
 
Регистрация: 05.08.2008
Сообщения: 115
Репутация: 12
По умолчанию

"Invalid use of keyword.
Token:SearchString
Line Number: 1."
Выдает все ту же ошибку((. AlexSku, не могли бы вы выложить исходник с примером, чтобы я мог посмотреть где я туплю?
Ответить с цитированием
  #11  
Старый 03.09.2008, 12:55
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Начало utit'а:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Query1: TQuery;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
Свойства Query1 и Params[0]:
Код:
object Form1: TForm1
  Left = 263
  Top = 103
  Width = 507
  Height = 395
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 40
    Top = 112
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Query1: TQuery
    DatabaseName = 'DBDEMOS'
    SQL.Strings = (

        'SELECT * FROM numbers WHERE firstname = :SearchString OR lastnam' +
        'e = :SearchString')
    Left = 40
    Top = 24
    ParamData = <
      item
        DataType = ftString
        Name = 'SearchString'
        ParamType = ptInput
      end
      item
        DataType = ftString
        Name = 'SearchString'
        ParamType = ptInput
      end>
  end
end
Params[1], видимо, заполнился сам, так как это тот же самый параметр.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter