Delphi Can
DBGrid de Birden Fazla Kayıt Seçmek. - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: DBGrid de Birden Fazla Kayıt Seçmek. (/showthread.php?tid=6679)

Sayfalar: 1 2


DBGrid de Birden Fazla Kayıt Seçmek. - OZCANK - 26-03-2022

Arkadaşlar Merhaba ; DBGrid1 e fatura listesini getiriyorum ve bu faturalardan bir kaçını seçmek ve eklemek istiyorum şöyle bir kod uyarladım ama bir türlü FATIRS_NO yu yazdıramadım. Yardımcı olur musunuz?

şu şekilde yapmaya çalışıyorum; SELECT * FROM TBLFATUIRS WHERE FATIRS_NO IN ('123','456','789')


procedure TForm29.DBGrid1CellClick(Column: TColumn);
var
 i,x: Integer;
 S: String;
begin
 mmo1.Lines.Clear;
 mmo1.Lines.Add('SELECT FATIRS_NO FROM TBLFATUIRS WHERE FATIRS_NO IN  (');

 if dbgrid1.SelectedRows.Count > 0 then
 begin
   with dbgrid1.DataSource.DataSet do
   begin
     for i := 0 to dbgrid1.SelectedRows.Count -1 do
     begin
       S := EmptyStr;
       GotoBookmark(Tbookmark(dbgrid1.SelectedRows[i]));
       for x := 0 to dbgrid1.Columns.Count - 1 do
       begin
         S := dbgrid1.Columns[0].Field.AsString;
       end;
       mmo1.Lines.Add(QuotedStr(S)+',');
     end;
   end;
 end;
 if mmo1.Lines.Count > 0 then
 begin
   S := mmo1.Lines[mmo1.Lines.Count-1];
   if S[Length(S)] = ',' then
   begin
     SetLength(S, Length(S)-1);
     mmo1.Lines[mmo1.Lines.Count-1] := S;
   end;
 end;
 mmo1.Lines.Add(')');
end;



DBGrid de Birden Fazla Kayıt Seçmek. - MuhammedYasir - 26-03-2022

if DBGrid1.SelectedRows.Count > 0 then
begin
 with DBGrid1.DataSource.DataSet do
 begin
   for i := 0 to DBGrid1.SelectedRows.Count -1 do
   begin
     S := EmptyStr;
     GotoBookmark(Tbookmark(DBGrid1.SelectedRows[i]));

     S := S + DBGrid1.Columns[0].Field.AsString;

     memo1.Lines.Add(QuotedStr(S)+',');
   end;
 end;
end;

Aldığım sonuç:

SELECT FATIRS_NO FROM TBLFATUIRS WHERE FATIRS_NO IN  (
'1',
'2',
'3'
)


Cvp: DBGrid de Birden Fazla Kayıt Seçmek. - OZCANK - 27-03-2022

(26-03-2022, Saat: 18:52)MuhammedYasir Adlı Kullanıcıdan Alıntı:
if DBGrid1.SelectedRows.Count > 0 then
begin
 with DBGrid1.DataSource.DataSet do
 begin
   for i := 0 to DBGrid1.SelectedRows.Count -1 do
   begin
     S := EmptyStr;
     GotoBookmark(Tbookmark(DBGrid1.SelectedRows[i]));

     S := S + DBGrid1.Columns[0].Field.AsString;

     memo1.Lines.Add(QuotedStr(S)+',');
   end;
 end;
end;

Aldığım sonuç:

SELECT FATIRS_NO FROM TBLFATUIRS WHERE FATIRS_NO IN  (
'1',
'2',
'3'
)
MuhammedYasir kardeşim çok teşekkür ederim. Ben şu şekilde düzenledim ama hep parantez ile kapatıyor.

'000000000108624'
)
'000000000050075'
)
'000000000212366'
)
'000000000212367'
)
'000000000212367'
)
'000000000212367'
)

Birde aynı kayıt girmesini nasıl engelleyebilirim?

Kod şu şekilde;

procedure TForm29.DBGrid1DblClick(Sender: TObject);
var
i: Integer;
S: String;
begin
if DBGrid1.SelectedRows.Count > 0 then
begin
with DBGrid1.DataSource.DataSet do
begin
  for i := 0 to DBGrid1.SelectedRows.Count -1 do
  begin
    S := EmptyStr;
    GotoBookmark(Tbookmark(DBGrid1.SelectedRows[i]));

    S := S + DBGrid1.Columns[0].Field.AsString;

    mmo1.Lines.Add(QuotedStr(S)+',');
  end;
end;
end;
if mmo1.Lines.Count > 0 then
begin
  S := mmo1.Lines[mmo1.Lines.Count-1];
  if S[Length(S)] = ',' then
  begin
    SetLength(S, Length(S)-1);
    mmo1.Lines[mmo1.Lines.Count-1] := S;
  end;
end;
mmo1.Lines.Add(')');
end;



DBGrid de Birden Fazla Kayıt Seçmek. - COMMANDX - 28-03-2022

Mükerrer Kaydı engellemenin en kısa yolu;

if memo1.lines.IndexOf(s) = -1 then
   Memo1.lines.Add(s);   



Cvp: DBGrid de Birden Fazla Kayıt Seçmek. - OZCANK - 28-03-2022

(28-03-2022, Saat: 10:19)COMMANDX Adlı Kullanıcıdan Alıntı: Mükerrer Kaydı engellemenin en kısa yolu;

if memo1.lines.IndexOf(s) = -1 then
   Memo1.lines.Add(s);   

