اضافه کردن یک select به query موجود

sara_she

Member
سلام به دوستان
من تو یک فرم با نام فاکتور خرید یه dbgridدارم و یک combobox و یک دکمه

هر بار کاربر یکی از کالاهای لیست شده در combobox رو انتخاب میکنه و روی دکمه کلیک می کنه این کالای جدید همراه مشخصاتش به dbgrid اضافه می شه . در نهایت db gird شامل لیست کالاهایی است که تو یک فاکتور خرید برای کاربر نمایش داده شده است

کد به صورت زیر است:
کد:
procedure Tfactor_kharid.Button1Click(Sender: TObject);
 var o_name:string;
     min_order,max_order,i : integer;
begin

 
 o_name:=combobox3.Text;
 dm1.IBQuery2.Active:=false;
 dm1.IBQuery2.close;

 //dm1.IBQuery2.SQL.Clear;

 dm1.IBQuery2.SQL.Add('select * from object where o_name=:o_name');
 dm1.IBQuery2.Params[0].Value:=o_name;
 dm1.IBQuery2.Active:=true;

 //dm1.DataSource6.Edit;

  dm1.DataSource6.DataSet:=dm1.IBQuery2;
  dbgrid1.DataSource:=dm1.DataSource6;

end;

مشکل اینه که با هر بار کلیک فقط رکورد جدید نشون داده می شه و قبلی از dbgrid پاک می شه . اونم به خاطر query که گذاشتم ولی من می خوام هربار یک Select به query اضافه بشه نه اینکه جای selectقبلی رو بگیره .راه حل چیه ؟
وقتی هم قسمت dm1.DataSource6.Edit رو فعال می کنم بار اول مشکلی نداره ولی وقتی برای کالای دوم روی دکمه کلیک می کنم پیغام می ده که دیتاست readonly است و نمی شه اونو تغییر داد
 
آخرین ویرایش:

nima_dir

Active Member
سلام دوست عزيز
يكي از ساده ترين راهها اينه كه يه جدول موقت بگيريد و جديدها رو به جدول اضافه كرده جدول رو به گريد وصل كنيد و ر بار كه تغيير ي داده ميشه يك refresh انجام بدين.
موفق باشيد
 

farhad110

Member
سلام
query ها برای انجام پرس و جو استفاده میشن و معمولا قابلیت insert , delete , edit ندارند. لا اقل query از تب BDE که اینجوری هست. اما با IBQuery کار نکردم. بهتره که برای inset , edit , delete از IBTable استفاده کنی.
 

sara_she

Member
من نمی خوام چیزی به جدول بانکم اضافه کنم که از Ibtabel و متد Appned اون استفاده کنم

می خوام کاربر هربار که کالایی از لیست Combobox انتخاب می کنه اطلاعات اون کالا در Dbgrid که کنار اونه نشون داده بشه در واقع به Dbgrid اضافه بشه نه اینکه جای رکورد قبلی رو بگیره . در نهایت Dbgridشامل لیست کالاهایی است که کاربر قصد خرید اونها رو داره. این لیست زیر مجموعه ای از کل کالاهای تعریف شده در جدول بانک اطلاعاتی است

من روش آقا نیما رو درست متوجه نشدم اگه یه نمونه کد برام بذارین ممنون می شم
 

nima_dir

Active Member
سلام سارا خانوم
شانس اوردين الان فهميدم كه زباني كه استفاده ميكنين دلي هست وگرنه بهتون نميگفتم كه با استفاده از دستور create وقتي كه فرمتون باز ميشه يه جدول موقت توي بانك اطلاعاتيتون ايجاد كنيد بعد هر باز كه كمبو تغيير كرد ركوردهاي مورد نظري كه بايد به گريد اضافه بشن رو به جدول اضافه كنيد و وقتي گريد به جدول متصل باشه بالطبع ركوردهاي جديد رو هم نشون ميده
. اي واي من شرمنده همه وي بي كارام از دهنم پريد اين روش:D:D:D
شوخي كردم موفق باشيد
 

