Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > DBComboBox не видит структуру таблицы


Автор: Shokan 10.5.2007, 07:06
почему у меня комбо бокс не видет таблицу?
вот, хотел вывести значений поле вот таким обрахом:

Код

procedure TForm1.FormActivate(Sender: TObject);
var a: Cardinal;
begin
for a:=1 to table1.RecordCount do  begin
DBListBox1.Items.Add(table1.FieldByName('name').AsString);
table1.next;
end;
end;


где их можно указать?
извеняюсь та тупой вопрос

Автор: Rodman 10.5.2007, 08:44
Shokan, а таблицу открыл?

не туда написал, тебе в Базы данных...

Автор: skyboy 10.5.2007, 09:35
Нужны компоненты: TDBComboBox(DBComboBox1), TDataSource(DataSource1), TTable(Table1)
Надо установить:
  • Свойство DBCombobox.DataSource := DataSource1;
  • Свойство DataSource1.DataSet:= Table1;
  • Свойство Table1.Active:= True;

Автор: Shokan 10.5.2007, 10:04
Да, там все в порядке.
Все это сделано.
вот виды ошибок:
[Error] Unit1.pas(105): Undeclared identifier: 'departments'
[Error] Unit1.pas(105): 'DO' expected but identifier 'RecordCount' found
[Error] Unit1.pas(106): ')' expected but identifier 'FieldByName' found
[Error] Unit1.pas(106): Missing operator or semicolon
[Fatal Error] Project1.dpr(6): Could not compile used unit 'Unit1.pas'

Автор: Rodman 10.5.2007, 10:54
Цитата(Shokan @  10.5.2007,  09:04 Найти цитируемый пост)
[Error] Unit1.pas(105): Undeclared identifier: 'departments'

в той строке такого нет.. выложи весь код...

Автор: Shokan 10.5.2007, 10:57
вот

Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Grids, DBGrids, DB, DBTables, ADODB, Buttons,
  jpeg, Menus, DBCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Edit1: TEdit;
    DBGrid1: TDBGrid;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    Panel4: TPanel;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    RadioButton4: TRadioButton;
    RadioButton5: TRadioButton;
    Image1: TImage;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N13: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    Image2: TImage;
    DBComboBox1: TDBComboBox;
    ADOQuery2: TADOQuery;
    DataSource2: TDataSource;
    Button1: TButton;
    procedure Edit1Change(Sender: TObject);
    procedure N13Click(Sender: TObject);
    procedure DBGrid1DblClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure DBComboBox1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Edit1Change(Sender: TObject);
  var
    caption: String;
    i:integer;
begin
  caption:='Family';
  if RadioButton1.Checked=true then
  Caption := 'Family'
  else if RadioButton2.Checked=true then
  Caption := 'Name'
  else if RadioButton3.Checked=true then
  Caption := 'Sname'
  else if RadioButton4.Checked=true then
  Caption := 'Workphone'
  else if RadioButton5.Checked=true then
  Caption := 'Cellphone' ;

    with ADOQuery1 do begin
    Close;
    SQL.Clear;
    SQL.Text := 'select * from Personal where ' + Caption + ' like "%'+Edit1.Text+'%"';;
    //Parameters.ParamByName('v_mid').Value := Edit1.Text;
    Open;
  end;
end;

procedure TForm1.N13Click(Sender: TObject);
begin
  Form1.Close;
end;

procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
Form2.Show;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Close;
  Form2.Close;
end;

procedure TForm1.DBComboBox1Change(Sender: TObject);
var a: Cardinal;
begin
for a:=1 to departments.RecordCount do  begin
DBComboBox1.Items.Add(departments.FieldByName('2').AsString);
departments.next;
end;

end.


Автор: Rodman 10.5.2007, 11:12
ну во первый ты departments даже не обьявил

Добавлено через 2 минуты и 22 секунды
Код

procedure TForm1.DBComboBox1Change(Sender: TObject);
var a: Cardinal;
begin
for a:=1 to ADOQuery1.RecordCount do  
begin
     DBComboBox1.Items.Add(ADOQuery1.Fields[2].AsString);
     ADOQuery1.next;
end;


что так?

Автор: Shokan 10.5.2007, 11:17
Я только начинаю этот язык. пришел с пхп.
горю желением освоится в этой среде.

при обявления откуда надо вытаскивать эти переменные?
Обясните пожалуйста

нет. вот это вот не работает
Код


procedure TForm1.DBComboBox1Change(Sender: TObject);
var a: Cardinal;
begin
  for a:=1 to ADOQuery2.RecordCount do
begin
  DBComboBox1.Items.Add(ADOQuery2.Fields[2].AsString);
  ADOQuery2.next;
end;
     end;
end.


выводит только 1-запись из этого поле