COMMANDX Kardeşim mükerreri bu şekilde engellemiyor.


DBGrid de Birden Fazla Kayıt Seçmek. - COMMANDX - 28-03-2022

Bende engelliyor.
VAR
S:STRING;
begin
S:=EDIT1.TEXT;
if memo1.lines.IndexOf(s) = -1 then
  Memo1.lines.Add(s);
end;
Ekteki Örneği indirip incelersen...


Cvp: DBGrid de Birden Fazla Kayıt Seçmek. - OZCANK - 28-03-2022

(28-03-2022, Saat: 10:55)COMMANDX Adlı Kullanıcıdan Alıntı: Bende engelliyor.
VAR
S:STRING;
begin
S:=EDIT1.TEXT;
if memo1.lines.IndexOf(s) = -1 then
  Memo1.lines.Add(s);
end;
Ekteki Örneği indirip incelersen...

Bu kod yapısın da bana yardımcı olabilir misin? Yapmak istediğim ('1','2','3','4') şeklinde 
procedure TForm29.DBGrid1DblClick(Sender: TObject);
var
i: Integer;
S: String;
begin
if DBGrid1.SelectedRows.Count > 0 then
begin
with DBGrid1.DataSource.DataSet do
begin
 for i := 0 to DBGrid1.SelectedRows.Count -1 do
 begin
   S := EmptyStr;
   GotoBookmark(Tbookmark(DBGrid1.SelectedRows[i]));

   S := S + DBGrid1.Columns[0].Field.AsString;

   mmo1.Lines.Add(QuotedStr(S)+',');
 end;
end;
end;
if mmo1.Lines.Count > 0 then
begin
 S := mmo1.Lines[mmo1.Lines.Count-1];
 if S[Length(S)] = ',' then
 begin
   SetLength(S, Length(S)-1);
   mmo1.Lines[mmo1.Lines.Count-1] := S;
 end;
end;
mmo1.Lines.Add(')');
end;



Cvp: DBGrid de Birden Fazla Kayıt Seçmek. - OZCANK - 29-03-2022

Arkadaşlar, DBGrid1 in MultiSelect özelliği ile seçim yapıyorum ve Ctrl + Click ile ekliyor bunu değiştirebilir miyim?  Ekle buttonu ile yapabilmem mümkün mü?


DBGrid de Birden Fazla Kayıt Seçmek. - COMMANDX - 31-03-2022

Kardeş , form üzerine 1 adet Listbox koy, Alttaki Kodu PopupMenu nesnesine Gride Sağ Tık olarak ekle
Seçtiğin Kayıtlar Listbox nesnesine Eklenecek, aynısı varsa eklenmeyecek
procedure TFORM1.Ekle1Click(Sender: TObject);
begin
if ListBox1.Items.IndexOf(Query1.fieldbyname('FATIRS_NO').Value) = -1 then BEGIN // Bu kısmı istersen Gride DblClick olarak da ekleyebilirsin
Listbox1.Items.Insert(0,Query1.fieldbyname('FATIRS_NO').Value);
end;


Hiç bir kaydı Listboxa atmadıysan yani listbox boş ise Tüm kayıtların FATIRS_NO larını geitirir.
Eğer Listbox dolu ise , Listboxtaki Kayıtları Döngüye sokarak SQL sorgusu Şeklinde sorgular
En sonda (b) SQL içinde iki adet Quotedstr var onun görevi, sonda kalan virgülden (a) kurtulmak için sonlandırıcıdır.
 
var
L:integer;
begin
Query1.Close;
Query1.SQL.Clear;
 With Query2 do begin
     SQL.Add('SELECT FATIRS_NO FROM TBLFATUIRS ');
 IF LISTBOX1.Items.Text <>'' THEN BEGIN
     SQL.Add(' WHERE FATIRS_NO IN ( ');
 FOR L:= 0 TO LISTBOX1.ItemS.Count-1 DO BEGIN
     SQL.Add(' '+QUOTEDSTR(LISTBOX1.Items.Strings[L])+',' ); // (a)
 END;
     SQL.Add(' '+QUOTEDSTR('')+QUOTEDSTR('')+') AND ' ); // (b)
Query1.Open
END;

Listbox1.clear;
END;
Başka Sorgun Yoksa (b) deki Sorgu içinde olan AND ı silebilirsin


Cvp: DBGrid de Birden Fazla Kayıt Seçmek. - OZCANK - 02-04-2022

(31-03-2022, Saat: 08:35)COMMANDX Adlı Kullanıcıdan Alıntı: Kardeş öncelikle çok teşekkür ederim. Ben bu kodu buraya ekledim ama ListBox1 e doubleclick ile ekleme yapıyor ama tırnak ve virgülleri eklemiyor. 

 
procedure TForm29.DBGrid1CellClick(Column: TColumn);
var
L:integer;
begin
Query2.Close;
Query2.SQL.Clear;
 With Query2 do begin
     SQL.Add('[SELECT FATIRS_NO FROM TBLFATUIRS ');
 IF LISTBOX1.Items.Text <>'' THEN BEGIN
     SQL.Add(' WHERE FATIRS_NO IN ( ');
 FOR L:= 0 TO LISTBOX1.ItemS.Count-1 DO BEGIN
     SQL.Add(' '+QUOTEDSTR(LISTBOX1.Items.Strings[L])+',' ); // (a)
 END;
     SQL.Add(' '+QUOTEDSTR('')+QUOTEDSTR('')+')  ' ); // (b)
END;
Listbox1.clear;
END;