farhad110

Member
ببخشید من منظور شما رو درست متوجه نشدم. البته شما هم بی تقصیر نیستی:
این کالای جدید همراه مشخصاتش به dbgrid اضافه می شه

اگر درست متوجه شده باشم شما میخوای نتیجه جستجوهای مختلف رو با هم داشته باشی. در واقع شما کنترل مناسبی رو برای این کار انتخاب نکردی چون dbgrid رابطه مستقیم با تغییرات dataset مربوطه داره. بهتره که نتیجه های جستجو رو توی Listbox یا StringGrid نمایش بدی. روشی رو که nima_dir عزیز هم معرفی کرد میتونه کارآمد باشه، به اینصورت که شما از قبل جدولی رو با مشخصات جدول مورد جستجو ایجاد کرده باشی و ...
 

sara_she

Member
سلام
از راهنماییتون خیلی ممنونم آقا نیما

من کد زیر رو تو روال formshowگذاشتم:
کد:
begin
  dm1.IBQuery3.Close;
  dm1.IBQuery3.SQL.Clear;
   with dm1.IBQuery3.SQL do
      begin
        Add('create table _kala(');
        Add('o_code    integer,');
        Add('o_name      char(30),');
        Add('o_group   char(30))');
      end;
      dm1.IBQuery3.ExecSQL;

     dm1.IBTable14.Database:=dm1.IBDatabase1  ;
     dm1.IBTable14.Transaction:=dm1.IBTransaction1  ;
     dm1.IBTable14.TableName:='kala';
     dm1.IBTable14.CachedUpdates:=true;
     dm1.IBTable14.active:=true;
end;

ولی وقتی به خط dm1.IBTable14.active:=true می رسه خطا میده که جدولی با نام kalaرو نمی شناسه

اگه این کد رو هم بردارم تو قسمتی که می خوام append کنم از ibtable14.open همین خطا رو می گیره.

مشکل چیه؟
 

nima_dir

Active Member
سلام
والله من دلفي ملفي بيلميرم. آما اگه تو وي بي بود ما ميومديم براي گريد روي كليكش يه select * از جدول ميزديم بعد يه بار ركوردست رو رفرش ميكرديم. خوب بالاخره فرق وي بي با دلفي به همين چيزاست ديگه.( اينم كريه امروز) شوخي كردم
موق باشيد
 

farhad110

Member
سلام

ممنون از راهنماییتون

ولی من یک سری فیلد اضافه دارم مثل ردیف کالا و مبلغ که از بانک مقدار نمی گیرند بلکه تو روال DBGrid1DrawColumnCell به اونا مقدار می دم . این کار رو با stringgridهم می شه انجام داد .

سلام
فرقی نمیکنه، مهم خوندن اطلاعات از dataset هست
این کدی رو که نوشتم اطلاعات جدول شما رو به stringgrid اضافه میکنه اما برای جستجوهای بعدی، دوباره از اول ساخته میشه. نتونستم محتویات stringgrid رو حفظ کنم و اطلاعات جدیدی رو اضافه کنم. کد رو میذارم شاید مفید باشه:
جدولی که اینجا مثال زده شده، جدولی هست با 4 فیلد:

کد:
[LEFT]procedure TForm1.Button1Click(Sender: TObject);
var j,count:integer;
begin
count:=Table1.RecordCount+1;
StringGrid1.RowCount:=count;

StringGrid1.ColCount:=4;
StringGrid1.FixedCols:=0;

Table1.First;
if not table1.Eof then
while not Table1.Eof do
  begin
  for j:=1  to count do
    begin
    StringGrid1.Cells[0,j]:=Table1.fieldbyname('نام فیلد').Value;
    StringGrid1.Cells[1,j]:=Table1.fieldbyname('نام فیلد').Value;
    StringGrid1.Cells[2,j]:=Table1.fieldbyname('نام فیلد').Value;
    StringGrid1.Cells[3,j]:=Table1.fieldbyname('نام فیلد').Value;
    table1.next;
    end;
  end;