Автор: Rodman 10.5.2007, 11:23
ооо плин.
Код

procedure TForm1.DBComboBox1Change(Sender: TObject);
var a: Cardinal; //можно целочисленное, ну это я думаю ты понял
begin
for a:=1 to ADOQuery1.RecordCount do  // если ADOQuery открыт то в переменной RecordCount кол-во строк
begin
     DBComboBox1.Items.Add(ADOQuery1.Fields[2].AsString);//записываешь в DBComboBox 3й столбей
     ADOQuery1.next;//переходишь на следующую запись
end;


Автор: Shokan 10.5.2007, 11:54
выходит только 1-запись всего поля:
в чем может быть дело?  smile 

Код

procedure TForm1.DBComboBox1Change(Sender: TObject);
var a: Cardinal;
begin
  for a:=1 to ADOQuery2.RecordCount do
begin
  DBComboBox1.Items.Add(ADOQuery2.Fields[2].AsString);
  ADOQuery2.next;
end;
     end;

Автор: Rodman 10.5.2007, 12:01
значит твоему условию
Код

SQL.Text := 'select * from Personal where ' + Caption + ' like "%'+Edit1.Text+'%"';

cоответствует только одна запись.

Автор: Shokan 10.5.2007, 12:07
нет. этот комбо бокс(DBComboBox1) не имеет никого отношения к ADOQuery1.
он связывается с ADOQuery2.
а там(в ADOQuery2) написано select * from departments


Автор: Rodman 10.5.2007, 12:31
покажи что ты исправил...

Автор: Shokan 10.5.2007, 12:43
вот ваш код:
я оттуда исправил выделенные красным

Код

procedure TForm1.DBComboBox1Change(Sender: TObject);
var a: Cardinal; //можно целочисленное, ну это я думаю ты понял
begin
for a:=1 to [color=red]ADOQuery1[/color].RecordCount do  // если ADOQuery открыт то в переменной RecordCount кол-во строк
begin
     DBComboBox1.Items.Add([color=red]ADOQuery1[/color].Fields[2].AsString); //записываешь в DBComboBox 3й столбей
     [color=red]ADOQuery1[/color].next; //переходишь на следующую запись
end;


вообщем ADOQuery1 на ADOQuery2 и все.
мне надо высести на DBComboBox1 из запроса:
Код

select * from departments

поле 2

структура подключения к файлу access такая:
Код

                              ADOQuery1                    DataSource1
ADOConnection1
                              ADOQuery2                    DataSource2 вот сюда вот подключен DBComboBox1  

Автор: Rodman 10.5.2007, 12:47
запрос напиши полностью,
Код

select ID, NAme1, Name2 from departments

Цитата(Shokan @  10.5.2007,  11:43 Найти цитируемый пост)
поле 2

в таком случае поле 2 будет - Name2...

Автор: Shokan 10.5.2007, 13:15
не в этом дело.
само структура таблицы departement такая.
та толко два поле под именами 1 и 2


Автор: Rodman 10.5.2007, 13:34
Цитата(Shokan @  10.5.2007,  12:15 Найти цитируемый пост)
под именами 1 и 2

арегинальные имя полей... переименуй их на Name1, Name2.. из-за имен тоже могут быть ошибки...

скажешь результат...

Автор: Shokan 10.5.2007, 14:23
я переименовал имена  полей в таблице Depaterments на id(number) & name(text)

вложил этот код

Код

var a: Cardinal;
begin
  for a:=1 to ADOQuery2.RecordCount do
begin
  DBComboBox1.Items.Add(ADOQuery2.Fields[2].AsString);
  ADOQuery2.next;
end;
     end;


но... опять smile 
выходит только самая первая строка этого толя, гребанный 
Административный департамент
ихвеняюсь за выражения

Автор: Rodman 10.5.2007, 20:04
так... бедь терпимее... во первый ты открываешь запрос далеко..

напиши...
Код

procedure TForm1.DBComboBox1Change(Sender: TObject);
begin
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('SELECT ID, Name1 FROM Depaterments ;');
adoquery2.Open;
while not adoquery2.Eof do
begin
     ComboBox1.Items.Add(ADOQuery2.Fields[1].AsString); //обычный комбобокс попробуй
     ADOQuery2.next; 
end;


вот такой код все что надо выведет...

иначе вылажуй базу и исходник - гляну...

Автор: Shokan 11.5.2007, 05:26
Вот --->

Автор: Shokan 11.5.2007, 05:27
вот исходник программы

Автор: Rodman 11.5.2007, 08:50
Цитата(Shokan @  10.5.2007,  13:23 Найти цитируемый пост)
id(number) & name(text)

Name - зарезервированное слово (тебя аксесс должен был предупредить), а в таком случае его нужно брать в [name]