end;[/LEFT]


یه سواال دیگه هم داشتم : عنوان رو برای ستون های stringgrid چه طور تعریف می کنند؟

کد:
[LEFT]StringGrid1.Cells[سطر,ستون]:='عنوان';[/LEFT]

برای تنظیم عرض ستونها:

کد:
[LEFT]StringGrid1.ColWidths[شماره ستون]:=مقدار عددی;[/LEFT]
 

farhad110

Member
پس به احتمال زیاد stringgrid هم کار شما رو انجام نمیده و شما باید از یه جدول موقت استفاده کنی.

کد:
[LEFT]procedure MakeDataBase;
begin
  with TTable.Create(nil) do
  begin
    DatabaseName  := 'c:\temp';
    TableName     := 'نام جدول.db';
    TableType     := ttParadox;
    with FieldDefs do
    begin
      Add('نام فیلد', ftString,20,false);
      Add('نام فیلد', ftInteger);
    end;
    CreateTable;
  end;
end;[/LEFT]

آقا نیما منظور شما اینه که در قدرت دلفی در مقابل vb شکی وجود نداره دیگههههههههه . شوخی بود، قصد مقایسه ندارم ولی ... :cool:
موفق باشید
 

nima_dir

Active Member
سلام دوست عزيز
واقعا در قدرت وي بي با اسمشو نبر شكي وجود نداره. اگه چيزي غير از اين بود كه حراجش نميكردن
آخرش چقدر فروختنش؟ 3كيلو 100 تومن!!؟؟
شوخي كردم
موفق باشيد
 

sara_she

Member
من کاری ندارم کدوم بهتره . فعلا که من دارم با دلفی کار می کنم و مشکلم البته هنوز پابرجاست

کدی که من نوشتم برای ایجاد جدول چه مشکلی داره که درست عمل نمی کنه؟

بانک من اینتربیس است
 

sara_she

Member
آقا فرهاد من نمی دونم کدی که شما گذاشتین برای کار با چه کاپوننت های بانک اطلاعاتیه . من با اینتر بیس کار می کنم. کد شمار و تست کردم ولی از قسمت Add فیلد ها خطا می گیره و ftstring و ftinteger رو نمی شناسه

کدی که خودم برای createگذاشتم خطایی نداره ولی موقع اجرا جدول ایجاد شده رو نمی شناسه
 

farhad110

Member
برای استفاده از کدی که من گذاشتم باید از تب BDE یه TTable به فرم اضافه کنی.
چه خطایی میده؟ پیغام خطا رو بنویس
 

Silvesters

New Member
سلام به همه من كدش رو براتون ميزارم كد مربوط به برگردوندن آيتم انتخاب شده فعلي در Stringgrid و حذف خانه ي خاصي از آون مي باشد .
اگه سوالي داشتيد بهم ميل كنيد زود زود چك مي كنم
procedure GridDeleteRow(RowNumber: Integer; Grid: TstringGrid);
var
i: Integer;
begin
Grid.Row := RowNumber;
if (Grid.Row = Grid.RowCount - 1) then
{ On the last row}
Grid.RowCount := Grid.RowCount - 1
else
begin
{ Not the last row}
for i := RowNumber to Grid.RowCount - 1 do
Grid.Rows := Grid.Rows[i + 1];
Grid.RowCount := Grid.RowCount - 1;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GridDeleteRow(3, stringGrid1);
end;



حالا كد انتخاب

function IsCellSelected(StringGrid: TStringGrid; X, Y: Longint): Boolean;
begin
Result := False;
try
if (X >= StringGrid.Selection.Left) and (X <= StringGrid.Selection.Right) and
(Y >= StringGrid.Selection.Top) and (Y <= StringGrid.Selection.Bottom) then
Result := True;
except
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if IsCellSelected(stringgrid1, 2, 2) then
ShowMessage('Cell (2,2) is selected.');
end;
 

جدیدترین ارسال ها

بالا