PS: никогда не называй поля одним словом... используй динный названия, типа - NameUser или FIOName...

Код

procedure TForm1.FormCreate(Sender: TObject);
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('SELECT Departments.id, Departments.name FROM Departments;');
adoquery1.Open;
while not adoquery1.Eof do
begin
     DBComboBox1.Items.Add(ADOQuery1.Fields[1].AsString); 
     ADOQuery1.next;
end;
end;

вот этот код у меня вывел все.

только внимательно его прочитай, заполнение в создании формы висит...

Автор: Shokan 11.5.2007, 11:32
все заработала!
спасибо большое. дело не в комбо боксе, оказывается в adoquery.
не знаю теперь... в пхп есть форма:
Код

<select name=depart>
<option>Адм. блок
<option>Фин. блок
<option>Тех. блок
</select>


и берешь значении выбранного так скажем Selecta

Код

$depart = $_post['depart'];
$sql = 'select * from Personal where depottament_id=$depart';


как на дельфи все это проиходит?
я сам решил вот так:
при выборке сразу же брать значения комбо бокса и вставлять его переменным
в sql запрос другого ADOQuery(через который подключается dbgrid) что бы у меня при выборке люди выберались с того департамента. правильно ли размышляю? как дальше с синтаксисом помогите



Код

procedure TForm1.FormCreate(Sender: TObject);
begin
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('SELECT Departments.id, Departments.name FROM Departments;');
adoquery2.Open;
while not adoquery2.Eof do
begin
DBComboBox1.Items.Add(ADOQuery2.Fields[1].AsString);
     ADOQuery2.next;
end;

adoquery1.Close;
adoquery1.SQL.Clear;
??????????????????????
adoquery1.Open;
end;



Автор: Rodman 11.5.2007, 12:02
Код

procedure TForm1.DBComboBox1Change(Sender: TObject);
begin
    adoquery1.Close;
    adoquery1.SQL.Clear;
    adoquery1.SQL.Add('select * from Departments where Departments.name=:Prm1');
    adoquery1.ParamByname('Prm1').Value:=DBComboBox1.Text;
    adoquery1.Open;
   //если связи прописаны выведется в DBGrid
end;

Автор: Shokan 11.5.2007, 13:21
Извеняюсь за тупизм: smile 
Код

 adoquery1.SQL.Add('select * from Departments where Departments.name=:Prm1');


Prm1 откуда передается?
а оператор ParamByname он вообще не определяет

Автор: Rodman 11.5.2007, 14:41
Цитата(Shokan @  11.5.2007,  12:21 Найти цитируемый пост)
Prm1 откуда передается?

это и есть твой параметр...

подобный твоему $depart...
Код

adoquery1.ParamByname('Prm1').Value:=//присваиваешь нужное значение

Автор: Shokan 14.5.2007, 05:45
Здраствуйте! мой следующий вопрос не подходит к теме, но я продолжаю что бы была лутче понятна сетуация моих вопросов.
DBComboBox1.Text- у меня выдодится названия(name) а не Id. можно ли сделать какое то скрытое поле для передачи параметра?
потому что в таблице Personal значения Department переданы через Id.
вышепоказанном коду дельфи ругается на эту строку:

  adoquery1.ParamByname('Department.Id').Value:=DBComboBox1.Text;
......
  //[Error] Unit1.pas(122): Undeclared identifier: 'ParamByname'
  //[Error] Unit1.pas(122): Missing operator or semicolon

вроде все нормально?
или их надо заранее задать на свойствах  adoquery1 в Object inspector-e?

Автор: Rodman 14.5.2007, 09:06
Shokan, запрос из adoquery1 в студию...

Добавлено через 10 минут и 40 секунд
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('SELECT Departments.id, Departments.name FROM Departments;');
adoquery2.Open;
while not adoquery2.Eof do
begin
     ComboBox1.Items.AddObject(ADOQuery2.Fields[1].AsString, Pointer(ADOQuery2.Fields[0].AsInteger));
     ADOQuery2.next;
end;
end;


а потом передавать запросу
Код

SELECT ID,[name] from Department WHERE id=:Prm1;


Код

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  adoquery1.Close;
  adoquery1.ParamByname('Prm1').Value:=integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);//передаст ID
  adoquery1.Open;
end;

Автор: Shokan 14.5.2007, 15:07
все. вроде бы решил.
поставил DBLookupComboBox1 в место комбобокса
прописал следуюшее 

Код

procedure TForm1.DBLookupComboBox1CloseUp(Sender: TObject);
begin
    adoquery1.Close;
    adoquery1.SQL.Clear;
    adoquery1.SQL.Add('select * from Personal where Department=:par1');
    adoquery1.Parameters.ParamByName('par1').Value:=DBLookupComboBox1.KeyValue;
    adoquery1.Open;
end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)